Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Timer 1 e 3 indipendenti ?

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Timer 1 e 3 indipendenti ?

Messaggioda Foto Utentegyruss » 9 mag 2012, 0:36

Ciao a tutti.
Ho un problema che non riesco a risolvere da solo e che vorrei esporvi.
Sto utilizzando un PIC 18F45K22 e programmo in assembly (più o meno :-P ) con MPLAB.
Vorrei utilizzare due timer in modo indipendente precisamente il timer 1 ed il timer 3 a 16bit. Ho bisogno che i due contino degli impulsi dai loro pin dedicati che sono RB5 ed RC0.
Quello che ottengo è che tutti e due incrementano allo stesso modo come se fossero collegati allo stesso pin di ingresso che è RC0 mentre gli impulsi su RB5 vengono ignorati. Leggendo il datasheet del PIC in questione ho settato i fuses e i registri relativi ai timer in modo opportuno, almeno credo, ma non sembrano funzionare come vorrei.
Questa è la gestione dei timer:
Codice: Seleziona tutto
;******************************************************************************************************
               #include <p18F45K22.inc>
               
;******************************************************************************************************
               
               config          FOSC = HSMP,  PLLCFG = ON,  PRICLKEN = ON,  FCMEN = OFF, IESO = OFF, BORV = 190, BOREN = NOSLP, PWRTEN = OFF, WDTEN = OFF,  PBADEN = OFF,  MCLRE = EXTMCLR, P2BMX = OFF, T3CMX = OFF, HFOFST = ON, CCP3MX = OFF, CCP2MX = OFF, DEBUG = OFF, XINST = OFF, LVP = OFF, STVREN = ON
            
      
                   ORG         10h               
               

               movlw         b'11111111'
               movwf         TRISA
               movlw         b'00100000'
               movwf         TRISB
               movlw         b'00000111'
               movwf         TRISC
                        
               movlw         b'00000000'         
               movwf         TRISD               
               clrf            PORTD

               clrf            PORTB

            
               clrf            ANSELA
               clrf            ANSELB
               clrf            ANSELC
               clrf            ANSELD
               clrf            ANSELE
            
               clrf            TMR1L
               clrf            TMR1H
               clrf            TMR3L
               clrf            TMR3H
;-----------------------------------------------------------------------------------------------------------------
;               TIMER1      INP = RC0
;-----------------------------------------------------------------------------------------------------------------   
                        
               movlw         b'10000111'
               movwf         T1CON               

                                             ;BIT7 = 1   TMRxCS   Selezione sorgente clock      | (11 = RISERVATO, NON USARE )
                                             ;                                          | (10 = CLOCK DA QUARZO SE TxSOSCEN = 1)
                                             ;                                          | (10 = CLOCK ESTERNO DA TxCKI SE TxSOSCEN = 0)
                                             ;                                          | (01 = TIMER 1/3/5 CLOCK = FOSC)
                                             ;BIT6 = 0   TMRxCS   Selezione sorgente clock      | (00 = TIMER 1/3/5 CLOCK = FOSC/4)
                                             ;BIT5 = 0   TxCKPS   Timer1/3/5 Prescaler bits
                                             ;BIT4 = 0   TxCKPS   Timer1/3/5 Prescaler bits
                                             ;BIT3 = 0      TxSOSCEN   Abilitazione oscillatore secondario (0 = DISABILITATO, 1 = ABILITATO)
                                             ;BIT2 = 1    TxSYNC   Timer1/3/5 sincronizzazione clock esterno
                                             ;BIT1 = 1   TxRD16   Abilitazione lettura/scrittura 16-bit (1 = 1x16 BIT, 0 = 2x8 BIT)
                                             ;BIT0 = 1   TMRxON   Timer1/3/5 Abilitato (1 = ON, 0 = OFF + AZZERAMENTO)

               movlw         b'00000000'
               movwf         T1GCON            ;   T1GCON

                                             ;BIT7 = 0   TMRxGE   Bit abilitazione gate         | (CON TMRxON = 0 ---> IGNORATO )
                                             ;                                          | (CON TMRxON = 1 IL CONTEGGIO E' CONTROLLATO DAL GATE)
                                             ;                                          | (CON TMRxON = 0 IL CONTEGGIO E' INDIPENDENTE DAL GATE)
                                             ;BIT6 = 0   TxGPOL   Bit polarità gate             | (1 = CONTA QUANDO GATE E' ALTO)
                                             ;                                          | (0 = CONTA QUANDO GATE E' BASSO)
                                             ;BIT5 = 0   TxGTM      Gate modalità toggle         | (1 = ABILITATO, 0 = DISABILITATO)
                                             ;BIT4 = 0   TxGSPM   Modalità singolo impulso      | (1 = ABILITATO, 0 = DISABILITATO
                                             ;BIT3 = 0      TxGGO/DONE   Stato acquisizione singolo impulso
                                             ;                                          | (1 = ACQUISIZIONE PRONTA, ATTESA CAMBIO DI STATO)
                                             ;                                          | (0 = ACQUISIZIONE COMPLETATA O MAI PARTITA)
                                             ;BIT2 = 0   TxGVAL   Indica lo stato attuale del gate per incremento TMRxH : TMRxL. Nessun effetto su TMRxGE.
                                             ;BIT1 = 0   TxGSS      Bits selezione gate         |00 = GATE PIN
                                             ;BIT0 = 0   TxGSS      Bits selezione gate         |10 = OPZIONE USCITA COMPARATORE1 SINCRONIZZATA SYNCC1OUT
                                             ;                                          |11 = OPZIONE USCITA COMPARATORE2 SINCRONIZZATA SYNCC2OUT
                                             ;                                          |01 = TIMER2/4/6 INCONTRA PR2/4/6

;-----------------------------------------------------------------------------------------------------------------
;               TIMER3      INP = RB5            
;-----------------------------------------------------------------------------------------------------------------

               movlw         b'10000111'
               movwf         T3CON               ;   T3CON

                                             ;BIT7 = 1   TMRxCS   Selezione sorgente clock      | (11 = RISERVATO, NON USARE )
                                             ;                                          | (10 = CLOCK DA QUARZO SE TxSOSCEN = 1)
                                             ;                                          | (10 = CLOCK ESTERNO DA TxCKI SE TxSOSCEN = 0)
                                             ;                                          | (01 = TIMER 1/3/5 CLOCK = FOSC)
                                             ;BIT6 = 0   TMRxCS   Selezione sorgente clock      | (00 = TIMER 1/3/5 CLOCK = FOSC/4)
                                             ;BIT5 = 0   TxCKPS   Timer1/3/5 Prescaler bits
                                             ;BIT4 = 0   TxCKPS   Timer1/3/5 Prescaler bits
                                             ;BIT3 = 0      TxSOSCEN   Abilitazione oscillatore secondario
                                             ;BIT2 = 0   TxSYNC   Timer1/3/5 sincronizzazione clock esterno
                                             ;BIT1 = 0   TxRD16   Abilitazione lettura/scrittura 16-bit (1 = 16 BIT, 0 = 8 BIT)
                                             ;BIT0 = 0   TMRxON   Timer1/3/5 Abilitato (1 = ON, 0 = OFF + AZZERAMENTO)


               movlw         b'00000000'
               movwf         T3GCON            ;   T1GCON

                                             ;BIT7 = 1   TMRxGE   Bit abilitazione gate         | (CON TMRxON = 0 ---> IGNORATO )
                                             ;                                          | (CON TMRxON = 1 IL CONTEGGIO E' CONTROLLATO DAL GATE)
                                             ;                                          | (CON TMRxON = 0 IL CONTEGGIO E' INDIPENDENTE DAL GATE)
                                             ;BIT6 = 0   TxGPOL   Bit polarità gate             | (1 = CONTA QUANDO GATE E' ALTO)
                                             ;                                          | (0 = CONTA QUANDO GATE E' BASSO)
                                             ;BIT5 = 0   TxGTM      Gate modalità toggle         | (1 = ABILITATO, 0 = DISABILITATO)
                                             ;BIT4 = 0   TxGSPM   Modalità singolo impulso      | (1 = ABILITATO, 0 = DISABILITATO
                                             ;BIT3 = 0      TxGGO/DONE   Stato acquisizione singolo impulso
                                             ;                                          | (1 = ACQUISIZIONE PRONTA, ATTESA CAMBIO DI STATO)
                                             ;                                          | (0 = ACQUISIZIONE COMPLETATA O MAI PARTITA)
                                             ;BIT2 = 0   TxGVAL   Indica lo stato attuale del gate per incremento TMRxH : TMRxL. Nessun effetto su TMRxGE.
                                             ;BIT1 = 0   TxGSS      Bits selezione gate         |00 = GATE PIN
                                             ;BIT0 = 0   TxGSS      Bits selezione gate         |10 = OPZIONE USCITA COMPARATORE1 SINCRONIZZATA SYNCC1OUT
                                             ;                                          |11 = OPZIONE USCITA COMPARATORE2 SINCRONIZZATA SYNCC2OUT
                                             ;                                          |01 = TIMER2/4/6 INCONTRA PR2/4/6


               


TEST
               btfsc      TMR1L,W               ;Serve per incrementare TMR1H
               nop
               btfsc      TMR3L,W               ;Serve per incrementare TMR3H
               nop
               
               movf      TMR1L,W               
               movwf      PORTD                  


               bra         TEST

               end



Ho lasciato i commenti dei singoli bit dei registri dei timer per poter avere la possibilità di capire cosa fanno singolarmente e spero di aver capito bene.
Un dettaglio che mi manda in confusione è distinguere il funzionamento di uno stesso pin con funzione T3CK1, T1CK1 e T3G tutti facenti riferimento a RC0.

Grazie, Marco.
Avatar utente
Foto Utentegyruss
50 1 2
New entry
New entry
 
Messaggi: 68
Iscritto il: 26 mar 2010, 13:01
Località: Torino

0
voti

[2] Re: Timer 1 e 3 indipendenti ?

Messaggioda Foto UtenteKirkegaard » 12 mag 2012, 21:39

solo per curiosità qual è il registro con il bit che associa il pin del micro come ingresso al timer ?
Avatar utente
Foto UtenteKirkegaard
7.415 1 7 10
Master
Master
 
Messaggi: 17
Iscritto il: 12 giu 2011, 19:09

0
voti

[3] Re: Timer 1 e 3 indipendenti ?

Messaggioda Foto Utentegyruss » 13 mag 2012, 21:49

Il registro che gestisce l' ingresso del timer è T1CON (per timer1) e T3CON (per timer3). Questi due sono uguali tra loro.
I bit che definiscono i rispettivi ingressi sono il 6 ed il 7 e si chiamano TMRxCS (2 bit) dove la "x" sta per 1 se timer1 e 3 se timer3. Sul datasheet leggo che vanno impostati a 1 il bit 7 e a 0 il bit 6 tenendo conto di porre a 0 il bit 3 che si chiama TxSOSCEN.
Altri dettagli che influiscono sugli ingressi RB5 e RC0 sono da impostarsi sui fuses e sono T3CMX e, forse, P2BMX e CCP3MX.
Avatar utente
Foto Utentegyruss
50 1 2
New entry
New entry
 
Messaggi: 68
Iscritto il: 26 mar 2010, 13:01
Località: Torino

2
voti

[4] Re: Timer 1 e 3 indipendenti ?

Messaggioda Foto Utentegyruss » 2 giu 2012, 23:44

E come mi disse Gohan in risposta ad un vecchio topic che i simulatori non sono affidabili al 100%, ebbene, ha proprio ragione. Dico questo perché il problema che ho riscontrato deriva proprio da MPLABSIM che fa un po' quello che vuole.
Infatti provando il programma direttamente su board easypic funziona perfettamente.
Mi chiedo solo se è anche vero il contrario, e cioè, che MPLABSIM dia esito positivo mentre una volta scaricato il programma nel PIC , questo non funzioni. Farò anche questo esperimento.
Ciao.
Avatar utente
Foto Utentegyruss
50 1 2
New entry
New entry
 
Messaggi: 68
Iscritto il: 26 mar 2010, 13:01
Località: Torino

0
voti

[5] Re: Timer 1 e 3 indipendenti ?

Messaggioda Foto Utentesimo85 » 2 giu 2012, 23:49

gyruss ha scritto:E come mi disse simo85 in risposta ad un vecchio topic che i simulatori non sono affidabili al 100%

E come dice IsidoroKZ "butta via i simulatori". :mrgreen:

EDIT: Mi ero confuso con MPLAB prima. :oops:
Avatar utente
Foto Utentesimo85
30,8k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[6] Re: Timer 1 e 3 indipendenti ?

Messaggioda Foto Utentegyruss » 3 giu 2012, 0:02

Lo so. Solo che quando ottengo che il programma viene "compilato" procedo poi con la simulazione andando a verificare registri e quant' altro e, nel caso serva, utilizzo gli "stimulus" per simulare, ad esempio, dei pulsanti. Non ho mai detto che che un programma compilato con successo deva per forza funzionare. Proprio per questo motivo passo sempre attraverso il simulatore nella speranza che sia attendibile. Ma da adesso in poi credo che lo verificherò anche sulla mia board.
Ciao, Marco.
Avatar utente
Foto Utentegyruss
50 1 2
New entry
New entry
 
Messaggi: 68
Iscritto il: 26 mar 2010, 13:01
Località: Torino

0
voti

[7] Re: Timer 1 e 3 indipendenti ?

Messaggioda Foto Utentesimo85 » 3 giu 2012, 0:15

gyruss ha scritto:Non ho mai detto che che un programma compilato con successo deva per forza funzionare.

simo85 ha scritto:EDIT: Mi ero confuso con MPLAB prima. :oops:

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

2
voti

[8] Re: Timer 1 e 3 indipendenti ?

Messaggioda Foto Utentegyruss » 3 giu 2012, 21:29

Non importa. L' importante alla fine è capirsi. Grazie lo stesso figlio di Goku. :ok:
Avatar utente
Foto Utentegyruss
50 1 2
New entry
New entry
 
Messaggi: 68
Iscritto il: 26 mar 2010, 13:01
Località: Torino


Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti