Newsgroup: it.hobby.elettronica.digitale
Titolo: Timer AVR AT8Mega

Salve a tutti!
Mi sto impegnando nel mio primo programma per AVR che utilizza il timer T/C0
ma ho un dubbio...
nei (pochi) esempi che ho trovato la gestione del tempo avviene in una
routine chiusa... es:
                    ldi Count30,30
                    ldi mark80,80
timeloop:      out tcnt0,temp
                    cp temp,mark80
                    brne timeloop
                    subi mark80,-80
                    dec count30
                    brne Timeloop
ovvero da quello che capisco l'esecuzione del programma si blocca in un
ciclo "while...do" lungo 30 x 80 cicli
io invece vorrei avere un programma lineare dove, ad un certo punto, e se si
verificano le condizioni , far partire il timer, continuare a eseguire il
programma ed inserire una routine che verifichi se il tempo x è trascorso
(non deve essere molto accurato, circa 7-10 secondi) e a questo punto
eseguire una operazione, se non è passato tale tempo, continua ad eseguire
il programma...
Immagino che non sia possibile in questo modo ma debba gestire il tutto
tramite interrupt?
Grazie!
Sergio

 tramite interrupt?
ti rispondo in generale, poichč non uso l'asm ma il C. i concetti perň sono
gli stessi.
per fare quello che vuoi la gestione a interrupt č senz'altro la piů comoda.
quando ti serve configuri il timer e lo fai partire. nei registri contatori
avrai inserito il valore che ti serve per ottenere la durata necessaria.
nella routine di interrupt inserisci (dopo aver fermato il timer o resettato
i registri contatori, nonchč il flag di interrupt) il codice che devi
eseguire quando scade il tempo. prima di allora e dopo aver completato la
routine di interrupt la CPU continua ad eseguire le altre istruzioni. se
vuoi ottenere tempi piů lunghi semplicemente all'inizio della routine di
int. incrementa una variabile contatore ed esegui il codice solo se questa
variabile ha raggiunto un valore prefissato.
ciao!
Marco

 variabile ha raggiunto un valore prefissato.
Grazie Marco!
lo sospettavo...
in effetti il manuale che ho parla di un avr "obsoleto" il 1200... che
immagino abbia solo il T/C0 a 8 bit...
l'AT8Mega ha anche (penso) il T/C1 a 16 Bit.. pertanto potrei gestire il
loop senza usare 2 contatori ma con i due bit H e L ... ma mantenendo la
routine di cui sopra questo mi blocca il programma per tutti gli 8
secondi... mentre con il T/C0 ponendo i due contatori a 250 e 125, posso
suddividere (nel mio caso tale tempo in 125) e bloccare pertanto il
programma per 4.000.000/1024/250= 64 msec che č per me accettabile....che
per 125 mi da gli 8 secondi voluti...
Grazie Ancora
Sergio

 per 125 mi da gli 8 secondi voluti...
mmm.... non ti seguo. cioè ho capito cosa intendi, ma mi sfugge per quale
motivo non utilizzi gli interrupt. normalmente le routine chiuse (do - loop
per intenderci) vengono usate quando vuoi ottenere dei ritardi, ovvero
funzioni sospensive per un certo tempo. se invece vuoi che dopo x secondi si
scateni un evento (che non dipende direttamente dal flusso del programma)
allora conviene praticamente sempre utilizzare gli interrupt.
o forse non ho capito io il problema ?
Marco

 allora conviene praticamente sempre utilizzare gli interrupt.
... principalmente perchè non ho ancora affrontato il problema interrupt....
poi anche perchè volevo capire se il ragionamento era giusto...
immagino che con un AT8mega e usando T/C1  a il bit, prescaler a 1024 e T/C1
overflow interrupt posso ottenere i tempi che mi interessano...
Scusa se approfitto.... ma non ho trovato molto sui fuses.. immagino che
programmando in C questo non sia un problema per te... ma se tu avessi
qualche dritta... oltre al datasheet (che ho già scaricato ma è più grande
di un libro...)
Grazie
Sergio

Ciao a tutti
Attento ai fuses !
Leggi bene il datasheets... sono anche io alle prime armo con Mega8
sotto alla tabella della spiegazione ( io o ci avevo fatto caso) spiega che:
Note: 1. For all fuses "1" means unprogrammed while "0" means programmed.
A me viene da capire esattamente il contrario... :-)
E ovviamente ho inchiodato il micro perchè piuttosto che selezionare il
Clock interno
ho scelto quello esterno... ma così facendo non hai più la possibilità di
programmarlo in seriale...
Ho trovato comunque gli aiuti in questo NG ma se eviti di fare queste
scoperte è meglio...
Poi c'è quello che ti permette di configurare PC6 come I/O e non piu come
Reset....
Ma se ci pensi il Reset è fondamentale per la programmazione seriale...
quindi on va piu nulla!
A parte questo mi trovo bene.
Ciao
ALX

 quindi on va piu nulla!
idem come sopra.
buon lavoro!
Marco

 programmarlo in seriale...
Sei sicuro di tutto ciò?
A me è capitato di programmare in-circuit il mio ATmega16 e cambiare questo
fuse.
Ho potuto poi ripristinare via ISP l'oscillatore interno, senza alcun
problema.
Sicuro che tale fuse precluda la programmazione seriale?
Saluti.
Gabriele.
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 ha scritto nel messaggio
news:151Z39Z223Z27Y1...@usenet.libero.it...



