Sunteți pe pagina 1din 20

Proiect microControlere

Calita Valentin-Adrian grupa 434 F

Cerinte: Sa se citeasca 6 temperaturi in intervalul -200 oC si 260oC cu 6 traducatoare de temperatura RTD Cu10 si sa se afiseze pe un afisaj 7 segment temperaturile individuale cat si temperatura minima. Se va folosi un microcontroler : AT90LS8535 produs de firma Atmel.

Proiectare: Date tehnice microcontroler: - 118 instructiuni , care aproape sunt executate intr-o singura instructiune. - 32 de registrii generali pe 8 biti - 4 MHz frecventa maxima de lucru - 8 canale de iesire pe 8 biti - convertor CAN pe 10 biti - UART programabil - 2 numaratoare pe 8 biti - consumul microcontrolerului la 4 MHz,3V si 20 oC : mod activ :6,4 mA; idle : 1,9 mA si modul Power-down <1 uA - alimentarea :2.7-6V Configuratia pinilor : (PDIP)

Schema bloc :

Descrierea pinilor: VCC alimentarea la 5 V GND masa PORT A este conectat la traducatoarele de temperatura si tot odata acest port reprezinta si intrarea in convertorul analog-digital PORT B este conectat la butoane PORT C este multiplexatorul pentru afisor PORT D este conectat la afisor RESET pinul care reseteaza microprocesorul chiar daca se primeste impuls de ceas.Impulsul de resetare trebuie sa dureze mai mult de 50 ns XTAL1,XTAL2 oscilatorul extern AVCC alimentarea pentru CAN AREF tensiunea de referinta pentru CAN AGND punctul de masa al CAN-ului Oscilatorul extern :

Arhitectura interna : Microprocesorul AT90LS8535 are o structura RISC cu 32 de registri generali de 8 biti fiecare,care sunt accesati intr-un singur impuls de tact . Asta inseamna ca ALU executa o operatie logica intr-un singur ciclu. Sase din cei 32 de registrii pot fi folositi ca trei registrii de 16 biti.Acesti registrii sunt denumiti X,Y si Z. Unitatea aritmetica logica poate realiza functii intre registrii sau intre un registru si o constanta.Operatiile cu un singur registru sunt executate tot in unitatea aritmetica logica. Microprocesorul poate adresa direct registrii.Cei 32 de registrii sunt asignate adresela $00 pana la $1F. Memoria de I/O are 64 de adrese pentru periferice : $20 pana la $5F. Microprocesorul este realizat pe baza unei structuri Harvard . Acesta separa memoria de date de cea de program. Programul din memoria este executat cu ajutorul a doua structuri pipe-line.Cat timp o instructiune este executata,alta instructiune este aduca din memoria de program si decodata. Acest principiu face ca instructiunea sa fie executata intr-un singur ciclu. Majoritatea instructiunilor sunt codate pe 16 biti.Fiecare adresa de memorie contine o instructiune de 16 sau 32 de biti. La aparitia unei cereri de intrerupere PC este salvat in stiva si se executa procedura alocata intreruperii.Stiva se afla fizic in SDRAM si este limitata doar de dimensiunea acesteia. Toate programele trebuie sa reseteze SP la inceputul lor. Adresa de inceputul a stivei este pe 10 biti si este o locatie unde se poate scrie si citi. Memoria SDRAM este de 512 biti si aceasta poate fi accesata cu 5 moduri de adresare.Memoria are o structura liniara.

Convertorul analogic-digital Convertorul are o rezolutie de 10 biti,timpul de conversie este intre 65 si 260 us,8 intrari multiplexate care permit ca portul A sa fie folosit ca intrare in CAN. Schema bloc a convertorului:

CAN-ul converteste o tensiune analogica la o valoarea numerica de 10 biti aproximand succesiv.Valoarea minima este setata de AGND si valoarea maxima este data de AVCC. Portul de intrare este selectat daca se scrie in ADMUX. Orice intrare a portului A poate fi selectata o singura intrare in convertorul analogic-numeric. Convertorul poate functiona in doua moduri : Single Conversion si Free Running.In primul mod fiecare conversie este activata de user,iar in a doua se scrie constant in registrul ADC-urului.Bitul ADFR din registrul ADCSR

selecteaza cele doua moduri . ADC-ul este activat daca se selecteaza bitul ADEN din ADCSR . ADC-ul nu consuma putere cand bitul ADEN nu este setat. Conversia incepe atunci cand este scris 1 logic in ADSC.Acest bit este setat automat in 0 cand conversia se termina.Dupa ce se termina conversia rezultatul de 10 biti este trecut in ADCH si ADCL. Senzorul de temperatura Senzorul de temperatura este relizat din Cupru si are coeficientul de temperatura 0.00427 in oC. Rezistenta traducatorului la 0oC este de 10 ohm. Acuratetea la 0 oC este de .2%.Acesta este realizat de firma Pyromation. El este realizat cu un singur fir . Configuratia fizica a senzorilor :

Deci daca aplicam o sursa de curent constanta de 10 mA o sa avem la iesire o tensiune intre 10 si 200 mV.

Schema sursei de curent Temperatura afisata se calculeaza astfel : Temp=0.525*numarul de la CAN-230 Convertorul analogic-numaric are tensiunea de referinta de 5V . El este pe 10 biti deci : NR CAN=tensiune(mv)*4,887 Dependenta traductorului de temperatura :
temperatura C -200 -190 -180 -170 -160 -150 -140 -130 -120 -110 -100 -90 -80 -70 -60 R ohm 1,058 1,472 1,884 2,295 2,705 3,113 3,519 3,923 4,327 4,728 5,128 5,526 5,923 6,318 6,712 Tensiunea de intrare mv 10,58 14,72 18,84 22,95 27,05 31,13 35,19 39,23 43,27 47,28 51,28 55,26 59,23 63,18 67,12 nr in zecimal dat de CAN 52 72 92 112 132 152 172 192 211 231 251 270 289 309 328

-50 -40 -30 -20 -10 0 0 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200 210 220 230 240 250 260

7,104 7,49 7,876 8,263 8,649 9,035 9,035 9,421 9,807 10,194 10,58 10,966 11,352 11,738 12,124 12,511 12,897 13,283 13,669 14,055 14,442 14,828 15,217 15,607 15,996 16,386 16,776 17,166 17,555 17,945 18,335 18,726 19,116

71,04 74,9 78,76 82,63 86,49 90,35 90,35 94,21 98,07 101,94 105,8 109,66 113,52 117,38 121,24 125,11 128,97 132,83 136,69 140,55 144,42 148,28 152,17 156,07 159,96 163,86 167,76 171,66 175,55 179,45 183,35 187,26 191,16

347 366 385 404 423 442 442 460 479 498 517 536 555 574 592 611 630 649 668 687 706 725 744 763 782 801 820 839 858 877 896 915 934

Transformarea de la binar la 7 seg(portC) 1 2 3 4


Configuratia portului C Numarul in

6 5

Numar

numar binar in

0 1 2 3 4 5 6 7 8 9

0 0 0 0 0 0 0 0 1 1

0 0 0 0 1 1 1 1 0 0

0 0 1 1 0 0 1 1 0 0

0 1 0 1 0 1 0 1 0 1

1 0 1 1 0 1 1 1 1 1

1 0 0 0 1 1 1 0 1 1

1 0 1 0 0 0 1 0 1 0

1 0 1 1 0 1 1 0 1 1

1 0 0 1 1 1 1 1 1 1

1 1 1 1 0 0 0 1 1 1

0 1 1 1 1 1 1 0 1 1

3F 60 6B 79 5D 5B 5F 31 7F 7B

Schema bloc a montajului

- uP este AT90LS8535 - butoanele sunt cu o singura pozitie si se poate apasa numai un singur buton - RTD sunt Cu 10 - Display este un MDE cu 4 digiti care este contrololat pe portul D,iar pe portul C se transmite informatia care trebuie afisata -bitul de semn este afisat cu un singur LED Algoritmul programului :

- se initializeaza portulA de intrare,portulB de intrare, portulD de iesire si portul C tot de iesire - se verifica apasarea unui buton de la portul B,adica daca se incarca portul B cu 1 logic - atunci cand va fii apasat un buton se va converti tensiunea intr-un numar cu ajutorul convertorului si se va calcula temperatura dupa formula de mai sus.Aceasta temperatura ca fii afisata continuu pana cand se va apasa alt buton - temperatura medie va fi actualizata continuu PROGRAMUL .cseg .org $0000 ;*****DEFINITII*********8 .equ SREG=$3f .equ PORTA=$1b .equ DDRA=$1a .equ PINA =$19 .equ PORTB=$18 .equ DDRB=$17 .equ PINB =$16 .equ PORTC=$15 .equ DDRC=$14 .equ PINC =$13 .equ PORTD=$12 .equ DDRD=$11 .equ PIND =$10 .equ ACSR=$08 .equ ADMUX=$07 .equ ADCSR=$06 .equ ADCH=$05 .equ ADCL=$04 .def ZL=r30 .def ZH=r31 .def min=r22 ;in registrul R1 salvez min .def butoane=r23 ;retinere butoane .def temp=r24 ;o variabila temporara .def zece=r25

.def temp2=r16 loop main main: ldi temp2,0x00 out DDRA,temp2 ; SETARE PORT A DE INTRARE out DDRBtemp2 ; SETARE PORT B DE INTRARE ldi temp2,0xFF out DDRC,temp2 ; SETARE PORT C DE IESIRE out DDRD,temp2 ; SETARE PORT D DE IESIRE ldi min,0xFF ; reg min se initializeaza cu valoarea cea ;mai mare ldi temp2,0x38 out ADCSR,temp2 ; incepere conversii -> 111000 ; conversie free running mov ZL,0x00 loop: in butoane,PINB ldi temp,0x01 cp temp,butoane breq BUTON1 ldi temp,0x02 cp temp,butoane breq BUTON2 ldi temp,0x04 cp temp,butoane breq BUTON3 ldi temp,0x08 cp temp,butoane breq BUTON4 ldi temp,0x10 cp temp,butoane breq BUTON5 ldi temp,0x20 cp temp,butoane breq BUTON6 ldi temp,0x40 cp temp,butoane ; citire butoane de la portul B ;sari daca este egal

breq BUTON7 call AFISARE / se afiseaza in continuu continutul lui ZL jmp loop ; reia ciclul loop BUTON1: ;subrutina pentru apasarea butonului 1 clr temp2 ldi ADMUX,temp2 ; selectare primul traductor in ZL,ADCL in ZH,ADCH ldi temp,ZH lsr ZL ;impart cu 2 lsr temp lsr temp ; impart cu 4 add ZL,temp ; acuma in ZL am numarul temperaturii ; s-a folosit formula de calcul de mai sus call AFISARE BUTON 2: clr temp2 ldi ADMUX,temp2 ; selectare traductor in ZL,ADCL in ZH,ADCH ldi temp,ZH lsr ZL lsr temp lsr temp add ZL,temp call AFISARE ret ; intoarcere din subrutina BUTON 3: ldi temp2,0x03 ldi ADMUX,temp2 ; selectare traductor in ZL,ADCL in ZH,ADCH ldi temp,ZH lsr ZL lsr temp lsr temp

add ZL,temp call AFISARE ret

; intoarcere din subrutina

BUTON 4: ldi temp2,0x04 out ADMUX, temp2 ; selectare traductor in ZL,ADCL in ZH,ADCH ldi temp,ZH lsr ZL lsr temp lsr temp add ZL,temp call AFISARE ret ; intoarcere din subrutina BUTON 5: ldi temp2,0x05 out ADMUX,temp2 ; selectare traductor in ZL,ADCL in ZH,ADCH ldi temp,ZH lsr ZL lsr temp lsr temp add ZL,temp call AFISARE ret ; intoarcere din subrutina BUTON 6: ldi temp2,0x06 out ADMUX,temp2 ; selectare traductor in ZL,ADCL in ZH,ADCH ldi temp,ZH lsr ZL lsr temp lsr temp

add ZL,temp call AFISARE ret

; intoarcere din subrutina

BUTON 7: Ldi temp2,0x07 out ADMUX,temp2 ; selectare traductor in ZL,ADCL in ZH,ADCH ldi temp,ZH lsr ZL lsr temp lsr temp add ZL,temp call AFISARE ret ; intoarcere din subrutina AFISARE: ldi temp,min sub temp,ZL tst temp ldi min,zl cbi PORTD,4 tst ZL sbrc sreg,4 sbi PORTD,4 ;subrutina de afisare ; testare daca ZL>min ; daca da atunci mutare ZL in min ; ; ; ; stergere setare semn testare daca ZL este negativ skip daca nu e negativ setare semn

ldi temp,ZL ldi zece,0x1010; am setat numarul 10 call impartire ;fac impartire la 10rezultatul se pune in r0 ldi temp,r0 call impartire ;mai fac o data impartirea la zece ;acuma am in r0 prima cifra a numarului scrisa in baza 2 call AFISARE_CIFRA3 ; afisarea lui r0 (4 biti )

;acum se fac 3 imultiri cu 10 mul temp,zece ldi temp,r0 mul temp,zece sub ZL,r0 ;acuma mai sunt numai doua cifre ldi temp,ZL call impartire; call AFISARE_CIFRA2 mul temp,zece sub ZL,r0 ldi r0,ZL call AFISARE_CIFRA1 ret impartire: ;impartirea la zece se face=2-3-2-5+2-7 ;numarul se citeste din temp shi ;se pune in r0

mov r0,temp lsr r0 ;impartire la 2^-3 lsr r0 lsr r0 mov r1,temp lsr r1 ;impartire la 2^-5 lsr r1 lsr r1 lsr r1 lsr r1 sub r0,r1 ;fac scaderea mov r1,temp lsr r1 lsr r1 lsr r1 lsr r1 lsr r1 lsr r1 lsr r1 add r0,r1 ;fac adunarea ;gata am in r0

ret AFISARE_CIFRA3: ;afisare continut r0,in afisorul 3 ldi temp2,0x04 out PORTD,temp2 ;100 AFISARE_CIFRA; ret AFISARE_CIFRA2: ;afisare continut r0,in afisorul 2 ldi temp2,0x02 out PORTD,temp2 ;010 AFISARE_CIFRA; ret AFISARE_CIFRA1: ;afisare continut r0,in primul afisorul ldi temp2,0x01 out PORTD,temp2 ;001 AFISARE_CIFRA; ret AFISARE_CIFRA: cp ro,0x00 breq CIFRA0 cp ro,0x01 breq CIFRA1 cp ro,0x02 breq CIFRA2 cp ro,0x03 breq CIFRA3 cp ro,0x04 breq CIFRA4 cp ro,0x05 breq CIFRA6 cp ro,0x07 breq CIFRA7 cp ro,0x08 breq CIFRA8 cp ro,0x09 breq CIFRA9 ;afisare o cifra

ret CIFRA0: ldi temp2,0x3F out PORTC,temp2 ret CIFRA1: ldi temp2,0x60 out PORTC,temp2 ret CIFRA2: ldi temp2,0x6B out PORTC,temp2 ret CIFRA3: ldi temp2,0x79 out PORTC,temp2 ret CIFRA4: ldi temp2,0x5D out PORTC,temp2 ret CIFRA6: ldi temp2,0x5F out PORTC,temp2 ret CIFRA7: ldi temp2,0x31 out PORTC,temp2 ret CIFRA8: ldi temp2,0x7F out PORTC,temp2 ret CIFRA9: ldi temp2,0x7B out PORTC,temp2 ret

.end