Orologio con ATmega 8535 e 7segmenti

Sezione dedicata ai Microcontrollori e ai Sistemi Embedded

Orologio con ATmega 8535 e 7segmenti

Postby girolamolarosa » 16 Apr 2015, 10:47

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?
girolamolarosa
 
Posts: 18
Joined: 26 Mar 2015, 16:43

Re: Orologio con ATmega 8535 e 7segmenti

Postby deluca » 18 Apr 2015, 15:14

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.
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: Orologio con ATmega 8535 e 7segmenti

Postby girolamolarosa » 30 Apr 2015, 18:56

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!
girolamolarosa
 
Posts: 18
Joined: 26 Mar 2015, 16:43

Re: Orologio con ATmega 8535 e 7segmenti

Postby deluca » 01 May 2015, 08:12

@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
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: Orologio con ATmega 8535 e 7segmenti

Postby girolamolarosa » 01 May 2015, 16:26

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!
girolamolarosa
 
Posts: 18
Joined: 26 Mar 2015, 16:43

Re: Orologio con ATmega 8535 e 7segmenti

Postby girolamolarosa » 01 May 2015, 16:30

ecco lo schema
Attachments
Senza titolo-2.jpg
shema
Senza titolo-2.jpg (127.01 KiB) Viewed 7487 times
girolamolarosa
 
Posts: 18
Joined: 26 Mar 2015, 16:43

Re: Orologio con ATmega 8535 e 7segmenti

Postby deluca » 01 May 2015, 16:50

@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.
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: Orologio con ATmega 8535 e 7segmenti

Postby girolamolarosa » 01 May 2015, 17:00

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!
Attachments
or.rar
(22.32 KiB) Downloaded 244 times
girolamolarosa
 
Posts: 18
Joined: 26 Mar 2015, 16:43

Re: Orologio con ATmega 8535 e 7segmenti

Postby girolamolarosa » 02 May 2015, 15:04

ha per caso avuto modo di dare un'occhiata al codice? è da stamattina che ci sbatto la testa senza nessun risultato!
girolamolarosa
 
Posts: 18
Joined: 26 Mar 2015, 16:43

Re: Orologio con ATmega 8535 e 7segmenti

Postby girolamolarosa » 04 May 2015, 10:01

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?
girolamolarosa
 
Posts: 18
Joined: 26 Mar 2015, 16:43

Re: Orologio con ATmega 8535 e 7segmenti

Postby Leonardo » 04 May 2015, 10:44

Ciao Girolamo,

Intervengo solamente per segnalarti che il pin AVCC deve essere collegato anche se non è utilizzato l'ADC.

Leonardo
Il mio blog di elettronica: http://electro-logic.blogspot.it
User avatar
Leonardo
 
Posts: 502
Joined: 29 May 2013, 22:31
Location: Parma

Re: Orologio con ATmega 8535 e 7segmenti

Postby girolamolarosa » 04 May 2015, 14:52

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?).
girolamolarosa
 
Posts: 18
Joined: 26 Mar 2015, 16:43

Re: Orologio con ATmega 8535 e 7segmenti

Postby deluca » 04 May 2015, 16:26

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.
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: Orologio con ATmega 8535 e 7segmenti

Postby girolamolarosa » 04 May 2015, 23:13

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
girolamolarosa
 
Posts: 18
Joined: 26 Mar 2015, 16:43

Re: Orologio con ATmega 8535 e 7segmenti

Postby deluca » 05 May 2015, 07:07

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
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: Orologio con ATmega 8535 e 7segmenti

Postby girolamolarosa » 05 May 2015, 16:20

Potrei postarle il progetto finito in privato per avere un parere sulla correttezza?
girolamolarosa
 
Posts: 18
Joined: 26 Mar 2015, 16:43

Re: Orologio con ATmega 8535 e 7segmenti

Postby deluca » 05 May 2015, 18:27

certamente girolamo,
puoi postarmi il progetto in privato.
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: Orologio con ATmega 8535 e 7segmenti

Postby girolamolarosa » 08 May 2015, 13:27

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 :)
girolamolarosa
 
Posts: 18
Joined: 26 Mar 2015, 16:43


Return to Microcontrollori e microprocessori

Who is online

Users browsing this forum: No registered users and 4 guests

cron