PIC16F870: Får inte Capture interrupt att fungera

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
AndersE
Inlägg: 54
Blev medlem: 27 september 2005, 16:07:17
Ort: Stockholm
Kontakt:

PIC16F870: Får inte Capture interrupt att fungera

Inlägg av AndersE »

Jag försöker använda Capture-funktionen på en PIC16F870, men jag får inga interrupt :(
Har samma problem med Timer 1.

(Timer 0 och Timer 2 kan jag få att generera interrupt)

Jag släpper in en klocksignal på pin 13, och använder pin 22 och 23 för debug. (DIL-kapsel)
Hoppas att någon kan peka på vad jag gör för fel...


Kod: Markera allt

	__config	_CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_OFF & _WDT_OFF & _HS_OSC  
	include "p16f870.inc"

PUSH    macro
        movwf   TEMP_W
        swapf   STATUS,W
        movwf   TEMP_S
        endm

POP     macro
        swapf   TEMP_S,W
        movwf   STATUS
        swapf   TEMP_W,1
        swapf   TEMP_W,W
        endm

;
; Register file definitions
;  First byte is at 0x20

TEMP_S	equ		0x20
TEMP_W	equ		0x21

; last byte is at 0x7F



	org	0			;
	goto	init			;
					;
	org	4			;
interrupt				;
	bcf		INTCON, GIE	; Disable interrupts
	PUSH			

	movlw	0x02			; DEBUG, show if we get interrupts
	xorwf	PORTB, F

	bcf		PIR1, CCP1IF	; Clear capture interrupt flag
	bcf		PIR1, TMR1IF	; Clear Timer 1 interrupt flag
	
	POP				;
	bsf		INTCON, GIE	;
	retfie				;




					; ******************************************************
					; Init
					; ******************************************************
init					;
	movlw	0x21			; Start at 21, using 20 as counter--
	movwf	FSR			;
	movlw	0x60-1			; 96 bytes, but "20" gets cleared by decfsz
	movwf	0x20			; Store number of bytes to clear in "20"
ram	clrf	INDF			; Clear the location pointed to by FSR
	incf	FSR, F			; Point to next location
	decfsz	0x20, F			; 
	goto	ram			;

	bcf	STATUS, RP0		;
	bcf	STATUS, RP1		;
	clrf	PORTA			;

	bsf	STATUS, RP0		; Bank 1

	movlw	0x08			; No TMR0 prescaler	
	movwf	OPTION_REG		;

	movlw	0x3F			;
	movwf	TRISA			;
	movlw	0x00			;
	movwf	TRISB			; PORTB outputs
	movlw	0x04			;
	movwf	TRISC			;

	clrf	PIE1			;
	bsf	PIE1, CCP1IE		;
	bsf	PIE1, TMR1IE		; DEBUG
	bcf	STATUS, RP1		; Bank 0


	clrf	CCP1CON			; Capture mode, every rising flank
	movlw	0x05			;
	movwf	CCP1CON			;
	movlw	0x01			; Timer1 on, no prescaler 
	movwf	T1CON			;

	clrf	INTCON			;
	bsf	INTCON, PEIE		; 
	bsf	INTCON, GIE		;




main
	movlw	0x04			; DEBUG, show if processor is running
	xorwf	PORTB, F		; DEBUG

	goto	main

	end

bearing
Inlägg: 11674
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: PIC16F870: Får inte Capture interrupt att fungera

Inlägg av bearing »

Ger den inte interrupt alls? jag ser att du har interrupt även på TMR1 overflow.

Kanske är något med bankerna. Har du provat att simulera?
Finns en stimulusfunktion som kan användas för att påverka pinnar så att de ger interrupt.

GIE nollas automatisk om ett intterrupt sker, återställs av RETFIE, har jag för mig.
bos
Inlägg: 2311
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: PIC16F870: Får inte Capture interrupt att fungera

Inlägg av bos »

Några kommentarer:

Du skriver att du "släpper in en klocksignal". Vad menas med det? Använder du en kristall eller extern klocka? Dina config-bittar anger att du använder HS-läge på oscillatorn. Enligt avsnitt 11.2 används HS för en kristall eller resonator. Om du använder en klocksignal tror jag inte det funkar så bra, men jag har ingen förstahandsinfo på det. Prova att använda INTOSC om du vill kolla att CCP funkar.

Istället för att bankswitcha manuellt med bsf/bcf STATUS, RP0 så rekommenderar jag att du använder "banksel" istället. Exempelvis "banksel TRISA", då får du garanterat rätt bank när du ska pilla på TRISA. Använd banksel för varje register så slipper du bry dig om vilken bank de ligger i. Det blir lite extra kod om du sätter många register och varannan av dem är i olika banker, men sånt går att optimera bort längre fram.

När din ISR ska sluta behöver du inte sätta GIE manuellt. Operanden "retfie" är "return from interrupt" och har som bieffekt att GIE sätts när den utförs. Du kan därför ta bort din bsf där.

Ett sista tips är att när du pillar med konfiguration av register (t.ex T1CON) så blir det mer lättöverskådligt om du använder talen i binär form. Då kan man direkt se bitarna som sätts utan att först behöva göra om till binärt, sätta/rensa bitarna, göra om till hexadecimalt. Du förlorar ingenting på att ha det i binärform. Lata personer, som jag, orkar oftast inte kontrollera någons inställningar mot databladet om det inte står i binär form, så det kanske ökar chansen att få hjälp.
AndersE
Inlägg: 54
Blev medlem: 27 september 2005, 16:07:17
Ort: Stockholm
Kontakt:

Re: PIC16F870: Får inte Capture interrupt att fungera

Inlägg av AndersE »

bearing skrev: Kanske är något med bankerna. Har du provat att simulera?

Ja, så var det! :)
Jag satte ju RP0 för bank 1, men nollade RP1 :roll:

Tack för input!
Har inte tid att testa just nu, men nu finns det ju en rimlig förklaring iaf..
bos
Inlägg: 2311
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: PIC16F870: Får inte Capture interrupt att fungera

Inlägg av bos »

AndersE skrev:Jag satte ju RP0 för bank 1, men nollade RP1 :roll:
Här har du ett lysande incitament till att använda "banksel" i fortsättningen.
Skriv svar