Page 1 of 1
Orologio con ATmega 8535 e 7segmenti
Posted:
16 Apr 2015, 10:47
by girolamolarosa
Buonasera,
dopo aver installato AVR Studio 4 e Proteus Isis ho iniziato a scrivere qualche programma, inizialmente qualcuno banale come l'accensione di qualche led o la visualizzazione di un numero su un 7segmenti per capire il funzionamento dei reg e del dispositivo in generale, e adesso sono passato a quello che dovrebbe essere il progetto per l'esame:
Un orologio OO/MM/SS con 6 display 7segmenti BCD e 5 tasti per il set dell'ora.
Ho quasi completato il progetto, dico quasi perché testandolo con Proteus mi sono accorto di qualche bug che devo sistemare!
Premettendo che la maggior parte dei miei colleghi si è presentata all'esame con il solito Termometro con sensore LM24 visualizzando la temperatura su un doppio 7 segmenti, il mio progetto è secondo voi scarno e troppo semplice?
Re: Orologio con ATmega 8535 e 7segmenti
Posted:
18 Apr 2015, 15:14
by deluca
il progetto è appropriato per l'esame, visto che la difficoltà sta nel fatto che il fw deve essere scritto in assembly....
il che lo rende un tantino + complesso.
Re: Orologio con ATmega 8535 e 7segmenti
Posted:
30 Apr 2015, 18:56
by girolamolarosa
Buonasera,
ho fatto visionare il mio progetto al Prof e mi ha detto che utilizzare dei decoder mod 4778 quando si ha a disposizione un micro che può fare la decodifica è una cosa sbagliata.
Allora io mi chiedo, perché esistono questi integrati????
Ulteriore domanda, come potrei attaccare 6 display al mio micro avendo a disposizione solo 3 porte libere?
Ho cercato di multiplexarli ma non ci sono riuscito in nessun modo!
Re: Orologio con ATmega 8535 e 7segmenti
Posted:
01 May 2015, 08:12
by deluca
@girolamo,
devo dare ragione al tuo prof quando ti dice che non ha senso utilizzare dei chip addizionali per pilotare i display 7seg quando hai a disposizione un micro con abbastanza pin di io tali da permetterne il loro pilotaggio e decodifica.
PS. potresti postare lo schema elettrico di come avevi collegato i display al micro e il codice sorgente utilizzato per multiplexare
Re: Orologio con ATmega 8535 e 7segmenti
Posted:
01 May 2015, 16:26
by girolamolarosa
Il problema principale sta nel fatto che quando vado a simulare con Proteus quello che sto scrivendo in AVR mi manda la cpu in overclock e mi scatta il triangolino giallo co l'avviso che la simulazione non sta andando in real time!
spero che questo sia dovuto ad un problema di stesura del codice che sto per postare!
- Code: Select all
;********************************************
;* WrittenBy GIROLAMO LAROSA *
;* for AVR AtMega8535 *
;* Clock Frequency: 7.3728Mhz *
;* *
;* Clock with AtMega8535 and 6 7seg display *
;* Crystal HC-49/U *
;* 6 decoder 7448 *
;* *
;********************************************
.device atmega8535
.nolist
.include "D:\Programmi\Atmel\AVR Tools\AvrAssembler\Appnotes\m8535def.inc"
.list
;============================
;Declaration
.def temp = r16
.def temp2= r17
.def displayCounter= r18
.def displayNumber = r19
.def Tens = r20
.def Ones = r21
.def secondi = r24
.def SSR = r25
.org 0x00
;===========================
;Interrupt Vector
rjmp Init ; Reset
rjmp EXT_INT0 ; External Interrupt, enabled with bush button ENTER
rjmp EXT_INT1 ; rjmp EXT_INT1
reti ; timer2 comp
reti ; timer2 ovf
reti ; timer1 capt
rjmp TIMER1COMPA ; timer/counter1 compare MachA enabled every 1s
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
;===========================
;Start the program:
Init:
ldi temp,high(RAMEND) ; Set Stack Pointer to the top of the RAM
out SPH,temp ;
ldi temp,low(RAMEND) ;
out SPL,temp ;
sei
;Input/Output
ser temp
out DDRA,temp ;PA0-6 output (7-seg)
out DDRB,temp ;PC0-5 output(Select Display) PC0=display1,PC1=display2...PC5=display6
out DDRC,temp ;test Interrupt
clr temp
out PortA,temp ;No pullUp resistor
out PortB,temp
;Initial condition register
ldi tens,12
ldi ones,12
ldi displayCounter,100
clr displayNumber
clr ZH
;LookUp table
ldi temp,0b01111110 ;0
mov R0,temp
ldi temp,0b00110000 ;1
mov R1,temp
ldi temp,0b01101101 ;2
mov R2,temp
ldi temp,0b01111001 ;3
mov R3,temp
ldi temp,0b00110011 ;4
mov R4,temp
ldi temp,0b01011011 ;5
mov R5,temp
ldi temp,0b01011111 ;6
mov R6,temp
ldi temp,0b01110000 ;7
mov R7,temp
ldi temp,0b01111111 ;8
mov R8,temp
ldi temp,0b01111011 ;9
mov R9,temp
;External Interrupt ENABLE
ldi temp,0b00001010 ;Falling edge of INT0,INT1 generates an interrup(EX_INT0,EX_INT1)
out MCUCR,temp
ldi temp,0b11000000 ;External Interrupt 0,1 Enabel
out GICR,temp
; SETUP TCNT1 CTC mode with prescaler clk/64
ldi temp,0b00000000
out TCCR1A,temp
ldi temp,(0<<ICNC1)|(0<<ICES1)|(1<<WGM13)|(1<<WGM12)|(1<<CS10)|(1<<CS11);
out TCCR1B,temp
;Load in OCR1A top value for compare match
ldi temp,0x3D ;TOP VALUE FOR TCNT1(3D08 ex 0r 15624 dec)
out OCR1AH,temp
out ICR1H,temp
ldi temp,0x08
out OCR1AL,temp
out ICR1L,temp
; ENABLE COMPARE MATCH INTERRUPT AT 15624, clock frequency 1Mh Interrupt every 1s
ldi temp,(0<<OCIE2)|(0<<TOIE2)|(0<<TICIE1)|(1<<OCIE1A)|(0<<OCIE1B)|(0<<TOIE1)|(0<OCIE0);
out TIMSK,temp
ldi temp,(0<<TOV1)
out TIFR,temp
rjmp Start
; *********************************
; * *
; * START *
; * *
; *********************************
Display:
dec displayCounter ; cambia display ogni 100 colpi di clock circa
breq PC+2
rjmp display
ldi displayCounter,100
cpi DisplayNumber,2 ; se displayNumber Ë a 2 lo resetto
brne PC+2
clr DisplayNumber
ldi ZL,20; ; faccio puntare ZL a tens o a ones, registri che uso per far puntare alle decine o unit‡ del "secondo corrente"
add ZL,displayNumber;se Ë attivo il secondo display, allora mando su zl tens, se Ë attivo il primo mando ones su zl
ld temp,Z
clr ZL
add ZL,temp
out PortA,temp ; preparo la porta con il numero dalla lookUp table
inc displayNumber
in temp,PinB ;
lsl temp ;shift a sinistra per attivare di volta in volta il prossimo transistor
sbrs temp,1 ; visto che per ora ho solo 2 display passo dal primo al secondo e viceversa
ldi temp, 0b00000001;
out PortB,temp ;attivo il transistor relativo o a tens o a ones
ret
DigitConvert: ; ogni volta che scatta l'interrupt di compare match mi incremento il reg secondi che utilizzo di in questa subroutines
clr Tens ;per far puntare tens e ones ai reg corrispondenti della lookup table
clr Ones
FindTens:
subi secondi,10; mi controllo se i secondi sono > di 10
brcs FindOnes ;se non Ë cosÏ passo a findones
inc Tens ; se sono > di 10 incremento tens(secondo display
rjmp FindTens ; ritorno indietro per riverificare
FindOnes:
subi secondi,-10; ritorno i secondi al valore di origine
mov ones,secondi, faccio puntare ones al reg della look up table relativa a secondi
ret
Start:
rcall digitConvert ; richiamo la subroutine di conversione
rcall display ;richiamo la subroutines di visualizzazione
rjmp Start ;loop a start
;===============================================
;* SUBROUTINES *
;===============================================
;1s Passed
TIMER1COMPA: ; interrupt di compare match che scatta ogni secondo viste le impostazioni del timercounter1
push SSR
in SSR,Sreg ;save SREG
push temp
inc secondi
cpi secondi,60 ; qui mi occupo solamente di incrementare il reg secondi e di controllare se sono arrivato a 60
brne PC+2
clr secondi ; se sono a 60, reset il reg
pop SSR
out SREG,SSR
pop SSR
ret
; queste due subroutines sono in previsione di un futuro implemento di 2 tasti per il settaggio dell'orologgio
EXT_INT0:
reti
; External Interrupt, enabled with bush button ENTER
EXT_INT1:
reti
Per ora mi stavo concentrando sulla visualizzazione dei secondi, mi preoccuperò successivamente dei minuti e delle ore anche se per come sto procedendo avrei bisogno di altri 4 registri di lavoro (tensMinuti,OnesMinuti,tensOre,OnesOre) e visto che me ne sono rimasti soltanto 6 liberi spero non me ne serva qualcun altro per altri motivi!!!
Ho allegato anche lo schema di come ho collegato i 2 display che sto utilizzando, e altri due di esempio!
Re: Orologio con ATmega 8535 e 7segmenti
Posted:
01 May 2015, 16:30
by girolamolarosa
ecco lo schema
Re: Orologio con ATmega 8535 e 7segmenti
Posted:
01 May 2015, 16:50
by deluca
@girolamo, al fine di facilitare il test,
posta uno zip contenente il progetto proteus e il codice hex così provo a simularlo sul mio pc.
Re: Orologio con ATmega 8535 e 7segmenti
Posted:
01 May 2015, 17:00
by girolamolarosa
deluca wrote:@girolamo, al fine di facilitare il test,
posta uno zip contenente il progetto proteus e il codice hex così provo a simularlo sul mio pc.
ecco a lei!
Re: Orologio con ATmega 8535 e 7segmenti
Posted:
02 May 2015, 15:04
by girolamolarosa
ha per caso avuto modo di dare un'occhiata al codice? è da stamattina che ci sbatto la testa senza nessun risultato!
Re: Orologio con ATmega 8535 e 7segmenti
Posted:
04 May 2015, 10:01
by girolamolarosa
Sono riuscito a risolvere il problema.
Avendo impostato come tempo di multiplexing circa 250us, supponendo di lavorare ad 1mhz, il computer in simulazione andava in overclock a causa dei moltissimo shift che doveva fare sulla porta di controllo dei transistori e sui reg di puntamento da mandare in uscita.
Aumentando questo tempo a 25ms il problema si risolve!A parte questo, c'erano parecchi errori nel codice che ho corretto!
Ora una cosa che non sto riuscendo a fare è a resettare il conteggio quando arrivo a 24 ore... per i 60 minuti e secondi ho fatto puntare i registri tens e Ones al registro r0 della lookup table una volta arrivato a 60, preoccupandomi in un ciclo esterno di azzererare i reg che tengono traccia dei secondi e dei minuti... ma per le ore la cosa diventa più difficile essendoci di mezzo le 4 ore dopo le 20...
ho cercato di azzerare semplicemente le ore arrivate a 24 ma non so per quale strano motivo il conteggio continua ad oltranza!!!
Facendo controlli sui registri di puntamento tens e ones il risultato in simulazione è praticamente uguale!!!
Ha qualche idea per indirizzarmi?
Re: Orologio con ATmega 8535 e 7segmenti
Posted:
04 May 2015, 10:44
by Leonardo
Ciao Girolamo,
Intervengo solamente per segnalarti che il pin AVCC deve essere collegato anche se non è utilizzato l'ADC.
Leonardo
Re: Orologio con ATmega 8535 e 7segmenti
Posted:
04 May 2015, 14:52
by girolamolarosa
Ciao Leonardo,
Grazie di essere entrato nella discussione e della dritta che mi hai dato!!!
Sono riuscito a risolvere anche l'ultimo problema che avevo! Ho testato l'orologio e sembra non avere nessun bug.
Sono riuscito a "stringere" anche il tempo del multiplexing portandolo a 12,5ms e adesso l'unica cosa che mi chiedo è se questo è abbastanza breve per non visualizzare lo spegnimento dei displays. Avevo intenzione di portarlo a 5ms ma purtroppo la simulazione in proteus non va! Solito triangolino in basso a sinistra per l'overclock della cpu (anche se quella del pc non è nemmeno al 5%, quindi mi chiedo parla della cpu del micro giusto?).
Re: Orologio con ATmega 8535 e 7segmenti
Posted:
04 May 2015, 16:26
by deluca
ciao girolamo,
sono stato fuori per il weekend e non ho potuto testare il tuo progetto, ma ho visto adesso che sei riuscito a risolvere i prb da solo e per questo son contento per te. Di sicuro hai imparato molte più cose di quelle che avresti imparato se fossimo stati noi a risolverli per te.
Re: Orologio con ATmega 8535 e 7segmenti
Posted:
04 May 2015, 23:13
by girolamolarosa
La ringrazio ugualmente!
Avrei uno domanda da porle. e' sbagliato impostare come tempo di multiplexing 12ms? è tanto?
Le porgo questa domanda in quanto simulando in proteus vedo proprio quello che sta accadendo e cioè la shift dei 6 display con l'accensione e lo spegnimento a ruota! Purtroppo al di sotto di questo tempo non ci posso andare ma non vorrei che il prof lo reputasse un errore
Re: Orologio con ATmega 8535 e 7segmenti
Posted:
05 May 2015, 07:07
by deluca
ciao girolamo,
in base al tipo di led, potresti vedere un leggero sfarfallio sui display con quella freq di mux.
se pensi di realizzare un prototipo della scheda, con tanto di veri display, da mostrare al prof, potresti mettere dei dipswitch per modificare la freq in modo da provare a migliorarne la visualizzazione.
ciao
Re: Orologio con ATmega 8535 e 7segmenti
Posted:
05 May 2015, 16:20
by girolamolarosa
Potrei postarle il progetto finito in privato per avere un parere sulla correttezza?
Re: Orologio con ATmega 8535 e 7segmenti
Posted:
05 May 2015, 18:27
by deluca
certamente girolamo,
puoi postarmi il progetto in privato.
Re: Orologio con ATmega 8535 e 7segmenti
Posted:
08 May 2015, 13:27
by girolamolarosa
Ho fatto le prove che mi ha consigliato, ho utilizzato il timer/counter per il conteggio dei 12ms e il risultato è analogo a quello che avevo attuato io! Ho contattato il prof e mi ha detto d non preoccuparmi di questo perchè Proteus girerà in un tempo simile al real time solamente se le operazioni che deve effettuare saranno semplici e lente da svolgere e che quindi il comportamento che vedo è normale!
Quindi reputo il progetto finito! O almeno spero di non arrivare li ed essere rimandato indietro