Hallo,
vielen Dank erstmal für die Tips. Mittlerweile funktioniert das Programm. ich weiß zwar nicht woran es lag, aber egal.
wen´s interessiert, hier nochmal der programmtext.
Funktion:
im 8Hz takt wird innerhalb eines interrupt ein taster abgefragt, und davon abhängig eine LED zum blinken gebracht.
#include <p16F690.inc>
__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)
w_copy equ 0x20 ; Backup für Akkuregister
s_copy equ 0x21 ; Backup für Statusregister
anaus equ 0x22 ; Status der LED
org 0
nop
goto Init
org 04 ; Einsprungadresse Interrupt
goto IntStart
org 05 ; ohne diese Zeitel kommt die Fehlermeldung:
; Error - section '.org_1' can not fit the absolute section.
; Section '.org_1' start=0x00000004, length=0x00000056
; *************** Initialisierungen ********************************
Init
bsf STATUS,RP0 ; Bank 1
movlw 0xFF
movwf TRISA ; PortA input
clrf TRISC ; PortC output
bcf STATUS,RP0 ; Bank 2
bsf STATUS,RP1
movlw 0x00 ; PortA digital
movwf ANSEL
bcf STATUS,RP0 ; Bank 0
bcf STATUS,RP1
;**************** Timer-Interupt einstellen ******************************
bsf STATUS, RP0 ; auf Bank 1 umschalten
movlw B'10000111' ; internen Takt zählen, Vorteiler zum Timer0, 32:1
movwf OPTION_REG
bcf STATUS, RP0 ; auf Bank 0 zurückschalten
clrf TMR0 ; ((32,768 kHz : 32 ): 256 = 8 Hz) ?
bsf INTCON, T0IE ; Timer0 interupt erlauben
bsf INTCON, GIE ; Interupt erlauben
loop
nop
goto loop
;************ Interrupt Einsprung *************************************
IntStart
movwf w_copy ; w retten
swapf STATUS, w ; STATUS retten
bcf STATUS, RP0 ; Bank 0
movwf s_copy ;
;************* Interrupt-Routine **************************************
btfsc PORTA, 5 ; RA5 = 0 (0V) -> überspringe nächsten Befehl
goto LED_AN ; lass die LED blinken
goto LED_AUS
LED_AN
btfsc anaus, 1 ; LED beim letzten Interrupt schon an?
goto LED_AUS
movlw 0x04 ; LED an
movwf PORTC
movlw 0x02 ; setze Status auf an
movwf anaus
goto IntEnd
LED_AUS
clrf PORTC ; LED aus
clrf anaus ; setze Status auf aus
goto IntEnd
IntEnd
bcf INTCON, T0IF ; Interupt-Flag löschen
swapf s_copy, w ; STATUS zurück
movwf STATUS
swapf w_copy, f ; w zurück mit flags
swapf w_copy, w
retfie
end