; **************************************************************************************** ; ; File: AVR_TIMER1.ASM * ; Data: 12.Mar.2004 * ; Version: 1.0 * ; IDE: AVR-Studio 4.0 * ; * ; Autore: Giuseppe Franco - giuseppe.franco@chilab.polito.it * ; Riferimenti: Politecnico di Torino - Laboratorio Materiali e Microsistemi * ; ; **************************************************************************************** ; Questo programma serve ad imparare come utilizzare la periferica ; integrata del timer, in particolare: ; ; --> come configurare i registri del timer utilizzato. ; --> come gestire alcuni eventi generati dal timer ; --> come utilizzare la funzione di 'compare'. ; --> come generare eventi sincroni direttamente sui pin dedicati OCx. ; --> come generare eventi sincroni con la verifica dei flags di stato del timer OCFx. ; --> l'utilizzo delle definizioni standard Atmel per i riferimenti ai bit dei registri. ; ; **************************************************************************************** .NOLIST ;.INCLUDE "C:\programmi\atmel\avr tools\avrassembler\appnotes\8515def.inc" .INCLUDE "C:\usr\develop\atmel\avr tools\avrassembler\appnotes\8535def.inc" .LIST ; Definizione dei registri utilizzati .DEF mp = R16 .DEF n1 = R18 .DEF n2 = R19 main: ; Viene impostato lo stack-pointer ed azzero il registro di stato (tutti gli interrupt sono mascherati) ldi mp,HIGH(RAMEND) out SPH,mp ldi mp,LOW(RAMEND) out SPL,mp ldi mp,0x00 out SREG,mp ldi mp,0b00000011 out DDRC,mp ; Abilito la porta C in uscita sul bit 0 ed 1 per pilotare due led con ; il metodo di scrittura diretta sul pin della porta. ldi mp,0b00100000 out DDRD,mp ; Abilito la porta D sul bit 5 in uscita per avere la commutazione ; automatica del pin quando avviene l'evento di comparazione. ldi mp,0b00000011 out PORTC,mp ; Spengo tutti i led sulla porta C ; Vengono impostati i registri di controllo del timer 1 TCCR1A e TCCR1B ; Questi registri in generale controllano il funzionamento del timer, per le ; diverse modalità operative ( funzione di output-compare su un pin di uscita ; dedicato, funzione di PWM, funzione di input-capture da un pin, selezione ; della sorgente di clock e di eventuale prescaler, abilitazione o meno degli ; interrupt, etc..). In generale come per tutte le periferiche, quando queste ; sono abilitate, vengono perse le funzionalità di I/O su alcuni pin delle ; porte disponibili, i quali assumono una funzione dedicata: in questo caso ; tali pin possono fungere da uscite per il timer, da ingressi di conteggio, ; o da ingressi di clock esterni. ; ldi mp,(1 << COM1A0) out TCCR1A,mp ldi mp,0 out TCCR1B,mp ; I registri di controllo sono impostati con i valori di 'default': le funzioni di output-compare ; sui pin OC1A e OC1B sono disabilitate, le funzioni PWM sono disabilitate, il timer risulta ; fermo. ; L'istruzione di caricamento immediata è equivalente alla scrittura: 'ldi mp,0b01000000' ; ma in questo modo ci si svincola dal conoscere la posizione assoluta dei bit; se cambiando ; tipologia di microcontrollore, i bit assumono posizioni differenti, tali modifiche saranno ; automaticamente riportate nel file di definizioni incluso all'inizio del programma, ; relativo al tipo di architettura scelta. ldi mp,HIGH(31560) out OCR1AH,mp ldi mp,LOW(31560) out OCR1AL,mp ; I registri di 'compare' sono impostati con il valore su 16 bit (31560) da comparare: ; Affinché tutti i 16 bit vengano trasferiti contemporaneamente nei due registri, ; occorre scrivere prima il byte alto, quindi il byte basso. ldi mp,0 out TCNT1H,mp out TCNT1L,mp ; Viene azzerato il timer. ; anche in questo caso affinché tutti i 16 bit vengano trasferiti contemporaneamente ; nei due registri del timer, occorre scrivere prima il byte alto, quindi il byte basso. ldi mp,(1 << CTC1) | (1 << CS11) | (1 << CS10) out TCCR1B,mp ; Viene avviato il timer con fattore di prescaler posto a 64x e sorgente di clock interna. ; Viene inoltre attivata la modalità di auto azzeramento del timer quando avviene un ; evento di comparazione. ; L'istruzione di caricamento immediata è equivalente alla scrittura: 'ldi mp,0b00001011' ; Anche in questo caso la selezione dei bit avviene utilizzando le definizioni standard ; incluse all'inizio del programma. compare_wait: in mp, TIFR sbrs mp, OCF1A rjmp compare_wait ; Viene verificato in 'polling' il 'flag' di compare del timer1 canale A, OCF1A. ; Questo bit viene impostato ad uno quando la comparazione dà esito positivo. ; Deve essere azzerato dal software se non viene abilitata la relativa interrupt. sbis PORTC, PC0 rjmp set_bit cbi PORTC, PC0 rjmp compare_reset set_bit: sbi PORTC, PC0 rjmp compare_reset ; Viene invertito lo stato di uscita del led sulla porta C ; Occorre notare che il pin 5 della porta D automaticamente commuta quando ; il flag OCF1A risulta impostato, in questo modo si sgrava la CPU del compito ; di commutare l'uscita. Infatti si può notare che entrambi i led commutano alla ; stessa cadenza temporale. compare_reset: in mp, TIFR sbr mp, (1 << OCF1A) out TIFR, mp ; Viene azzerato il bit di stato della comparazione del canale A, OCF1A. rjmp compare_wait ; Viene ripetuto il loop. ; In questo modo ad ogni evento di comparazione il led effettua un lampeggio.