Aangezien het de vorige keer niet helemaal goed ging met de PIC12F675, ga ik nu maar verder met de 16F628.

Wederom probereer ik de timer aan de praat te krijgen, en een interrupt te genereren.

Code is op dit moment als volgt:

	; Assign your microcontroller
        LIST P=16F628

	; This include file makes programming more understandeble
        include <P16F628.INC>

	; Predefine your configuration Word
	;__CONFIG 		Configuration Word
	;_CP_OFF		Code Protection 
	;_DATA_CP_OFF		EEPROM Code Protection
	;_BODEN_OFF		Under Voltage Reset
	;_MCLRE_ON		Master Clear Enable(Reset)
	;_PWRTE_ON		Powerup Timer 
	;_WDT_OFF		WatchDog Timer
	;_INTRC_OSC_NOCLKOUT	Internal RC oscilator(pins RA6/RA7 can be used voor I/O)
	;_LVP_OFF		Low Voltage Programming
	
	__CONFIG _CP_OFF & _DATA_CP_OFF & _BODEN_OFF & 
_MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _LVP_OFF

	; Disable warning : Register in operand not in bank 0
	ERRORLEVEL -302 

	; free 16F628 RAM starts at 0x20(depends on type microcontroller)
	CBLOCK 0x20
        ENDC
        
	;startadres of the controller
	org 0x0000
		goto	init

; Interrupt routine
	org 0x0004
		btfss	INTCON, 2	; check for timer0 overflow
		goto	endinterrupt
		movlw	b'11111111'
		xorwf	PORTB, 1	; xor W with PORTB, store in PORTB


endinterrupt
		bcf		INTCON, 2	; clear TMR0 Overflow
		RETFIE


; For using A0-A3 as digital I/O 
	init
		movlw	D'7' 		; 
        movwf	CMCON		; Comparators off, all pins digital I/O 

; Reset Port values
        clrf	PORTA	
        clrf	PORTB

; define your pin direction (input/output)
		bsf		STATUS, RP0	; Switch to bank 1
        movlw	b'11111111'	;
        movwf	TRISA		; PORTA = all inputs
        movlw	b'00000000'	; 
        movwf	TRISB		; PORTB = all outputs
		bcf		STATUS, RP0	; Switch to bank 0

; Set prescaler to TMR0
		CLRWDT
		bsf		STATUS, RP0
		movlw	b'11011111'
		movwf	OPTION_REG
		bcf		STATUS, RP0

; Set interrupt register
		movlw	b'10100000'	; set Global interrupt enable, set TMR0 Overflow interrupt enable
		movwf	INTCON

; Main loop
main
		nop
		goto main

	END

Waar gaat het fout? De interrupt routine wordt niet gestart bij het overflowen van Timer0. Tenzij ik handmatig (in MPLAB SIM) het INTCON register vol met 1-en knal.

Waar ik zelf de draad even kwijt ben is in de datasheet bij het INTCON register, daar staat namelijk:

GIE: Global interrupt enable bit.
1- Enables all UNmasked bits
0- disables all interrupts

...

T0IE: TMR0 Overflow Interrupt Enable bit
1 = Enables the TMR0 interrupt
0 = Disables the TMR0 interrupt

Moet ik de T0IE bit nu setten of niet ?

Tweede vraag, hoe zorg ik dat dat ding naar zijn ISR gaat?

[Bericht gewijzigd door Mr GAmba op (18%)]

Om een timer0 interrupt te krijgen moeten de GIE en de T0IE geset worden.
Dit zijn bit 7 en bit5 van het INTCON-register.

Bit 5 heb je niet geset ;)

Je bedoelt dat hier:

		movlw	b'10011000'	; set Global interrupt enable, set TMR0 Overflow interrupt enable
		movwf	INTCON

dit moet staan:

		movlw	b'10100000'	; set Global interrupt enable, set TMR0 Overflow interrupt enable
		movwf	INTCON

Dan kom ik nogsteeds niet in de interrupt, vandaar dat ik bit5 heb ge"unmasked". Omdat dat juist bij GIE staat.

Werkt nogsteeds niet als ik dit aanpas...

Heb je timer0 wel lopend, want dat mis ik in je progje..

TMR0 loopt wel. Dit zet ik in het OPTION_REG aan, door T0CS op 0 te zetten ( internal instruction cycle clock )

Op dit moment is de prescaler lekker voor de WDT, die haal ik er straks wel bij als de ISR wordt aangeroepen.

En nu werkt tie ineens wel.. iig bedankt alvast Zonnepaneeltje.

[Bericht gewijzigd door Mr GAmba op (13%)]