Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Ottenere 1 Hz precisissimo, 16f84a

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Ottenere 1 Hz precisissimo, 16f84a

Messaggioda Foto Utentecarlomusumeci » 5 apr 2015, 15:53

Ciao a tutti :)Innanzitutto AUGURI ...
Ho scritto questo firmware (perfettamente funzionante,testato) che ogni secondo incrementa i due display di una unità,fino ad arrivare al numero 59 per poi ripartire da zero...
tutto funziona alla perfezione,,,solo che paragonandolo ad un'orologio dopo un poco perde il tempo...questo comporterebbe dei problemi se dovrei realizzare orologi o timer programmabili per l'intero arco della giornata...
Il metodo più efficace per ottenere ' 1 Hz ' quale sarebbe? qualcuno me lo spiegherebbe?magari tramite interrupt o altro...
Fosc 4Mhz
Codice: Seleziona tutto
;OROLOGIO CARLO MUSUMECI CON PIC 16F84A
        PROCESSOR       16F84
        RADIX                  DEC
        INCLUDE             "P16F84A.INC"
        ERRORLEVEL      -302

        __CONFIG        3FF5H

ORG     0CH

      d1      RES      1
      d2      RES      1
      UNITA   RES      1
      DECINE   RES      1
      S1      RES      1
      S2      RES      1
      S3      RES      1
;definizione numeri
      ZERO   EQU      B'00111111'
      UNO   EQU      B'00000110'
      DUE   EQU      B'01011011'   
      TRE   EQU      B'01001111'
      QUATTRO   EQU      B'01100110'
      CINQUE   EQU      B'01101101'
      SEI   EQU      B'01111101'
      SETTE   EQU      B'00000111'
      OTTO   EQU      B'01111111'
      NOVE   EQU      B'01101111'
;DEFINIZIONE CATODI DISPLAY
      DISP_UNIT   EQU      0
      DISP_DECINE   EQU      1

ORG     0X00
      BSF      STATUS,RP0 ;ACCEDI AL BANCO 1
      MOVLW   B'00000000';IMPOSTA TUTTI OUT
      MOVWF   TRISA      ;A PORTA A
      MOVLW   B'10000000';IMPOSTA TUTTI OUT TRANNE BIT 7 IN INPUT
      MOVWF   TRISB      ;A PORTA B
      BCF      STATUS,RP0 ;ACCEDI A BANCO 0
      CLRF   UNITA      ;PULISCI DIPLAY UNITA'
      CLRF   DECINE     ;PULISCI DISPLAY DECINE
      CALL   VISUALIZZA ;VISUALIZZA LE OPERAZIONI SUL DISPLAY


;_________________________________________________^^INIZIO PROGRAMMA^^___________________________________________


Main   
      CALL   INC_UNIT   ;INCREMENTA UNITA'
      CALL   INC_DEC    ;INCREMENTA DECINA
      MOVLW   d'6'       ;MUOVI IN W '6 DECIMALI'
      SUBWF   DECINE,W   ;SOTTRAI 6 DA DECINE E METTI IL RISULTATO IN W
      BTFSC   STATUS,Z   ;ESEGUI LA SUCCESSIVA SE Z E' A 0
      CLRF   DECINE     ;SE ARRIVA A 6 AZZERA DECIN
       GOTO    Main       ;RITORNA AL MAIN
INC_UNIT
      CALL    VISUALIZZA ;CHIAMA GESTIONE VISUALIZZAZIONE
      call   Delay1s    ;RITARDO DI UN SECONDO
       incf    UNITA      ;INCREMENTA UNITA'
      movlw   d'10'      ;MUOVI IN W '10 DECIMALI'
      subwf   UNITA,W    ;SOTTRAI 10 DA UNITA' E METTI RISULTATO IN W
      BTFSC   STATUS,Z   ;SE RISULTA 0 ESEGUI OPERAZIONE SEGUENTE
      RETURN             ;SE 0 RITORNA AL PROGRAMMA PRINCIPALE
      GOTO   INC_UNIT   ;SE NON è 0 CONTINUA A INCREMENTARE
INC_DEC   
      CLRF   UNITA      ;AZZERA UNITA'
      BTFSC   STATUS,Z   ;SE Z SI TROVA A 0 ESEGUI LA SUCCESSIVA
      INCF   DECINE     ;INCREMENTA DECINA
        RETURN             ;RITORNA AL PROGRAMMA PRINCIPALE


   
   
VISUALIZZA
        BSF      PORTA,DISP_UNIT
      MOVF   UNITA,0   ;legge il valore di unità e lo copia in W
      CALL   DISPLA
      MOVWF   PORTB
      BCF      PORTA,DISP_UNIT
      CALL   Delay5

      BSF      PORTA,DISP_DECINE
        MOVF   DECINE,0  ;legge il valore di unità e lo copia in W
      CALL   DISPLA
      MOVWF   PORTB
       BCF      PORTA,DISP_DECINE
      CALL   Delay5

       RETURN
DISPLA
      ADDWF   PCL,1
      RETLW   ZERO
      RETLW   UNO
       RETLW   DUE
       RETLW   TRE
       RETLW   QUATTRO
       RETLW   CINQUE
       RETLW   SEI
      RETLW   SETTE
      RETLW   OTTO
      RETLW   NOVE
;__________________________________________RITARDO MULTIPLEXER_________________________________
Delay5
         ;4993 cycles
        movlw   0xE6
         movwf   d1
         movlw   0x04
         movwf   d2
Delay_0
         decfsz   d1, f
         goto   $+2
         decfsz   d2, f
         goto   Delay_0

         ;3 cycles
         goto   $+1
         nop

         ;4 cycles (including call)
         return
;_________________________________________________________________________________________________
Delay1s
         ;999997 cycles
      movlw   0x08
      movwf   S1
      movlw   0x2F
      movwf   S2
      movlw   0x03
      movwf   S3
Delay1_0
      decfsz   S1, f
      goto   $+2
      decfsz   S2, f
      goto   $+2
      decfsz   S3, f
      goto   Delay1_0

         ;3 cycles
      goto   $+1
      nop
      return
END
Avatar utente
Foto Utentecarlomusumeci
353 5 7
Sostenitore
Sostenitore
 
Messaggi: 526
Iscritto il: 8 apr 2011, 0:35

0
voti

[2] Re: Ottenere 1 Hz precisissimo, 16f84a

Messaggioda Foto Utentesimo85 » 5 apr 2015, 16:03

carlomusumeci ha scritto:l metodo più efficace per ottenere ' 1 Hz ' quale sarebbe?

Prima di tutto usare un quarzo da 32768 Hz = 2^{15} Hz.

EDIT:
Ma non come quarzo principale. I 32768 Hz devono essere di riferimento per il timer.

Auguri anche a te.

O_/
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[3] Re: Ottenere 1 Hz precisissimo, 16f84a

Messaggioda Foto Utentecarlomusumeci » 5 apr 2015, 16:08

Immaginavo che servisse quel quarzo...avendo quel quarzo,come faresti? dovrei usare il prescaler e dividere per?
Avatar utente
Foto Utentecarlomusumeci
353 5 7
Sostenitore
Sostenitore
 
Messaggi: 526
Iscritto il: 8 apr 2011, 0:35

0
voti

[4] Re: Ottenere 1 Hz precisissimo, 16f84a

Messaggioda Foto Utentesimo85 » 5 apr 2015, 16:20

Basta configurare il prescaler, vedi a pag. 11 del datasheet.
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[5] Re: Ottenere 1 Hz precisissimo, 16f84a

Messaggioda Foto Utentecarlomusumeci » 5 apr 2015, 16:25

non riesco a capire...devo utilizzare questo quarzo al posto di quello da 4Mhz?
Avatar utente
Foto Utentecarlomusumeci
353 5 7
Sostenitore
Sostenitore
 
Messaggi: 526
Iscritto il: 8 apr 2011, 0:35

0
voti

[6] Re: Ottenere 1 Hz precisissimo, 16f84a

Messaggioda Foto Utentesimo85 » 5 apr 2015, 16:39

carlomusumeci ha scritto:devo utilizzare questo quarzo al posto di quello da 4Mhz?

Nonee.

Devi usare il quarzo da 32768 Hz come referenza per il TMR0.
Ossia devi sparare dentro il pin R4/T0CKI un segnale ad onda quadrata di 32768 Hz.

E poi devi applicare la formula per il TMR0 ma ora non me la ricordo e non ho tempo di cercarla.

O_/
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[7] Re: Ottenere 1 Hz precisissimo, 16f84a

Messaggioda Foto UtenteArrow » 5 apr 2015, 17:15

Personalmente non ho mai scritto codice per PIC però in linea teorica dovresti impostare il registro del timer che usi in modo che abbia in ingresso come sorgente il clock da 32768kHz anche se il clock principale rimane quello da 4MHz. Ossia mettere l'onda quadra generata dal relativo circuito col quarzo in ingresso al pin R4 (cos' dice simo85 :D )
Avatar utente
Foto UtenteArrow
103 1 6
Frequentatore
Frequentatore
 
Messaggi: 166
Iscritto il: 11 giu 2014, 22:12

0
voti

[8] Re: Ottenere 1 Hz precisissimo, 16f84a

Messaggioda Foto Utentecarlomusumeci » 5 apr 2015, 18:00

scusatemi allora a questo punto faccio così?
L hertz ricavato lo mando in RA4/T0CKI
Ultima modifica di Foto Utentecarlomusumeci il 5 apr 2015, 18:11, modificato 1 volta in totale.
Avatar utente
Foto Utentecarlomusumeci
353 5 7
Sostenitore
Sostenitore
 
Messaggi: 526
Iscritto il: 8 apr 2011, 0:35

0
voti

[9] Re: Ottenere 1 Hz precisissimo, 16f84a

Messaggioda Foto Utentesimo85 » 5 apr 2015, 18:16

Scusa Foto Utentecarlomusumeci, avevo visto male ed ho scritto una papera (che ho provveduto ad eliminare :lol: ). Avevo confuso il 4060 con il micro.

#-o #-o #-o

sorry.

Comunque sí, il segnale lo devi introdurre in RA4/T0CKI.

O_/
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[10] Re: Ottenere 1 Hz precisissimo, 16f84a

Messaggioda Foto Utentecarlomusumeci » 5 apr 2015, 18:17

In questo caso impiegherei un CD40106...credo di aver capito
Avatar utente
Foto Utentecarlomusumeci
353 5 7
Sostenitore
Sostenitore
 
Messaggi: 526
Iscritto il: 8 apr 2011, 0:35

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 7 ospiti