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 INTCONdit moet staan:
movlw b'10100000' ; set Global interrupt enable, set TMR0 Overflow interrupt enable
movwf INTCONDan 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...
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%)]