ed ho usato per il micro una frequenza(cristallo esterno) esterna di 4915200 Hz
in poche parole col prescaler di 1024 la frequenza di conteggio del timer counter dovrebbe essere 4800 Hz
ho impostato il TCNT0 in modo che contasse fino a 240 e poi si attiva un interrupt dove incremento un contatore che in quando arriva a 20 mi va a incrementare i secondi fino a 59 (poi inizia ad incrementare i minuti e cosi via)...
non riesco proprio a capire dove sbaglio, gia ad occhio si vede che il conteggio è sbagliato,spero che possiate aiutarmi
questa è la parte di codice che riguarda l'inizializzazione del timer counter
- Codice: Seleziona tutto
;TCNT0
ldi temp,0b00001101 ;uso il TCNT0 con prescaler di 1024 in modalità CTC
out TCCR0,temp
clr temp ;faccio partire TCNT0 da 0
out TCNT0,temp
ldi temp,240 ;imposto il conteggio fino a 240
out OCR0,temp
ldi temp,0b00000010 ;attivo l'interrupt compare match di TCNT0
out TIMSK,temp
questa è la parte che riguarda l'interrupt (questa parte continua ma poi sotto confronta soltanto i registri della sveglia con quelli dell'ora attuale per far suonare la sveglia)
- Codice: Seleziona tutto
OVTCNT0:
inc TIMEH ;incremento TIMEH
cpi TIMEH,20 ;confronto TIMEH con 20
breq PC+2 ;se TIMEH diverso da 20
rjmp sveglia ;vado alla routine controllo sveglia
clr TIMEH ;altrimenti resetto TIMEH
cpi secondi,59 ;se secondi diverso da 59
brne Fine_Inc ;vado salto a Fine_Inc
clr secondi ;altrimenti resetto secondi
cpi minuti,59 ;ripeto la stessa cosa per i minuti
brne Fine_Inc2 ;
clr minuti
cpi ore,23 ;e per le ore impostando limite
brne Fine_Inc3 ;max a 23
clr ore
rcall CGM ;chiamo CGM (controllo giorno max)
cp giorno,VALMAX ;se giorno attuale diverso dal giorno max raggiungibile
brne Fine_Inc4 ;saltiamo sotto
ldi giorno,1 ;altrimenti resetto il contatore dei giorni a 1
cpi mese,12 ; se mese diverso da 12
brne Fine_Inc5 ;salto sotto
ldi mese,1 ;altrimenti resetto mese a 1
inc anno ;ed incremento l'anno
rjmp Fine ;saltando alla fine
Fine_Inc:
inc secondi ;incrementa i secondi
rjmp Fine ;e salta alla fine
Fine_Inc2:
inc minuti ;incrementa i minuti
rjmp Fine ;salta alla fine
Fine_Inc3:
inc ore ;incrementa le ore
rjmp Fine ;e salta alla fine
Fine_Inc4:
inc giorno ;incrementa giorno
rcall fine ;e salta alla fine
Fine_Inc5:
inc mese ;incrementa i mesi
Fine:
sbrs help,4 ;se il bit 4 di help è 1 vuol dire che sto impostando la sveglia quindi non aggiorno il display
rcall lcd_out
mentre questa è la routine che aggiorna il display
- Codice: Seleziona tutto
lcd_out :
ldi dataReg,0b10000000 ;sposto il cursore del display alla posizione 00
rcall LCD_Command ;da dove visualizzero l'ora della sveglia
nop
nop
nop
nop
nop
mov dataReg,ore ;mi salvo il contenuto di ore in dataReg
rcall converti ;converto il contenuto in decine e unità
rcall LCD_w_Data ;invio le decine salvate in dataReg al display
nop
nop
nop
nop
nop
mov dataReg,unita ;dopodiche lo faccio con le
rcall LCD_w_Data ;unita
nop
nop
nop
nop
nop
mov dataReg,duepunti ;invio al display
rcall LCD_w_Data ;il simbolo : tra ore e minuti
nop
nop
nop
nop
nop
mov dataReg,minuti ;mi salvo il contenuto di minuti in dataReg
rcall converti ;converto il contenuto in decine e unità
rcall LCD_w_Data ;invio le decine salvate in dataReg al display
nop
nop
nop
nop
nop
mov dataReg,unita ;dopodiche lo faccio con le
rcall LCD_w_Data ;unita
nop
nop
nop
nop
nop
mov dataReg,punto ;invio al display
rcall LCD_w_Data ;il simbolo punto tra minuti e secondi
nop
nop
nop
nop
nop
mov dataReg,secondi ;mi salvo il contenuto di secondi in dataReg
rcall converti ;converto il contenuto in decine e unità
rcall LCD_w_Data ;invio le decine salvate in dataReg al display
nop
nop
nop
nop
nop
mov dataReg,unita ;dopodiche lo faccio con le
rcall LCD_w_Data ;unita
nop
nop
nop
nop
nop
ldi dataReg,0b10001011 ;sposto il cursore del display alla posizione 11
rcall LCD_Command ;da dove visualizzero l'ora della sveglia
nop
nop
nop
nop
nop
mov dataReg,hh ;invio dati relativi alle ore della sveglia
rcall converti
rcall LCD_w_Data
nop
nop
nop
nop
nop
mov dataReg,unita
rcall LCD_w_Data
nop
nop
nop
nop
nop
mov dataReg,duepunti ;inserisco duepunti
rcall LCD_w_Data
nop
nop
nop
nop
nop
mov dataReg,mm ;invio dati relativi ai minuti della sveglia
rcall converti
rcall LCD_w_Data
nop
nop
nop
nop
nop
mov dataReg,unita
rcall LCD_w_Data
nop
nop
nop
nop
nop
ldi dataReg,0b11000100 ;vado sulla riga successiva dove
rcall LCD_Command ;visualizzero il contenuto della data
nop
nop
nop
nop
nop
mov dataReg,giorno ;giorno
rcall converti
rcall LCD_w_Data
nop
nop
nop
nop
nop
mov dataReg,unita
rcall LCD_w_Data
nop
nop
nop
nop
nop
mov dataReg,slash ;slash
rcall LCD_w_Data
nop
nop
nop
nop
nop
mov dataReg,mese ;mese
rcall converti
rcall LCD_w_Data
nop
nop
nop
nop
nop
mov dataReg,unita
rcall LCD_w_Data
nop
nop
nop
nop
nop
mov dataReg,slash ;slash
rcall LCD_w_Data
nop
nop
nop
nop
nop
ldi dataReg,0b00110010
rcall LCD_w_Data
nop
nop
nop
nop
nop
mov dataReg,anno ;anno
subi dataReg,200
brcs cont_cent
ldi dataReg,50
rjmp final
cont_cent:
subi dataReg,-200
subi dataReg,100
brcs zero
ldi dataReg,49
rjmp final
zero:
ldi dataReg,48
final:
rcall LCD_w_Data
nop
nop
nop
nop
nop
mov dataReg,anno
rcall converti
rcall LCD_w_Data
nop
nop
nop
nop
nop
mov dataReg,unita
rcall LCD_w_Data
nop
nop
nop
nop
nop
ret
converti:
clr decine
clr unita
con_dec:
subi dataReg,10
brcs con_unit
inc decine
rjmp con_dec
con_unit:
subi dataReg,-58
mov unita,dataReg
mov dataReg,decine
subi dataReg,-48
ret

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)




