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







Zitieren

Lesezeichen