Newsgroup: it.hobby.elettronica.digitale
Titolo: Problema TMR0 PIC16F84

Non capisco come mai non riesco ad ottenere la temporizzazione di 0,848 mS
impostando il prescaler :8 ed il TMR0 a 150 con un clock di 4MHz. La
temporizzazione che ottengo e' di circa 12 mS.
La formula dovrebbe essere Frequenza di clock / 4 = 1MHz, cioe' 1uS, che
moltiplicato per 8 (prescaler) fa 8uS; questo dovrebbe incrementare il
registro TMR0 per 106 passi (256-150) sino allo 0 che genera l'interrupt
848uS.
Dove sbaglio?
Su RB0 viene generato un interrupt ogni 10mS, possibile che ci sia qualche
iterazione?
Naturalmente riabilito gli interrupts sia TOIF che GIE ecc...
Grazie
--------------------------------
Inviato via 
http://usenet.libero.it

 ha scritto nel messaggio
news:212Z162Z71Z26Y1...@usenet.libero.it...


Intanto grazie Andrea, ecco il codice incriminato, se hai un pò di tempo:
	ORG 04H
	btfsc INTCON,T0IF ;Testa se l'interrupt e' TMR0 (TOIF)
	goto IntTOIF
	btfsc INTCON,INTF ;Testa se l'interrupt e' RB0 (INTE)
	goto IntINTF
End_ih
	bcf INTCON,T0IF
	bcf INTCON,INTF
	retfie ;ritorna al programma principale e riabilita GIE
IntTOIF
	movlw 150
	movwf TMR0 ;Imposta il registro TMR0 per 0,848mS
	bsf PORTA,LED2
	goto End_ih
IntINTF
	bsf PORTA,LED1
	goto End_ih
Start
.......
	bsf STATUS,RP0
		;**********************
		;REGISTRO OPTION
		;bit 0 = L PS0 Prescaler Rate :8
		;bit 1 = H PS1 Prescaler
		;bit 2 = L PS2 Prescaler
		;bit 3 = L PSA Prescaler
		;bit 4 = L TOSE Fronte di salita RA4 (non usato)
		;bit 5 = L TOCS Si incrementa con il ck interno
		;bit 6 = H INTEDG Per fronti di salita su RB0
		;bit 7 = L RBPU Resistori Pull-ups abilitati
		;**********************
	movlw 01000010B
	movwf OPTION_REG
	movlw 150
	movwf TMR0 ;Imposta il registro TMR0 per 0,848mS
	bcf STATUS,RP0 ;Azzera il bit 5 (RP0) del registro STATUS
				;per accedere alle PORTE (BANK 0)
		;**********************
		;REGISTRO INTCON (INTERRUPTS)
		;bit 0 = - RBIF Lettura int RB4-7
		;bit 1 = - INTF Lettura int RB0
		;bit 2 = - T0IF Lettura int TMR0
		;bit 3 = H RBIE H Abilita RB4-7
		;bit 4 = H INTE H Abilita int RB0
		;bit 5 = H T0IE H Abilita int TMR0
		;bit 6 = L EEIE L Disabilita int scrittura completa EEPROM
		;bit 7 = H GIE H Abilita la gestine degli interrupts
		;**********************
	movlw 10111000B
	movwf INTCON
Ebbene visto con l'oscilloscopio, il LED 1 che interviene con l'interrupt su
RB0 ogni 10mS va bene, ma il LED 2 che dovrebbe intervenire ogni 0,8mS circa
interviene anche ogni 10mS.


** ORG 00H
** goto Start
 	ORG 04H
 	btfsc INTCON,T0IF ;Testa se l'interrupt e' TMR0 (TOIF)
 	goto IntTOIF
 	btfsc INTCON,INTF ;Testa se l'interrupt e' RB0 (INTE)
 	goto IntINTF
 End_ih
 	bcf INTCON,T0IF
 	bcf INTCON,INTF
 	retfie ;ritorna al programma principale e riabilita GIE
 IntTOIF
 	movlw 150
 	movwf TMR0 ;Imposta il registro TMR0 per 0,848mS
 	bsf PORTA,LED2
 	goto End_ih
 IntINTF
 	bsf PORTA,LED1
 	goto End_ih
 
 Start
 	bsf STATUS,RP0

secondo me e tutto ok il codice, ma manca di due cose te le ho segnate con
**
prova e facci sapere ciaoooo GIP


 Intanto grazie Andrea, ecco il codice incriminato, se hai un pň di tempo:


Grazie per la risposta, in effetti e' un estratto del codice.
Clock=4MHz
Direttive....
Costanti...
Variabili File register ...
RESET VECTOR
ORG 00H ;Inizio area programma (Dopo il RESET)
;Salta al corpo del programma principale per evitare le routine di interrupt
goto Start
Punto di inizio routine interrupt...
ORG 04H
        movwf accum ;Memorizza W nella variabile accum
        btfsc INTCON,T0IF ;Testa se l'interrupt e' TMR0 (TOIF)
	goto IntTOIF
	btfsc INTCON,INTF ;Testa se l'interrupt e' RB0 (INTE)
	goto IntINTF
End_ih
	bcf PORTA,LED1
	bcf PORTA,LED2
	bcf INTCON,T0IF
	bcf INTCON,INTF
	movf accum,w ;Ripristina W
	retfie ;ritorna al programma principale e riabilita GIE
	;-----------------------------------------------------------------
	; TMR0 Interrupt handler 1mS circa
	;-----------------------------------------------------------------
IntTOIF
	movlw 150
	movwf TMR0 ;Imposta il registro TMR0 per 0,848mS
	bsf PORTA,LED2
	goto End_ih
	;-----------------------------------------------------------------
	; INTE Interrupt handler (RB0)
	;-----------------------------------------------------------------
IntINTF
	bsf PORTA,LED1
	goto End_ih
;*****************************************************************
; Programma principale Inizializzazione
;*****************************************************************
Start
	bsf STATUS,RP0 ;Setta il bit 5 (RP0) del registro STATUS
				;per accedere ai registri TRIS (BANK 1)
	movlw 00000000B ;Carica il valore nell'accumulatore
	movwf TRISA ;Imposta IN/OUT PORTA A (0=uscita, 1=ingresso)
	movlw 01110001B ;Carica il valore nell'accumulatore
	movwf TRISB ;Imposta IN/OUT PORTA B (0=uscita, 1=ingresso)
		;**********************
		;REGISTRO OPTION
		;bit 0 = L PS0 Prescaler Rate :8
		;bit 1 = H PS1 Prescaler
		;bit 2 = L PS2 Prescaler
		;bit 3 = L PSA Prescaler
		;bit 4 = L TOSE Fronte di salita RA4 (non usato)
		;bit 5 = L TOCS Si incrementa con il ck interno
		;bit 6 = H INTEDG Per fronti di salita su RB0
		;bit 7 = L RBPU Resistori Pull-ups abilitati
		;**********************
	movlw 01000010B
	movwf OPTION_REG
	movlw 150
	movwf TMR0 ;Imposta il registro TMR0 per 0,848mS
	bcf STATUS,RP0 ;Azzera il bit 5 (RP0) del registro STATUS
				;per accedere alle PORTE (BANK 0)
		;**********************
		;REGISTRO INTCON (INTERRUPTS)
		;bit 0 = - RBIF Lettura int RB4-7
		;bit 1 = - INTF Lettura int RB0
		;bit 2 = - T0IF Lettura int TMR0
		;bit 3 = L RBIE H Abilita RB4-7
		;bit 4 = H INTE H Abilita int RB0
		;bit 5 = H T0IE H Abilita int TMR0
		;bit 6 = L EEIE L Disabilita int scrittura completa EEPROM
		;bit 7 = H GIE H Abilita la gestine degli interrupts
		;**********************
	movlw 10110000B
	movwf INTCON
	bcf PORTA,LED1 ;Spegne il LED1
	bcf PORTA,LED2 ;Spegne il LED2
	goto Main
;*****************************************************************
; Loop principale
;*****************************************************************
Main
	goto Main
	END
E' sempre alleggerito, spero di non aver dimenticato niente di essenziale,
comunque dalle ultime prove che ho fatto, sembra che il PIC non tenga conto
del prescaler e se carico sul registro TMR0 il valore 249 ottengo una
temporizzazione di circa 0,8mS ma se abilito anche l'interrupt RB0 (che
viene scatenato dall'esterno ogni 10mS) il problema ritorna.
Grazie.


 > movwf INTCON
.....


sempre impossibile ma sempre sulla puttanate ci perdiamo io premetto ho
perso delle settinane per una locazione ram che non mi riuscivo spiegare
come veniva sporcata cmq l'importante e venirne fuori buon divertimento con
il timer alla prox


 ha scritto nel messaggio
news:212Z162Z72Z32Y1...@usenet.libero.it...
