• Non ci sono risultati.

Programma micro-controllore Appendice A

N/A
N/A
Protected

Academic year: 2021

Condividi "Programma micro-controllore Appendice A"

Copied!
13
0
0

Testo completo

(1)

Appendice A

Programma micro-controllore

. .include "8515def.inc" ;.include "tabella.txt" .equ rs=$d0 .equ rw=$d1 .equ buffer_display=$d2 .equ clear=$01 .equ returnhome=$02

.equ entrymodeset=$06 ; I/D=1 S=0 .equ displaycontrol=$0c ; D=1 C=0 B=0 .equ displaycontroloff=$08 ; D=0 C=0 B=0 .equ cursordisplay=$10 .equ functionset=$38 ; DL=1 N=1 F=0 .equ setcgram=$40 .equ setddramL1=$80 .equ setddramL2=$c0 .equ CONVL=$d3 .equ CONVH=$d4 .equ DISPL=$d5 .equ DISPH=$d6 .equ virgola=$d7

;la ram $a8 e $a9 e' utilizzata per i 12 bit da mandare al DAC

.equ bin12dac=$d8

;ram in cui scrivo i codici ascii che ottengo dal binario dell'ADC

;$aa-$ad .equ buffer_ascii=$da .equ MEDIAL=$de .equ MEDIAH=$df .equ valorel=$e0 .equ valoreh=$e1 .equ saltol=$e2 .equ saltoh=$e3 .equ fsoglia=$e5 .equ periodoL=$e6 .equ periodoH=$e7 .equ soglia0L=$e8 .equ soglia0H=$e9 .equ soglia1L=$ea .equ soglia1H=$eb .equ Nportatal=$ec .equ Nportatah=$ed .equ portatal=$ee .equ portatah=$ef

;definizioni dei registri usati .def count = r20 .def temp = r21 .def temp2 = r22 .def temp3 = r23 .def flag = r24 .def temp0=r25 ;costanti:

;NB: quando si aggiungono parole in cseg occorre aggiornare Nword

.equ buff_len = 40 ;lunghezza del buffer (40 caratteri)

(2)

.equ bufS_len = 10 ;lunnghezza del buffer_str

.equ Nword = 7 ;numero di parole su cui fare il confronto

rjmp inizio ; reset nop ; int0 nop ; int1 nop ; timer capt rjmp timer ; timer comp A nop ; timer comp B nop ; timer over nop ; timer 0 overflow nop ; spi trens compl rjmp ricevuto ; uart rx reti ; udr empty reti ; uart tx compl nop ; comparator inizio: ldi temp,high(RAMEND) out SPH,temp

ldi temp,low(RAMEND) out SPL,temp

nop

;carica in ram la tabella ldi xl,low(tabella) ldi xh,high(tabella) ldi zl,low(2*valori) ldi zh,high(2*valori) lpm mov r18,r0 carica_tab: cpi r18,0 breq tab_compl adiw zl,1 lpm st x+,r0 dec r18 rjmp carica_tab tab_compl: nop ldi temp,0b10011000 ; Inizializza la UART. out UCR,temp ldi temp,$17 out UBRR,temp ldi XL,low(buffer) ldi XH,high(buffer) ldi count,$00 sts buf_pointL,XL sts buf_pointH,XH sts buf_count,count ldi flag,$00 sei cicloinf: nop sbrs flag,0 rjmp cicloinf rcall prepara rjmp cicloinf ;procedura di ricezione:

;mette il dato in temp, poi lo mette nel buffer controlla di non averlo saturato

ricevuto: in temp,UDR ;eco locale rcall scrivi

;confronto con "invio" cpi temp,$0d breq settaflag lds XL,buf_pointL lds XH,buf_pointH lds count,buf_count memorizza: st X+,temp sts buf_pointL,XL sts buf_pointH,XH

;aggiorno il contatore buffer,e controllo la lunghezza inc count sts buf_count,count cpi count,buff_len brpl buffer_overflow reti

settaflag: ldi temp,$20 ori flag,$01

; memorizza per salvare lo "spazio" rjmp memorizza buffer_overflow:ldi ZL,low(2*msg1) ldi ZH,high(2*msg1) rcall errore reti

; prepara, interpreta e salvaNCH trasferiscono i dati

; da Buffer generale a buffer_str prepara: ;temp2 contatore

ldi temp2,$00 ldi YL,low(buffer_str) ldi YH,high(buffer_str) adiw YL,1 ldi XL,low(buffer) ldi XH,high(buffer) interpreta: ld temp,X+ cpi temp,$20 breq salvaNCH st Y+,temp inc temp2 rjmp interpreta

salvaNCH: ldi YL,low(buffer_str) ldi YH,high(buffer_str) st Y,temp2

confronta1: ldi temp3,00

ldi ZL,low(2*inizio_parole) ldi ZH,high(2*inizio_parole) ldi YL,low(buffer_str) ldi YH,high(buffer_str) lpm mov temp2,r0

;i confronti da fare sono 1 in + rispetto al numero di char

(3)

inc temp2 ori flag,$02 confronta2: ld temp,Y+ lpm adiw ZL,1 cpse r0,temp andi flag, $fd mov temp,r0

confronta3: dec temp2 cpi temp2,$00

brne confronta2 sbrc flag,1

rjmp caricasub nuovaparola: inc temp3

cpi temp3, Nword breq non_trovato ldi YL,low(buffer_str) ldi YH,high(buffer_str) adiw ZL,2 lpm mov temp2,r0 inc temp2 ori flag,$02 rjmp confronta2

caricasub: ;occorre risettare il flag andi flag,0b11111100 ;indirizza correttamente Z lpm mov temp,r0 adiw ZL,1 lpm mov temp2,r0 mov ZL,temp mov ZH,temp2 icall ;risetta le impostazioni iniziali ldi xl,low(buffer) ldi xh,high(buffer) ldi count,$00 sts buf_pointL,XL sts buf_pointH,XH sts buf_count,count ret

non_trovato: ldi ZL,low(2*msg2) ldi ZH,high(2*msg2) rcall errore ldi count,$00 ret

convertiDA: ;ricavo high nibble del primo dato ld temp,X+ rcall intervallo1 lsl temp lsl temp lsl temp lsl temp mov temp2,temp

;ricavo low nibble del primo dato

ld temp,X+

rcall intervallo1

;memorizzo in temp2 il risultato or temp2,temp

;ricavo high nibble del secondo dato ld temp,X+ rcall intervallo1 lsl temp lsl temp lsl temp lsl temp mov temp3,temp

;ricavo low nibble del secondo dato

ld temp,X+

rcall intervallo1

;memorizzo in temp3 il risultato or temp3,temp

;adesso in temp2 ho il primo dato e in temp3 il secondo

sts bin12dac,temp2 sts bin12dac+1,temp3 rcall ini_dac rcall dac ret

intervallo1: cpi temp,$30 ;intervallo ["0".."9"] brmi fuori_intervallo cpi temp,$3a brpl intervallo2 subi temp,$30 rjmp fine intervallo2: cpi temp,$41 ;intervallo ["A".."F"] brmi fuori_intervallo cpi temp,$47 brpl intervallo3 ldi r25,$19 add temp,r25 ldi r25,$0f and temp,r25 rjmp fine intervallo3: cpi temp,$61 ;intervallo ["a".."f"] brmi fuori_intervallo cpi temp,$67 brpl fuori_intervallo ldi r25,$19 add temp,r25 ldi r25,$0f and temp,r25 rjmp fine fuori_intervallo: ldi ZL,low(2*msg3) ldi ZH,high(2*msg3) rcall errore

(4)

fine: ret

convertiAD:

rcall media

ldi r18,2 ; carico posizione sts virgola,r18 ; virgola in ram (0=senza virgola) lds r18,MEDIAL sts DISPL,r18 lds r18,MEDIAH sts DISPH,r18 rcall bin_ascii rcall invia_uart ;rcall invia_display ret

;la routine "errore" prende come ingresso il valore di Z che deve indirizzare ;uno dei messaggi di errore (che devono finire con $00 : fine messaggio) errore: lpm adiw ZL,1 mov temp,r0 cpi temp,$00 breq fine_msg rcall scrivi rjmp errore

fine_msg: ;resetta le impostazioni iniziali ldi XL,low(buffer) ldi XH,high(buffer) ldi count,$00 sts buf_pointL,XL sts buf_pointH,XH sts buf_count,count andi flag,0b11111100 ret

scrivi: sbis USR,5 rjmp scrivi out UDR,temp ret

.dseg

buffer: .byte buff_len buffer_str : .byte bufS_len buf_pointL : .byte 1 buf_pointH : .byte 1 buf_count: .byte 1 tabella: .byte 38 .cseg valori: .db 38, $05,$0d, $30,$75, $cd,$01, $83,$06, $20,$4e, $c7,$01, $06,$05, $f8,$2a, $c0,$01, $f4,$01, $58,$1b, $b8,$01, $4d,$01, $a0,$0f, $af,$01, $7d,$00, $d0,$07, $9f,$01,0 msg1:

.db "Overflow del buffer ",$0d,$00 msg2:

.db "Parola non trovata",$0d,$00

msg3:

.db "Argomento di DAC non valido ",$0d,$00 inizio_parole: .db 3,"DAC",low(convertiDA),high(convertiDA) .db 3,"ADC",low(convertiAD),high(convertiAD) .db 3,"fsa",low(stand_alone),high(stand_alone ) .db 3,"sla",low(modo_slave),high(modo_slave) .db 3,"low",low(mod_soglia0),high(mod_soglia0 ) .db 3,"hig",low(mod_soglia1),high(mod_soglia1 ) .db 3,"per",low(mod_periodo),high(mod_periodo ) ;**************************************** ****************************

;inizializza i pin che servono al DAC ;**************************************** ****************************

ini_dac: sbi DDRA,7 ;SCLK

sbi DDRA,3 ;SYNC attivo basso sbi DDRA,5 ;SDIN linea dati cbi PORTA,7

sbi PORTA,3

cbi PORTA,3 ;inizio invio dati ret

;**************************************** ****************************

;invia al DAC 12 bit leggendoli in ram iniziando da bin12dac (byte basso) ;**************************************** **************************** dac: push r17 push r19 push r20 lds r19,bin12dac lds r20,bin12dac+1 ldi r17,8

loop1: sbi PORTA,7 rol r19 brcs setta1 cbi PORTA,5 rjmp continua1 setta1: sbi PORTA,5 continua1: nop nop nop cbi PORTA,7 dec r17 brne loop1 ldi r17,8 loop2: sbi PORTA,7 rol r20 brcs setta2 cbi PORTA,5 rjmp continua2 setta2: sbi PORTA,5 continua2: nop

(5)

nop nop cbi PORTA,7 dec r17 brne loop2 pop r20 pop r19 pop r17 ret ;**************************************** ****************************

;setta i PIN della PORTA B che servono alla procedura conv

;**************************************** **************************** ini_conv: sbi DDRB,6 ;clock

sbi DDRB,2 ;start convert cbi DDRB,4 ;dati sbi PORTB,6 sbi PORTB,2 ret ;**************************************** ****************************

;media il valore dell'adc su 16 letture ;**************************************** **************************** media: push r16 push r17 push r18 push r19 push r20 push r21 ldi r16,0 ldi r17,0 ldi r21,17 leggi_valore: dec r21 cpi r21,0 breq dividi rcall ini_conv rcall conv ldi r19,4 pausa2: dec r19 ldi r18,168 pausa: dec r18 nop nop nop cpi r18,0 brne pausa cpi r19,0 brne pausa2 lds r18,CONVL add r16,r18 lds r18,CONVH adc r17,r18 rjmp leggi_valore dividi: swap r16 ldi r18,$0f and r16,r18 mov r19,r17 swap r19 ldi r20,$f0 and r19,r20 or r16,r19 swap r17 and r17,r18 sts MEDIAL,r16 sts MEDIAH,r17 pop r21 pop r20 pop r19 pop r18 pop r17 pop r16 ret ;**************************************** ****************************

;scrive i 12 bit ricevuti in ram in CONVH e CONVL

;connessioni: clock-porta B pin 6 ; start convert-porta B pin 2 ; dati seriali in ingresso- porta B pin 4 ;**************************************** **************************** conv: push r18 push r21 push r22 sbi PORTB,6 ldi r22,0

cbi PORTB,2 ;impulso basso di start conv nop nop nop cbi PORTB,6 nop nop nop sbi PORTB,6 nop nop nop cbi PORTB,6 nop nop nop sbi PORTB,6 ;1 nop in r18,PINB bst r18,4 bld r22,3 cbi PORTB,6 nop nop sbi PORTB,6 ;2 nop in r18,PINB bst r18,4 bld r22,2 cbi PORTB,6 nop nop sbi PORTB,6 ;3 nop in r18,PINB bst r18,4 bld r22,1 cbi PORTB,6 nop nop

(6)

sbi PORTB,6 ;4 nop in r18,PINB bst r18,4 bld r22,0 cbi PORTB,6 nop nop sbi PORTB,6 ;5 nop in r18,PINB bst r18,4 bld r21,7 cbi PORTB,6 nop nop sbi PORTB,6 ;6 nop in r18,PINB bst r18,4 bld r21,6 cbi PORTB,6 nop nop sbi PORTB,6 ;7 nop in r18,PINB bst r18,4 bld r21,5 cbi PORTB,6 nop nop sbi PORTB,6 ;8 nop in r18,PINB bst r18,4 bld r21,4 cbi PORTB,6 nop nop sbi PORTB,6 ;9 nop in r18,PINB bst r18,4 bld r21,3 cbi PORTB,6 nop nop sbi PORTB,6 ;10 nop in r18,PINB bst r18,4 bld r21,2 cbi PORTB,6 nop nop sbi PORTB,6 ;11 nop in r18,PINB bst r18,4 bld r21,1 cbi PORTB,6 nop nop sbi PORTB,6 ;12 nop in r18,PINB bst r18,4 bld r21,0 cbi PORTB,6 nop nop nop sbi PORTB,6 nop nop nop cbi PORTB,6 sts CONVL,r21 sts CONVH,r22 sbi PORTB,2 pop r22 pop r21 pop r18 ret ;**************************************** ****************************

;interpreta come numero binario i 16 bit nelle locazioni

;DISPL e DISPH della ram

;**************************************** **************************** bin_ascii: push r16 push r19 push r20 push r21 push r22 push r23 push r24

ldi r20,0 ; pulisco reg ldi r21,0 ; in cui scrivero' ldi r22,0 ; le cifre decimali ldi r23,0

ldi r24,0

lds r16,DISPL ;inizio algoritmo sbrc r16,0 ;per la conversione rcall somma1 sbrc r16,1 rcall somma2 sbrc r16,2 rcall somma4 sbrc r16,3 rcall somma8 sbrc r16,4 rcall somma16 sbrc r16,5 rcall somma32 sbrc r16,6 rcall somma64 sbrc r16,7 rcall somma128 lds r16,DISPH sbrc r16,0 rcall somma256 sbrc r16,1 rcall somma512 sbrc r16,2 rcall somma1024 sbrc r16,3 rcall somma2048 sbrc r16,4 rcall somma4096 sbrc r16,5 rcall somma8192 sbrc r16,6 rcall somma16384 sbrc r16,7 rcall somma32768

ldi r19,$30 ;trasformo cifre decimali

add r20,r19 ;in codice ascii add r21,r19

(7)

add r22,r19 add r23,r19 add r24,r19 sts buffer_ascii,r20 sts buffer_ascii+1,r21 sts buffer_ascii+2,r22 sts buffer_ascii+3,r23 sts buffer_ascii+4,r24 pop r24 pop r23 pop r22 pop r21 pop r20 pop r19 pop r16 ret ;**************************************** ****************************

;TRAMITE LA UART INVIA AL PC I CODICI ASCII CHE TROVA IN RAM

;A PARTIRE DA buffer_ascii ;**************************************** **************************** invia_uart: push r16 push r20 push r21 push r22 push r23 push r24 lds r20,buffer_ascii lds r21,buffer_ascii+1 lds r22,buffer_ascii+2 lds r23,buffer_ascii+3 lds r24,buffer_ascii+4

out UDR,r24 ;invio decimigliaia wait0:

;ritardo_tx

sbis USR,5 rjmp wait0

out UDR,r23 ;invio migliaia wait1:

;ritardo_tx

sbis USR,5

rjmp wait1

out UDR,r22 ;invio centinaia wait2: ;ritardo_tx sbis USR,5

rjmp wait2

out UDR,r21 ;invio decine wait3: ;ritardo_tx sbis USR,5

rjmp wait3

out UDR,r20 ;invio unita wait4: ;ritardo_tx sbis USR,5 rjmp wait4 ldi r16,$0d

out UDR,r16 ;invio il carattere CR wait5: ;ritardo_tx sbis USR,5 rjmp wait5 pop r24 pop r23 pop r22 pop r21 pop r20 pop r16 ret ;**************************************** ****************************

;fa comparire sul display le cifre decimali del numero

;posiziona il punto in modo da avere tante cifre decimali

;quante ne indica 'virgola' ; collegamenti:

; ENABLE <-> PORT A bit 0 ; R/W <-> PORT A bit 1 ; RS <-> PORT A bit 2 ; DB7-DB0 (buffer_display) <-> PORT C ;**************************************** **************************** invia_display: push r16 push r17 push r18 push r19 push r20 push r21 push r22 push r23 push r24 push r25 lds r20,buffer_ascii lds r21,buffer_ascii+1 lds r22,buffer_ascii+2 lds r23,buffer_ascii+3 lds r24,buffer_ascii+4 ldi r18,$ff ; abilita le porte A e C..

out DDRA,r18 ; ..in uscita out DDRC,r18 ldi r18,displaycontroloff; spegne display sts buffer_display,r18 ldi r18,0 sts rs,r18 rcall invia ldi r18,clear ; cancella display

sts buffer_display,r18 ldi r18,0

sts rs,r18 rcall invia

ldi r18,setddramL1 ; setta setddram

sts buffer_display,r18 ldi r18,0

sts rs,r18 rcall invia

ldi r18,functionset ; setta functionset

sts buffer_display,r18 ldi r18,0

(8)

sts rs,r18 rcall invia rcall invia ldi r18,' ' sts buffer_display,r18 ldi r18,1 sts rs,r18 rcall invia

ldi r18,1 ;controllo su pos virgola lds r25,virgola sts rs,r18 sts buffer_display,r24 ;scrivo 1a cifra rcall invia

cpi r25,4 ;controllo su pos virgola brne virg2 rcall punto virg2: sts buffer_display,r23 ;scrivo 2a cifra rcall invia

cpi r25,3 ;controllo su pos virgola brne virg3 rcall punto virg3: sts buffer_display,r22 ;scrivo 3a cifra rcall invia

cpi r25,2 ;controllo su pos virgola brne virg4 rcall punto virg4: sts buffer_display,r21 ;scrivo 4a cifra rcall invia

cpi r25,1 ;controllo su pos virgola brne virg5 rcall punto virg5: sts buffer_display,r20 ;scrivo 5a cifra rcall invia ldi r18,' ' sts buffer_display,r18 rcall invia ldi r18,'m' sts buffer_display,r18 rcall invia ldi r18,'l' sts buffer_display,r18 rcall invia ldi r18,'/' sts buffer_display,r18 rcall invia ldi r18,'m' sts buffer_display,r18 rcall invia ldi r18,'i' sts buffer_display,r18 rcall invia ldi r18,'n' sts buffer_display,r18 rcall invia

ldi r18,displaycontrol ; setta displaycontrol sts buffer_display,r18 ldi r18,0 sts rs,r18 rcall invia pop r25 pop r24 pop r23 pop r22 pop r21 pop r20 pop r19 pop r18 pop r17 pop r16 ret somma1: ldi r19,1 rcall sommaunita ret somma2: ldi r19,2 rcall sommaunita ret somma4: ldi r19,4 rcall sommaunita ret somma8: ldi r19,8 rcall sommaunita ret somma16: ldi r19,6 rcall sommaunita ldi r19,1 rcall sommadecine ret somma32: ldi r19,2 rcall sommaunita ldi r19,3 rcall sommadecine ret somma64: ldi r19,4 rcall sommaunita ldi r19,6 rcall sommadecine ret somma128: ldi r19,8 rcall sommaunita ldi r19,2 rcall sommadecine ldi r19,1 rcall sommacentinaia ret somma256: ldi r19,6 rcall sommaunita ldi r19,5 rcall sommadecine ldi r19,2 rcall sommacentinaia ret

(9)

somma512: ldi r19,2 rcall sommaunita ldi r19,1 rcall sommadecine ldi r19,5 rcall sommacentinaia ret somma1024: ldi r19,4 rcall sommaunita ldi r19,2 rcall sommadecine ldi r19,1 rcall sommamigliaia ret somma2048: ldi r19,8 rcall sommaunita ldi r19,4 rcall sommadecine ldi r19,2 rcall sommamigliaia ret somma4096: ldi r19,6 rcall sommaunita ldi r19,9 rcall sommadecine ldi r19,4 rcall sommamigliaia ret somma8192: ldi r19,2 rcall sommaunita ldi r19,9 rcall sommadecine ldi r19,1 rcall sommacentinaia ldi r19,8 rcall sommamigliaia ret somma16384: ldi r19,4 rcall sommaunita ldi r19,8 rcall sommadecine ldi r19,3 rcall sommacentinaia ldi r19,6 rcall sommamigliaia ldi r19,1 rcall sommadecimigli ret somma32768: ldi r19,8 rcall sommaunita ldi r19,6 rcall sommadecine ldi r19,7 rcall sommacentinaia ldi r19,2 rcall sommamigliaia ldi r19,3 rcall sommadecimigli ret sommaunita: add r20,r19 cpi r20,10 brmi fine1 subi r20,10 ldi r19,1 rjmp sommadecine fine1: ret sommadecine: add r21,r19 cpi r21,10 brmi fine2 subi r21,10 ldi r19,1 rjmp sommacentinaia fine2: ret sommacentinaia: add r22,r19 cpi r22,10 brmi fine3 subi r22,10 ldi r19,1 rjmp sommamigliaia fine3: ret sommamigliaia: add r23,r19 cpi r23,10 brmi fine4 subi r23,10 ldi r19,1 rjmp sommadecimigli fine4: ret sommadecimigli: add r24,r19 ret

invia: cbi PORTA,1 ; setta write lds r18,rs

cpi r18,1 ; valuta RS brne lab3

sbi PORTA,2 ; setta RS rjmp lab4

lab3: cbi PORTA,2 ; resetta RS lab4: lds r18,buffer_display

out PORTC,r18 ; fissa i dati nop

sbi PORTA,0 ; setta enable nop

nop nop

cbi PORTA,0 ; resetta enable ldi r17,$ff wait11: dec r17 cpi r17,0 nop brne wait11 ret

punto: ldi r18,$2e ;scrive la virgola sts buffer_display,r18 ldi r18,1 sts rs,r18 rcall invia ret ;**************************************** **************************** ;FUNZIONAMENTO STAND-ALONE ;**************************************** **************************** stand_alone: push r18 push r19

ldi r18,0 ;inizializza flag soglia

(10)

ldi r18,$00

sts periodoL,r18 ;inizializza periodo (circa 2sec)

ldi r18,$30 sts periodoH,r18

ldi r18,$0e ;inzializza soglie sts soglia0L,r18 ldi r18,$85 sts soglia0H,r18 ldi r18,$00 sts soglia1L,r18 ldi r18,$26 sts soglia1H,r18 ;inizializza il timer ldi r19,$0 out TCCR1A,r19

ldi r19,$d ;setta il prescale del clock1

out TCCR1B,r19 ;e il reset dopo l'arrivo a compA

in r19,TIMSK

ori r19,$60 ;abilita le interruzioni del timer1

out TIMSK,r19 ;cmpA bit6 lds r19,periodoL ;carica intervallo (parte bassa)

out OCR1AL,r19

lds r19,periodoH ;carica intervallo (parte alta)

out OCR1AH,r19 sei pop r19 pop r18 ret modo_slave: push r19 ldi r19,$8 out TCCR1B,r19 ;spegne il timer rcall scrivi_slave pop r19 ret ;**************************************** **************************** ;TIMER ;**************************************** **************************** timer: push r18 push r19 push r20 push r21

rcall media ;legge il valore dall'ADC (MEDIAL MEDIAH)

lds r18,fsoglia ;legge il flag della soglia

cpi r18,0

brne soglia_alta

lds r19,soglia1L ;carica soglia alta in bin12dac

sts bin12dac,r19 lds r19,soglia1H sts bin12dac+1,r19

ldi r19,1 ;commuta soglia sts fsoglia,r19 lds r18,valorel ;calcola il salto lds r19,valoreh lds r20,MEDIAL lds r21,MEDIAH clv sbc r18,r20 sbc r19,r21 sts valorel,r20 ;registra l'ultimo valore letto

sts valoreh,r21 rjmp startdac

soglia_alta: lds r19,soglia0L ;carica soglia bassa in bin12dac

sts bin12dac,r19 lds r19,soglia0H sts bin12dac+1,r19

ldi r19,0 ;commuta soglia sts fsoglia,r19 lds r18,valorel ;calcola il salto lds r19,valoreh lds r20,MEDIAL lds r21,MEDIAH sts valorel,r20 ;registra l'ultimo valore letto

sts valoreh,r21 clv sbc r20,r18 sbc r21,r19 mov r18,r20 mov r19,r21 startdac: rcall ini_dac

rcall dac ;imposta la nuova soglia sul DAC

lds r20,saltol ;calcola la media con il salto precendente lds r21,saltoh sts saltol,r18 ;registra l'ultimo salto sts saltoh,r19 clv adc r20,r18 adc r21,r19

ldi r18,0 ;azzero il carry ror r18

ror r21 ;divido per 2 ror r20 sts Nportatal,r20 sts Nportatah,r21 rcall portata lds r20,portatal lds r21,portatah

sts DISPL,r20 ;carica portata in DISPL DISPH

sts DISPH,r21

rcall bin_ascii ;visualizza sul display

rcall invia_display lds r19,periodoL ;carica intervallo (parte bassa)

out OCR1AL,r19

lds r19,periodoH ;carica intervallo (parte alta)

out OCR1AH,r19 pop r21 pop r20 pop r19 pop r18 reti

(11)

;**************************************** ***************************

;

;**************************************** *************************** mod_periodo: ;ricavo high nibble del primo dato ld temp,X+ rcall intervallo1 lsl temp lsl temp lsl temp lsl temp mov temp2,temp

;ricavo low nibble del primo dato

ld temp,X+

rcall intervallo1

;memorizzo in temp2 il risultato or temp2,temp

;ricavo high nibble del secondo dato ld temp,X+ rcall intervallo1 lsl temp lsl temp lsl temp lsl temp mov temp3,temp

;ricavo low nibble del secondo dato

ld temp,X+

rcall intervallo1

;memorizzo in temp3 il risultato or temp3,temp

;adesso in temp2 ho il primo dato e in temp3 il secondo

sts periodol,temp3 sts periodoh,temp2 ret

mod_soglia0: ;ricavo high nibble del primo dato ld temp,X+ rcall intervallo1 lsl temp lsl temp lsl temp lsl temp mov temp2,temp

;ricavo low nibble del primo dato

ld temp,X+

rcall intervallo1

;memorizzo in temp2 il risultato or temp2,temp

;ricavo high nibble del secondo dato ld temp,X+ rcall intervallo1 lsl temp lsl temp lsl temp lsl temp mov temp3,temp

;ricavo low nibble del secondo dato

ld temp,X+

rcall intervallo1

;memorizzo in temp3 il risultato or temp3,temp

;adesso in temp2 ho il primo dato e in temp3 il secondo

sts soglia0l,temp2 sts soglia0h,temp3 ret

mod_soglia1: ;ricavo high nibble del primo dato ld temp,X+ rcall intervallo1 lsl temp lsl temp lsl temp lsl temp mov temp2,temp

;ricavo low nibble del primo dato

ld temp,X+

rcall intervallo1

;memorizzo in temp2 il risultato or temp2,temp

;ricavo high nibble del secondo dato ld temp,X+ rcall intervallo1 lsl temp lsl temp lsl temp lsl temp mov temp3,temp

;ricavo low nibble del secondo dato

ld temp,X+

rcall intervallo1

;memorizzo in temp3 il risultato or temp3,temp

;adesso in temp2 ho il primo dato e in temp3 il secondo

sts soglia1l,temp2 sts soglia1h,temp3 ret

;**************************************** ****************************

; scrive SLAVE sul display

;**************************************** **************************** scrivi_slave: push r18

ldi r18,clear ; cancella display

sts buffer_display,r18 ldi r18,0

(12)

rcall invia ldi r18,' ' sts buffer_display,r18 ldi r18,1 sts rs,r18 rcall invia ldi r18,' ' sts buffer_display,r18 ldi r18,1 sts rs,r18 rcall invia ldi r18,' ' sts buffer_display,r18 ldi r18,1 sts rs,r18 rcall invia ldi r18,' ' sts buffer_display,r18 ldi r18,1 sts rs,r18 rcall invia ldi r18,'S' sts buffer_display,r18 rcall invia ldi r18,'L' sts buffer_display,r18 rcall invia ldi r18,'A' sts buffer_display,r18 rcall invia ldi r18,'V' sts buffer_display,r18 rcall invia ldi r18,'E' sts buffer_display,r18 rcall invia pop r18 ret ;**************************************** ****************************

;CALCOLA LA PORTATA IN ml/min

;legge il valore in Nportatal Nportatah ;scrive la portata il ml/min in portatal portatah ;**************************************** **************************** portata: push r14 push r15 push r16 push r17 push r18 push r19 push r20 push r21 push r22 push r23 push r24 push r25 push r26 push r27 lds r18,Nportatal lds r19,Nportatah

cpi r18,$d2 ;controllo sul range massimo brge oltrerange ldi xl,low(tabella) ldi xh,high(tabella) sbiw xl,1 ldi r22,7 successivo: cpi r22,0 dec r22 breq sotto_range adiw xl,5 ld r20,x+ ld r21,x cp r19,r21 brlo successivo cp r18,r20 brlo successivo sbiw xl,5 ld r14,x+ ld r15,x+ ld r16,x+ ld r17,x+ diff: sub r18,r20 sbc r19,r21 ldi r22,0 ldi r23,0 somma11: cpi r18,0 breq somma22 add r22,r14 adc r23,r15 dec r18 rjmp somma11 somma22: cpi r19,0 breq somma55 ldi r18,$ff somma33: cpi r18,0 breq somma44 add r22,r14 adc r23,r15 dec r18 rjmp somma33 somma44: dec r19 rjmp somma22 somma55: add r22,r16 adc r23,r17 sts portatal,r22 sts portatah,r23 sotto_range: rcall sottorange

pop r27 pop r26 pop r25 pop r24 pop r23 pop r22 pop r21 pop r20

(13)

pop r19 pop r18 pop r17 pop r16 pop r15 pop r14 ret oltrerange: push r18 ldi r18,' ' sts buffer_display,r18 ldi r18,1 sts rs,r18 rcall invia ldi r18,' ' sts buffer_display,r18 ldi r18,' ' sts buffer_display,r18 ldi r18,'h' sts buffer_display,r18 ldi r18,'i' sts buffer_display,r18 ldi r18,'g' sts buffer_display,r18 ldi r18,'h' sts buffer_display,r18 pop r18 ret sottorange: push r18 ldi r18,' ' sts buffer_display,r18 ldi r18,1 sts rs,r18 rcall invia ldi r18,' ' sts buffer_display,r18 ldi r18,' ' sts buffer_display,r18 ldi r18,'l' sts buffer_display,r18 ldi r18,'o' sts buffer_display,r18 ldi r18,'w' sts buffer_display,r18 pop r18 ret

Riferimenti

Documenti correlati

Negli ultimi anni, il settore dell'industria alimentare cinese ha registrato un rapido sviluppo, con un tasso di crescita media annua superiore al 20%, pari al doppio

In Chapter III, the Authors will focus on the risks and trade-offs of the Commission’s choice to support the deployment of an all fibre network, while bearing in mind

Ancora una volta, non sono presenti nel testo fenomeni culturali tipici della cultura emittente, sono invece presenti fenomeni socioculturali specifici della

Non è dato sapere perché solo le illustrazioni ad opera di Pagano siano firmate, mentre il suo collaboratore non lascia testimonianza di sé; un’ipotesi probabile è che,

IN-DEPTH ANALYSIS ON “POTENTIAL AND CHALLENGES OF EVOTING IN THE EUROPEAN UNION” LA CORTE ROBERTS E LA TUTELA DELLA LIBERTÀ RELIGIOSA NEGLI STATI UNITI D’AMERICA A cura

4 RSCAS/EUDO-CIT-NP 2013/29 – © 2013 Author.. passed the examinations in the state language and the fundamentals of the Constitution of the Republic of Lithuania. The legal acts do