LIST P=PIC16F84A #include P16F84A.inc __config _CP_OFF &_PWRTE_ON &_WDT_OFF &_XT_OSC Kor100Reg EQU 0x10 ;plus Konstante Inn100Reg EQU 0x11 ;innere Schleifenzahl mal Auss100Reg EQU 0x12 ;aeussere Schleifenzahl Kor1MReg EQU 0x13 ;plus Konstante-Register Inn1MReg EQU 0x14 ;innere Schleifenzahl mal Auss1MReg EQU 0x15 ;aeussere Schleifenzahl-Reg SupAuss1M EQU 0x16 ;ganz äussere SchlZahl-Register Kor20Reg EQU 0x17 ;Registeradresse (plus Konstante) Inn20Reg EQU 0x18 ;Registeradresse (innere Schleifenzahl) mal Auss20Reg EQU 0x19 ;Registeradresse (aeussere Schleifenzahl) PDZReg EQU 0x1A QuerReg1 EQU 0x1B QuerReg2 EQU 0x1C Schl01Reg EQU 0x1D WLTReg EQU 0x1E ;WeglaufTimerRegister Zae8Reg EQU 0x1F MyFlags1 EQU 0x20 ;Bit 0: 1=es ist zur Zeit gebremst. ;Bit 1: Bit für Diagnose Led ;Bit 2: (Empfangskanalflag) 1 = Trisb,2 ist gesettet Empfang auf Standardkanal für Break Clear= Empfang für WLT/Release ;Bit 3: (Release-Quittung) 1= Bremse wurde bereits einmal gelöst Durch EEDATA,3 ersetzt ;Bit 4: Set=Bremsung wurde von WLT beantragt WLTIMReg EQU 0x21 ChoTIMReg EQU 0x22 BrTIMReg EQU 0x23 STATUs_TEMP EQU 0x24 W_TEMP EQU 0x25 RechReg EQU 0x26 Kor5Reg EQU 0x27 ;Registeradresse (plus Konstante) Inn5Reg EQU 0x28 ;Registeradresse (innere Schleifenzahl) mal Auss5Reg EQU 0x29 ;Registeradresse (aeussere Schleifenzahl) EEFlags1 EQU 0x03 ;EEPROM-Adresse unter der das ehemalige Myflags1,3 ausschaltfest gespeichert wird. Also das Flag, ; welches sagt, ob zuletzt gebremst wurde oder zuletzt die Bremse gelöst wurde. Wäre das Flag falsch ;könnte es nämlich u.U.zum Bremsseilriss führen. Das ganze Byte wird gesetzt oder gecleart, weil sich sowieso ;keine einzelnen Bits im EEprom ändern lassen. Abgefragt wird Bit 3. ; Start und Interrupt verteilung---Start und Interrupt verteilung---Start und Interrupt verteilung---Start und Interrupt verteilung-- ;Start und Interrupt verteilung---Start und Interrupt verteilung---Start und Interrupt verteilung---Start und Interrupt verteilung--- NOP ;000000 NOP NOP GOTO priminit Intvec NOP ; CALL TestBlk ;TestLED !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! BTFSS INTCON,1 GOTO PortInt ;kein Überlast-Interrupt also weiter MOVLW B'00000110' ;Überlastabschaltung MOVWF PORTA RETURN ; (zu Motorlaufprogramm) PortInt NOP PUSH MOVWF W_TEMP ; Copy W to TEMP register, SWAPF STATUS, W ; Swap status to be saved into W MOVWF STATUs_TEMP ; Save status to STATUS_TEMP register BCF STATUS,RP0 BTFSS INTCON,0 ;Ist es ein PortCh Interrupt? Oder eher Timer? GOTO TimeInt BTFSS PORTB,7 ;nicht dass der PC Interrupt vom Signalrückfallen ausgelöst wurde! GOTO POP0 BCF INTCON,GIE BCF INTCON,3 ;DISable PortChI BCF INTCON,5 ;Disable TimerInt BCF INTCON,0 ;Interrupt Portbchange Flag wiederherstellen CALL Aktionsauswahl MOVLW B'00101000' ;Portb Change Interr ein und Timer MOVWF INTCON POP1 SWAPF STATUs_TEMP,W ; Swap nibbles in STATUS_TEMP register; and place result into W MOVWF STATUS ; Move W into STATUS register; (sets bank to original state) SWAPF W_TEMP, F ; Swap nibbles in W_TEMP and place result in W_TEMP SWAPF W_TEMP, W ; Swap nibbles in W_TEMP and place result into W RETfie ;(to Init/Sleep) TimeInt BTFSS INTCON,2 ;(Flag )Timer Interrupt für Weglauftimer und regelmäßigen Kanalwechsel GOTO POP0 ;kann's eigentlich nicht geben einer von den drei Interrupts muß es ja gewesen sein. CALL chooseChannel ;das Modul zum Wechsel des Empfangskanals CALL WLTDec ;das Modul zum regelmäßigen runterzählen der erlaubtenZeit ohne Empfang CALL Unterspannungstest ; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! CALL BremsCheck ;Modul überprüft ob gebremst sein sollte und ist.MUFU und Seilspannung o.ä. Bremst ggf. POP0 MOVLW B'00101000' ;Portb Change Interr ein und Timer MOVWF INTCON POP2 SWAPF STATUs_TEMP,W ; Swap nibbles in STATUS_TEMP register; and place result into W MOVWF STATUS ; Move W into STATUS register; (sets bank to original state) SWAPF W_TEMP, F ; Swap nibbles in W_TEMP and place result in W_TEMP SWAPF W_TEMP, W ; Swap nibbles in W_TEMP and place result into W retfie ;Hauptprogrammschleife...CCCC..Hauptprogrammschleife...CCCC..Hauptprogrammschleife...CCCC..Hauptprogrammschleife...CCCC..Hauptprogrammschleife...CCCC.. ;Hauptprogrammschleife...CCCC..Hauptprogrammschleife...CCCC..Hauptprogrammschleife...CCCC..Hauptprogrammschleife...CCCC..Hauptprogrammschleife...CCCC.. priminit MOVLW D'5' ;Alle Counter laden um Wartezeiten beim Einschalten zu vermeiden. MOVWF ChoTIMReg MOVLW D'50' MOVWF WLTIMReg MOVLW D'12' MOVWF BrTIMReg BCF MyFlags1,0 Init BCF INTCON,7 BSF STATUS,RP0 CLRF TRISA CLRF TRISB BSF TRISB,1 ;Unterspannungsensor ; BSF TRISB,0 ;Interruptport PIN6 als Eingang BSF TRISB,7 ; PIN13 MOVLW B'10010111' ;Wahl der neg Flanke für Interrupt PIN6 RB0 MOVWF OPTION_REG ;sowie Timer-Einstellungen BCF STATUS,RP0 MOVLW B'00000110' MOVWF PORTA BCF PORTB,2 ;sonst hat der Decoder womöglich einen H-Pegel am Stelleingang BCF PORTB,0 NOP BCF PORTB,4 ;Tonsignal ausschalten MOVLW B'00101000' ;Portb Change Interr ein und Timer aber im GGsatz zu init2 noch keine GIE MOVWF INTCON CALL Schl1M ;Wartezeit um Fehler im Powerup Zeitfenster zu vermeiden, dann Init Wiederholung priminit2 MOVLW D'5' ;Alle Counter laden um Wartezeiten beim Einschalten zu vermeiden. MOVWF ChoTIMReg MOVLW D'50' MOVWF WLTIMReg MOVLW D'12' MOVWF BrTIMReg BCF MyFlags1,0 Init2 BCF INTCON,7 BSF STATUS,RP0 CLRF TRISA CLRF TRISB BSF TRISB,1 ;Unterspannungsensor ; BSF TRISB,0 ;Interruptport PIN6 als Eingang BSF TRISB,7 ; PIN13 MOVLW B'10010111' ;Wahl der neg Flanke für Interrupt PIN6 RB0 MOVWF OPTION_REG ;sowie Timer-Einstellungen BCF STATUS,RP0 MOVLW B'00000110' MOVWF PORTA BCF PORTB,2 ;sonst hat der Decoder womöglich einen H-Pegel am Stelleingang BCF PORTB,0 BCF PORTB,3 ;falls kein Testblink!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! BSF PORTB,5 BSF PORTB,6 NOP BCF PORTB,4 ;Tonsignal ausschalten MOVLW B'10101000' ;Portb Change Interr ein und Timer MOVWF INTCON ;SLEEP Der Timer 0 ist aus während sleep und kann deshalb nicht wecken.keinesfalls wieder aktivieren! wait Goto wait ;es muß ja noch Zeit übrig sein, in die die Interrupts fallen können. GOTO Init ;MODULE -- MODULE--MODULE -- MODULE--MODULE -- MODULE--MODULE -- MODULE--MODULE -- MODULE--MODULE -- MODULE-- ;MODULE -- MODULE--MODULE -- MODULE--MODULE -- MODULE--MODULE -- MODULE--MODULE -- MODULE--MODULE -- MODULE-- Aktionsauswahl BCF INTCON,5 ;TimerInterr disabled sonst ungestörter kein Empfang von 8 Bit langen Signalen, da ja ständig die Kanäle gescannt werden. BCF INTCON,2 ;Timer Flag resettet BCF INTCON,3 ;PortB Interr disabled (negative Signalflanke soll nichts auslösen) BTFSS MyFlags1,2 GOTO PLX BSF MyFlags1,0 CALL Break WeiterBr BTFSS PORTB,7 ;Bei gedrücktem Knopf weiterbremsen: RETURN BTFSS MyFlags1,2 GOTO PLDemod Call Schl100 ;Bremscheck in kurzen Intervallen Call Schl100 Call Schl100 CALL BremsCheck2 GOTO WeiterBr PLX CALL PLDemod BTFSC PORTB,7 ;Bei gedrücktem Knopf weiter GOTO PLX Return ;Kanalwechsel nach Timer--Kanalwechsel nach Timer--Kanalwechsel nach Timer--Kanalwechsel nach Timer--Kanalwechsel nach Timer--Kanalwechsel nach Timer-- chooseChannel BCF INTCON,7 BCF INTCON,3 ;disa RB P-C BCF INTCON,5 ;disable Timer Decfsz ChoTIMReg,F RETURN MOVLW D'3' MOVWF ChoTIMReg BCF PORTB,2 BSF STATUS,RP0 BTFSC TRISB,2 GOTO Choo2 BSF TRISB,2 BCF STATUS,RP0 BSF MyFlags1,2 ;set = Trisb,2 ist gesettet Empfang auf Standardkanal für Break GOTO Choo3 BSF STATUS,RP0 Choo2 BCF TRISB,2 BCF STATUS,RP0 BCF MyFlags1,2 Choo3 CALL Schl20 CALL Schl20 BCF INTCON,0 ;Damit Port-Changes aktuell sind alte löschen RETURN ; Weglaufbremse-- Wegfahrsperre -- Weglaufbremse-- Wegfahrsperre -- Weglaufbremse-- Wegfahrsperre -- Weglaufbremse-- Wegfahrsperre WLTDec Decfsz WLTIMReg,F RETURN MOVLW D'25' MOVWF WLTIMReg DECFSZ WLTReg,F RETURN BSF MyFlags1,0 ;Bremsflag setzen Bremsen beantragen BSF MyFlags1,4 ;Bremsung wurde von WLT beantragt Return ;BR--CH--BR--CH--BR--CH--BR--CH--BR--CH--BR--CH--BR--CH--BR--CH--BR--CH--BR--CH--BR--CH--BR--CH--BR--CH--BR--CH--BR--CH--BR--CH--BR--CH-- BremsCheck Decfsz BrTIMReg,F RETURN MOVLW D'48' MOVWF BrTIMReg BTFSS MyFlags1,0 ;Modul überprüft, ob gebremst sein sollte, bzw ist. Zieht ggf. die Bremse nach. Return BremsCheck2 BTFSC MyFlags1,4 GOTO BremsCheck3 CALL shortbreak return BremsCheck3 CALL Break BCF MyFlags1,4 ;ab hier weiter mit shortbreak Return ;Ansteuerungen--Ansteuerungen--Ansteuerungen--Ansteuerungen--Ansteuerungen--Ansteuerungen--Ansteuerungen--Ansteuerungen--Ansteuerungen-- ;Ansteuerungen--Ansteuerungen--Ansteuerungen--Ansteuerungen--Ansteuerungen--Ansteuerungen--Ansteuerungen--Ansteuerungen--Ansteuerungen--Ansteuerungen-- Break BCF INTCON,3 BCF INTCON,5 BSF PORTB,4 ;Tonsignal einschalten BSF STATUS,RP0 BSF TRISB,0 BCF STATUS,RP0 CALL Schl01 BTFSC PORTB,0 ; Zugleich auch Interrupt port, nicht nur Abfrage! GOTO Break1 ;wenn das Seil nicht gespannt ist. CALL RDEE BTFSS EEDATA,3 ;MyFlags1,3 GOTO Break7 ;wenn das Seil schon gespannt ist und zuletzt gebremst wurde, soll das Seil natürlich nicht zerrissen werden. Break1 MOVLW B'00000011' ;Seil nicht, oder vom releasen gespannt. MOTOR an. MOVWF PORTA MOVLW D'15' MOVWF RechReg Break6 BTFSC PORTB,0 ; GOTO Break3 ;wenn das Seil nicht, oder nicht mehr gespannt ist. Weiter unter Break3 CALL RDEE ;EEprom Leseroutine BTFSS EEDATA,3 ;MyFlags1,3 GOTO Break4 ;wenn zuletzt gebremst wurde und das Seil inzwischen gespannt ist. Call Schl20 ;wenn zuletzt released wurde und das Seil noch gespannt ist. DECFSZ RechReg,F ;Wenn das Seil nach 300ms nicht zu lockern geht weiter unter Break3 GOTO Break6 Break3 MOVLW D'12' MOVWF RechReg BTFSS PORTB,0 ; Zugleich auch Interrupt port, nicht nur Abfrage! GOTO Break4 ;wenn das Seil schon gespannt ist und der Interrupt nicht funktioniert soll das Seil natürlich nicht zerrissen werden. Call Schl20 ;wenn das Seil nicht gespannt ist. DECFSZ RechReg,F GOTO Break3 Break4 MOVLW B'00000110' ;Motor ausschalten MOVWF PORTA NOP NOP BCF PORTB,5 ; Messbrücke schon mal auf höhere Bremskraft umschalten für nächste Phase (nach 2 sec) CALL Schl1M ;Wartezeit während 1. Bremsphase softbremsen CALL Schl100 CALL Schl100 Break7 BCF PORTB,5 ;Einsprungstelle falls das Seil schon gleich beim Bremsstart straff gemeldet wurde.(Z.B. durch falsche Einstellung oder Temperaturgang) CALL Schl20 CALL Schl20 BTFSS PORTB,0 GOTO Break8 ;Wenn die Seilspannung eine Stufe übersprungen hat MOVLW B'00000011' ;Motor (wieder) an aber mit höherem Bremskraftlimit 2. Bremsphase MOVWF PORTA CALL Schl20 Break5 BTFSS PORTB,0 GOTO Break9 ;Wenn die Seilspannung inzwischen die höhere Stufe erreicht hat Call Schl20 GOTO Break5 Break9 MOVLW B'00000110' ;Motor ausschalten MOVWF PORTA NOP NOP BCF PORTB,5 ; Messbrücke schon mal auf höhere Bremskraft umschalten für nächste Phase (nach 2 sec) BCF PORTB,6 CALL Schl1M ;Wartezeit während 1. Bremsphase softbremsen CALL Schl1M Break8 BCF PORTB,5 BCF PORTB,6 CALL Schl20 CALL Schl20 BTFSS PORTB,0 GOTO Break2 ;Wenn die Seilspannung Stufe 2 übersprungen hat und schon auf der höchsten ist zum BremsAbschluss Break2 MOVLW B'00000011' ;Motor (wieder) an aber mit höherem Bremskraftlimit 3. Bremsphase MOVWF PORTA MOVLW D'10' MOVWF RechReg CALL Schl20 Break10 BTFSS PORTB,0 GOTO Break2 ;Wenn die Seilspannung inzwischen die höchste (3.) Stufe erreicht hat Call Schl20 DECFSZ RechReg,F GOTO Break10 Break2 BCF PORTB,4 ;Tonsignal ausschalten BSF PORTB,5 ;Zusatzsbremskraftlimit wieder ausschalten an Meßbrücke BSF PORTB,6 MOVLW B'00000110' ;MOTOR aus MOVWF PORTA BCF MyFlags1,4 ;WLT braucht keine Softbremsung mehr zu machen da bereits BSF STATUS,RP0 BCF TRISB,0 ;kein Ärger mehr mit PortB Interrupt BCF STATUS,RP0 BCF PORTB,0 BCF INTCON,4 ;PortB,0 Interr Disabled Überlast (eigentlich doppelt) BCF INTCON,1 CALL ClrEE ;BCF MyFlags1,3 ;MyflagsBit 3: (Release-Quittung) 0= zuletzt wurde gebremst.1= Bremse wurde bereits einmal gelöst return shortbreak BCF INTCON,3 BCF INTCON,5 BSF STATUS,RP0 BSF TRISB,0 BCF STATUS,RP0 BCF PORTB,5 ;Zusatzbremskraft einschalten BCF PORTB,6 CALL Schl20 CALL Schl20 BTFSC PORTB,0 ; Zugleich auch Interrupt port, nicht nur Abfrage! GOTO shortbreak1 ;wenn das Seil nicht mehr gut gespannt ist. GOTO shortbreak2 ;wenn das Seil noch gut gespannt ist wird nicht nachgebremst. shortbreak1 MOVLW B'00000011' ;MOTOR an. MOVWF PORTA CALL Schl20 MOVLW D'15' MOVWF RechReg shortbreak3 BTFSS PORTB,0 GOTO shortbreak2 Call Schl20 DECFSZ RechReg,F GOTO shortbreak3 BSF PORTB,5 ;Zusatzbremskraft ausschalten BSF PORTB,6 shortbreak2 CALL Standby BSF STATUS,RP0 BCF TRISB,0 BCF STATUS,RP0 BCF PORTB,0 BCF INTCON,4 ;PortB,0 Interr Disabled BCF INTCON,1 CALL ClrEE ;BCF MyFlags1,3 ;MyflagsBit 3: (Release-Quittung) 0= zuletzt wurde gebremst.1= Bremse wurde bereits einmal gelöst return Release BCF INTCON,3 BCF INTCON,5 BSF PORTB,5 BSF PORTB,6 CALL RDEE BTFSC EEDATA,3 ;MyFlags1,3 GOTO RelRaus ;falls die Bremse schon gelöst wurde, nicht weiter lösen, damit der Draht sich nicht verheddert. ; der Motor kann also nicht zweimal nacheinander in der Bremslöserichtung drehen. Dazwischen muß Break BSF STATUS,RP0 BSF TRISB,0 BCF STATUS,RP0 CALL Schl01 MOVLW B'00001100' ;Motor rückwärts an MOVWF PORTA MOVLW D'20' MOVWF RechReg Release2 BTFSC PORTB,0 GOTO Release3 CALL Schl20 ;Kurbeln bis der Faden locker ist. DECFSZ RechReg,F ;oder die Höchstzeit vorbei (400ms) GOTO Release2 GOTO RelRaus Release3 MOVLW D'10' MOVWF RechReg CALL Schl20 Release4 CALL Schl20 BTFSS PORTB,0 GOTO RelRaus DECFSZ RechReg,F GOTO Release4 RelRaus MOVLW B'00000110' ;MOTOR aus MOVWF PORTA BSF STATUS,RP0 BCF TRISB,0 BCF STATUS,RP0 BCF PORTB,0 BCF INTCON,4 ;PortB,0 Interr Disabled BCF INTCON,1 CALL SetEE ;BSF MyFlags1,3 ;MyflagsBit 3: (Release-Quittung) 1= Bremse wurde bereits einmal gelöst 0= zuletzt wurde gebremst. return Standby BCF INTCON,7 MOVLW B'00000110' MOVWF PORTA NOP NOP return ;LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL ;------Längendemodulator-------Längendemodulator-------Längendemodulator-------Längendemodulator-------Längendemodulator----- PLDemod MOVLW 0x07 ;statt Los callen MOVWF Zae8Reg BSF PDZReg,0 BSF PORTB,3 ; statt Testblink WLT Empfangsanzeige !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! RX Call Schl100 RLF PDZReg,F BTFSS PORTB,7 GOTO RX1 ;kein Empfang also LowBit BSF PDZReg,0 GOTO RX2 RX1 BCF PDZReg,0 RX2 DECFSZ Zae8Reg,F GOTO RX ; Die acht empfangenen Bits sind jetzt eingespeichert. AuswRelease BCF PORTB,3 ; statt Testblink WLT Empfangsanzeige !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Movf PDZReg,W ;PDZReg Quersumme bilden 7 oder 8?Bremse freigeben. MOVWF QuerReg1 Call Quer MOVLW D'6' ;jetzt Dauersignal = Release aber Anspruch gesenkt SUBWF QuerReg2,W BTFSS STATUS,C GOTO NurWLT BCF MyFlags1,0 MOVLW D'40' ;WLT resetten auf volles Konto MOVWF WLTReg BCF MyFlags1,4 CALL Release RETurn NurWLT NOP MOVLW D'1' ; neues Signal einfach Quersummentest auf 4 WLT-Reichweite durch SIGNALqualität einstellen. SUBWF QuerReg2,W ;im Moment auf 1 d.h. jedes Signal auf diesem Kanal bewirkt WLT-Reset !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! BTFSS STATUS,C ;außer es wird vorher durch Auswrelease abgefangen, aber dann ja auch. RETURN MOVLW D'6' SUBWF QuerReg2,W BTFSC STATUS,C RETURN ; Movf PDZReg,W ; MOVWF QuerReg1 ; MOVLW B'00011111' ;hintere 5 Bits invertieren Quersumme 7 oder 8? Weglauftimer nachladen auf 4 ; XORWF QuerReg1,F ; CALL Quer ; MOVLW D'6' ; Anspruch gesenkt auf 6 ev.wieder heben um Reichweitenunterschied zwischen WLT und Bremse zu wahren. ; SUBWF QuerReg2,W ; BTFSS STATUS,C ; RETurn MOVLW D'40' ;WLT resetten auf volles Konto MOVWF WLTReg BCF MyFlags1,4 ;und natürlich auch nicht mehr shortbreak deaktiviert lassen (falls) RETurn Quer CLRF QuerReg2 BTFSC QuerReg1,0 Incf QuerReg2,F BTFSC QuerReg1,1 Incf QuerReg2,F BTFSC QuerReg1,2 Incf QuerReg2,F BTFSC QuerReg1,3 Incf QuerReg2,F BTFSC QuerReg1,4 Incf QuerReg2,F BTFSC QuerReg1,5 Incf QuerReg2,F BTFSC QuerReg1,6 Incf QuerReg2,F BTFSC QuerReg1,7 Incf QuerReg2,F RETURN Unterspannungstest BTFSC PORTB,1 ;Bei Unterspannung könnte z.B. die Überlastfunktion versagen und das Bremsseil zerrissen werden. RETURN BSF PORTB,4 ;Tonsignal einschalten CALL Release shutoff GOTO shutoff ;EEPROM Routinen---EEPROM Routinen---EEPROM Routinen---EEPROM Routinen---EEPROM Routinen---EEPROM Routinen---EEPROM Routinen--- ; EEPROM Routinen---EEPROM Routinen---EEPROM Routinen---EEPROM Routinen---EEPROM Routinen---EEPROM Routinen---EEPROM Routinen--- ;EEPROM Routinen---EEPROM Routinen---EEPROM Routinen---EEPROM Routinen---EEPROM Routinen---EEPROM Routinen---EEPROM Routinen--- ; EEPROM Routinen---EEPROM Routinen---EEPROM Routinen---EEPROM Routinen---EEPROM Routinen---EEPROM Routinen---EEPROM Routinen--- SetEE MOVLW EEFlags1 MOVWF EEADR MOVLW 0xFF ;Dateninhalt FF=Flag gesetzt 00 = nicht gesetzt MOVWF EEDATA BCF INTCON, GIE ; Disable INTs. BSF STATUS, RP0 ; Bank 1 BSF EECON1, WREN ; Enable Write MOVLW 0x55 ; MOVWF EECON2 ; Write 55h MOVLW 0xAA ; MOVWF EECON2 ; Write AAh BSF EECON1,WR ; Set WR bit ; begin write WRTest BTFSC EECON1,WR GOTO WRTest BCF EECON1, WREN ; Disable Write BCF STATUS, RP0 ; Bank 0 CALL Schl01 RETURN ClrEE MOVLW EEFlags1 MOVWF EEADR MOVLW 0x00 ;Dateninhalt FF=Flag gesetzt 00 = nicht gesetzt MOVWF EEDATA BCF INTCON, GIE ; Disable INTs. BSF STATUS, RP0 ; Bank 1 BSF EECON1, WREN ; Enable Write MOVLW 0x55 ; MOVWF EECON2 ; Write 55h MOVLW 0xAA ; MOVWF EECON2 ; Write AAh BSF EECON1,WR ; Set WR bit ; begin write WRTest2 BTFSC EECON1,WR GOTO WRTest2 BCF EECON1, WREN ; Disable Write BCF STATUS, RP0 ; Bank 0 CALL Schl01 RETURN RDEE MOVLW EEFlags1 ; MOVWF EEADR ; Address to read BSF STATUS, RP0 ; Bank 1 BSF EECON1, RD ; EE Read BCF STATUS, RP0 ; Bank 0 ;anschließend BTFSC/S EEData irgendein Bit RETURN ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXSchleifen ;XXXSchleifenXXXSchleifenXXXSchleifenXXXSchleifenXXXSchleifenXXXSchleifenXXXSchleifen ;Schl01Reg EQU 0xxx Schl01 MOVLW D'48' MOVWF Schl01Reg Schl01Dec DECFSZ Schl01Reg,F GOTO Schl01Dec RETURN ;Kor5Reg EQU 0x27 ;Registeradresse (plus Konstante) ;Inn5Reg EQU 0x28 ;Registeradresse (innere Schleifenzahl) mal ;Auss5Reg EQU 0x29 ;Registeradresse (aeussere Schleifenzahl) Schl5 MOVLW 0x0D ;Korrekturschleife laden MOVWF Kor5Reg Schl5Korr DECFSZ Kor5Reg,1 GOTO Schl5Korr MOVLW 0x6C ;Schl auss laden MOVWF Auss5Reg load5inn MOVLW 0x15 ;Schl inn laden MOVWF Inn5Reg Schl5inn DECFSZ Inn5Reg,1 GOTO Schl5inn CLRWDT DECFSZ Auss5Reg,1 GOTO load5inn NOP Return ;Kor20Reg EQU 0x17 ;Registeradresse (plus Konstante) ;Inn20Reg EQU 0x18 ;Registeradresse (innere Schleifenzahl) mal ;Auss20Reg EQU 0x19 ;Registeradresse (aeussere Schleifenzahl) Schl20 MOVLW 0x09 ;Korrekturschleife laden MOVWF Kor20Reg Schl20Korr DECFSZ Kor20Reg,1 GOTO Schl20Korr MOVLW 0xE3 ;Schl auss laden MOVWF Auss20Reg load20inn MOVLW 0x2A ;Schl inn laden MOVWF Inn20Reg Schl20inn DECFSZ Inn20Reg,1 GOTO Schl20inn CLRWDT DECFSZ Auss20Reg,1 GOTO load20inn Return Schl60 CALL Schl20 CALL Schl20 CALL Schl20 Return ;Kor100Reg EQU 0x10 ;plus Konstante ;Inn100Reg EQU 0x11 ;innere Schleifenzahl mal ;Auss100Reg EQU 0x12 ;aeussere Schleifenzahl Schl100 MOVLW 0x2F ;Korrekturschleife laden MOVWF Kor100Reg Schl100Korr DECFSZ Kor100Reg,1 GOTO Schl100Korr MOVLW 0xDE ;Schl auss laden MOVWF Auss100Reg load100inn MOVLW 0xDF ;Schl inn laden MOVWF Inn100Reg Schl100inn DECFSZ Inn100Reg,1 GOTO Schl100inn CLRWDT DECFSZ Auss100Reg,1 GOTO load100inn Return ;Kor1MReg EQU 0x13 ;plus Konstante-Register ;Inn1MReg EQU 0x14 ;innere Schleifenzahl mal ;Auss1MReg EQU 0x15 ;aeussere Schleifenzahl-Reg ;SupAuss1M EQU 0x16 ;ganz äussere SchlZahl-Register Schl1M MOVLW 0x7F ;Korrekturschleife laden MOVWF Kor1MReg Schl1MKorr DECFSZ Kor1MReg,1 GOTO Schl1MKorr MOVLW 0x8C ;Superaeussere Schl laden MOVWF SupAuss1M load1Mauss MOVLW 0x2B ;Schl auss laden MOVWF Auss1MReg load1Minn MOVLW 0x51 ;Schl inn laden MOVWF Inn1MReg Schl1Minn DECFSZ Inn1MReg,1 GOTO Schl1Minn CLRWDT DECFSZ Auss1MReg,1 GOTO load1Minn DECFSZ SupAuss1M,F GOTO load1Mauss Return ;TESTBLINK---TESTBLINK---TESTBLINK---TESTBLINK---TESTBLINK---TESTBLINK---TESTBLINK---TESTBLINK---TESTBLINK---TESTBLINK--- ;Testprogramm mit Led an RA3: TestBlk BTFSS MyFlags1,1 ;nur zum TEST!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! GOTO Mu3Set ; wieder entfernen !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! BCF MyFlags1,1 ;nur zum TEST!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! BCF PORTB,3 ; wieder entfernen !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! GOTO BlinkFert ; wieder entfernen !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Mu3Set BsF MyFlags1,1 ; wieder entfernen !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! BSF PORTB,3 ; wieder entfernen !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! BlinkFert RETURN ;nur zum TEST!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! End