Ok, dann also mal folgende Angaben:
- PIC 16F88
Code:
ISR ;interupt service routine
movwf copyw ;Status und W retten
swapf STATUS, W
bcf STATUS, RP0
movwf copys
btfsc PIR1, TMR1IF ;testet Timer 1 Interrupt-Flag
goto TMR1ISR ; wenn gesetzt, zur Timer-Inkrementierung gehen
btfsc PORTB, 7 ; wenn nicht gesetzt, testen ob der Taster den Interrupt ausgelöst hat (nur Reaktion, wenn aufsteigende Flanke den Interrupt ausgelöst hat)
goto RBInt ; wenn ja, zur Taster-Rutine gehen
goto ISRend ; wenn nicht, ISR beenden
..........
RBInt ;Taster-ISR
bcf INTCON, RBIF ;PORTB-Interrupt-Flag löschen
bsf UPDRBI ;Update-Flag für PORTB setzten (bedingt Reaktion im Hautprogramm)
goto ISRend ; Interrupt beenden
ISRend ;iRutine, um ISR zu beenden
swapf copys, w ;Status, und w wieder laden
movwf STATUS
swapf copyw, f
swapf copyw, w
bsf UPDLCD ;Flag setzen, damit das LCD neu beschrieben wird
retfie ;ISR-ende
...............
InitTimer ;Init des Timer, "PIE1, TMR1IE" wird noch nicht gesetzt (Timer1 interrupt enable-bit)
bcf STATUS, RP0
movlw B'00110101' ;prescaler: 1:8; internal clock; no synchronize; Timer1 enabled
movwf T1CON
bsf STATUS, RP0
bcf PIE1, TMR1IE
bcf STATUS, RP0
bsf INTCON, RBIE ;PORTB-Interrupt an
bsf INTCON, PEIE ;Periphäre-Interrupts an
bsf INTCON, GIE ;Global-Interrupt an
return
Main
btfsc UPDLCD ;Testen, ob das LCD neu beschrieben werden muss (bei Reset nicht der Fall)
goto WriteLcd
call Init ;Initialisierungen
call InitLCD ;Initialisierungen
call InitTimer ;Initialisierungen
WriteLcd ;Endlosschleife des Hauptprogramms,
bcf UPDLCD ;LCD-Update-Flag löschen
btfsc UPDRBI ;testen, ob der Taster gedrückt wurde
goto TestRBI ;zur Taster-Rutine gehen
call printzehn ;LCD schreiben
call printseke ;LCD schreiben
call printsekz ;LCD schreiben
call printmine ;LCD schreiben
call printminz ;LCD schreiben
call printstde ;LCD schreiben
call printstdz ;LCD schreiben
movlw b'11001111' ;Cursor an letzte Position
call OutLcdControl
movlw D'10' ;Warteschleife, um LCD nicht zu überlasten
movwf loops
call WAIT
goto WriteLcd ;Endlosschleife
TestRBI ;Testen, ob der Taster wirklich gedrückt wurde
bcf UPDRBI ;Flag löschen
movlw D'20' ;Warteschleife, um prellen abzuwarten
movwf loops
call WAIT
btfsc PORTB, 7 ;Ist der Taster immer noch angeschaltet?
goto StartTMR ;wenn ja, zur Timer-Start-Rutine gehen
goto WriteLcd ;wenn nein, abbruch
StartTMR ;Timer starten
bsf STATUS, RP0 ;bank 1
bsf PIE1, TMR1IE ;Timer1 Enable-Bit setzten
bcf STATUS, RP0 ;Bank 0
goto WriteLcd ;zurück zum Hauptprogramm
So, sorry, dass ich die Kommentare vergessen habe. Diese sollten weiterhelfen.
Guss orph
Lesezeichen