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

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

Messaggioda Foto Utentecarlomusumeci » 6 apr 2015, 1:23

perche non è quello riportato nel post 12? non appena arriva l'impulso da 1 Hz si genera l'interrupt e si va all'indirizzo 0x04...ho abbozzato un po di codice
Codice: Seleziona tutto
ORG     0X00
      GOTO INIZIO
ORG      0X04
      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   EXIT

INC_UNIT
       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
EXIT
      BCF      INTCON,RBIF
       RETFIE
;____________________________________________________________________________________________________________________________________________________
INIZIO
      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
      MOVLW   B'10001000'
      MOVWF   INTCON
      BCF      STATUS,RP0 ;ACCEDI A BANCO 0
      
..... continuo col programma...


una cosa del genere dentro l'interrupt è un po troppo? o conviene che dentro l'interrupt metto solo
Codice: Seleziona tutto
INCF UNITA
RETFIE

e poi il resto lo faccio fuori dall'interrupt...
Avatar utente
Foto Utentecarlomusumeci
353 5 7
Sostenitore
Sostenitore
 
Messaggi: 526
Iscritto il: 8 apr 2011, 0:35

0
voti

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

Messaggioda Foto UtenteWALTERmwp » 6 apr 2015, 1:41

Scrivendo che non è corretto non si intende che non funzioni; se le tue elaborazioni non impegnano troppo tempo rispetto al successivo interrupt può anche andare.
Il fatto è che la routine di interrupt ha una sua funzione ben definita cioè "intercettare" l'evento che si è stabilito di rilevare quanto prima possibile rispetto alla sua insorgenza ed agire di conseguenza.
E' un principio semplice e di base da tenere presente.
Se tu la impegni, per esempio, nello svolgere l'aggiornamento di tutta una serie di registri, per l'arco di tempo durante il quale la "carichi" di questa attività, il rilevamento di altri eventuali interrupt(s) (che tu potresti avere abilitato) rimane precluso.

Saluti

p.s.
come ti ha scritto Foto Utentesimo85, è sufficiente che all'insorgenza dell'interrupt, nel codice che ha inizio dal vettore (0x04), ti limiti alla modifica del valore di una variabile; nel codice gestito in modo ciclico esegui l'interrogazione di quella variabile ed in base all'esito stabilisci cosa fare.
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8989
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

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

Messaggioda Foto Utentecarlomusumeci » 6 apr 2015, 1:46

hai ragione,conviene starci il meno tempo possibile all'interno dell'interrupt...se le operazioni possono essere svolte al di fuori dell'interrupt faccio così...
per come lo scritto io funziona,ma accetto i consigli e vedo di metterli in pratica...<Grazie mille

per il momento non ho altri interrupt,e non credo me ne servino altri...
Avatar utente
Foto Utentecarlomusumeci
353 5 7
Sostenitore
Sostenitore
 
Messaggi: 526
Iscritto il: 8 apr 2011, 0:35

0
voti

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

Messaggioda Foto UtenteWALTERmwp » 6 apr 2015, 1:49

carlomusumeci ha scritto:hai ragione
beh, non te lo avevo suggerito io ma gli altri, ma va bene così figurati ...
carlomusumeci ha scritto:e poi il resto lo faccio fuori dall'interrupt...
esatto.

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8989
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

3
voti

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

Messaggioda Foto UtentePaolino » 6 apr 2015, 8:37

Non capisco peò perché vuoi inserire una rete di divisione e far scattare l'interrupt ogni secondo.
Collegando direttamente il quarzo da 32768Hz al PIC (secondo quanto indicato dal datasheet) potresti far compiere la divisione direttamente al microcontrollore, risparmiandoti qualche componente sulla scheda.

Ciao.

Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,6k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4226
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

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

Messaggioda Foto UtenteArrow » 6 apr 2015, 14:29

magari usandolo come ingresso al fatidico timer che, impostato l'opportuno divisore e valore di fine conteggio ti genererà un interruzione ogni secondo dove andrai ad incrementare un contatore (credo che incrementare un registro di un unità sia la cosa più rapida che si possa fare).
Avatar utente
Foto UtenteArrow
103 1 6
Frequentatore
Frequentatore
 
Messaggi: 166
Iscritto il: 11 giu 2014, 22:12

0
voti

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

Messaggioda Foto Utentecarlomusumeci » 6 apr 2015, 15:10

non sono molto bravo a calcolare i divisori..ma ci ho provato
allora...
Codice: Seleziona tutto
MOVLW    B'00100110'
MOVWF   OPTION_REG

cosi' facendo ho settato il clock del tmr0 dal pin RA4 e divido la frequenza per 128

quindi ottengo : 32.768 / 128 = 256 incrementi al secondo
per far si che il tmr0 generi un interrupt deve arrivare a 0 giusto?
quindi dentro al vettore di interrupt oltre che incrementare la variabile del contatore...devo settare il tmr0 a 1 per contare 255 incrementi
--------

Codice: Seleziona tutto
ORG 0X04
        MOVLW d'1'
        MOVWF tmr0
        INCF UNITA
        RETFIE


sicuro che sto sbagliando qualcosa...se divido i 32.768 Hz per 128 ottendo = 256 Hz quindi 256 incrementi al secondo...a quanto devo inizializzare Tmr0?
:shock:
Avatar utente
Foto Utentecarlomusumeci
353 5 7
Sostenitore
Sostenitore
 
Messaggi: 526
Iscritto il: 8 apr 2011, 0:35

0
voti

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

Messaggioda Foto UtenteArrow » 6 apr 2015, 17:07

puoi dividere per più di 128?
Avatar utente
Foto UtenteArrow
103 1 6
Frequentatore
Frequentatore
 
Messaggi: 166
Iscritto il: 11 giu 2014, 22:12

2
voti

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

Messaggioda Foto UtenteIsidoroKZ » 6 apr 2015, 17:31

Perché usare un altro quarzo, se c'è già quello da 4 MHz? Ho guardato il data sheet del micro e forse si potrebbe fare così.

Si parte da fck/4 lo si passa per il prestare, dividendo per 64, poi si entra nel tmr0 che divide ancora per 256 e genera un interrupt alla fine del conteggio. La frequenza degli interrupt risulta quindi di 61.035... Hz.

Nella routine di interrupt si contano gli interrupt e ogni 61 interrupt si incrementa una cella di memoria che contiene i secondi. Il programma fuori dell'interrupt provvede alla visualizzazione.

Il divisore però non è esattamente 61, ma 61.035... il che vuol dire che il divisore non deve essere sempre 61, ma talvolta deve essere 62 (tecnica di divisione frazionaria). Ogni in un periodo di 256s ci devono essere 9 divisori per 62 e i restanti 247 divisori per 62. In questo modo il divisore medio è proprio quello che serve e non si accumulano errori di divisione. La routine di interrupt è rapida, solo un decremento di un contatore, quando arriva a 0 si incrementa il contatore dei secondi e si reindirizzato il contatore a 61 o 62.

Il punto importante è che non si deve reinizializzare tmr0, quello conta di continuo senza perdere il ritmo, e si compensa la strana frequenza risultante con la divisione frazionata. C'è un po' di jitter sul conteggio dei secondi, circa 16ms, tutto sommato accettabile.

Al posto di avere un interrupt a 61Hz si può anche scendere di frequenza cambiando i divisori.
Per usare proficuamente un simulatore, bisogna sapere molta più elettronica di lui
Plug it in - it works better!
Il 555 sta all'elettronica come Arduino all'informatica! (entrambi loro malgrado)
Se volete risposte rispondete a tutte le mie domande
Avatar utente
Foto UtenteIsidoroKZ
121,2k 1 3 8
G.Master EY
G.Master EY
 
Messaggi: 21059
Iscritto il: 17 ott 2009, 0:00

0
voti

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

Messaggioda Foto Utentecarlomusumeci » 6 apr 2015, 18:02

fosc4/1 dividendo per 64, poi si entra nel tmr0 che divide ancora per 256 e genera un interrupt alla fine del conteggio

Intendi usare il prescaler che divide i 1.000.000 Hz / 64 = 15625 Hz,poi si lascia decrementare il tmr0 senza inizializzare niente...e ad ogni passaggio per lo zero si hanno 61,03515625 Hz...

poi creo una variabile che ad ogni interrupt si incrementa,arrivata al sessantesimo incremento incrementi l'unità del contatore, e riporti a 0 la variabile che conta gli interrupt...
Avatar utente
Foto Utentecarlomusumeci
353 5 7
Sostenitore
Sostenitore
 
Messaggi: 526
Iscritto il: 8 apr 2011, 0:35

PrecedenteProssimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 11 ospiti