;This is a file for Microchip MPLAB IDE Assembler. If you open it with this, it will be shown in explaining colours and can edit it and easily convert into a Hex-File. ;It's written for the schematic which I publish here too. ;It's a well developed device, but I still could make it a bit better with another controller. ;It's been 6 weeks of qualified work - I will sell the rights of commercial production for 4000 Euros. I've never earned any money. ; Everybody else is invited to build themselves such a self-educating-device of course: ;Achtung beim Einschalten startet die Schaltung nicht sekundengenau sofort, ; weil der LP-oszillator unglaublich langsam auf Touren kommt. ; Ist aber egal weil der Oszillator hinterher sowieso ununterbrochen laufen soll und die Uhr am Anfang sowieso gestellt werden sollte. LIST P=PIC12F675 #include P12F675.inc __config B'00000110000100' ;Die ersten beiden Stellen der config - Zahl sind der Bandgap - Wert. Den müßte man theoretisch für jeden Chip individuell einstellen, ;Allerdings macht der Controller soweit ich weiß bei den hier verwendenten Features sowieso keinen Gebrauch davon.Es ist also eigentlich egal. ;Alle "EQU's", die nicht mit "v"beginnen, sind Zahlen die nach Wunsch eingestellt werden können. ;Aber natürlich nur vor dem Brennen des Pic. Danach sind nur Uhr und Kalender über das Geheim-Interface zugänglich. ;Das ist aber sehr umständlich ;Die mit klein"v"am Anfang sind Registeradresse, an denen nichts einzustellen ist. ;Die hellgrünen Zahlen mit D und Apostrophen sind normale Dezimalzahlen. Die mit"0x"davor sind Hex-Zahlen.Die mit "B" und Apostrophen sind Binärzahlen. EV18 EQU D'99' ;damit ich gleich merke, wenn damit noch irgend ein Murcks ist ;Einschaltverhältnis an Geburtstagen und wenn volljährig !!!!!!!!!!!!!!!!! EV vor dem Brennen sinnvoll einstellen!!!!!!!!!! EVFeri EQU D'99' ; Ferien EVSa EQU D'01' ;Einschaltverhältnis an Samstagen EVSo EQU D'01' EVFreit EQU D'05' ;also Mittwoch Die File ist geändert, Ableger nur von Version 13 machen! EVWota EQU D'07' ;Wochentag LaDr18 EQU D'99' ; LadeRate Je kleiner die Laderate desto größer die Maximalzeit bei vollem Guthaben !!!!!!!!!!!!!!!!! LaDr vor dem Brennen sinnvoll einstellen!!!!!!!!!! LaDrFeri EQU D'99' ;LaDr 0=es bleibt wie es ist,frei oder gesperrt 6=max 6Stunden am Stück LaDrFreit EQU D'09' ;(Mi) ;7=5h12min - 8=4h33min - 9=4h3min max.Die Zeiten sind aber erheblich LaDrSa EQU D'00' ;größer wenn (weil) während Spielpausen konsequent ausgeschaltet wird. LaDrSo EQU D'00' ;Entladegeschwindigkeit im Verhältnis zu 65536mal 2 Sekunden zB 9 pro 2sec LaDrWota EQU D'11' ;Berechnung von Laderate und Einschaltverhältnis: Zunächst müßen Sie sich folgende Fragen stellen: 1.Wieviele Stunden am Tag möchte ich durchschnittlich fernsehen können?(tTag) ;2.Wieviele Stunden möchte ich maximal ansparen können, wenn ich meine Fernsehstunden nicht sofort nutze?(tmax) ;Es gelten folgende Gleichungen: EV=(24/tTag)-1 (EV mindestens = 1) ---------z.B. 2Stunden durchschnittlich d.h. EV=11 ; LaDr=36,41/t-max; t-max=36,41/LaDr ; tTag=24/(EV+1) ------------Man kann aber natürlich nur ganzzahlige Einschaltverhältnisse und Laderaten wählen. ; Wenn maximale Einschaltzeit tmax und notwendige Anspardauer twarte vorgegeben sind gilt folgende Formel EV= (twarte/tmax)+1 ; die Formel für LaDr bleibt davon unbeeinflußt. Wollen Sie also einmal in der Woche zwei Stunden lang Stargate gucken, ;EV=(166h/2h)+1 EV also=84 -------- LaDr = 36,41/2 LaDr also = 18,2 muß abgerundet werden, um das Ende von Stargate nicht abzuschneiden. LaDr also =18 ; Das bedeutet dann, dass Sie alternativ 16,9 Minuten täglich fernsehen können oder alle zwei Tage die Simpsons, wenn Sie auf Stargate verzichten. Wenn Sie die Laderate ;und das EV je nach Wochentag verschieden einstellen,wird die genaue Berechnung natürlich komplizierter. Macht man z.B. die (Ent)Laderate am Samstag kleiner, dann lohnt es sich ;natürlich richtig, Fernsehzeit für den Samstag aufzusparen. ;Das EV muß mindestens 1 sein, weil 0 soviel bedeutet, wie 256. Aber man kann die Laderate auf 0 setzen, wenn man einen bestimmten Wochentag ;dauerglotzen können möchte. Denn es ist ausgesprochen unwahrscheinlich, dass man genau um 00Uhr morgens dieses Tages ein Guthaben von genau Null hat. ;in dem verrückten Fall muß man dann allerdings einen Tag ganz verzichten. 1zu 65000 finde ich jedenfalls unwahrscheinlich. Man darf nur nicht gegen Mitternacht immer wieder sofort einschalten, wenn sich das Ding ausschaltet. ;Erklärung Lottosamstag: jeder Samstag mit einer Binär Nummer mit 3 Nullen am Ende ist ein 18erTag ; Ein- und Aus- Zeiten: Also die Uhr-Zeiten an denen die Glotze eingeschaltet werden kann, wenn man ein Zeit-Guthaben hat, ; oder ausgeschaltet wird egal, ob man ein Zeitguthaben hat. Ein18 EQU D'25' ; !!!!!!!!!!!!!!!!! "Ein" vor dem Brennen sinnvoll einstellen!!!!!!!!!! EinFeri EQU D'25' EinFreit EQU D'05' ;Mittw EinSa EQU D'05' EinSo EQU D'07' EinWota EQU D'05' Aus18 EQU D'25' ; =25 Uhr - also nie, weil es ja nie 25 Uhr wird !!!!!!!!!!!!!!!!! "Aus" vor dem Brennen sinnvoll einstellen!!!!!!!!!! AusFeri EQU D'25' AusFreit EQU D'25' ;ALSO Mittw !! ;25 Uhr: Am Freitag garnicht. (Erst am Samstag um 0x00 siehe Aus1) AusSa EQU D'25' AusSo EQU D'23' AusWota EQU D'23' Aus118 EQU D'25' ;nie !!!!!!!!!!!!!!!!! "Aus1" vor dem Brennen sinnvoll einstellen!!!!!!!!!! Aus1Feri EQU D'25' ;nie Aus1Freit EQU D'00' ; Aus1Sa EQU D'00' ;Also Freitag abend Mitternacht es ginge auch 0x01 gleich ein Uhr nachts usw. Aus1Wota EQU D'00' ;Aus1 und Ein1 sind nötig, wenn im Laufe eines Tages also von 00 bis 00 Uhr mehr als einmal ein oder ausgeschaltet werden soll. Aus1So EQU D'00' ;Dass ich das Zusatzaus auch bei anderen Wochentagen auf 00 gestellt habe ;ist nur zur Bequemlichkeit bei Erstinbetriebnahme.An sich unwichtig, da sowieso aus. Ein118 EQU D'25' ;nie !!!!!!!!!!!!!!!!! "Ein1" vor dem Brennen sinnvoll einstellen!!!!!!!!!! Ein1Feri EQU D'25' ;nie Ein1Freit EQU D'25' ;nie Ein1Sa EQU D'25' ;nie Ein1So EQU D'25' ;nie Ein1Wota EQU D'25' ;nie ;Bei Datums können nur Hex-Zahlen verwendet werden, da sie in oberes und unteres Byte zerlegt werden müßen: UpVollj EQU 0x03 ;Up- und Lo Byte vom Hex Datum des Erwachsenwerdens gerechnet vom 1.1.2007 (=Tag Nr1) !!!!!!!!!!!!!!!!! vor dem Brennen sinnvoll einstellen!!!!!!!!!! LoVollj EQU 0x90 GebT1Up EQU 0x00 ;zB.16ten Geb prüfen Tag181= 0x00B5 (oder ein anderes Datum, an dem man nicht genervt werden darf) !!!!!!!!!!!!!!!!! vor dem Brennen sinnvoll einstellen!!!!!!!!!! GebT1Lo EQU 0xB5 GebT2Up EQU 0x02 ;z.B.17ten Geb prüfen Tag 547= 0x0223 !!!!!!!!!!!!!!!!! vor dem Brennen sinnvoll einstellen!!!!!!!!!! GebT2Lo EQU 0x23 ;---------------WEITERE EINSTELLUNGEN GANZ UNTEN IM PROGRAMM UNTER DEM LABEL "Init" (Start-Datum)-------------------wichtig!!!!!!! ;(sonst nirgendwo Einstellungen) ; --bei den v's nichts einstellen, das wäre verheerend.-- vEntla EQU 0x2D ;Register aus dem das Guthaben - in/decrementiermodul seine Be/Ent-Laderate entnimmt zB 9 pro gezählten Takt ;Entladegeschwindigkeit im Verhältnis zu 65536mal 2 Sekunden zB 9 pro 2sec Zu diesem Zweck entnimmt das Programm die für den jeweiligen Tag gewünschte ;Laderate um 00 Uhr aus den Vorgaben und trägt sie in dieses Register ein. vEinschV EQU 0x2E ; hier entnimmt das In/DecModul sein Einschaltverhältnis ; Einschaltverhältnis dh ausgeschalteter Teil des Tages durch einschaltbaren vEinZt EQU 0x2F ; hier wird die für diesen Tag gültige uhrmäßige Einschaltzeit gespeichert täglich aktualisiert vAusZt EQU 0x30 ; Speicher für aktuelle Ausschaltuhrzeit täglich aktualisiert vDatAd EQU 0x31 ; Speicher für die Adresse der Ferien oder Schultage eigentlich nur ein Rechenspeicher vRech1 EQU 0x33 ; Zwischenspeicher um zu verrechnende Zahlen vorübergehend festzuhalten vRech2 EQU 0x34 ;werden von verschiedenen Modulen genutzt vRech3 EQU 0x35 vRech4 EQU 0x38 vRech5 EQU 0x39 vAus1 EQU 0x36 ;Speicher für zusätzliche Aus- oder Ein- Schaltzeiten falls an einem Tag zwei vEin1 EQU 0x37 ; Zeitfenster geöffnet werden sollen zB Samstag um 0x00 Zusatzaus weil Freitag kein Aus ;--bei den v's nichts einstellen, das wäre verheerend.-- v2Sec Equ 0x22 ;Sekunden-Register lesbar und setzbar bei Abweichung vMin Equ 0x32 ;usw vHour Equ 0x24 ;uzw vDOW Equ 0x25 ;usw Day of Week Mo-So = 0-6 vDNoLo Equ 0x26 ;Tagesnummer beginnend mit Null für Silvester 2006 unteres Byte vDNoUp Equ 0x27 ;oberes Byte der Tagesnummer vGutLo EQU 0x28 ; Das ist das Register, in dem die 0-65535 Guthabeneinheiten stehen, die rauf oder runter vGutHi EQU 0x29 ; gezählt werden je nach vEntla oder v EinschV schneller oder langsamer. vDiv EQU 0x2A ;Divisionsregister, dient ständig zum Verarbeiten des Einschaltverhältnisses.Kein freies Rechenregister. vAusg EQU 0x2B ;Bit0=1dh Sicherheitsenable Für Ausgangsfreigabe müssen alle drei =1 sein ;Bit1=1 Guthaben vorhanden ;Bit2=1 Uhrzeit akzeptabel vPrimCheck EQU 0x3A ;Mit diesem Register wird überprüft, ob bei einem Reset die Ersteinstellungen ; vorgenommen werden sollen, oder ob es nur ein Störungs-Reset ist. ;--bei den v's nichts einstellen, das wäre verheerend.-- ;in den beiden folgenden Ram-Adressen werden Einzel-Bits gspeichert: vZeitStatus Equ 0x21 ;für die Flags der Zeiteinheiten (keine Einstellungen) ;vZeitStatus,0 ist 2-SekundenFlag ;vZeitStatus,1 ist MinutenFlag ;vZeitStatus,2 ist StundenFlag ;vZeitStatus,3 ist TagesFlag ;vZeitStatus,4 ist WochenFlag (deaktiviert um Programmspeicher zu sparen, da nicht benutzt) ;vZeitStatus,5 ist Einschaltstatus Ist-Zustands - Flag 1= Glotze ist an 0=aus ;vZeitStatus,6 ist 1=Bildschirmfreigabe von Guthabensteuerung 0=gesperrt ;vZeitStatus,7 ist SicherheitsEnable - wenn dieses Bit clear ist kann sich die ;Glotze nicht in Abwesenheit selbst wieder einschalten ;falls die Power selbst geschaltet wird vMuFu EQU 0x2C ;Multifunktionsregister ;vMuFu,0 ist ;Rechen-Bit für toggelnden Ausgangsschalter überwindet Monitor Redundanzen keine Einstellung ;vMuFu,1 ist ;das Uhrzeitmäßige EinschaltBit ;vMuFu,2 =1,d.h. Alter größer oder gleich 18 Jahre ;vMuFu,3 ist ;Ferientags Flag 1= zuletzt war ein Ferientag 0= Der letzte Beginntag war ein Schulbeginntag ;vMuFu,4 ist ;ErrorBit 1= es ist ein Error aufgetreten ; wird in diesem Programm nicht wirklich genutzt. ;vMuFu,5 ist das 5V Betriebspannungsflag. vMuFu,5 =0 d.h. zuletzt waren keine 5V vorhanden ;vMufu,5 dient zur Steuerung verschiedener Vorgänge vIntFu EQU 0x3A ;Register für die Prüfflags zum Eintritt in interaktiven Modus. (akustische Zeit-Signale/Einstellmodus) vIntOrd EQU 0x3B ;Register für Ablauf-Ordnungs-Flags innerhalb InterState ;(Betätigter Geheimschalter = clear an GPIO,3 else set) org 0x00 Start NOP GOTO Init GOTO Maerchen GOTO Maerchen ;beste Füllung für unbenutzte Programmzellen org 0x004 invec return invec2 call ISR GOTO InterMo GOTO LadeLos Maerchen BSF STATUS,RP0 ;Vorbereit für Timr1 WakeUp vor dem Einschlafen. clrf PIE1 clrf ANSEL MOVLW B'101100' MOVWF TRISIO BCF STATUS,RP0 MOVLW 0x07 MOVWF CMCON BCF ADCON0,ADON MOVLW 0x0F MOVWF T1CON MOVLW B'11000000' MOVWF INTCON clrf PIR1 BSF STATUS,RP0 bsf PIE1,TMR1IE schlafi sleep ;endlich--der sleep-Befehl NOP GOTO invec2 ;vZeitStatus Equ 0x21 ;für die Flags der Zeiteinheiten ;v2Sec Equ 0x22 ;Sekunden-Register lesbar und setzbar bei Abweichung ;vMin Equ 0x23 ;usw ;vHour Equ 0x24 ;usw ;vDOW Equ 0x25 ;usw Day of Week Mo-Fr ;vDNoLo Equ 0x26 ;Tagesnummer beginnend mit Null für Silvester 2006 unteres Byte ;vDNoUp Equ 0x27 ;oberes Byte der Tagesnummer ;Was 2-sekündlich abgearbeitet werden muß: ;also erstmal Uhr weiterstellen ISR bcf STATUS,RP0 ;btfss PIR1,TMR1IF ;BSF vMuFu,4 ;dieser Fall darf eigentlich garnicht auftreten. Da auch nicht zu entscheiden ist ob return oder goto maerchen richtig wäre:deaktiviert. CLRF PIR1 ;(TMR1IF) BCF GPIO,1 ;Die IO-Gruppe wurde vorgezogen um dem Eingang etwas Zeit zum Einstellen der Spannung zu geben. Eigentlich immer noch zu wenig. NOP BSF STATUS,RP0 BSF TRISIO,1 NOP BCF STATUS,RP0 movlw 0x00 ;Test-Beschleuniger. Wieder auf 0x00setzen addwf TMR1H,F ; für Test FF laden hat zwar keinen Einfluß auf die Simulation, aber die ;echte Hardware läuft damit 250 mal schneller,falls sie sich dabei nicht überschlägt bsf vZeitStatus,0 ;2-SekundenFlag incf v2Sec,F movf v2Sec,W sublw 0x1D ;subtract W from 29 (to check if full minute)C wird nur dann Null, wenn das einen Übertrag gibt. btfsc STATUS,C ; Das ist nur bei 30 Doppelsekunden und mehr der Fall(bei 2-Sekunden-Takt) (Ungestört rundlaufender Timer) goto Guti ;dieses Verfahren ist viel störsicherer als das mit Zero-Check. clrf v2Sec bsf vZeitStatus,1 incf vMin,F movf vMin,W sublw 0x3B ; 59 minus 60 gibt einen Übertrag. Bei Subtraktion ist Carry dann also clear. btfsc STATUS,C goto Guti clrf vMin bsf vZeitStatus,2 incf vHour,F movf vHour,W sublw 0x17 btfsc STATUS,C goto Guti clrf vHour bsf vZeitStatus,3 incf vDOW,F ;increment the day of the week movf vDOW,W ;W = vDOW sublw 0x06 ;subtract W from 6 btfss STATUS,C ; bei Subtraktions-Übertrag carry = 0 call WoClea ;neue Woche incfsz vDNoLo,F goto Guti incf vDNoUp,F goto Guti ;---------------------------------------------- WoClea clrf vDOW ;clear vDOW für Montag=0x00 ;;;bsf vZeitStatus,4 ;Wochen-Flag --ein Wochenflag ist prima, aber da es nicht benutzt wird,spare ich den Speicherplatz-- return ;Ende des Uhrweitersetzens ;GUTHABENSTEUERUNG ;vGutLo EQU 0x28 ; Das ist das Register, in dem die 0-65535 Guthabeneinheiten stehen, die rauf oder runter ;vGutHi EQU 0x29 ; gezählt werden je nach vEntla oder v EinschV schneller oder langsamer. ;vEntla EQU 0x2D ;Register - gewählte Entladegeschwindigkeit im Verhältnis zu 65536mal 2 Sekunden wird hier gespeichert ;vEinschV EQU 0x2E ;Register - von Kalender gewähltes Einschaltverhältnis dh ausgeschalteter Teil des Tages durch eingeschalteten ;Überprüfung der 15-Volt-Spannung an GP1 PIN6 Guti MovF GPIO,F NOP NOP BTFSS GPIO,1 GOTO GutInc ;;;GOTO GutDec ;15 Volt Spannung vorhanden - Glotze ist also an GutDec BSF vZeitStatus,5 ;Einschaltstatus Ist-Zustands - Flag für Glotze ist an BSF STATUS,RP0 BcF TRISIO,1 BCF STATUS,RP0 BSF vMuFu,5 BSF GPIO,1 ;Guthaben - Aktualisierung MOVF vEntla,W ;Entladegeschwindigkeit des Guthabens SUBWF vGutLo,F BTFSC STATUS,C GOTO SwOn MOVLW 0x01 ;Übertrag SUBWF vGutHi,F BTFSC STATUS,C GOTO SwOn incf vGutHi,F ;Speicher leer also retour MOVF vEntla,W ;(Entladegeschwindigkeit-s. o. ) ADDWF vGutLo,F GOTO SwOff SwOn BSF vZeitStatus,6 ; Dieses Flag gibt den Bildschirm aus Sicht des Guthabens frei - oder nicht GOTO AltCheck SwOff BCF vZeitStatus,6 ; Dieses Flag gibt den Bildschirm frei - oder nicht - hier sperrt es GOTO AltCheck ;15 Volt Spannung fehlt - Glotze ist also aus ;vDiv EQU 0x2A GutInc BCF vZeitStatus,5 ;Einschaltstatus Ist-Zustands- Flag für Glotze ist aus ;;;B S F vZeitStatus,7 ;Achtung! Es ist zwar aus, das Einschalten darf aber nicht enabled werden F-A-L-L-S die Power selbst geschaltet wird, da nur Standby. ; Das Einschalten darf dann nur durch fehlende 5V Spannung oder Aus-Signal vom Monitor enabled werden ; nicht vom Standbyzustand (keine15V) also andernorts, um Abwesenheitseinschaltung zu verhindern. BSF vZeitStatus,6 ; Flag: Guthaben (ist ja egal, wenn derBildsch aus ist. Ermöglicht aber dem Einschaltmodul in dieser für Papas Glotze ;geänderten Version, sich überhaupt einzuschalten wenn kurz nach aus wieder eingeschaltet wird. BSF STATUS,RP0 BcF TRISIO,1 BCF STATUS,RP0 BTFSS vMuFu,5 GOTO MuCleaInc BSF GPIO,1 GOTO GuAInc MuCleaInc BCF GPIO,1 ;Guthaben Aktualisierung mit Quotientenschleife GuAInc DECFSZ vDiv,F ;Schleife entladen GOTO AltCheck MOVF vEntla,W ;Entladegeschwindigkeit jetzt Aufladeeinheit ADDWF vGutLo,F BTFSS STATUS,C GOTO EVset MOVLW 0x01 ;Übertrag ADDWF vGutHi,F BTFSS STATUS,C Goto EVset DECF vGutHi,F ;voll also retour MOVF vEntla,W SUBWF vGutLo,F EVset MOVF vEinschV,W ;verbrauchten Quotienten Aus-Zeit zu Ein-Zeit wiedereinsetzen MOVWF vDiv ;;GOTO Disp ;;;Disp GOTO AltCheck ;Hier war mal ein Display für Testzwecke nur noch Weiterleitung ;UHRZEIT-GUT/SCHLECHT-BIT-SCHREIBE- UND KALENDERAUSWERTUNGS-MODUL ;a)DATUMSBEDINGTE EINSTELLUNGEN DATUMSBEDINGTE EINSTELLUNGEN DATUMSBEDINGTE EINSTELLUNGEN DATUMSBEDINGTE EINSTELLUNGEN ; Modul wid nur täglich um 00Uhr ausgeführt ;Das Kalendermodul, welches auch die zur Zeit gültigen Einstellungen erkennt ;Bit vMuFu,2 =1 d h Alter über oder gleich 18 Jahre 0=jünger AltCheck BTfSS vZeitStatus,3 ;DatumsCheck täglich GOTO GCheckEnde BCF vZeitStatus,3 ;TagesFlag resetten Goto Schultag ; MOVF vDNoUp,W Ich habe hier den ganzen Kinder - Kram mit dem Datum gekillt, und übersprungen Originalbefehl grün !!!!!!!!!!!!!!!!!!!!!! SUBLW UpVollj ;18terGeburtstag Tag Nr 912 als zweiBytige Hex-Zahl = 03 90 BTFSS STATUS,C ;das muß jeder persönlich einsetzen GOTO AltWr INCF vDNoUp,W SUBLW UpVollj BTFSC STATUS,C GOTO Lotto MovF vDNoLo,W SUBLW LoVollj BTFSC STATUS,Z GOTO AltWr MOVF vDNoLo,W SUBLW LoVollj BTFSC STATUS,C GOTO Lotto ;;GOTO AltWr AltWr BSF vMuFu,2 ;Alters - Flag schreiben AltWr1 MOVLW EV18 ;Einschaltverhältnis und Laderate setzen MOVWF vEinschV MOVLW LaDr18 MOVWF vEntla MOVLW Ein18 MovWf vEinZt MOVLW Aus18 Movwf vAusZt MOVLW Ein118 MovWf vEin1 MOVLW Aus118 Movwf vAus1 GOTO GCheckEnde ;Lotto - Samstage auf drei Nullen -ganz frei Lotto MOVLW B'11111000' XORWF vDNoLo,W ADDWF vDNoLo,W SUBLW B'11111000' BTFSS STATUS,Z GOTO GebCheck MOVF vDOW,W SUBLW 0x05 ;Montag ist Wochentag 0 Samstag also 5 BTFSC STATUS,Z GOTO AltWr1 ;;GOTO GebCheck GebCheck MOVF vDNoUp,W ;zB.16ten Geb prüfen SUBLW GebT1Up BTFSS STATUS,Z Goto GebCheck1 MOVF vDNoLo,W SUBLW GebT1Lo BTFSC STATUS,Z GOTO AltWr1 GebCheck1 MOVLW GebT2Up ;z.B.17ten Geb prüfen SUBWF vDNoUp,W BTFSS STATUS,Z GOTO FerCheck MOVLW GebT2Lo SUBWF vDNoLo,W BTFSC STATUS,Z GOTO AltWr1 ;;;GOTO FerCheck ;FERIENCHECK ;Tabelle mit ersten Ferientage Nummern steht am Ende des Programms ;oberes Byte der Tagesnummern in Tabelle am Ende des Programms ; Tabelle mit ersten Schultagen nach Ferien am Ende des Programms ; PC returnt von dort mit den 8 unteren bits der Tagesnummer welche ;anschließend mit dem aktuellen Datum verglichen werden.Dann falls unteres Byte stimmt die oberen Bits ;Die ganze Tabelle wird gnadenlos einfach einmal durchgeckeckt macht dem Chip ja kaum Arbeit FerCheck MOVLW 0x03 ;Voreinstellung für die folgende Tabellenabfrage Schul- oder Ferien-Anfangstage MOVWF PCLATH BTFSC vMuFu,3 ;Ferientags Flag 1= zuletzt war ein Ferientag 0= es war kein Ferientag Goto SchulCheck ; Wenn ein Ferienanfangstag war muß ja wohl als nächstes ein Schulanfangstag folgen GOTO FerCheck1 ; Es waren keine Ferien also könnten ja jetzt welche sein FerCheck1 clrf vDatAd ;Tabellen-Adresse resetten- FerCheck2 incf vDatAd,F ;nächste Zeile der Tabelle prüfen MOVF vDatAd,W ;prüfen ob man mit der Tabelle durch ist SUBLW 0x11 ;Maximale Zahl in DatAd ist 17 also 11hex BTFSS STATUS,C GOTO WTagsCheck ;Tabelle ist durch - es ist kein FerienbeginnTag CALL FerTabLo SUBWF vDNoLo,W BTFSS STATUS,Z Goto FerCheck2 CALL FerTabUp ;unteres Byte stimmt. Stimmt oberes auch? SUBWF vDNoUp,W BTFSS STATUS,Z Goto FerCheck2 ;nein also weiter mit der Tabelle ;;;Goto Ferientag ; oberes Byte stimmt auch - Hurra Ferientag MOVLW EVFeri ;Ferien beginnen heute Einschaltverhältnis Laderate Schalt-Uhrzeiten setzen MOVWF vEinschV MOVLW LaDrFeri MOVWF vEntla MOVLW EinFeri MovWf vEinZt MOVLW AusFeri Movwf vAusZt BSF vMuFu,3 GOTO GCheckEnde ;Falls Ferien waren fängt heute vielleicht die Schule wieder an SchulCheck clrf vDatAd ;Tabellen-Adresse resetten SchCheck2 incf vDatAd,F ;nächste Zeile der Tabelle prüfen MOVF vDatAd,W ;prüfen ob man mit der Tabelle durch ist SUBLW 0x11 ;Maximale Zahl in DatAd ist 17 also 11hex BTFSS STATUS,C GOTO GCheckEnde ;Tabelle ist durch - es ist kein SchulbeginnTag CALL SchTabLo SUBWF vDNoLo,W BTFSS STATUS,Z Goto SchCheck2 CALL SchTabUp ;oberes Byte? SUBWF vDNoUp,W BTFSS STATUS,Z Goto SchCheck2 ;nein--uff ;;;Goto Schultag ;hurra -wir lernen was- Schultag BCF vMuFu,3 ;Ferien/Schul-Tags-Flag clearen ;ok - Schulzeit aber es könnte ja Sonntag sein oder zB Freitag... WTagsCheck MOVF vDOW,W BTFSC STATUS,Z GOTO Wotag ;Montag MOVWF vRech1 DECF vRech1,F BTFSC STATUS,Z GOTO Wotag ;Dienstag DECF vRech1,F BTFSC STATUS,Z GOTO Freitag ;Dies ist eigentlich der Mittwoch, aber für Mittwoch ist nichts vorgesehen für Papas Version geändert DECF vRech1,F BTFSC STATUS,Z GOTO Wotag DECF vRech1,F BTFSC STATUS,Z GOTO Wotag ;Freitag wird als WOTa behandelt. DECF vRech1,F BTFSC STATUS,Z GOTO Samstag DECF vRech1,F BTFSC STATUS,Z GOTO Sonntag CLRF vDOW BSF vMuFu,4 ;ErrorBit setzen kann passieren falls jemand Montags das Datum zurücksetzt dann ist wieder Montag. GOTO GCheckEnde ;Montag Dienstag Mittwoch oder Donnerstag Wotag MOVLW EVWota ; Einschaltverhältnis Laderate Schalt-Uhrzeiten setzen MOVWF vEinschV MOVLW LaDrWota MOVWF vEntla MOVLW EinWota MovWf vEinZt MOVLW AusWota Movwf vAusZt MOVLW Ein1Wota MovWf vEin1 MOVLW Aus1Wota Movwf vAus1 GOTO GCheckEnde Freitag MOVLW EVFreit ;Einschaltverhältnis Laderate Schalt-Uhrzeiten setzen MOVWF vEinschV MOVLW LaDrFreit MOVWF vEntla MOVLW EinFreit MovWf vEinZt MOVLW AusFreit Movwf vAusZt MOVLW Ein1Freit MovWf vEin1 MOVLW Aus1Freit Movwf vAus1 GOTO GCheckEnde Samstag MOVLW EVSa ;Einschaltverhältnis Laderate Schalt-Uhrzeiten setzen MOVWF vEinschV MOVLW LaDrSa MOVWF vEntla MOVLW EinSa MovWf vEinZt MOVLW AusSa Movwf vAusZt MOVLW Ein1Sa MovWf vEin1 MOVLW Aus1Sa Movwf vAus1 GOTO GCheckEnde Sonntag MOVLW EVSo ;Einschaltverhältnis Laderate Schalt-Uhrzeiten setzen MOVWF vEinschV MOVLW LaDrSo MOVWF vEntla MOVLW EinSo MovWf vEinZt MOVLW AusSo Movwf vAusZt MOVLW Ein1So MovWf vEin1 MOVLW Aus1So Movwf vAus1 ;;;;GOTO GCheckEnde GCheckEnde GOTO UhrCheck ;b)UHRZEITBEDINGTE EINSTELLUNGEN -- UHRZEITBEDINGTE EINSTELLUNGEN --UHRZEITBEDINGTE EINSTELLUNGEN --UHRZEITBEDINGTE EINSTELLUNGEN -- ;Uhrzeit-Bit set/clear -Modul ;Uhrzeit-Bit set/clear -Modul ;Uhrzeit-Bit set/clear -Modul ; die tatsächliche Uhrzeit wird mit den Vorgaben verglichen ;Uhrzeit Bit = vMuFu,1 ;Modul wird stündlich ausgeführt Die soll-aus-/ein-Uhrzeiten werden mit den ist-Uhrzeiten verglichen ;und entsprechend das Uhrzeit Bit geschaltet UhrCheck BTFSS vZeitStatus,2 ;Modul wird nur stündlich ausgeführt (Uhrzeit) GOTO AusgMod ;;;GOTO UhrCheckEnde BCF vZeitStatus,2 ;Das StundenFlag zurücksetzen MOVF vHour,W SUBWF vEinZt,W ;prüfe alle 4 Uhrzeitschalter BTFSc STATUS,Z BSF vMuFu,1 ;setze das Uhrzeitmäßige EinschaltBit (es gibt noch dasGuhaben und Sicherh-Bit) MOVF vHour,W SUBWF vAusZt,W BTFSc STATUS,Z BcF vMuFu,1 ;lösche das Uhrzeitmäßige EinschaltBit, falls Du hier vorbeikommst.. MOVF vHour,W SUBWF vEin1,W BTFSc STATUS,Z BSF vMuFu,1 ;setze das Uhrzeitmäßige EinschaltBit,.. MOVF vHour,W SUBWF vAus1,W BTFSc STATUS,Z BcF vMuFu,1 ;lösche das Uhrzeitmäßige EinschaltBit,... ;UhrCheckEnde ;;;GOTO AusgMod ;AUSGANGSSCHALTMODUL läuft 2-sekündlich ;Hier laufen alle Einstellungen zusammmen und schalten den AusgangsPin Nr7 (GPIO-0) ;vAusg EQU 0x2B ;Bit0=1dh Sicherheitsenable ;Bit1=1 Guthaben vorhanden ;Bit2=1 Uhrzeit akzeptabel ;Ausgang wird nur freigeschaltet, wenn alle diese drei Bits gesetzt sind. ;die anderen Bits müssen unbenutzt bleiben ;vMuFu (Multifunktionsregister);Bit0 =Toggle-Speicher für Monitor-Sperren. AusgMod BTFSS vZeitStatus,5 ;Ausgeschaltet - Ausg gleich freigeben ;WENN keine 15V dann Ausg Modul garnicht erst aufrufen NOP ;Goto freigeben ;um andere Funktionen nicht zu stören ; Aber GPIO-0 freigeben um erlaubtes Einschalten zu beschleunigen ;(sofortiges Einschalten ermöglichen und Power Down) verändertin Papas Version!!!!!!!!!!!!!!!!!!!!!!!!!!! CLRF vAusg BTFSS vZeitStatus,7 ;Bits ins Ausg-Check-Register Übertragen Goto AusgMod1 BSF vAusg,0 AusgMod2 BTFSS vZeitStatus,6 GOTo AusgMod3 BSF vAusg,1 AusgMod4 BTFSS vMuFu,1 goto AusgMod5 BSF vAusg,2 GOTO AusgMod6 AusgMod1 BCF vAusg,0 GOTO AusgMod2 AusgMod3 BCF vAusg,1 GOTO AusgMod4 AusgMod5 BCF vAusg,2 AusgMod6 Bsf STATUS,RP0 Bcf TRISIO,0 BCF STATUS,RP0 MOVLW B'00000111' ;Check-Register checken SUBWF vAusg,W BTFSS STATUS,Z GOTO sperren GOTO freigeben freigeben BCF GPIO,0 GOTO AusgDone sperren BTFSS vZeitStatus,5 ;Sicherheitsbit und zusätzliches Ausschalten-müssen einsparen wenn sowieso aus GOTO AusgDone ;in dieser Variante kann der Microcontroller des Fernseh IR-Empfängers zwar zur Unzeit eingeschaltet werden, aber ;nur einmal und da wird er in 2sec abgewürgt. Dafür ist dann aber das Sicherheitsbit auch gesetzt,und man kann ;beruhigt weggehen, auch, wenn es 2Minuten vor Entsperruhrzeit ist. Der Microcontroller des Fernsehers versucht ja ;noch ein paar Minuten weiter, einzuschalten. Das kann er dann aber auch nicht mehr. BCF vZeitStatus,7 ;Da dieses Enable Bit jetzt clear ist kann sich die ;Glotze nicht in Abwesenheit selbst wieder einschalten ;falls die Power selbst geschaltet wird ;BTFSS vMuFu,0 ;toggelnder Ausgangsschalter überwindet Monitor Redundanzen ;GOTO sperren2 ;BCF vMuFu,0 ;BCF GPIO,0 ;GOTO AusgDone ;sperren2 BSF vMuFu,0 BSF GPIO,0 ;;;GOTO AusgDone AusgDone RETURN ;Ende des Ausgabemoduls ;BATTERIE_LADEPROGRAMM ;BATTERIE_LADEPROGRAMM ;BATTERIE_LADEPROGRAMM ;BATTERIE_LADEPROGRAMM ;BATTERIE_LADEPROGRAMM ;BATTERIE_LADEPROGRAMM ;BATTERIE_LADEPROGRAMM LadeLos BCF INTCON,GIE ;um Komplikationen mit dem Interruptvektor 0x0004 zu vermeiden, da wir ja gleich in eine Endlosschleife gehen. BSF STATUS,RP0 MOVLW 0x34 ; Erst mal den Ladezustand der Batterie messen: MOVWF ANSEL ;Pin2 und AD Clock-Speed/Quelle wählen BCF STATUS,RP0 MOVLW 0x09 MOVWF ADCON0 NOP MOVLW 0x08 MOVWF vRech1 AccqT DECFSZ vRech1,F ;accquisition-time. 20usec sollten bei 8BitAuflösung reichen. GOTO AccqT BSF ADCON0,1 ADBitTest BTFSC ADCON0,1 ;Warteschleife bis AD-Conversion fertig GOTO ADBitTest ;Wert in Ladestrom umrechnen: MOVLW D'172' SUBWF ADRESH,W ;0-255 je nach Ladezustand bzw jedenfalls gemessener Spannung BTFSS STATUS,C GOTO MaxLad ;Batterie hat weniger als ca 3,2V also total leer. MOVWF vRech1 ;83 - 0 je nach Vollständigkeit der Ladung SUBLW D'76' BTFSC STATUS,C GOTO ADT1 BCF vMuFu,5 ;RAUS: Batterie ist voller als möglich, es muß also wohl VDD unter die Batteriespannung gesunken sein weil die BSF vZeitStatus,7 ;Sicherheitsbit freigeben !!!!!!!!!! ;5V-Betriebsspannung ausfiel. BCF GPIO,1 ;Laden ist also gar nicht möglich. GOTO Maerchen ADT1 MOVLW D'53' ;hier gehts weiter SUBWF vRech1,W BTFSC STATUS,C GOTO Goout ;ES waren über 53. Batterie voll, also raus aus der Ladeschleife MOVWF vRech2 ;es waren 53 oder weniger. Differenz zu 53 abspeichern COMF vRech2,F INCF vRech2,F GOTO Lade Goout BSF GPIO,1 BSF vMuFu,5 GOTO Maerchen MaxLad MOVLW D'53' MOVWF vRech2 clrf vRech1 ;;;GOTO Lade ;vRech1 enthält jetztdie Zahl 53 - 0 je nach Vollständigkeit der Ladung im für die Ladestromeinstellung ;relevanten Intervall, vRech2 den Rest der an 53 fehlt. Lade BSF STATUS,RP0 ; endlich mal den AD-Converter abschalten. MOVLW 0x30 MOVWF ANSEL BCF STATUS,RP0 BCF ADCON0,ADON BCF PIR1,ADIF BSF STATUS,RP0 ;falls noch aus anderem Programmteil falsch zurückgeblieben, Pin 6 zum Output machen. BcF TRISIO,1 ;(nur Programmierbequemlichkeit um nicht bei jeder Programmänderung alles kontrollieren zu müssen.) BCF STATUS,RP0 Lade1 BCF GPIO,1 ; GPIO1 auf Low schalten = laden INCF vRech2,W ;Ladezeit entspricht grob gerechnet dem was vRech1 an 53 fehlt mal 2Pulse mal 128. MOVWF vRech3 Lade2 DECFSZ vRech3,F GOTO Lade5 GOTO Lade4 Lade5 MOVLW 0x80 MOVWF vRech4 Lade6 DECFSZ vRech4,F GOTO Lade6 GOTO Lade2 Lade4 BsF GPIO,1 ; GPIO1 auf High schalten= Lade-Pause um Zyklus gleichbleibend lang zu vervollständigen. INCF vRech1,W ;damit ist der durchschnittliche Ladestrom dann in etwa umgekehrt MOVWF vRech3 ;proportional zur Batteriespannung im für den Ladezustand relevanten Fenster. Lade3 DECFSZ vRech3,F GOTO Lade7 GOTO Lade9 Lade7 MOVLW 0x80 MOVWF vRech4 Lade8 DECFSZ vRech4,F GOTO Lade8 GOTO Lade3 Lade9 BTFSS PIR1,TMR1IF ;Ist der Timer1 abgelaufen? GOTO Lade1 ;nächster Zyklus BSF vMuFu,5 GOTO invec2 ;Raussprung aus der Endlos - Ladeschleife, um die Uhr weiterzusetzen und alles zu checken ;GPIO,1 ist dabei noch auf High, das heißt es wird nicht unkontrolliert geladen. ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ;;;Ende des Ladeprogramms ;;;Ende des Ladeprogramms ;;;Ende des Ladeprogramms ;;;Ende des Ladeprogramms ; -------BEGINN DES INTERAKTIVEN MODULS--XXXXXXXXXXX------ -------BEGINN DES INTERAKTIVEN MODULS--XXXXXXXXXXX------ -------BEGINN DES INTERAKTIVEN MODULS--XXXXXXXXXXX------ ; -------BEGINN DES INTERAKTIVEN MODULS--XXXXXXXXXXX------ -------BEGINN DES INTERAKTIVEN MODULS--XXXXXXXXXXX------ InterMo BTFSC vMuFu,5 ;Interakt Modul wird nur im ausgeschalteten Zustand des Monitors aktiv GOTO LadeLos ; Zugangscode in Geheimschalter abfragen BTFSC vIntFu,5 GOTO InterState BTFSC vIntFu,4 GOTO IntSet5 BTFSC vIntFu,3 GOTO IntSet4 BTFSC vIntFu,2 GOTO IntSet3 BTFSC vIntFu,1 GOTO IntSet2 BTFSC vIntFu,0 GOTO IntSet1 BTFSS GPIO,3 Goto IntSet0 GOTO Loesch IntSet5 BTFSS GPIO,3 GOTO Loesch BSF vIntFu,5 LueLa CALL TonA ; give special sound um Ankunft auf Interstate zu signalisieren.Wird leider leicht übersprungen, wenn man zu langsam am Geheimschalter ist. Call TonD CALL TonD BTFSS PIR1,TMR1IF GOTO LueLa GOTO invec2 IntSet4 BTFSC GPIO,3 GOTO Loesch BSF vIntFu,4 GOTO Maerchen IntSet3 BTFSC GPIO,3 GOTO Loesch BSF vIntFu,3 GOTO Maerchen IntSet2 BTFSC GPIO,3 GOTO Loesch BSF vIntFu,2 GOTO Maerchen IntSet1 BTFSC GPIO,3 GOTO Loesch BSF vIntFu,1 GOTO Maerchen IntSet0 BSF vIntFu,0 GOTO Maerchen Loesch CLRF vIntFu ;wenn das Interface kein Schalter-Signal bekommen hat, oder nicht das richtige. BTFSS vZeitStatus,1 GOTO Maerchen BCF vZeitStatus,1 GOTO LadeLos ;auch im Stromsparmodus wenigstens einmal pro Minute gucken ob der Stromsparmodus beendet werden kann. ;Zugangscode confirmed , hier beginnt das Abhör und Einstellprogramm für den RTC ;2mal 2sec = 4Sec Pause nach Begrüßungssignal Doppelbip c-c InterState CALL HearLos Wal3 CALL TonA CALL TonA Wal4 BTFSS PIR1,TMR1IF GOTO Wal5 CALL ISR GOTO Wal6 Wal5 BTFSC GPIO,3 GOTO Wal4 GOTO InterState3 ;nach langem tiefen Ton(A)Geheimsch betätigen dann gehts zum Abhören der RTC Wal6 CALL TonD CALL TonD Wal7 BTFSS PIR1,TMR1IF GOTO Wal8 CALL ISR GOTO Wal3 Wal8 BTFSC GPIO,3 GOTO Wal7 GOTO InterState4 ;nach langem hohen Ton (D) Geheimsch betätigen dann gehts zum Stellen der RTC ;RTC Abhörprogramm---------------------------------------------------------------------------- ;hören (abhören der Uhrzeit und Datumseinstellungen) InterState3 CALL HearLos ;Einleitungssignal (zwei c-Bips ) und 4 Sek Pause HearSec MOVF v2Sec,F ;darauf warten, dass es 00 Sekunden wird. BTFSS STATUS,Z GOTO HearSec2 call TonD ;Zeitzeichen call TonD ;GOTO HearSec2 HearSec2 BTFSS PIR1,TMR1IF GOTO HearSec3 Call ISR GOTO HearSec HearSec3 BTFSS GPIO,3 ;weiter mit Geheimschalter GOTO HearMin GOTO HearSec ;...............Minuten abhören............................. HearMin CALL HearLos ;Einleitungssignal (zwei c-Bips ) und 4 Sek Pause ;die sechs Minuten-Bits werden abgespielt HearMin4 RLF vMin,W MOVWF vRech4 RLF vRech4,F MOVLW 0x07 MOVWF vRech5 HearNext DECFSZ vRech5,F GOTO MinSch GOTO HearReady MinSch RLF vRech4,F BTFSS STATUS,C Goto HearMin5 CALL HearHigh ;Tonsignal für Bit geben wenn H GOTO HearNext HearMin5 CALL HearLow ;Tonsignal für Bit geben wenn L GOTO HearNext ;nächstes Bit HearReady BTFSS PIR1,TMR1IF GOTO HearReady CALL ISR BTFSS GPIO,3 ;Geheimschalter überprüfen ggf weiter zu Stunden GOTO HearHour CALL HearLos3 ;2sec Pause und dann von vorne GOTO HearMin4 ;...............Stunden abhören........................................................ HearHour CALL HearLos ;die fünf Stunden-Bits werden abgespielt HearHour4 RLF vHour,W ;neu MOVWF vRech4 RLF vRech4,F RLF vRech4,F MOVLW 0x06 MOVWF vRech5 HearHNext DECFSZ vRech5,F GOTO HourSch GOTO HearHReady HourSch RLF vRech4,F BTFSS STATUS,C Goto HearHour5 CALL HearHigh GOTO HearHNext HearHour5 CALL HearLow GOTO HearHNext ;letze neu HearHReady BTFSS PIR1,TMR1IF GOTO HearHReady CALL ISR BTFSS GPIO,3 ;Geheimschalter überprüfen GOTO HearDOW CALL HearLos3 ;2sec Pause und dann von vorne GOTO HearHour4 ;........Wochentag abhören.............................................. HearDOW CALL HearLos ;die drei Wochentags-Bits werden abgespielt HearDOW4 RLF vDOW,W MOVWF vRech4 RLF vRech4,F RLF vRech4,F RLF vRech4,F RLF vRech4,F MOVLW 0x04 MOVWF vRech5 HearDNext DECFSZ vRech5,F GOTO DOWSch GOTO HearDReady DOWSch RLF vRech4,F BTFSS STATUS,C Goto HearDOW5 CALL HearHigh GOTO HearDNext HearDOW5 CALL HearLow GOTO HearDNext HearDReady BTFSS PIR1,TMR1IF GOTO HearDReady CALL ISR BTFSS GPIO,3 ;Geheimschalter überprüfen GOTO HearDNoUp ; ggf. weiter mit Oberstem Datumsnibble CALL HearLos3 ;2sec Pause und dann von vorne GOTO HearDOW4 ;.................................................................................. HearDNoUp CALL HearLos HearDNoUp4 SWAPF vDNoUp,W MOVWF vRech4 CALL PlayNib BTFSS GPIO,3 ;Geheimschalter überprüfen GOTO HearDNoMe ; ggf. weiter mit mittlerem Datumsnibble CALL HearLos3 ;2sec Pause und dann von vorne GOTO HearDNoUp4 ;.................................................................... HearDNoMe CALL HearLos HearDNoMe4 MOVF vDNoLo,W MOVWF vRech4 CALL PlayNib BTFSS GPIO,3 ;Geheimschalter überprüfen GOTO HearDNoLo ; ggf. weiter mit unterstem Datumsnibble CALL HearLos3 ;2sec Pause und dann von vorne GOTO HearDNoMe4 ;..................................................................... HearDNoLo CALL HearLos HearDNoLo4 SWAPF vDNoLo,W MOVWF vRech4 CALL PlayNib BTFSS GPIO,3 ;Geheimschalter überprüfen GOTO InterEnde ;.......hier gehts raus.....Ende des Abhörens.-------------------------------- CALL HearLos3 ;2sec Pause und dann von vorne GOTO HearDNoLo4 ;................................................................................. HearHigh CALL TonD CALL TonD CALL TonP return HearLow CALL TonA CALL TonA CALL TonP return ;.......................... HearLos CALL TonC ;Doppelbip zur Quittierung des Geheimschaltersignals CALL TonP CALL TonC HearLos2 BTFSS PIR1,TMR1IF GOTO HearLos2 ;erst mal 2Sec Pause (insgesamt 4sec Pause)zum Schalter loslassen Call ISR HearLos3 BTFSS PIR1,TMR1IF ; 2 Sec Pause GOTO HearLos3 Call ISR return ;.................................................................. PlayNib MOVLW 0x05 MOVWF vRech5 PlayNibNext DECFSZ vRech5,F GOTO NibSch GOTO PlayNibReady NibSch RLF vRech4,F BTFSS STATUS,C Goto HearNib5 CALL HearHigh GOTO PlayNibNext HearNib5 CALL HearLow GOTO PlayNibNext PlayNibReady BTFSS PIR1,TMR1IF GOTO PlayNibReady CALL ISR return ;............................. InterEnde clrf vIntFu clrf vIntOrd GOTO Maerchen ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;........................... ;RTC-Set-Programm................................... InterState4 CALL TonC ;Dauer-Bip-Serie zur Begrüßung bis Geheimschalter CALL TonP BTFSC PIR1,TMR1IF CALL ISR BTFSC GPIO,3 GOTO InterState4 ;;;GOTO StellWahl StellWahl CALL HearLos Abfrag4 CALL TonC CALL TonC Abfrag5 BTFSS PIR1,TMR1IF GOTO Abfrag6 CALL ISR GOTO Abfrag Abfrag6 BTFSC GPIO,3 GOTO Abfrag5 GOTO InterEnde ;nach mittlerem langem Ton(C)Geheimsch betätigen beendet das Interaktive Programm ohne etwas zu verändern Abfrag CALL TonD Abfrag2 BTFSS PIR1,TMR1IF GOTO Abfrag3 CALL ISR GOTO Abfrag7 Abfrag3 BTFSC GPIO,3 GOTO Abfrag2 GOTO Tim2 ;nach hohem Ton(D)Geheimsch betätigen dann geht es hier zum Uhrzeit resetten Abfrag7 CALL TonA Abfrag8 BTFSS PIR1,TMR1IF GOTO Abfrag9 CALL ISR GOTO Abfrag4 Abfrag9 BTFSC GPIO,3 GOTO Abfrag8 GOTO Dat2 ;nach tiefem Ton(A)Geheimsch betätigen dann geht es hier zum Datum korrigieren ;................................... Tim2 CALL HearLos ;Begrüßung Doppelbip-4sec Pause Tim12 CALL TonC CALL TonC CALL TonC Tim13 BTFSS PIR1,TMR1IF GOTO Tim14 CALL ISR GOTO Tim3 Tim14 BTFSC GPIO,3 GOTO Tim13 GOTO InterEnde ;nach langem mittleren Ton(C)Geheimsch betätigen beendet das Interaktive Programm ohne etwas zu verändern Tim3 CALL TonA Tim4 BTFSS PIR1,TMR1IF GOTO Tim5 CALL ISR GOTO Tim6 Tim5 BTFSC GPIO,3 GOTO Tim4 CLRF v2Sec MOVLW 0x1E MOVWF vMin MOVLW 0x09 MOVWF vHour GOTO InterEnde ;nach einfachem tiefen Ton(A)Geheimsch betätigen dann ist die Uhr auf 9Uhr 30 gestellt Tim6 CALL TonA CALL TonP CALL TonA Tim7 BTFSS PIR1,TMR1IF GOTO Tim8 CALL ISR GOTO Tim9 Tim8 BTFSC GPIO,3 GOTO Tim7 CLRF v2Sec MOVLW 0x1E MOVWF vMin MOVLW 0x11 MOVWF vHour GOTO InterEnde ;nach Doppel Ton(AA)Geheimsch betätigen dann ist die Uhr auf 17Uhr 30 gestellt Tim9 CALL TonA CALL TonP CALL TonA CALL TonP CALL TonA Tim10 BTFSS PIR1,TMR1IF GOTO Tim11 CALL ISR GOTO Tim12 ;und von vorne immer rund Tim11 BTFSC GPIO,3 GOTO Tim10 CLRF v2Sec MOVLW 0x1E MOVWF vMin MOVLW 0x17 MOVWF vHour GOTO InterEnde ;nach Tripel-Ton(AAA)Geheimsch betätigen dann ist die Uhr auf 23Uhr 30 gestellt ;.................................................. Dat2 CALL HearLos ;Datumseinstellungen.Was man nicht kann ist Montags den Wochentag ;zurücksetzen, oder Sonntags vor.Man kann auch nicht an Tagesdaten mit 8 ;Nullen oder Einsen den Tag zurück oder vorsetzen. Dann muß man eben einen Tag warten. ;da das Interface nur für Notfälle und Erstinbetriebnahme und gelegentliches Uhrstellen gedacht ist. ; Der Platz im Programmspeicher war ziemlich knapp. Dat12 CALL TonC CALL TonC CALL TonC Dat13 BTFSS PIR1,TMR1IF GOTO Dat14 CALL ISR GOTO Dat3 Dat14 BTFSC GPIO,3 GOTO Dat13 GOTO InterEnde ;nach langem mittleren Ton(C)Geheimsch betätigen beendet das Interaktive Programm ohne etwas zu verändern Dat3 CALL TonA Dat4 BTFSS PIR1,TMR1IF GOTO Dat5 CALL ISR GOTO Dat6 Dat5 BTFSC GPIO,3 GOTO Dat4 INCF vDOW,F GOTO InterEnde ;nach einfachem tiefen Ton(A)Geheimsch betätigen dann wird der Wochentag einen Tag weitergesetzt,jedoch nicht das Datum. Dat6 CALL TonA CALL TonP CALL TonD Dat7 BTFSS PIR1,TMR1IF GOTO Dat8 CALL ISR GOTO Dat9 Dat8 BTFSC GPIO,3 GOTO Dat7 DECF vDOW,F GOTO InterEnde ;nach Doppel Ton tief-hoch(AD)Geheimsch betätigen dann wird der Wochentag einen Tag zurückgesetzt,jedoch nicht das Datum Dat9 CALL TonA CALL TonP CALL TonD CALL TonP CALL TonA Dat10 BTFSS PIR1,TMR1IF GOTO Dat11 CALL ISR GOTO Dat15 Dat11 BTFSC GPIO,3 GOTO Dat10 INCF vDNoLo,F GOTO InterEnde ;nach Tripel-Tontief-hoch-tief (ADA)Geheimsch betätigen dann wird das Datum einen Tag weitergesetzt, ;jedoch nicht der Wochentag Dat15 CALL TonD CALL TonP CALL TonD CALL TonP CALL TonD Dat16 BTFSS PIR1,TMR1IF GOTO Dat17 CALL ISR GOTO Dat12 ;und von vorne immer rund Dat17 BTFSC GPIO,3 GOTO Dat16 DECF vDNoLo,F GOTO InterEnde ;nach Tripel-Ton hoch -hoch-hoch (DDD)Geheimsch betätigen dann wird das ;Datum einen Tag zurückgesetzt, jedoch nicht der Wochentag ;------------------------------------------------------------------- TonA MOVLW 0xB0 MOVWF vRech1 FlankeA NOP NOP NOP MOVLW 0x0E ;aeußere Zeit MOVWF vRech2 Zeitinnen MOVLW 0x12 ;innere Zeit MOVWF vRech3 Decinnen DECFSZ vRech3,F GOTO Decinnen CLRWDT Decaussen DECFSZ vRech2,F GOTO Zeitinnen MOVLW B'00000001' ;TON-Ausgangswahl für GPIO,0 XORWF GPIO,F ;in PortbRegister DECFSZ vRech1,F GOTO FlankeA RETURN TonC MOVLW 0xD1 ;Tondauer MOVWF vRech1 FlankeC NOP NOP NOP NOP NOP MOVLW 0x0D ;aeußere Zeit MOVWF vRech2 ZeitinnenC MOVLW 0x10 ;innere Zeit MOVWF vRech3 DecinnenC DECFSZ vRech3,F GOTO DecinnenC CLRWDT DecaussenC DECFSZ vRech2,F GOTO ZeitinnenC MOVLW B'00000001' ;TON-Ausgangswahl für GPio,0 XORWF GPIO,F ;in PortbRegister DECFSZ vRech1,F GOTO FlankeC RETURN TonD MOVLW 0xEB ;Tondauer MOVWF vRech1 FlankeD NOP MOVLW 0x0E ;aeußere Zeit MOVWF vRech2 ZeitinnenD MOVLW 0x0D ;innere Zeit MOVWF vRech3 DecinnenD DECFSZ vRech3,F GOTO DecinnenD CLRWDT DecaussenD DECFSZ vRech2,F GOTO ZeitinnenD MOVLW B'00000001' ;TON-Ausgangswahl für GPIO,0 XORWF GPIO,F ;in PortbRegister DECFSZ vRech1,F GOTO FlankeD RETURN TonP MOVLW 0xEB ;Tondauer (Tonlange Pause) MOVWF vRech1 FlankeP MOVLW 0x0E ;aeußere Zeit MOVWF vRech2 ZeitinnenP MOVLW 0x0D ;innere Zeit MOVWF vRech3 DecinnenP DECFSZ vRech3,F GOTO DecinnenP CLRWDT DecaussenP DECFSZ vRech2,F GOTO ZeitinnenP MOVLW B'00000000' ;TON-Ausgangswahl fürgarkein Port XORWF GPIO,F ;in PortbRegister DECFSZ vRech1,F GOTO FlankeP RETURN ;-------ENDE DES INTERAKTIVEN MODULS--YYYYYYYYYYYYY-------------ENDE DES INTERAKTIVEN MODULS--YYYYYYYYYYYYY------ ; -------ENDE DES INTERAKTIVEN MODULS--YYYYYYYYYYYYY-------------ENDE DES INTERAKTIVEN MODULS--YYYYYYYYYYYYY------ ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;VOREISTELLUNGEN ZUM START-----------;VOREISTELLUNGEN ZUM START-----------;VOREISTELLUNGEN ZUM START-----------;VOREISTELLUNGEN ZUM START----------- ;Einstellungen , die den Oszillator zum Schwingen bringen und Interrupts verhindern sollen Init clrf TMR0 ;???? clrf TMR1H ;???? ;;;CLRF TMR1L BSF STATUS,RP0 clrf PIE1 clrf ANSEL MOVLW B'101100' MOVWF TRISIO BCF STATUS,RP0 BSF GPIO,1 MOVLW 0x07 MOVWF CMCON BCF ADCON0,ADON MOVLW 0x0F MOVWF T1CON MOVLW B'01000000' MOVWF INTCON clrf PIR1 MOVLW 0x31 ;Pause bis der LP-Quarzoszillator sicher gut läuft und der MOVWF vRech3 ;Chip dessen Takt für den Timer verwendet. Start3 MOVLW 0xFF ;Habe erstaunlich lange Zeiten gemessen. Aber egal, da einmalig bei Inbetriebnahme. MOVWF vRech1 Start2 MOVLW 0xFF MOVWF vRech2 Start1 DECFSZ vRech2,F GOTO Start1 DECFSZ vRech1,F GOTO Start2 DECFSZ vRech3,F GOTO Start3 Priminit MovF vPrimCheck,W ; - überprüfen, ob das Gerät schon mal eingeschaltet wurde und nur ein SUBLW 0xA5 ; Störungsreset vorliegt. Es wäre blöd, wenn man nur mit der Faust auf BTFSC STATUS,Z ;die Kiste hauen muß, damit der Controller in seiner Fassung wackelt und GOTO Maerchen ;man per Reset wieder volles Guthaben kriegt. Eigentlich würde das Datum ins MOVLW 0xA5 ; EEProm gehören.Die Schreib/Lese-Routine dafür ist aber so umfangreich, dass ich aus MOVWF vPrimCheck ;Platzknappheit im Programmspeicher darauf verzichtet habe. Meine Notlösung:Wenn der Inhalt des Check-Registers nach der ;Störung noch stimmt, ist wahrscheinlich, dass auch das Datumsregister und die meisten anderen gehalten haben. ;Registereinstellungen bei Erstinbetriebnahme: MOVLW 0xFF ; - mit vollem Guthaben anfangen --naheliegend-- MOVWF vGutHi MOVLW 0x06 ; - Damit das Guthaben nicht gleich nach 10Minuten wieder leer ist, MOVWF vEntla ; weil Entla zufällig auf 250 oä steht. BSF vMuFu,1 ; - 1=Im Start- Augenblich ist gerade uhrzeitmäßig freigegeben - praktisch- BSF vZeitStatus,6 ; - GuthabenBit. Fehlt nur noch Sicherheitsbit vZeitstatus,7 um Glotze erfolgreich erst-einzuschalten ;Dazu Glotze einmal ausschalten(Hauptschalter oder Stecker). max 1Minute nötig. BCF vMuFu,3 ; - 1= Es sind gerade Ferien 0= Es ist grade Schulzeit. Wichtige Erst-Einstellung. !!!!!!!!!!!!!!!!! vor dem Brennen sinnvoll einstellen!!!!!!!!!!! ;Weil sonst bis zum Ende der nächsten Ferien frei ist. MOVLW 0x00 ;Start-Datum bzw,praktischerweise der Tag davor, da ja gleich 00Uhr Durchgang (oberes Byte) !!!!!!!!!!!!!!!!! vor dem Brennen sinnvoll einstellen!!!!!!!!!! MOVWF vDNoUp MOVLW 0xD1 ; Start-Datum unteres (LSB)-Byte !!!!!!!!!!!!!!!!! vor dem Brennen sinnvoll einstellen!!!!!!!!!! MOVWF vDNoLo MOVLW 0x05 ;Wochentag Start-Datum, bzw. eins davor. 0 gleich Montag 1=Dienstag 6=Sonntag !!!!!!!!!!!!!!!!! vor dem Brennen sinnvoll einstellen!!!!!!!!!! MOVWF vDOW MOVLW D'23' ;Uhrzeit ist in der Priminit nicht so wichtig, weil man die ja sowieso MOVWF vHour ; stellen muß, nur praktisch,wenn man gleich nach 2 Minuten den erforderlichen MOVLW D'58' ;OO-Uhr Durchlauf kriegt MOVWF vMin ; Das Gerät muß bei Inbetriebnahme einmal über 00Uhr laufen, um damit alle sonstigen Einstellungen herzustellen. GOTO Maerchen ;------------------------------------------------------------------------------------------------------------ ;.............................................................................................................. ;TABELLEN MIT DATUM VON FERIENBEGINN UND ENDE Bestandteil der Datumsbedingten täglichen Einstellungen ; es dürfen keine RETLw-Befehle angefügt oder gelöscht werden aber 7E-7E Hex kann durch Ferien bzw Schulbeginndaten ersetzt werden die in ;weniger ferner Zukunft liegen Also durch die Datums der ersten Ferientage an denen nämlich in den Ferienmodus geschaltet wird ; Das Datum wird berechnet als Nummer. Der erste Tag ist der 1.1.2007 also Nummer1 der 30.6.2009 ist ;dann Nummer 912 also Hex0390 Die Zahlen habe ich in Hex umgewandelt um die oberen beiden Hex ziffern in der Up-Tabelle ;einzutragen die unteren beiden in die LoTab Die obere und untere Hälfte einer Zahl müßen in derselben Zeilennnummer ;stehen man kann aber ein früheres Datum einfach oben auf die Tabellen schreiben die zeiliche Reihenfolge ist egal, da sowieso ;die ganze Tabelle gelesen wird.Die Eintragungen in der Tabelle erster Schultage nach Ferien sind daher auch unabhängig von den ;Feriendaten ansonsten gilt dafür dasselbe. Abgelaufene Daten können durch neue ersetzt werden. org 0x3AF FerTabLo MOVF vDatAd,W ADDWF PCL,F RETLW 0x7E ;Zeile 0 unbenutzt wird nicht abgefragt anno sonstwann RETLW 0x5A ;Zeile 1 ;Platz für 18 LoBytes von Ferienbeginntagen RETLW 0xAC ;Zeile 2 RETLW 0x09 RETLW 0x62 RETLW 0xB8 RETLW 0x1F RETLW 0x7C RETLW 0xD0 RETLW 0x39 RETLW 0x92 RETLW 0xF6 RETLW 0x41 RETLW 0x9E RETLW 0x0C ;Zeile 14 RETLW 0x7E RETLW 0x7E ;7E..Irgendwas muß ja drinstehen sonst stürzt es ab 0x7E7E liegt in ferner Zukunft RETLW 0x7E ;Zeile 17 ; Die 7E-s sind nur Platzhalter für echte Datums, die stattdessen eingesetzt werden können FerTabUp MOVF vDatAd,W ADDWF PCL,F Retlw 0x7E ;erste Adresse nicht benutzbar nur Redundanz RETLW 0x00 ;Zeile1 ;Platz für 18 UpBytes von Ferienbeginntagen RETLW 0x00 ;Zeile2 RETLW 0x01 RETLW 0x01 RETLW 0x01 RETLW 0x02 RETLW 0x02 RETLW 0x02 RETLW 0x03 RETLW 0x03 RETLW 0x03 RETLW 0x04 RETLW 0x04 RETLW 0x05 ;Zeile14 RETLW 0x7E RETLW 0x7E RETLW 0x7E ;Zeile 17 SchTabLo MOVF vDatAd,W ADDWF PCL,F RETLW 0x7E ;anno sonstwann Zeile 0 nicht benutzbar RETLW 0x6A ;Zeile 1 ;Platz für 18 Low-Bytes von Schulbeginntagen RETLW 0xDA RETLW 0x19 RETLW 0x75 RETLW 0xC8 RETLW 0x4D RETLW 0x8C RETLW 0xE2 RETLW 0x49 retlw 0xC0 ;Z10 RETLW 0x06 RETLW 0x4F RETLW 0xAE RETLW 0x3A ;Z14 RETLW 0x7E;7E..Irgendwas muß ja drinstehen sonst stürzt es ab 0x7E7E liegt in ferner Zukunft RETLW 0x7E ; Die 7E-s sind nur Platzhalter für echte Datums, die stattdessen eingesetzt werden können RETLW 0x7E ;Zeile 17 SchTabUp MOVF vDatAd,W ADDWF PCL,F RETLW 0x7E ; Hier nichts reinschreiben nur Redundanz RETLW 0x00;Platz für 18 Low-Bytes von Schulbeginntagen RETLW 0x00 RETLW 0x01 RETLW 0x01 RETLW 0x01 RETLW 0x02 RETLW 0x02 RETLW 0x02 RETLW 0x03 retlw 0x03 ;Z10 RETLW 0x04 RETLW 0x04 RETLW 0x04 RETLW 0x05 RETLW 0x7E RETLW 0x7E ;7E..Irgendwas muß ja drinstehen sonst stürzt es ab 0x7E7E liegt in ferner Zukunft RETLW 0x7E ;Zeile 17 ; Die 7E-s sind nur Platzhalter für echte Datums, die stattdessen eingesetzt werden können. END ;AUFGETRETENE PROBLEME ------------------AUFGETRETENE PROBLEME ------------------AUFGETRETENE PROBLEME ------------------ ;------AUFGETRETENE PROBLEME ------------------AUFGETRETENE PROBLEME ------------------AUFGETRETENE PROBLEME ------------------ ;------------AUFGETRETENE PROBLEME ------------------AUFGETRETENE PROBLEME ------------------AUFGETRETENE PROBLEME ------------------ ;1.: Die Ist-Zustands erfassung am 15V - Eingang funktioniert nur wenn wirklich ungefähr 15V/0V anliegen. Bei einem Gerät mit einer 27 V Betriebsspannung ;war eine zusätzliche 13V-Zener Diode erforderlich, um die Spannung auf 15V zu reduzieren, zumal die 27V im Stdby Zustand nicht auf 0V runtergehen, ;Dadurch konnte die Software im Standby-Zustand das Guthaben nicht aufladen, sondern nur bei ausgeschaltetem Hauptschalter. ;2.Bei dem Fernseher wurde die Betriebsspannung selbst durch den Timer nach Standby ausgeschaltet.Nicht nur das Bild. ; Dadurch trat eine bisher unbekannte Rückkopplung auf, weil die Betriebsspannung ja eine Größe ist, die vom Timer ausgewertet wird. ;Versuchte man im gesperrten Zustand einzuschalten, so schaltete sich selbiges Gerät im 2-Sekunden Rhythmus ein und aus, was auf Dauer wohl nicht gut ist ;für die Hardware. Grund: In ausgeschaltetem Zustand wird standardmäßig auch die Ausgangssperrung aufgehoben, da sie nun ja nicht mehr vonnöten und andere ;Features behindern könnte (s.u.) Der Microcontroller des Fernsehers (zum Glück gibt es nicht bei allen Geräten solche Probleme) ;will aber weiter einschalten, und gibt erst nach einiger Zeit (5min oder so) auf. ;also schaltet er ein und der TV- timer wieder aus weil ja Sperrzeit ist, usw. Das absichtliche Ausgangstoggeln war sowieso schon deaktiviert. Lösung: den 2. Befehl ; vom Ausgangsschaltmodul (goto freigeben) in NOP umwandeln Das hat allerdings zur Folge , dass garnichts mehr geht, wenn man nach Erschöpfung des Zeit- ;Guthabens wieder einschalten will, weil man an dem entscheidenden BSF-Befehl jetzt garnicht mehr vorbeikommt. ; Also unter GutInc noch BSF vZeitStatus,6 einfügen Solange aus ist,ist das Korrekte Guthabenbit ja egal und beim Einschalten wird es dann ggf sofort korrigiert. ;So bekommt man den Fernseher eingeschaltet, wenn man wieder Guthaben hat. Ich hoffe dass es damit jetzt bei allen Geräten geht. ;Bei mir jedenfalls läufts. Kleine Schönheitskorrektur beim power-selbst schalten: " BTFSS vZeitStatus,5" und "GOTO AusgDone" ;unter sperrren im Ausgangsmodul einsetzen.Vor " BCF vZeitStatus,7 " Das erspart einem ein überflüssiges Zurücksetzen des Sicherheitsbits mittels Ausschalterbetätigung ; am Morgen, wenn der Fernseher zur gesperrten Zeit gar nicht eingeschaltet war, aber über Nacht im Standby. ;3. Die Inbetriebnahme Features sollte ich mal etwas bequemer gestalten. So muß man ja immer von Mitternacht bis zur nächsten Ein-Zeit ;(bei mir normalerweise 5 Stunden,warten, bevor man erst mal fernsehen kann. Nach Inbetriebnahme ist das gut, um Mißbrauch des Stell-Menus zu verhindern, ; aber bei Inbetriebnahme lästig. Allerdings habe ich den PIC randvoll programmiert. Entweder muß man etwas anderes streichen oder den verwandten PIC-Typ ;mit 2k Befehlsspeicherzeilen verwenden. ;4.die Ersteinstellungen könnten bequem nach oben im Skript verlinkt werden mit mehr Speicherplatz ;5. die Einstellungen die ich je nach Einsatzfall umprogrammieren muss könnten im Einstellungsteil des Skripts verfügbar gemacht werden. ;6. sämtliche Features könnten einen Enable-Link im Einstellungsteil zum vertragen. Mag man den Quatsch mit den Lottotagen nicht:Ein Bit ändern und Ruhe. ;7.Es sollte einen Festguthaben-Modus geben, damit man genau mit der Fernsehzeit die man heute hat rechnen zu kann, ohne sich intellektuell anstrengen zu müssen. ;8.Die Ausschaltuhrzeiten sollten genauer festlegbar sein, nicht nur Stunden- sondern mindestens viertelstundenweise. ;9. Es könnte eine Version mit offen sichtbarem Punktmatrix-Textdisplay geben, damit der Benutzer immer genau weiß, woran er ist. ;--falls das gewünscht ist-- Die Dinger hab ich mir sowieso schon zu "Studienzwecken" bei ebay erramscht. ;10. All das mach ich aber nur bei Interesse.