;Dies ist der Sourcecode für eine Anlage mit mehreren zeitgesteuerten Schließfächern für mehrere User. Zum Beispiel als Nahrungsmittelverteiler"Diätschrank". ;Der User kann sich selbst für eine gewünschte Uhrzeit oder Zeitspanne von einzelnen oder allen Fächern aussperren. ;Einzelne Fächer können durch Fileediting für einzelne User reserviert werden, müßen aber nicht. ;Der Sourcecode ist für die Verarbeitung mit MPLAB IDE von Microchip gedacht.Er wurde auch auf dieser Software erstellt. ;Assembler in Einstellung: release, absoluten Code generieren.-Das gibt dann auch eine Hex-File für den Brenner. ;MPLAB IDE wird von Microchip kostenlos angeboten, dem Hersteller der PIC-Microcontroller,(CPU) für die es einzig geeignet ist. ;Dieser Sourcecode gehört zu einem Schaltplan, der einen PIC18F4520-Microcontroller verwendet. ;Der Sourcecode für die Schloss-Controller und für die Steuerzentrale korrespondieren miteinander. ;Entwicklung: 2009-2010, Hans von Sperling, Neuss ;!!!!!!!!!!!!!!!!!!!!!UNBEDINGT EINSTELLPFLICHTIG: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ;!!!!!! Vor jedem IC-programmieren! !!!!!!!!!!!!!! ; unbedingt einstellpflichtig sind die Schloß Identifikationsnummer von 1-4 unter der DEF: "EigAdrCod" denn die Zentrale muß die Schlösser ja unterscheiden ; und die Werte für die Servopositionen unter den DEF's: "Aufwert" und "ZuWert" ,weil sich die Mechanik sonst selbstzerstören könnte. ;!!!!!!!!!!!!!!!!!!!!!UNBEDINGT EINSTELLPFLICHTIG! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ;Neuerungen: ;Rieg 21 ist nicht abwärtskompatibel, bzw. umgekehrt, weil in Rieg21 /Zentrale102c neue Usart-Befehle eingeführt wurden: Schlafbefehle und autonomes Überwachen. ;--------- ;Riegelversion20 gehört zu Zentrale Version 100 ; SER19: ;Der Lichtblitz der Lichtschranke wurde auf ein Viertel verkürzt, durch eine Ausnahme Weiterleitung von ISR1 nach ISR4 so dass zwei Slots4 hintereinander kommmen. ;Wenn in Folge der Riegel-Version 19 Lichtschrankenstörungen auftreten, ev. wieder verlängern. Obwohl man sich auch eine Helligkeits-Verbesserung denken könnte. ;Im Standby spart diese Neuerung etwas Strom aber nicht wirklich viel. Das gleiche gilt für den IDLE-Sleep nach ungenutzten Interrupt-Slots im Main Bereich. ;SRV18 gilt ab Kuel 87 ;Rieg 16 gilt ab Kuel 85e!!!!! ;Rieg 15 zu den folgenden bis Kuel85e. die und folgende laufen nämlich nur mit Version Srv16 ;Rieg 14 gehört zu Kuel80 ;Schließen findet nur statt, wenn das Lochblech eingesteckt ist--oder wird. ; jeder Datenaustausch beginnt also immer mit einem zeitnahen ;Einschalten des ganzen Controllers und der Init. Dauerdaten können also nicht im Ram gespeichert werden. LIST P=PIC18F1320 #include P18F1320.inc ;folgender "altmodischer" Block ist einfach aus der inc -File kopiert/modifiziert: ;der Intio2 läuf6t auf 8 Mhz und wird auch nicht durch den Prescaler reduziert. Instr.Freq also =2Mhz __CONFIG _CONFIG1H, _IESO_OFF_1H & _FSCM_OFF_1H & _INTIO2_OSC_1H __CONFIG _CONFIG2L, _PWRT_ON_2L & _BOR_OFF_2L & _BORV_27_2L __CONFIG _CONFIG2H, _WDT_OFF_2H & _WDTPS_32K_2H __CONFIG _CONFIG3H, _MCLRE_OFF_3H __CONFIG _CONFIG4L, _DEBUG_OFF_4L & _LVP_OFF_4L & _STVR_ON_4L __CONFIG _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L __CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H __CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L __CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H __CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L __CONFIG _CONFIG7H, _EBTRB_OFF_7H ;---------------------------------- ;1.Servopositionen, werden beim Programmieren -notfalls Schloßindividuell- in die Originalfile eingetragen. ;sind natürlich je nach Servomarke und Typ verschieden. ;und vor allem müßen sie auf die Riegelmechanik, in die das Servo eingebaut wird, abgestimmt werden. ;mein 50g-Graupner Servo: ;auftreten kann mit dem alten goßen schweren grauen Graupner Servo zwischen 20 und 84 = rechts-Links fast Anschlag. ; Aber kein Platz dafür im Gehäuse.(Kühlschrank-Schloss Nr.1) Hebel verbiegt nur. (Zu85 auf81) ;blaues Servo "SG90": ;blaues Servo "SG90": Maximal 73 (74 ist Anschlag) ;minimal 16 (15 ist Anschlag) ; Das blaue Servo macht dabei nur eine ca 180-Grad Drehung. #DEFINE StellWert D'43' ;Startposition, nur bei Init #DEFINE ZuWert D'31' ;Wert für Riegelstellung "ZU" Std84 Achtung: "Zu" kann der größere oder kleinere Wert sein!!!!!!!Je nach Servoeinbaurichtung. #DEFINE Aufwert D'44' ; STD81 ;Meine Nr1:Kühlschranktür: (Zu85 auf81)auftreten kann z.Zt zwischen 20 und 84 = rechts-Links fast Anschlag. Aber kein Platz dafür im Gehäuse. Hebel verbiegt nur. ;Nr1 also: (Zu85 auf81) ;Mein Schloß Nr.2:Gefrierfachschloß mit Seilzugmechanik: Zu=22, auf = 70. ;Mein Schloß Nr.3: ZusatzSchrankfach rechts (klein) "Auf" = 48, "Zu" = 31 ;Mein Schloß Nr.4: ZusatzSchrankfach links (groß) "Auf" = 60, "Zu" = 40 ;----------------------------------------------------------------------------------------------------- ;------------------------------------------------------------------------------------------------------------------------------------------------- ;Codes für die Usart-Kommunikation mit Zentrale: ;-----zweites Viertel noch nicht verwendet.-------- ;-------------------------------- ;Definitionen Usart -gemeinsam mit SchlossController: ; Nr.1 - 63 (0000 0000 wird nicht verwendet.) ;Verwendung: besondere Aufträge ;Format: ; 000x xxxx :Quittg Sonderauftragxyz (0000 0000 wird nicht verwendet.) ; 001x xxxx : Sonderauftragxyz ;---------------: ; 000 0 0001 :Quittung:Auftrag zur Low-Power-Überwachung wurde empfangen. (überwachtes Schloß) (Auftrag erlischt bei Auf oder Zu-Befehl) ; 000 0 0010 :Quittung:Auftrag zum Sleep nur Adressübewachung wurde empfangen. (z.B.nicht überwachtes Schloß bei Low-Power-Überwachung) ;(Auftrag erlischt bei Auf oder Zu-Befehl) ; 001 0 0001 :Auftrag zur Low-Power-Überwachung an überwachtes Schloß (Auftrag erlischt bei Auf oder Zu-Befehl) ; 001 0 0010 :Auftrag zum Sleep nur Adressübewachung z.B.an nicht überwachtes Schloß bei Low-Power-Überwachung (Auftrag erlischt bei Auf oder Zu-Befehl) #DEFINE LowPowUeberwCod B'00000001' #DEFINE SleepMitAdUeCod B'00000010' #DEFINE AutoUeContrlCod B'00000011' ;Anweisung,an das Schloß, Auskunft zu geben, ob noch bestätigt werden kann, dass die Tür nicht geöffnet wurde. ;nicht verwendet: B'00000100' #DEFINE AWLoPoUeberwCod B'00100001' #DEFINE AWSleepMAdUeCod B'00100010' #DEFINE AWAuUeNochZuCod B'00100011' ; Bestätigung, das die Tür nicht geöffnet wurde. #DEFINE AWAuUeAufoKpCod B'00100100' ;Mitteilung, dass die Tür möglicherweise (aussteckern) (oder (regulär)bestimmt (Lichtschranke hell)) geöffnet wurde. ;--------------------------------------- ;Nr. 64 - 127: noch nicht verwendet. ;-------------------------------- ;Definitionen Usart -gemeinsam mit SchlossController: ;--------------drittes Viertel:Aufträge und Auftrags-Q:----------- ; Auftragsquittungen: Nur eine Sorte,verbrauchen den Bereich: 128 - 159 ; also von Peripherie zurück an Zentrale: ;Format: 100x xxxx : ;bit 5-7 schon vorgegeben. ;Bit4 : 1= Zu-Befehlsempfang bestätigt. (Quittung) ; 0= Auf-Befehlsempfang bestätigt.(Quittung) ;Bit3 : 1= Antwort auf AUF-Zu Befehl ; 0= Antwort auf Neutralbefehl, auf nur Statusabfrage ;Bit2 : 1= Der Riegel hatte Zeit, den Befehl auszuführen ; 0= Der Riegel braucht ev. noch Zeit. ;Bit1 : 1= Die Lichtschranke wird als dunkel gemessen ; 0= Die Lichtschranke wird als hell gemessen ;Bit0 : 1= Die Angaben unter Bit 1 sind aktuell ; 0= Die Angaben unter Bit 1 sind nicht zuverlässig ;-------------------------------------------------------- ;32Aufträge: 160 - 191 ;#DEFINE UstStatusAufAbfr D'163' ;#DEFINE UstStatusZuAbfr D'164' ;#DEFINE CodNichtErkCod D'165' #DEFINE AufBefehlCod D'166' #DEFINE ZuBefehlCod D'167' #DEFINE NurStatusBefCod D'168' #DEFINE AFTRAbschlMeldg D'191' ;höchster Auftrag. ;------------oberstes Viertel: Bereichfür Adressen und Adress-Q.: ------------ ;32Adressquittungen: 192 - 223 #DEFINE AWZentralPAdrCod D'192' #DEFINE AWFach1UaAdressCod D'193' ;32Adressen:224 - 255 #DEFINE ZentralProzAdrCod D'224' #DEFINE Fach1UaAdressCod D'225' ;für eigene Adressierung und Rückidentifikation hier ist Fach 1 #DEFINE Fach2UaAdressCod D'226' ;Fächeradresscodes fangen immer mit 0xE oder 0xf an. Also die obersten drei Bits=111x xxxx #DEFINE Fach3UaAdressCod D'227' ;dazu addiert sich einfach die Fachnummer (bei der Zentrale 0) #DEFINE Fach4UaAdressCod D'228' #DEFINE EigAdrCod D'225' ;227Fach3UaAdressCod !!!!!!!!!!!!einstellen!auf Fach-Nr!!!!!!!!!!!!!!! ;---------------------------------------- #DEFINE Motor_MaxTime D'6' ;maximale Zeit (in Sec), die das Servo am Stück eingeschaltet bleiben kann in Sekunden (Übergeordnete Sicherung, deshalb >> als 1sec ;soll z.B. bei Türüberwachung eine Servo-Dauereinschaltung mittels des Motorstromschalters beenden. ;REGISTER ;0x00 = erste Adresse in Access.-Bank erste Adresse regulär Bank 0 ist 0x80 entspr D'128' FlagReg1 EQU D'0' ;FlagReg1,0 ;Das Lichtschranken einschalt-Bit ;FlagReg1,1 Das Lischra-Mess-Bit ;FlagReg1,2 ; 0= Servoport inhibieren, bis Signalklarheit herrscht. ;FlagReg1,3 ; Lichtschranken-Status-Bit 1= Lochblech ist drin,Riegel vielleicht. 0= Riegel ist offen / Tür offen ;FlagReg1,4 ;0= kein Servo-Signal ohne neuen Stellwert seit POR ;FlagReg1,5 ;0=Aufsoll-Bit ;1=ZuSoll-Bit (je nach dem Zuletzt vom Usart empfangenen Befehl.)(StehenderBefehlFlag) ;FlagReg1,6 ;Abstandhalte Toggel- Bit für TX -Usart ;FlagReg1,7 ;1=Anfrage bezüglich Schloßstatus wurde gestellt,aber noch nicht beantwortet.0= erledigt.(beantwortet) FlagReg2 EQU D'1' ;FlagReg2,0 ;Usart-busy-Flag 1= USART busy ,d.h. besonders busy: im Datenaustauschmodus. ;FlagReg2,1 ;F1,3-ValiditätsBit F2,1=1 d.h. der Wert der Lichtschr.Status-Bit 1,3 wurde seit Init aktualisiert,(von da ab ja periodisch). ;FlagReg2,2 ;Lischraschnellbit 1=25 Hz Abfragefrequenz.(wenn geschlossen werden soll) 0=4,16 Hz ;FlagReg2,3 ein Teilerflag ;FlagReg2,4 frei ;FlagReg2,5 ; 1= bestätigte Schließung."safe" 0= die Schließung wurde nicht befohlen, oder hatte keine Zeit, sich abzuspielen. ;FlagReg2,6 ;Befehlkonstanz-Flag 1= Auf bzw.Zu-Befehl hat sich laut F1,5 seit einer Sekunde nicht geändert. ;FlagReg2,7 ;Konstanz-Toggelflag FlagReg3 EQU D'2' ;FlagReg3,0 ;0= kein Stellbefehl erhalten.ServoUB aus. 1=Servostrom darf an.Motorstrom nicht vor Usart-Befehl Freigabe - Flag. ;FlagReg3,1 1= bestätigte Entriegelung. 0= die Entriegelung wurde nicht befohlen, oder hatte keine Zeit, sich abzuspielen. ;FlagReg3,2 ;AuftrotzZu-Flag. 1= AuftrotzZu 0= Zu und zu. Lischra / Bestätigung ;FlagReg3,3 ;Erstempfangsbit für Auf: Wird nach dem ersten Empfang eines Auf-Befehls =1 gesetzt. Init =0 (ZuBef =0) wegen F2.7 ;FlagReg3,4 ;1= die Tür hat zuletzt einen Selbstüberwachungsbefehl erhalten. 0= auf zu oder sleep. AutoUeContrlCod egal. ;FlagReg3,5 ;1= die Tür hat zuletzt einen (sleep)Befehl zum Standby-unter-Power-ohne-Überwachung-Modus erhalten.0=auf zu oder selbstÜberw. ;FlagReg3,6 ;1= Die Tür hat einen Überwachungsbefehl erhalten und wurde seither nicht geöffnet. -erlischt bei Power on-Reset- ;FlagReg3,7 ;1= lange Slots mit niedriger Frequenz (1500),denn:1= Motor aus(LATB,5=0) oder Usartbusy (F2,0=1) FlagReg4 EQU D'3' ;FlagReg4,0 ;Sleep-timing Hilfsflag, mit 25Hz gesettet,im nicht-servo-mode ;FlagReg4,1 ; Debug-Flag 1 ;FlagReg4,2 ; Debug-Flag2 ;FlagReg4,3 ;FlagReg4,4 ;FlagReg4,5 ;FlagReg4,6 ;FlagReg4,7 FlagReg5 EQU D'4' ;FlagReg5,0 ;FlagReg5,1 ;FlagReg5,2 ;FlagReg5,3 ;FlagReg5,4 ;FlagReg5,5 ;FlagReg5,6 ;FlagReg5,7 CBLOCK D'5' UsartAblFlgReg1 ;set = aktiviert und noch unverbraucht UsartAblFlgReg2 ;set = aktiviert und noch unverbraucht CodInPuReg1 CodInPuReg2 CodInPuReg3 CodInPuReg4 CodInPuReg5 CodInPuReg6 UsartTimOutTimReg Slotverdünner CodOutPuReg1 CodOutPuReg2 CodOutPuReg3 CodOutPuReg4 AnfBefInPuReg IntVertReg RechReg1 RechReg2 FuenfzgHzReg FuenfzgHzBReg StellcountReg StellWertReg ;die Zahl hier drin bestimmt die Länge des 1-2 ms- Servoimpulses ProtoStellWertReg ZufZahlReg AeussZufZahlReg LischTimReg MechanikVerzTimReg ProtoQuittSendReg RCPuReg LiTaktFLgSlotReg LiTakFLgSlotReg2 MotorMaxTimReg DeepSleepTimReg SekTaktReg ENDC ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;Programm:---Programm:---Programm:---Programm:---Programm:---Programm:---Programm:---Programm:--- ;jeder Befehl verbraucht zwei Speicheradressen, zweizeilige Befehle sogar 4! (PIC18) org 0x00 NOP NOP GOTO INIT;,0MainLoop von dort nach Mainloop; (Hauptschleife/Bereitschaftsschleife) (ex-"call") ;Goto ist resistent gegen Stack-Fehler und erlaubt ausserdem 2 Nops am Reset-point (es kam u.U nicht bei Init vorbei) ;---------------------------------------------------------------- org 0x08 IntvecH NOP GOTO ISRH ;--------------------------------------------- org 0x16 NOP IntvecL NOP BRA ISRH ;eigentlich kein L-Interr. vorgesehen. So gibts wenigstens irgendwann mal ein retfie. Ausserdem war es so und hat funktioniert. ;----------------------- org 0x22 ;Hierfür Idle-mode für sleep einschalten, in dem die Peripherals (Timer) noch Clock haben.bringt höchstens 200uA von 3mA ;Aufgabe nach Init verlegt, gibt sowieso nur dieses Sleep bis jetzt. MainLoop BTFSS RCON,1,0 ;Das POR-Registrierungsbit: 1= "Ich habe seit POR die komplette Init absolviert."(Bit wird bei POR von Chip-Hardware gecleart.In Init gesetzt) RESET ;Sicherstellung gegen eine Art von Latch ups, bei denen die Init offensichtlich gar nicht mehr absolviert wurde.NOP ; BSF INTCON,7,0; NOP sleep NOP BTG PORTB,7,0 ;PGData, orange, rote Led an Teststecker BRA MainLoop ;-------------------------------------------------- org 0x56 ISRH NOP ;der Intio2 läuft auf 8 Mhz und wird auch nicht durch den Prescaler reduziert. Instr.Freq also =2Mhz MOVLW D'197' ;hier 32khz Interrupt-Frequenz von (20 000 Hz 160 )einstellen ADDWF TMR0L,F,0 ;32khz=197 (fill up, also 256-197=59 ist relevante Zahl) BCF INTCON,2,0 ;Timer Flag zurücksetzen ;------------------------------------ BCF TRISB,7,0 ;LED - Display ---TEsts only------------------ BCF TRISB,6,0 ; BCF PORTB,7,0 ;PGData, orange, rote Led an Teststecker ; BTFSC FlagReg4,1,0 ; Debug-Flag 1 ; BSF PORTB,7,0 BCF PORTB,6,0 ;PGClock grau , grüne LED an Teststecker BTFSC FlagReg4,2,0; Debug-Flag2 BSF PORTB,6,0 ;------------------------ BTFSS FlagReg3,7,0 ;1= lange Slots mit niedriger Frequenz (1500),denn:1= (Motor aus(LATB,5=0) oder Usartbusy (F2,0=1)) BRA FUFFLos MOVLW D'106' SUBWF TMR0L,F,0 ;Doublette:BCF T0CON,3,0 ;0=prescaler verdoppeln (PSA) -Zusammen gibt das ~330 Instructions pro cycle statt ~62 u.SlotTempoangleichung an Zentralgerät. ;im Servo-Modus gilt: ;Instr.Freq =2Mhz durch InterruptFreq ca.32000 = 62,5 Instr/Slot na, ja, eben die 59 von oben. ;mit einer Slot-Frequenz von 8,5Khz ;im Nicht-Servo Ansteuer Modus (Usart-Modus)gilt: ;(59 InstrCy +106 Instr.cy) *2 = 330 Instr.cy pro Slot ;mit einer Frequenz von 6,06Khz geteilt durch 4 Slots =1,515khz ungefähr entsprechend der Slotfrequenz der Zentrale. ;----------------------------------------------------------------------- ;Lischra-Timing im Nicht-Servomodus: ;herunterteilen auf ungefähr 25Hz DECFSZ LiTaktFLgSlotReg,F,0 ;Lichtschranken-Takt für Longslots erzeugen: 6,06Khz durch BRA Interruptverteilung Movlw D'242' MOVWF LiTaktFLgSlotReg,0 ;hier ungefähr 25Hz BTG FlagReg4,1,0 ; Debug-Flag 1 !!!!!!!!!!!!!!!!!!!!!! ;1.Lichtschranke starten: BTFSC FlagReg2,2,0 ;Lischraschnellbit 1=25 Hz (wenn geschlossen werden soll) 0=4,16 Hz BRA LiTaktLSlot DECFSZ LischTimReg,F,0 ;Das Register ist bei beiden Interruptgeschwindigkeiten in Verwendung!!!!!!! BRA LiTaktLSlot2 ;hier 4,16Hz,aber nur, wennF2,2=0!!: MOVLW D'6' ;25/6= 4,1666 Hz MOVWF LischTimReg ,0 LiTaktLSlot BSF FlagReg1,0,0 ;Das Lichtschranken einschalt-Bit 25-Hz-lich. bzw.4,16hzlich ;hier wieder ungefähr 25Hz: BSF FlagReg4,0,0 ;Sleep-timing Hilfsflag, mit 25Hz gesettet,im nicht-servo-mode ;2.: 1-Hz Erzeugung: LiTaktLSlot2 DECFSZ LiTakFLgSlotReg2,F,0 ;Lichtschranken-Takt für Longslots erzeugen: 6,06Khz durch BRA Interruptverteilung Movlw D'25' MOVWF LiTakFLgSlotReg2,0 ;hier ungefähr 1Hz: ;sekündlich: BSF FlagReg2,6,0 ;Befehlkonstanz-Flag 1= Auf bzw.Zu-Befehl hat sich laut F1,5 seit einer Sekunde nicht geändert. BRA Interruptverteilung;Wenn der Usart läuft gibts überhaupt nichts 50hzliches. (achtg ev. Störungen im Stellwert.!!!!!!) ;-------------------------------------------------------------------------- ;Nur bei Servomodus: ;im Servo-Modus gilt: ;Instr.Freq =2Mhz durch InterruptFreq ca.32000 = 62,5 Instr/Slot na, ja, eben die 59 von oben. ;mit einer Slot-Frequenz von 8,5Khz ;32000Hz : 640 =50 Hz ;1:32000Hz x 64 =2ms d.h. 32 Servostufen zwischen 1 und 2ms(PWM bringt auch nicht mehr Prescaler zu klein) FUFFLos DECFSZ FuenfzgHzReg ,F,0 ;an F2,0 gekoppelt:BSF T0CON,3,0 ;1=prescaler wieder auf normal(PSA) nur 60Icy/Slot BRA FuffEnde Movlw D'10' MOVWF FuenfzgHzReg ,0 DECFSZ FuenfzgHzBReg ,F,0 BRA FuffEnde Movlw D'64' MOVWF FuenfzgHzBReg ,0 ;ev. den 50HzSlot vom Interruptverteiler ausnehmen, da schon viel Zeit verbraucht.!!!!!!!!!!!!!!?? ;hier steht 50 Hertzliches: BTFSS FlagReg1,4,0 ;0= kein Servo-Signal ohne neuen Stellwert seit POR BRA FufBereitIn BTFSC FlagReg1,2,0 ; 0= Servoport inhibieren, bis Signalklarheit herrscht. BSF PORTA,0,0 ;;!!!ServosignalStartflanke Servoport inhibieren, bis Signalklarheit herrscht. FufBereitIn CLRF StellcountReg,0 ;------------ INCF MechanikVerzTimReg,F,0 ;Hochzählen bis Begrenzung 50 =1Sekunde (Monoflop)!!!!!!!!!! MOVLW D'50' ; Zum Starten der Verzögerung Register clearen und F2,6clearen. CPFSLT MechanikVerzTimReg ,0 MOVWF MechanikVerzTimReg,0 CPFSLT MechanikVerzTimReg ,0 BSF FlagReg2,6,0 ;Befehlkonstanz-Flag 1= Auf bzw.Zu-Befehl hat sich laut F1,5 seit einer Sekunde nicht geändert. BTG FlagReg4,2,0 ; Debug-Flag 2 !!!!!!!!!!!!!!!!!!!!!! ;----------- DECFSZ SekTaktReg ,F,0 BRA FufBereit3 MOVLW D'50' MOVWF SekTaktReg ,0 ;hier Sekundentakt, ausser während Usart u.ev.a. jedenfalls während Servo.: ;sekündlich: Motorstrom-Langzeitausschalter: BTFSS FlagReg3,0,0 ;0= kein Stellbefehl erhalten.ServoUB aus. 1=Servostrom darf an.Motorstrom nicht vor Usart-Befehl Freigabe - Flag. BCF PORTB,5,0 ;Der Motorstrom ist ja sowas von aus...mehrfach abgesichert. BTFSS FlagReg3,0,0 ;0= kein Stellbefehl erhalten.ServoUB aus. 1=Servostrom darf an.Motorstrom nicht vor Usart-Befehl Freigabe - Flag. BRA FufBereit3 DECFSZ MotorMaxTimReg,F,0 BRA FufBereit3 ;(alle sechs Sekunden eingestellt) BCF FlagReg3,0,0 ;0= ServoUB zusätzlich disabled = aus. 1=Servostrom darf an.Motorstrom nicht vor Usart-Befehl Freigabe - Flag. BCF PORTB,5,0 ;Der Motorstrom ist ja sowas von aus...mehrfach abgesichert. MOVLW Motor_MaxTime ;maximale Zeit, die das Servo am Stück eingeschaltet bleiben kann in Sekunden (Übergeordnete Sicherung, deshalb >> als 1sec) MOVWF MotorMaxTimReg,0 ;------ weiter mit 50Hz FufBereit3 BTG FlagReg2,3,0 BTFSS FlagReg2,3,0 BRA FuffEnde ;Reduzierung auf 25 Hz, zum Stromsparen BTFSC FlagReg2,2,0 ;Lischraschnellbit 1=25 Hz (wenn geschlossen werden soll) 0=4,16 Hz BRA FufBereit2 DECFSZ LischTimReg,F,0 ;Register ist bei beiden Interruptgeschwindigkeiten in Verwendung!!!!!! BRA FuffEnde MOVLW D'6' ;25/6= 4,1666 Hz MOVWF LischTimReg ,0 FufBereit2 BSF FlagReg1,0,0 ;Das Lichtschranken einschalt-Bit 25-Hz-lich. bzw.4,16hzlich ;Ende 50 Hertzliches ;--------------------------------- ;wieder 32KHz: FuffEnde Nop INCF StellcountReg ,F,0 MOVF StellWertReg,W,0 CPFSGT StellcountReg ,0 BRA StellEnde BCF PORTA,0,0 DECF StellcountReg ,F,0 StellEnde NOP ;hier noch max ca 45 Icy übrig manchmal auch wesentlich weniger. nach Slotverteiler dann > als 1sec) MOVWF MotorMaxTimReg,0 MOVLW D'25' ;(Fünfundzwanzigstel Sekunden)1sec reicht, wenn nachtriggerbar MOVWF DeepSleepTimReg,0 BSF RCON,1,0 ;Das POR-Registrierungsbit setzen dann 1= "Ich habe seit POR die komplette Init absolviert."(Bit wird bei POR von Chip-Hardware gecleart.) MOVLW B'11100000' MOVWF INTCON,0 ;Interrupts enablen GOTO MainLoop ;exRETURN 0 Goto ist resistent gegen Stack-Fehler und erlaubt ausserdem 2 Nops am Reset-point (es kam u.U nicht bei Init vorbei) END