Timer 1 e 3 indipendenti ?
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
) 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:
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.
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
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.
