home | area personale         schemi | tutorial | robotica | pic micro | recensioni         forum | chat irc         faq | contatti         store | Ordina PCB
username
password
cerca
 
OROLOGIO DIGITALE CON PIC16F84A tipo: livello:
Semplice orologio digitale con ore, minuti e led che lampeggiano ogni secondo, progettato con pic16f84a e til311.
 
 



 

Orologio digitale con PIC16F84A


clicca per ingrandire

Descrizione:

Questo semplice progetto sfrutta il vantaggio che i TIL311 hanno un decoder integrato grazie al quale è sufficiente mandare il dato in codice bcd con 4 bit per ottenere il numero selezionato. inoltre avendo un bit di enable è possibile fare in modo, nonostante le quattro linee dati che vanno ai display siano collegate tutte e quattro insieme, di visualizzare il bunero sul display desiderato. Accendendo e spegnendo i vari display a una velocità non percettibile dall'occhio umano otterremo la visualizzazione dell'ora su tutti i display contemoraneamente. Più precisamente vedremo sui primi due display le ore mentre sugli ultimi due i minuti. Inoltre i led centrali sono programmati in modo che lampeggino una volta al secondo, scandendo così anche i secondi. I tre pulsanti hanno le rispettive funzioni:

pulsante 1: mette in stendby l'orologio

pulsante 2: se l'orologio è in standby, incrementa i minuti per la regolazione

pulsante 3: se l'orologio è in standby, incrementa le ore per la regolazione


PROGRAMMA
 

Per il funzionamento dell’orologio e stato scritto nella memoria del pic il programma sotto riportato

 

;---------------------------OROLOGIO----------------------------

;

;Le uscite RA0,RA1,RA2,RA3 sono collegate agli ingressi dati A, B,

;C, D dei TIL311 mentre le uscite RB3,RB4,RB5,RB6 aggiornano con

;il livello basso i display agendo su LS. Gli ingressi RB0, RB1 e RB2

;sono collegati a 3 pulsanti:P0 seleziona e deseleziona la modalità

;impostazione; P1 consente l'avanzamento manuale dei minuti, P2 quello

;delle ore. L'uscita RA4 agisce sui led dei secondi mentre l'uscita

;RB7 spegne il display delle decine delle ore quando è zero.

;

;Clock da 5MHz

;

;-------------------------- DICHIARAZIONI

 

        list p=16F84A

       

PORT_A  EQU    05            ; Assegnano ai registri speciali

PORT_B  EQU    06            ;  le denominazioni indicate nella

STATO   EQU    03            ;  prima colonna.

ZERO    EQU    02

OPT     EQU    81

INTCON  EQU    0B

UNI_MIN EQU    10            ; Registro per le unità minuti

DEC_MIN EQU    11            ; Registro per le decine minuti

UNI_ORE EQU    12            ; Registro per le unità ore

DEC_ORE EQU    13            ; Registro per le decine ore

COUNT_1 EQU    0C            ; Registri usati

COUNT_2 EQU    0D            ;  nelle routine

COUNT_3 EQU    0E            ;  di ritardo

COUNT_4 EQU    0F

GOSTART EQU    14             ; Registro con i flag B0 e B1

                              ;  di ritorno a START

W_TEMP  EQU    15            ; Registro W temporaneo

ST_TEMP EQU    16            ; Registro stato temporaneo

 

;--------------------------

 

        ORG    0000          ; Carica in memoria dall'indirizzo 0000

        GOTO   INIT           ; Salta ad INIZIALIZZAZIONE

 

;-------------------------- SUB INTERRUPT: gestisce l'interrupt

 

INT     ORG    0004           ; Carica in memoria dall'indirizzo 004

        MOVWF  W_TEMP         ; Salva W in W_TEMP

       SWAPF   STATO,0       ; Salva STATO

        MOVWF  ST_TEMP        ;  in ST_TEMP

        CALL   DEL_SEC        ; Ritardo anti-rimbalzo per P0

 

PULS1   BTFSC  PORT_B,1       ; Testa P1 e se non è premuto

        GOTO   PULS2          ;  salta a PULS2

        MOVLW  03             ; Imposta un ritardo

        MOVWF  COUNT_3        ;  anti-rimbalzo più breve

        CALL   LOOP3          ;  per P1

        CALL   INC_MIN        ; Incrementa di una unità i minuti

        CALL   OUT            ;  e li visualizza

 

PULS2   BTFSC  PORT_B,2       ; Testa P2 e se non è premuto

        GOTO   PULS0          ;  salta a PULS0

        MOVLW  03             ; Imposta un ritardo

        MOVWF  COUNT_3        ;  anti-rimbalzo più breve

        CALL   LOOP3          ;  per P2

        CALL   INC_ORE        ; Incrementa di una unità le ore

        CALL   OUT            ;  e le visualizza

 

 

PULS0   BTFSC  PORT_B,0       ; Testa P0 e se non è premuto

        GOTO   PULS1          ;  torna a PULS1

        CALL   DEL_SEC        ; Ritardo anti-rimbalzo

        SWAPF  ST_TEMP,0      ; Ripristina ST_TEMP

        MOVWF  STATO          ;  in STATUS

        SWAPF  W_TEMP,1       ; Ripristina W_TEMP

        SWAPF  W_TEMP,0       ;  in W

        BSF    GOSTART,1      ; Setta il flag B1 di GOSTART

        BCF    INTCON,1       ; Azzera il flag INTF di interrupt

        BSF    INTCON,7       ; Riabilita l'interrupt generale GIE

ESCI    RETFIE                ; Esce dall'interrupt

                             

;-------------------------- INIZIALIZZAZIONE

 

INIT    ORG    0030           ; Carica in memoria dall'indirizzo 0030

        MOVLW  B'00000000'    ; Linee di PORT_A

        TRIS   PORT_A         ;  come uscite

        MOVLW  B'00000111'    ; Linee RB0, RB1, RB2 come ingressi

        TRIS   PORT_B         ;  linee RB3-RB7 come uscite

        BSF    STATO,5        ; Seleziona il banco 1

        BCF    OPT,6          ; Interrupt sul fronte di discesa

        BCF    STATO,5        ; Ritorno al banco 0

        BSF    INTCON,4       ; Abilita l'interrupt di RB0

        CLRF   UNI_MIN        ; Azzera i registri

        CLRF   DEC_MIN        ;  dei minuti

        CLRF   UNI_ORE        ;  e delle ore

        CLRF   DEC_ORE       

        BSF    PORT_B,3       ; Pone in stato di memoria (latch)

        BSF    PORT_B,4       ;  i display dei minuti

        BSF    PORT_B,5       ;  e delle ore

        BSF    PORT_B,6           

        BSF    INTCON,7       ; Abilita l'interrupt generale

 

;-------------------------- MAIN

 

START   CLRF   GOSTART        ; Azzera i flag B0 e B1 di GOSTSTART

        CALL   OUT            ; Visualizza i registri ore e minuti

        CALL   DEL_MIN        ; Introduce il ritardo di 1 min

        BTFSC  GOSTART,1      ; Se B1 è 1

        GOTO   START          ;  torna a START, altrimenti

        CALL   INC_MIN        ;  incrementa i minuti

        BTFSC  GOSTART,0      ; Se B0 è 1

        GOTO   START          ;  torna a START, altrimenti

        CALL   INC_ORE        ;  incrementa le ore

        GOTO   START          ; Ricomincia da START

 

;-------------------------- SUB DEL_SEC: genera il ritardo di 0,5 s

 

;Ritardo=X*Y*Z*5*Tempo in uS di un ciclo macchina (0,8uS per clock di 5MHz)

 

DEL_SEC MOVLW  06H           ; Variabile X

        MOVWF  COUNT_3       

LOOP3   MOVLW  0FAH          ; Variabile Y

        MOVWF  COUNT_2       

LOOP2   MOVLW  53H           ; Variabile Z

        MOVWF  COUNT_1       

LOOP1   BTFSC  GOSTART,1      ; Controlla B1 e se è 1

        GOTO   START3         ;  esce dalla routine

        DECFSZ COUNT_1      

        GOTO   LOOP1

        DECFSZ COUNT_2

        GOTO   LOOP2

        DECFSZ COUNT_3

        GOTO   LOOP3

START3  RETURN

 

;-------------------------- SUB DEL_MIN: genera il ritardo di 1 min

;                           accendendo e spegnendo i LED dei secondi

 

DEL_MIN MOVLW  3C

        MOVWF  COUNT_4

LOOP4   BSF    PORT_A,4       ; Accende i LED dei secondi

        CALL   DEL_SEC

        BTFSC  GOSTART,1

        GOTO   START4

        BCF    PORT_A,4       ; Spegne i LED dei secondi

        CALL   DEL_SEC

        DECFSZ COUNT_4

        GOTO   LOOP4

START4  RETURN

 

;-------------------------- SUB OUT: fa uscire i registri minuti e ore

;                           su RA0-RA3 e aggiorna i display con RB3-RB6

 

OUT     MOVF   UNI_MIN,0      ; OUT di unità minuti

        MOVWF  PORT_A        

        BCF    PORT_B,3       ;  e aggiorna con RB3

        BSF    PORT_B,3       ;  il display di unità minuti

        MOVF   DEC_MIN,0      ; OUT di decine minuti

        MOVWF  PORT_A        

        BCF    PORT_B,4       ;  e aggiorna con RB4

        BSF    PORT_B,4       ;  il display di decine minuti

        MOVF   UNI_ORE,0      ; OUT di unità ore

        MOVWF  PORT_A

        BCF    PORT_B,5       ;  e aggiorna con RB5

        BSF    PORT_B,5       ;  il diplay di unità ore

        MOVLW  00             ; Controlla se DEC_ORE

        XORWF  DEC_ORE,0      ;  è 0,

        BTFSC  STATO,ZERO    ; Se lo è

        GOTO   BLANK          ;  salta a BLANK altrimenti

        BCF    PORT_B,7       ;  non effettua blanking del display

        MOVF   DEC_ORE,0      ; OUT di decine ore

        MOVWF  PORT_A        

        BCF    PORT_B,6       ;  aggiorna con RB6

        BSF    PORT_B,6       ;  il display di decine ore

        GOTO   RETOUT         ; Va a RETURN

BLANK   BSF    PORT_B,7      ; Abilita il blanking del display dec ore

RETOUT  RETURN              

 

;-------------------------- SUB INC_MIN: incrementa unità e decine minuti

 

INC_MIN INCF   UNI_MIN       ; Incrementa unità minuti

        MOVLW  0A             ; Confronta unità minuti

        XORWF  UNI_MIN,0      ;  con 10 D

        BTFSS  STATO,ZERO     ; Se non è 10 D

        GOTO   START1         ;  salta a START1

        CLRF   UNI_MIN        ; Altrimenti azzera unità minuti

        INCF   DEC_MIN        ;  e incrementa decine minuti

        MOVLW  06             ; Confronta decine minuti

        XORWF  DEC_MIN,0      ;  con 6 D

        BTFSS  STATO,ZERO     ; Se non è 6 D

        GOTO   START1         ;  salta a START1

        CLRF   DEC_MIN        ; Altrimenti azzera decine minuti

        GOTO   EX_INCM        ;  e salta a RETURN

START1  BSF    GOSTART,0     ; Attiva il flag B0

EX_INCM RETURN

 

 

 

 

;-------------------------- SUB INC_ORE: incrementa unità e decine ore

 

INC_ORE INCF   UNI_ORE       ; Incrementa unità ore

        MOVLW  02             ; Confronta decine ore

        XORWF  DEC_ORE,0      ;  con 2 D

        BTFSC  STATO,ZERO     ; Se decine ore è 2 D

        GOTO   VENTI          ;  salta a VENTI

        MOVLW  0A             ; Altrimenti confronta unità ore

        XORWF  UNI_ORE,0      ;  con 10 D

        BTFSS  STATO,ZERO     ; Se non è 10 D

        GOTO   START2         ;  salta a RETURN

        CLRF   UNI_ORE        ; Altrimenti azzera le unità ore

        INCF   DEC_ORE        ;  e incrementa le decine ore

        GOTO   START2         ; Salta a RETURN

VENTI   MOVLW  04            ; Confronta unità ore

        XORWF  UNI_ORE,0      ;  con 4 D

        BTFSS  STATO,ZERO     ; Se non è 4 D

        GOTO   START2         ;  salta a RETURN

        CLRF   UNI_ORE        ; Altrimenti azzera unità ore

        CLRF   DEC_ORE        ;  e decine ore

START2  RETURN

 

                  END



  il parere della community
esprimi il tuo voto approvi questa pagina? promo


  non sei autenticato, per questo non puoi visualizzare i commenti sulla pagina. Se sei registrato accedi oppure registrati.


difficoltà
costo
informazioni
Questa pagina è stata creata da michelemilani
il 09/06/2010 ore 00:30
ultima modifica del 18/06/2010 ore 15:59
la pagina è stata visitata 11914 volte




Lo staff di www.grix.it non si assume responsabilità sul contenuto di questa pagina.
Se tu sei l'autore originale degli schemi o progetti proposti in questo articolo, e ritieni che siano stati violati i tuoi diritti, contatta lo staff di www.grix.it per segnalarlo.

   
 







 
 
indietro | homepage | torna su copyright © 2004/2024 GRIX.IT - La community dell'elettronica Amatoriale