;RWUE9 - STEUERUNG FÜR REGENWASSER-NUTZUNGSANLAGE ;MIT MOTORVENTIL UND RS232-SCHNITTSTELLE ;STAND: 23.3.96 ;AM 1.5.96 NACHGERÜSTET FÜR ZYSTERNEN-EINSPEISUNG ;AM 5.8.97 MOTORLAUFZEIT VON 2 AUF 3 MINUTEN VERLÄNGERT ;AM 7.7.98 MENÜ-ANZAHL VON 9 AUF 8 VERINGERT / DAZU IN ZEILE 1143 "9" EINGETRAGEN LIST P=16C57, R=HEX INDAD = 00 PCOUNT = 02 STATUS = 03 FSR = 04 PA = 05 PB = 06 PC = 07 EE = 08 ;OPCODE, ADRESSE EEPROM 3. 30-TZ EZ = 09 ;SCHLEIFENZÄHLER EEPROM 4. 30-TZ TAG1 = 0A ;1. 30-TAGEZÄHLER PEGL = 0B ;DIREKT VOM AD-WANDLER PEGH = 0C ; BYTE1 = 0D BYTE2 = 0E ;FÜR VERZ, BINBCD BYTE3 = 0F ND = 10 ;NULLPUNKT DIFFERENZ ,FILE 1: RS232-SPEICHER UT = 11 ;UMSCHALTSCHWELLE TRINKW. ,FILE 1: RS232-SPEICHER TR = 12 ;TROCKENLAUFSCHUTZ TZ = 13 ;TAGEZÄHLER AUS/EIN/ZYSTERNE AM = 14 ;ANZEIGEMODE ZÄ1 = 15 ; ,FILE 1: MOTORVENTIL-SPEICHER ZÄ2 = 16 ; ,FILE 1: MOTORVENTIL-SPEICHER TAG2 = 17 ;2. 30-TAGEZÄHLER LBYTE = 18 ;HIERIN BEFINFET SICH DER BINÄRE ANZEIGEWERT HBYTE = 19 ; LO = 1A ;LOGIKHILFSREGISRER Z0 = 1B ;ZIFFER-HILFSREGISTER Z1 = 1C ;ZIFFER 1 = HUNDERTER Z2 = 1D ;ZIFFER 2 = ZEHNER Z3 = 1E ;ZIFFER 3 = EINER Z4 = 1F ;ZIFFER 4 = ZEICHEN PAS = B'00000100' ;TRISTATEREGISTERWERTE, 1=EINGANG, 0=AUSG. PBS = B'00010001' PCS = B'11110000' ORG 7FF GOTO INIT ;NACH EINEM RESET STEHEN DIE STATUSBIT'S ;BIT 5 UND BIT 6 AUF NULL ORG 0 ;------------------------------------------------------------------------------ ;DIESE ADRESSEN LIEGEN IN DER 2. SEITENHÄLFTE ZIFOUT GOTO ZIFOUT_ LOGIK GOTO LOGIK_ TAGZÄ GOTO TAGZÄ_ ;------------------------------------------------------------------------------ KOMMA ;SETZT DAS KOMMA IN DER ANZEIGE AN DIE ;STELLE, DIE IM FSR ANGEGEBEN IST BTFSS Z4,4 ;BP TESTEN BSF INDAD,4 BTFSC Z4,4 ;BP TESTEN BCF INDAD,4 RETLW 0 ;------------------------------------------------------------------------------ ;VERZÖGERUNG VE10 CLRWDT MOVLW 0D ;10ms MOVWF BYTE1 ;LADE F MIT W LP MOVLW 0FF ; MOVWF BYTE2 ;LADE F MIT 255 L DECFSZ BYTE2,F ;DEC F UND ÜBERSPRINGE NÄCHSTEN ;BEFEHL WENN ERGEBNIS = 0 GOTO L ;ZURÜCK WENN F <> 0 DECFSZ BYTE1,F ;... GOTO LP ;WIEDERHOLE INNERE SCHLEIFE WENN F <> 0 RETLW 0 ;RETURN ZUM HAUPTPROGRAMM ;------------------------------------------------------------------------------ BINBCD ;WANDELT DIE WERTE IN HBYTE UND LBYTE IN ;BCD-CODE UM UND LEGT SIE IN BYTE1, BYTE2 ;UND BYTE3 AB MOVLW B'00000011' ANDWF HBYTE,F ;HBYTE < 4 MOVF LBYTE,W MOVWF Z0 ;WERT ZWISCHENSPEICHERN CLRF BYTE2 MOVF HBYTE,W CALL BI1 MOVWF BYTE1 MOVF HBYTE,W CALL BI2 ADDWF LBYTE,F ;DER REST AUS HBYTE WIRD AUFADDIERT BTFSS STATUS,0 GOTO BI3 ;WENN KEIN ÜBERTRAG IST INCF BYTE1,F MOVLW D'156' ;-100+256 ADDWF LBYTE,F BI3 MOVLW D'100' ;LBYTE UMSETZUNG BI31 INCF BYTE1,F SUBWF LBYTE,F BTFSC STATUS,0 GOTO BI31 ;ZURÜCK WENN KEIN CARRY DECF BYTE1,F ;WENN CARRY: ZÄHLER UND LBYTE KORRIGIEREN ADDWF LBYTE,F ; MOVLW D'10' BI4 INCF BYTE2,F SUBWF LBYTE,F BTFSC STATUS,0 GOTO BI4 DECF BYTE2,F ADDWF LBYTE,F MOVF LBYTE,W MOVWF BYTE3 MOVF Z0,W MOVWF LBYTE RETLW 0 BI1 ADDWF PCOUNT,F ;HUNDERTER-LISTE RETLW 0 RETLW 2 RETLW 5 RETLW 7 BI2 ADDWF PCOUNT,F ;REST-LISTE RETLW 0 RETLW D'56' RETLW D'12' RETLW D'68' ;------------------------------------------------------------------------------ COD ;CODIERT WERTE UND LEGT SIE IN DEN ;ZIFFERREGISTERN AB ;W MUSS DEN EINZUSCHREIBENDEN WERT ENTHALTEN ;FSR MUSS AUF DAS ZIELREGISTER GERICHTET SEIN CALL CO2 ;UMCODIEREN BTFSS Z4,4 ;TEST BP - OB z.Z. DAS DISPLAY INVERTIERT IST MOVWF INDAD ;WENN NICHT, DANN EINSCHREIBEN BTFSS Z4,4 RETLW 0 MOVWF INDAD ;HIER WIRD ERST EINGESCHR., DANN INVERT. COMF INDAD,F RETLW 0 CO2 ADDWF PCOUNT,F RETLW B'11101110' ;7-SEGMENT "0" ( CODE = e d c dp b a f g ) RETLW B'00101000' ;7-SEGMENT "1" RETLW B'11001101' ;7-SEGMENT "2" RETLW B'01101101' ;7-SEGMENT "3" RETLW B'00101011' ;7-SEGMENT "4" RETLW B'01100111' ;7-SEGMENT "5" RETLW B'11100111' ;7-SEGMENT "6" RETLW B'00101100' ;7-SEGMENT "7" RETLW B'11101111' ;7-SEGMENT "8" RETLW B'01101111' ;7-SEGMENT "9" RETLW B'10101111' ;7-SEGMENT "A" RETLW B'11100011' ;7-SEGMENT "b" RETLW B'11000110' ;7-SEGMENT "C" RETLW B'11101001' ;7-SEGMENT "d" RETLW B'11000111' ;7-SEGMENT "E" RETLW B'10000111' ;7-SEGMENT "F" RETLW B'00000100' ;7-SEGMENT "~" 16 RETLW B'00000001' ;7-SEGMENT "-" 17 RETLW B'01000000' ;7-SEGMENT "_" 18 RETLW B'00000000' ;7-SEGMENT " " 19 SPACE ;------------------------------------------------------------------------------ ZEROSET ;ZIEHT DEN O-PUNKT-WERT VOM L- U. HBYTE AB ;SETZT BEI ERGEBNIS < 0 ERGEBNIS = 0 MOVF ND,W SUBWF LBYTE,F BTFSC STATUS,0 ;WENN CARRY RETLW 0 MOVLW D'1' SUBWF HBYTE,F BTFSC STATUS,0 ;WENN CARRY / CARRY BEIM HBYTE = WERT < 0 RETLW 0 CLRF LBYTE CLRF HBYTE RETLW 0 ;------------------------------------------------------------------------------ ANZMO1 ;LIEST DAS AM-CONFIG-REGISTER UND RECHNET ;DEN WERT IN HBYTE UND LBYTE ENTSPRECHEND ;DES ANGEGEBENEN TANKS UM. MOVF AM,W ADDWF PCOUNT,F GOTO ANZ0 GOTO ANZ1 GOTO ANZ2 GOTO ANZ3 GOTO ANZ4 GOTO ANZ5 ANZ0 ;cm RETLW 0 ANZ1 ;1,0 BSF STATUS,6 ;SEITE 2 GOTO ANZ1L ANZ2 ;1,5 BSF STATUS,6 ;SEITE 2 GOTO ANZ2L ANZ3 ;2,0 BSF STATUS,6 ;SEITE 2 GOTO ANZ3L ANZ4 ;2,5 MOVLW B'01100000' ;SEITE 3 MOVWF STATUS GOTO ANZ4L ANZ5 ; MOVLW B'01100000' ;SEITE 3 MOVWF STATUS GOTO ANZ5L ;------------------------------------------------------------------------------ ANZMO2 ;SETZT DAS KOMMA IN DER ANZEIGE MOVF AM,W CALL ANZMO MOVWF FSR ;ADRESSE VON ZIFFERREGISTER LADEN CALL KOMMA RETLW 0 ANZMO ADDWF PCOUNT,F RETLW Z1 ;cm RETLW Z1 ;1,0 RETLW Z2 RETLW Z2 ;HIER MUSS EINGETRAGEN WERDEN, WO DAS RETLW Z2 ;KOMMA HIN SOLL RETLW Z1 ;------------------------------------------------------------------------------ ADIN ;LIEST DEN AD-WANDLER AUS ;HBYTE + LBYTE ENTHALTEN AM ENDE DEN WERT ;VOM AD-WANDLER GETEILT DURCH 3,28 ;DAS EINLESEN CLRF PEGH BCF PB,1 ;CS AUF "L" ADI1 BTFSS PB,0 ;DOUT GOTO ADI1 MOVLW D'4' MOVWF ZÄ1 ADI2 RLF PEGH,F ;4 X H-BYTE IN BSF PB,2 ;SCLK BCF PB,2 BCF PEGH,0 BTFSC PB,0 BSF PEGH,0 DECFSZ ZÄ1,F GOTO ADI2 MOVLW D'8' MOVWF ZÄ1 ADI3 RLF PEGL,F ;8 X L-BYTE IN BSF PB,2 BCF PB,2 ;FALLENDE FLANKE VOM TAKT BCF PEGL,0 BTFSC PB,0 BSF PEGL,0 DECFSZ ZÄ1,F GOTO ADI3 BSF PB,1 ;CS AUF "H" ;DIE RECHNUNG: / 3,28 MOVF PEGH,W ;PEGH CALL ADL3H MOVWF HBYTE MOVF PEGH,W CALL ADL3L MOVWF LBYTE SWAPF PEGL,W ;PEGL-MSB ANDLW B'00001111' CALL ADL2L ADDWF LBYTE,F BTFSC STATUS,0 ;CARRY INCF HBYTE,F MOVF PEGL,W ;PEGL-LSB ANDLW B'00001111' CALL ADL1L ADDWF LBYTE,F BTFSC STATUS,0 ;CARRY INCF HBYTE,F RETLW 0 ADL3H ADDWF PCOUNT,F ;LISTE FÜR PEGH -> HBYTE RETLW D'0' RETLW D'0' RETLW D'0' RETLW D'0' RETLW D'1' RETLW D'1' RETLW D'1' RETLW D'2' RETLW D'2' RETLW D'2' RETLW D'3' RETLW D'3' RETLW D'3' RETLW D'3' RETLW D'4' RETLW D'4' ADL3L ADDWF PCOUNT,F ;LISTE FÜR PEGH -> LBYTE RETLW D'0' RETLW D'78' RETLW D'156' RETLW D'234' RETLW D'56' RETLW D'134' RETLW D'212' RETLW D'34' RETLW D'112' RETLW D'190' RETLW D'12' RETLW D'91' RETLW D'169' RETLW D'247' RETLW D'69' RETLW D'147' ADL2L ADDWF PCOUNT,F ;LISTE FÜR PEGL-MSB -> LBYTE RETLW D'0' RETLW D'5' RETLW D'10' RETLW D'15' RETLW D'20' RETLW D'24' RETLW D'29' RETLW D'34' RETLW D'39' RETLW D'44' RETLW D'49' RETLW D'54' RETLW D'59' RETLW D'63' RETLW D'68' RETLW D'73' ADL1L ADDWF PCOUNT,F ;LISTE FÜR PEGL-LSB -> LBYTE RETLW D'0' RETLW D'0' RETLW D'1' RETLW D'1' RETLW D'1' RETLW D'2' RETLW D'2' RETLW D'2' RETLW D'2' RETLW D'3' RETLW D'3' RETLW D'3' RETLW D'4' RETLW D'4' RETLW D'4' RETLW D'4' ;<- EIGENTLICH 5 ABER DANN SPRINGT DIE ANZ. ;------------------------------------------------------------------------------ ORG 100 ;2. SEITENHÄLFTE ;------------------------------------------------------------------------------ TAGZÄ_ ;30-TAGEZÄHLER, SCHALTET DAS MOTORVENTIL ;AUF TRINKWASSER WENN 30 TAGE UM SIND. ;DIE UMSCHALTUNG UND DER ZÄHLER WIRD ;ZURÜCKGESETZT WENN DER TRINKWASSERBEHÄLTER ;EIN MAL VOLSTÄNDIG GELEERT WURDE BTFSS Z4,4 ;TEST BP - OB z.Z DAS DISPLAY INVERTIERT IST RETLW 0 INCFSZ TAG1,F RETLW 0 INCFSZ TAG2,F RETLW 0 INCFSZ EE,F RETLW 0 INCF EZ,F MOVLW B'11111000' ANDWF EZ,W BTFSC STATUS,2 ;WENN NULL-FLÄG NICHT GESETZT RETLW 0 ;RET. WENN EZ NOCH < 8 CLRF TAG1 CLRF TAG2 CLRF EE CLRF EZ BTFSC LO,5 ;WENN NICHT EINGESCHALTET BSF LO,4 RETLW 0 ;------------------------------------------------------------------------------ ZIFOUT_ ;GIBT DIE ZIFFERREGISTER SERIEL AN PA AUS ;UND COMPLEMENTIERT SIE DANACH MOVLW Z1 MOVWF FSR ;ADRESSE VON ZIFFERREGISTER 1 LADEN ZIF0 MOVLW 8 MOVWF ZÄ2 ;BITZÄHLER LADEN ZIF1 BCF PA,0 ;TAKT AUF "L" BTFSS INDAD,7 ;BIT LESEN UND AUSGEBEN BCF PA,1 ; BTFSC INDAD,7 ; BSF PA,1 ; BSF PA,0 ;TAKT AUF "H" RLF INDAD,F DECFSZ ZÄ2,F GOTO ZIF1 RLF INDAD,F ;NOCH EINMAL FÜR DAS CARRYBIT INCF FSR,F MOVF FSR,W ANDLW B'00011111' BTFSS STATUS,2 ;ENDE WENN ZERO ERREICHT GOTO ZIF0 ;INVERTIEREN ALLER ZIFFERREGISTER MOVLW Z1 MOVWF FSR ;ADRESSE VON ZIFFERREGISTER 1 LADEN ZIF2 COMF INDAD,F INCF FSR,F MOVF FSR,W ANDLW B'00011111' BTFSS STATUS,2 ;ENDE WENN ZERO ERREICHT GOTO ZIF2 CLRF FSR ;BYTE 5 LÖSCHEN RETLW 0 ;------------------------------------------------------------------------------ LOGIK_ ;VERKNÜPFT ALLE EIN- UND AUSGÄNGE ;SETZT ENTSPRECHENDE ZEICHEN IM DISPLAY ;LO,0 -> TROCKENLAUFSCHUTZ 1 = AKTIV ;WIRD VOM PEGELSTAB GESCHALTET ;LO,1 -> TR.W.NACHSPEISUNG 1 = AKTIV ;WIRD VOM PEGELSTAB GESCHALTET ;ODER IM ZYST.MODE VON SCHALTSCHWELLE ;LO,2 -> SOLLSTELLUNG FÜR MOTORVENTIL ;1 = AUF TRINKWASSER ;WIRD VON DER SCHALTSCHWELLE GESTEUERT ;LO,4 = 1 SETZT LO,2 AUF JEDEN FALL AUF 1 ;LO,3 -> TOGGELBIT TROCKENL.-ABSCHALTSCHWELLE ;LO,4 -> 30-TAGEZÄHLER 1 = WIEDER LEERMACHEN ;WIRD VOM PEGELSTAB PC,6 AUSGESCHALTET ;UND VOM ZÄHLER EINGESCHALTET ;LO,5 -> 30-TAGEZÄHLER 0 = ABGESCHALTET ;WIRD VON ALS CONFIG-REGISTER VON EEIN GELADEN ;LO,6 -> ISTSTELLUNG MOTORVENTIL ;LO,7 -> 1 = MOTORVENTIL HAT DEFINIERTE ;STELLUNG ( 0 = STEUERUNG GERADE EINGESCHALTET) MOVLW PAS TRIS PA MOVLW PBS ;TRISTATE ZUR SICHERHEIT WIEDERHOLEN TRIS PB MOVLW PCS TRIS PC CLRF Z0 BTFSC TZ,2 ;ABZWEIG FÜR ZYSTERNENNACHSPEISUNG GOTO LO2 ;PEGELSTAB EINLESEN BTFSS PC,5 BCF LO,1 BTFSS PC,4 BSF LO,1 BTFSS PC,7 BCF LO,0 BTFSS PC,6 BSF LO,0 BTFSS PC,6 BCF LO,4 ;HIER 30-TAGE-PROGRAMM-ZURÜCKGESETZT ;TRINKWASSERZULAUF-TOGGELBIT-AUSWERTUNG LO0 BTFSS LO,1 GOTO LO1 BTFSC LO,4 ;WENN 30-TAGE FLAG AUSGESCHALTET GOTO LO1 BCF PC,1 ;TRINKWASSER AUF BSF Z0,6 ;"_" EINGESCHALTET GOTO LO2 LO1 BTFSS LO,1 BSF PC,1 ;TRINKWASSER ZU LO2 MOVF HBYTE,F ;HBYTE-NULLTEST BTFSC STATUS,2 GOTO LO3A BCF LO,3 ;TOGGELBIT TR.LAUF.ABSCH.SCHW. RESET BCF LO,2 ;TOGGELBIT MOTORVENTIL AUF REGENWASSER GOTO LO3 ;WENN > 256 cm ;TRINKWASSER-ANSAUG-TOGGELBIT EINSTELLEN (LO,2) LO3A MOVLW D'1' ;DIESER WERT BESTIMMT DIE -HYSTERESE SUBWF UT,W SUBWF LBYTE,W BTFSS STATUS,0 ;WENN INHALT > SCHALTSCHWELLE BSF LO,2 ;TOGGELBIT GESETZT MOVLW D'1' ;DIESER WERT BESTIMMT DIE +HYSTERESE ADDWF UT,W SUBWF LBYTE,W BTFSC STATUS,0 ;WENN INHALT < SCHALTSCHWELLE BCF LO,2 ;TOGGELBIT RÜCKGESETZT ;TROCKENLAUF-TOGGELBIT EINSTELLEN MOVLW D'1' ;DIESER WERT BESTIMMT DIE -HYSTERESE SUBWF TR,W SUBWF LBYTE,W BTFSS STATUS,0 ;WENN INHALT > SCHALTSCHWELLE BSF LO,3 ;TOGGELBIT GESETZT MOVLW D'1' ;DIESER WERT BESTIMMT DIE +HYSTERESE ADDWF TR,W SUBWF LBYTE,W BTFSC STATUS,0 ;WENN INHALT < SCHALTSCHWELLE BCF LO,3 ;TOGGELBIT RÜCKGESETZT LO3 BTFSC TZ,2 ;ABZWEIG FÜR ZYSTERNENNACHSPEISUNG GOTO LOZ BTFSS LO,2 ;30-TAGE-ZÄHLER-RESET WENN AUF- GOTO LO3B ;TRINKWASSER GESCHALTET IST CLRF TAG1 CLRF TAG2 CLRF EE CLRF EZ LO3B BTFSC LO,4 ;30-TAGE-PROGRAMM AUSWERTUNG BSF LO,2 ;NACH DEM EINSCHALTEN DER STEUERUNG DEFINIERTE ;STELLUNG FÜR MOTORVENTIL HERSTELLEN BTFSC LO,7 GOTO LO4G ;WEMN GESETZT = ES IST NICHT DIE ERSTE RUNDE BTFSS LO,2 GOTO LO4H BCF LO,6 ;DAS SCHLEPP-BIT IN GEGENSÄTZLICHE POSITION GOTO LO4G LO4H BSF LO,6 ;DAS SCHLEPP-BIT IN GEGENSÄTZLICHE POSITION LO4G BSF LO,7 ;FLAG SETZEN FÜR: ERSTE RUNDE GEWESEN ;VERGLEICH: MOTORVENTIL IST- UND SOLLSTELLUNG BTFSS PC,0 GOTO LO4A ;WENN MOTORVENTIL GERADE LÄUFT BTFSS PC,2 GOTO LO4A ;WENN MOTORVENTIL GERADE LÄUFT BTFSS LO,2 GOTO LO4B BTFSS LO,6 GOTO LO4B GOTO LO4F ;WENN SOLL- UND ISTWERT AUF 1 LO4B BTFSC LO,2 GOTO LO4C BTFSC LO,6 GOTO LO4C GOTO LO4F ;WENN SOLL- UND ISTWERT AUF 0 ;TIMER LADEN LO4C BSF FSR,5 ;REGISTERBANK 1 CLRF ZÄ1 ;256 ; MOVLW D'48' ;48x256 = TIMER AUF 2min.(BEI 100Hz) MOVLW D'72' ;72x256 = TIMER AUF 3min.(BEI 100Hz) ge„ndert am 5.8.97 MOVWF ZÄ2 BCF FSR,5 ;REGISTERBANK 0 BTFSS LO,2 ;AB HIER WIRD NACHGESTELLT GOTO LO4D BCF PC,0 ;MOTOR AN BSF LO,6 ;ISTWERT NACHZIEHEN GOTO LO4A LO4D BCF PC,2 ;MOTOR AN BCF LO,6 ;ISTWERT NACHZIEHEN ;TIMER DECREMENTIEREN LO4A BSF FSR,5 ;REGISTERBANK 1 DECFSZ ZÄ1,F GOTO LO4E DECFSZ ZÄ2,F GOTO LO4E BSF PC,0 ;MOTOR AUS BSF PC,2 ;MOTOR AUS LO4E BCF FSR,5 ;REGISTERBANK 0 LO4F BTFSC LO,2 ; BSF Z0,2 ;"~" EINGESCHALTET ;RELAIS ANGEZOGEN WENN TOGGELBIT GESETZT LO5 BTFSC LO,3 ;TOGGELBIT TROCKENL.-ABSCHALTSCHWELLE GOTO LO8 LO6 BTFSC LO,0 ;SPEICHER FÜR PEGELSTABZUSTAND (1=TROCKEN) GOTO LO8 LO7 BCF PA,3 ;RELAIS ABGEFALLEN PUMPENSTROM MÖGLICH GOTO LO9 LO8 BSF Z0,0 ;"-" EINGESCHALTET BSF PA,3 ;RELAIS ANGEZOGEN PUMPENSTROM NICHT MÖGLICH ;ZEICHEN INS AUSGABEREGISTER EINSCHREIBEN LO9 BTFSC Z4,4 ;BP TESTEN COMF Z0,F MOVF Z0,W MOVWF Z4 RETLW 0 LOZ BTFSC LO,2 ;TOGGELBIT TRINKW.-NACHSPEISUNG (FÜR ZYSTERNE) BSF Z0,6 ;"_" EINGESCHALTET BTFSC LO,2 BCF PC,1 ;TRINKWASSER AUF BTFSS LO,2 BSF PC,1 ;TRINKWASSER ZU LOZY BTFSC LO,3 ;TOGGELBIT TROCKENL.-ABSCHALTSCHWELLE GOTO LO8 GOTO LO7 ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ INIT ;PROGRAMM-ANFANG CLRF D'1' ;CLR RTCC MOVLW B'00001010' ;TEILER -> WDT :4 = MIN 36ms OPTION CLRWDT MOVLW D'8' ;ALLE REGISTER LÖSCHEN MOVWF FSR INI1 CLRF INDAD INCF FSR,F MOVF FSR,W ANDLW B'00011111' BTFSS STATUS,2 GOTO INI1 CLRF ND ;FILE 10 AUF BANK 1 ! CLRF UT ;FILE 11 AUF BANK 1 ! CLRF FSR ;WIEDER AUF REGISTERBANK 0 ZURÜCKSCHALTEN MOVLW B'00000000' ;PORT A AUF "L" MOVWF PA MOVLW B'00000010' ;CS VON AD-WANDLER AUF "H" MOVWF PB MOVLW B'00000111' ;AUSGÄNGE AUF "H" ( = AUS ) MOVWF PC MOVLW B'01100010' ;LOGIK-HILFSREGISTER ( TOGGEL ) MOVWF LO ;BIT 1 AUF "H" = TRINKWASSER AN ;BIT 5 AUF "H" = 30-TAGE-ZÄHLER EIN ;BIT 6 AUF "H" = ISTWERT MOTORVENTIL MOVLW PAS TRIS PA MOVLW PBS TRIS PB MOVLW PCS TRIS PC BTFSS PA,2 GOTO ADJ ;ABZWEIG ZUM KALIBRIERUNGSPROGRAMM "ADJ" CALL ZIFOUT ;ANZEIGE LÖSCHEN BSF STATUS,6 ;SEITE 2 CALL EEIN ;CONFIG-REGISTER LADEN CLRF STATUS ;SEITE 0 BTFSC TZ,0 ;1 = AUS, 2 = AN, 3 = ZYSTERNE BCF LO,5 ;WENN BIT1 = NULL: 30-TAGEZÄHLER ABGESCHALTET MOVLW D'3' SUBWF TZ,W BTFSS STATUS,2 ;WENN "3" ( = ZYSTERNENNACHSPEISUNG ) GOTO INI3 CLRF TZ BSF TZ,2 ;1 = AUS, 2 = AN, 4!! = ZYSTERNE INI3 MOVLW D'200' ;2s VERZÖGERUNG, DAMIT DIE PUMPE, WENN MOVWF ZÄ1 ;TROCKENLAUFS. IST, NICHT ANLÄUFT UND SOFORT INI2 CALL VE10 ;(ZUM ZEITPUNKT DER HÖCHSTEN STROMAUFNAHME) DECFSZ ZÄ1,F ;WIEDER ABGESCHALTET WIRD. GOTO INI2 ;------------------------------------------------------------------------------ HAUPT CALL ADIN ;ADWANDLER LESEN CALL ZEROSET ;0-PUNKT CALL LOGIK ;ALLE EIN- UND AUSGÄNGE VERKNÜPFEN CLRF STATUS ;SEITE 0 WENN VON LO-ZYSTERNE ZURÜCK GESPRUNGEN WIRD BSF STATUS,6 ;SEITE 2 CALL RS232 ;AUSGABE DER ANZEIGEWERTE ÜBER RS232 CLRF STATUS ;SEITE 0 CALL ANZMO1 ;cm / qm CLRF STATUS ;SEITE 0 CALL BINBCD ;BINÄR-BCD-WANDLUNG MOVLW Z1 MOVWF FSR ;EINSTELLUNG FÜR ZIEL DER 7-SEGMENTCODIERUNG MOVF BYTE1,W CALL COD ;7-SEGMENTCODIERUNG INCF FSR,F MOVF BYTE2,W CALL COD INCF FSR,F MOVF BYTE3,W CALL COD CALL ANZMO2 ;SETZT DAS KOMMA GEMÄSS ANZEIGEMODE CALL ZIFOUT CALL VE10 CALL TAGZÄ GOTO HAUPT ;------------------------------------------------------------------------------ ADJ BSF STATUS,5 ;SEITE 1 GOTO ADJA ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ ORG 200 ;------------------------------------------------------------------------------ ;VERZÖGERUNG VE10A CLRWDT MOVLW 0D ;10ms MOVWF BYTE1 ;LADE F MIT W LPA MOVLW 0FF ; MOVWF BYTE2 ;LADE F MIT 255 LA DECFSZ BYTE2,F ;DEC F UND ÜBERSPRINGE NÄCHSTEN ;BEFEHL WENN ERGEBNIS = 0 GOTO LA ;ZURÜCK WENN F <> 0 DECFSZ BYTE1,F ;... GOTO LPA ;WIEDERHOLE INNERE SCHLEIFE WENN F <> 0 RETLW 0 ;RETURN ZUM HAUPTPROGRAMM ;------------------------------------------------------------------------------ ACLRA ;LÖSCHT DIE ANZEIGE CLRF Z1 CLRF Z2 CLRF Z3 CLRF Z4 RETLW 0 ;------------------------------------------------------------------------------ BINBCDA ;WANDELT DEN WERT IN LBYTE IN ;BCD-CODE UM UND LEGT IHN IN BYTE2 ;UND BYTE3 AB MOVF LBYTE,W MOVWF ZÄ2 ;WERT ZWISCHENSPEICHERN CLRF BYTE2 MOVLW D'10' BI3A SUBWF ZÄ2,F BTFSS STATUS,0 ;WENN NICHT CARRY GOTO BI4A INCF BYTE2,F GOTO BI3A BI4A ADDWF ZÄ2,W ;WIEDER 10 D'RAUF, WEIL ZU VIEL ABGEZOGEN MOVWF BYTE3 ;DER REST SIND DANN DIE EINER RETLW 0 ;------------------------------------------------------------------------------ CODA ;CODIERT BCD-WERTE UND LEGT SIE IN DEN ;ZIFFERREGISTERN AB ;W MUSS DEN EINZUSCHREIBENDEN WERT ENTHALTEN ;FSR MUSS AUF DAS ZIELREGISTER GERICHTET SEIN CALL CO2A ;UMCODIEREN BTFSS Z4,4 ;TEST BP - OB z.Z DAS DISPLAY INVERTIERT IST MOVWF INDAD ;WENN NICHT, DANN EINSCHREIBEN BTFSS Z4,4 RETLW 0 MOVWF INDAD ;HIER WIRD ERST EINGESCHR., DANN INVERT. COMF INDAD,F RETLW 0 CO2A ADDWF PCOUNT,F RETLW B'11101110' ;7-SEGMENT "0" ( CODE = e d c dp b a f g ) RETLW B'00101000' ;7-SEGMENT "1" RETLW B'11001101' ;7-SEGMENT "2" RETLW B'01101101' ;7-SEGMENT "3" RETLW B'00101011' ;7-SEGMENT "4" RETLW B'01100111' ;7-SEGMENT "5" RETLW B'11100111' ;7-SEGMENT "6" RETLW B'00101100' ;7-SEGMENT "7" RETLW B'11101111' ;7-SEGMENT "8" RETLW B'01101111' ;7-SEGMENT "9" RETLW B'10101111' ;7-SEGMENT "A" RETLW B'11100011' ;7-SEGMENT "b" RETLW B'11000110' ;7-SEGMENT "C" RETLW B'11101001' ;7-SEGMENT "d" RETLW B'11000111' ;7-SEGMENT "E" RETLW B'10000111' ;7-SEGMENT "F" RETLW B'00000100' ;7-SEGMENT "~" 16 RETLW B'00000001' ;7-SEGMENT "-" 17 RETLW B'01000000' ;7-SEGMENT "_" 18 RETLW B'00000000' ;7-SEGMENT " " 19 SPACE RETLW B'10000001' ;7-SEGMENT "r" 20 RETLW B'11000001' ;7-SEGMENT "c" 21 RETLW B'10100001' ;7-SEGMENT "n" 22 ;------------------------------------------------------------------------------ ZIFOUTA ;GIBT DIE ZIFFERREGISTER SERIEL AN PA AUS ;UND COMPLEMENTIERT SIE DANACH MOVLW Z1 MOVWF FSR ;ADRESSE VON ZIFFERREGISTER 1 LADEN ZIF0A MOVLW 8 MOVWF Z0 ;BITZÄHLER LADEN ZIF1A BCF PA,0 ;TAKT AUF "L" BTFSS INDAD,7 ;BIT LESEN UND AUSGEBEN BCF PA,1 ; BTFSC INDAD,7 ; BSF PA,1 ; BSF PA,0 ;TAKT AUF "H" RLF INDAD,F DECFSZ Z0,F GOTO ZIF1A RLF INDAD,F ;NOCH EINMAL FÜR DAS CARRYBIT INCF FSR,F MOVF FSR,W ANDLW B'00011111' BTFSS STATUS,2 ;ENDE WENN ZERO ERREICHT GOTO ZIF0A ;INVERTIEREN ALLER ZIFFERREGISTER MOVLW Z1 MOVWF FSR ;ADRESSE VON ZIFFERREGISTER 1 LADEN ZIF2A COMF INDAD,F INCF FSR,F MOVF FSR,W ANDLW B'00011111' BTFSS STATUS,2 ;ENDE WENN ZERO ERREICHT GOTO ZIF2A CLRF FSR ;BYTE 5 LÖSCHEN - SONST FALSCHER BLOCK RETLW 0 ;------------------------------------------------------------------------------ KOMMAA ;SETZT DAS KOMMA IN DER ANZEIGE AN DIE ;STELLE, DIE IM FSR ANGEGEBEN IST BTFSS Z4,4 ;BP TESTEN BSF INDAD,4 BTFSC Z4,4 ;BP TESTEN BCF INDAD,4 RETLW 0 ;------------------------------------------------------------------------------ EEOUT ;SCHREIBT DIE ADJ.-WERTE INS EEPROM ;IN ZÄ1 STEHT DIE NUMMER AUS DEM ADJ.-MENUE ;DIE BESTIMMT, WENN SIE 0,1,2 ODER 3 HEISST ;DIE EEPROM-ADRESSE FÜR DEN ZU SPEICHERNDEN ;WERT. GRÖSSERE MENUE-NUMMERN WERDEN ALS ;WERT IN EEPROM-ADRESSE 4 EINGESCHRIEBEN. ;ADR.0 = NULLPUNKT DIFFERENZ - LBYTE ;ADR.1 = UMSCHALTSCHWELLE TRINKW. - LBYTE ;ADR.2 = TROCKENLAUFSCHUTZ - LBYTE ;ADR.3 = TIMER (1=AUS) - LBYTE ;ADR.4 = ANZEIGEMODE - ZÄ1 MOVF ZÄ1,W MOVF ZÄ1,W MOVWF EE MOVLW D'4' SUBWF ZÄ1,W BTFSS STATUS,0 ;WENN ZÄ1-WERT >= 4 GOTO EEO MOVWF LBYTE ;DIE DIFFERENZ IN LBYTE MOVLW D'4' ;SPEICHERPLATZ FÜR ANZEIGEMODE EE ADR. 04 MOVWF EE EEO BCF EE,7 BCF EE,6 BSF EE,5 BSF EE,4 CALL SB CALL ADR ;EWEN CALL FIN2 BSF EE,7 BSF EE,6 BCF EE,5 BCF EE,4 CALL SB CALL ADR ;ERASE CALL FIN1 ADDWF PCOUNT,F GOTO ERR BCF EE,7 BSF EE,6 BCF EE,5 BCF EE,4 CALL SB CALL ADR ;WRITE CALL DAT ;8 BIT CALL DAT ;DIE GLEICHEN 8 BIT NOCH EINMAL CALL FIN1 ADDWF PCOUNT,F GOTO ERR BCF EE,7 BCF EE,6 BCF EE,5 BCF EE,4 CALL SB CALL ADR ;EWDS CALL FIN2 RETLW 0 SB BSF PB,3 ;CS "H" BSF PB,5 ;STARTBIT "H" BSF PB,6 ;CLK "H" 1 NOP BCF PB,6 ;CLK "L" RETLW 0 ADR MOVLW D'8' MOVWF EZ AROT BCF PB,5 ;DI "L" BTFSC EE,7 BSF PB,5 BSF PB,6 ;CLK "H" 2 - 9 NOP BCF PB,6 ;CLK "L" RLF EE,F DECFSZ EZ,F GOTO AROT RLF EE,F ;ALTEN ZUSTAND WIEDER HERSTELLEN BCF PB,5 ;DI "L" RETLW 0 DAT MOVLW D'8' MOVWF EZ DROT BCF PB,5 BTFSC LBYTE,7 BSF PB,5 BSF PB,6 ;CLK "H" 12-19 20-27 NOP BCF PB,6 ;CLK "L" RLF LBYTE,F DECFSZ EZ,F GOTO DROT RLF LBYTE,F ;ALTEN BIT-ZUSTAND WIEDER HERSTELLEN RETLW 0 FIN1 BCF PB,3 ;CS "L" NOP BSF PB,3 ;CS "H" CLRF PEGL CLRF PEGH BUSY BTFSC PB,4 ;DO GOTO FIN2 DECFSZ PEGL,F GOTO BUSY ;TIMER DECFSZ PEGH,F GOTO BUSY BCF PB,3 ;CS "L" BCF PB,5 ;DI "L" RETLW 0 FIN2 BCF PB,3 ;CS "L" BCF PB,5 ;DI "L" RETLW 1 ;------------------------------------------------------------------------------ ERR ;ERROR-MELDUNG CALL ACLRA MOVLW Z1 MOVWF FSR MOVLW D'14' ;E CALL CODA INCF FSR,F MOVLW D'20' ;r CALL CODA INCF FSR,F MOVLW D'20' ;r CALL CODA ER CALL ZIFOUTA CALL VE10A GOTO ER ;------------------------------------------------------------------------------ ;DER ADJ-KNOPF DIENT ZUM EINSTELLEN DER KALIBRIERUNGSWERTE: 0-PUNKT, ;SCHALTSCHWELLE-TRINKWASSER, SCHALTSCHWELLE-TROCKENLAUF UND ZUM FESTLEGEN ;OB DAS GERÄT FÜR ZISTERNENNACHSPEISUNG VERWENDET WERDEN SOLL. DER ;ANZEIGEMODUS KANN ZWISCHEN cm UND qm BEI 1m, 1,5m, 2m, 2,5m FESTGELEGT WERDEN. ;BEIM EINSCHALTEN DES GERÄTS WIRD DER ADJ-KNOPF FESTGEHALTEN, DADURCH WIRD ;DAS ADJ-HILFSPROGRAMM AUFGERUFEN. DANACH BEDEUTET EINMAL DRÜCKEN: AUSWÄHLEN ;ZWEIMAL DRÜCKEN: WEITER ZUM NÄCHSTEN PUNKT. ;------------------------------------------------------------------------------ ADJA CLRF ZÄ1 AJ0 CALL ACLRA MOVLW Z1 MOVWF FSR MOVF ZÄ1,W ;MENUE-NUMMER CALL CODA AJ1 CALL ZIFOUTA CALL VE10A BTFSS PA,2 GOTO AJ1 ;BIS KNOPF WIEDER LOSGELASSEN WIRD AJ2 CALL ZIFOUTA CALL VE10A BTFSC PA,2 ;WENN KNOPF ERNEUT GEDRÜCKT GOTO AJ2 AJ3 CALL ZIFOUTA CALL VE10A BTFSS PA,2 GOTO AJ3 ;BIS KNOPF WIEDER LOSGELASSEN WIRD MOVLW D'50' ;1s "WARTEN" LADEN ( BEI 50 Hz DISPLAY ) MOVWF ZÄ2 AJ4 CALL ZIFOUTA CALL VE10A BTFSS PA,2 GOTO AJ6 ;WENN KNOPF ZUM 2. MAL IN 1s GEDRÜCKT WIRD DECFSZ ZÄ2,F GOTO AJ4 AJ5 MOVF ZÄ1,W ADDWF PCOUNT,F GOTO NULLK GOTO UTRI GOTO TROC GOTO TIMER GOTO AMOCM GOTO AMO10 GOTO AMO15 GOTO AMO20 GOTO AMO25 GOTO AMORE AJ6 INCF ZÄ1,F MOVLW D'9' ;HIER DIE ZAHL DER UNTERPROGRAMME SUBWF ZÄ1,W BTFSS STATUS,2 GOTO AJ0 ;NÄCHSTE STUFE GOTO ADJA ;KALIB.PROG.AUSWAHL NOCH MAL VON VORNE ;--------- NULL-KALIBRIERUNG NULLK CALL ACLRA MOVLW Z1 MOVWF FSR CLRW CALL CODA ;0 INCF FSR,F CALL CODA ;0 INCF FSR,F CALL CODA ;0 N5 CALL ZIFOUTA CALL VE10A BTFSC PA,2 ;WENN KNOPF ERNEUT GEDRÜCKT GOTO N5 BCF STATUS,5 ;SEITE 0 CALL ADIN BSF STATUS,5 ;SEITE 1 CLRF ZÄ1 ;ZÄ1 WURDE BEI ADIN GEBRAUCHT CALL EEOUT GOTO AJ6 ;--------- UMSCHALTSCHWELLE AUF TRINKWASSER UTRI CALL ACLRA ;ANZEIGE CLEAR MOVLW D'30' MOVWF LBYTE ;REGISTER MIT PRESETWERT LADEN U0 CALL BINBCDA ;BINÄR-BCD-UMWANDLUNG MOVLW Z1 MOVWF FSR MOVLW D'16' ;~ CALL CODA INCF FSR,F MOVF BYTE2,W CALL CODA INCF FSR,F MOVF BYTE3,W CALL CODA INCF FSR,F MOVLW D'16' ;~ CALL CODA MOVLW D'255' ;4s "WARTEN" LADEN ( BEI 50 Hz DISPLAY ) MOVWF ZÄ2 U1 CALL ZIFOUTA CALL VE10A BTFSS PA,2 GOTO U2 ;WENN KNOPF INNERHALB 4s GEDRÜCKT WIRD DECFSZ ZÄ2,F GOTO U1 GOTO U4 ;EXIT U2 DECF LBYTE,F BTFSS STATUS,2 GOTO U3 MOVLW D'60' MOVWF LBYTE ;REGISTER MIT 2. PRESETWERT LADEN U3 CALL ZIFOUTA CALL VE10A BTFSS PA,2 ;WENN KNOPF LOSGELASSEN WIRD GOTO U3 GOTO U0 U4 CALL EEOUT GOTO AJ6 ;--------- UMSCHALTSCHWELLE AUF TROCKENLAUFSCHUTZ TROC CALL ACLRA ;ANZEIGE CLEAR CLRF HBYTE MOVLW D'20' MOVWF LBYTE ;REGISTER MIT PRESETWERT LADEN T0 CALL BINBCDA ;BINÄR-BCD-UMWANDLUNG MOVLW Z1 MOVWF FSR MOVLW D'17' ;- CALL CODA INCF FSR,F MOVF BYTE2,W CALL CODA INCF FSR,F MOVF BYTE3,W CALL CODA INCF FSR,F MOVLW D'17' ;- CALL CODA MOVLW D'255' ;4s "WARTEN" LADEN ( BEI 50 Hz DISPLAY ) MOVWF ZÄ2 T1 CALL ZIFOUTA CALL VE10A BTFSS PA,2 GOTO T2 ;WENN KNOPF INNERHALB 4s GEDRÜCKT WIRD DECFSZ ZÄ2,F GOTO T1 GOTO T4 ;EXIT T2 DECF LBYTE,F BTFSS STATUS,2 GOTO T3 MOVLW D'40' MOVWF LBYTE ;REGISTER MIT 2. PRESETWERT LADEN T3 CALL ZIFOUTA CALL VE10A BTFSS PA,2 ;WENN KNOPF LOSGELASSEN WIRD GOTO T3 GOTO T0 T4 CALL EEOUT GOTO AJ6 ;--------- 30-TAGE-ZÄHLER 2 = AN 1 = AUS ; 3 = AUS, ZYSTERNENNACHSPEISUNG TIMER CALL ACLRA ;ANZEIGE CLEAR MOVLW D'3' MOVWF LBYTE ;REGISTER MIT PRESETWERT LADEN TI1 CALL BINBCDA ;BINÄR-BCD-UMWANDLUNG MOVLW Z2 MOVWF FSR MOVF BYTE3,W CALL CODA MOVLW D'255' ;4s "WARTEN" LADEN ( BEI 50 Hz DISPLAY ) MOVWF ZÄ2 TI2 CALL ZIFOUTA CALL VE10A BTFSS PA,2 GOTO TI3 ;WENN KNOPF INNERHALB 4s GEDRÜCKT WIRD DECFSZ ZÄ2,F GOTO TI2 GOTO TI5 ;EXIT TI3 DECF LBYTE,F BTFSS STATUS,2 GOTO TI4 MOVLW D'3' MOVWF LBYTE ;REGISTER MIT 2. PRESETWERT LADEN TI4 CALL ZIFOUTA CALL VE10A BTFSS PA,2 ;WENN KNOPF LOSGELASSEN WIRD GOTO TI4 GOTO TI1 TI5 CALL EEOUT GOTO AJ6 ;--------- ANZEIGEMODE: cm AMOCM CALL ACLRA MOVLW Z1 MOVWF FSR MOVLW D'21' ;c CALL CODA INCF FSR,F MOVLW D'22' ;m CALL CODA AMC CALL ZIFOUTA CALL VE10A BTFSC PA,2 ;WENN KNOPF ERNEUT GEDRÜCKT GOTO AMC CALL EEOUT GOTO AJ6 ;--------- ANZEIGEMODE: qm - 1m DURCHMESSER AMO10 CALL ACLRA MOVLW Z1 MOVWF FSR MOVLW D'1' ;1 CALL CODA INCF FSR,F MOVLW D'0' ;0 CALL CODA MOVLW Z1 MOVWF FSR CALL KOMMAA ;, AM10 CALL ZIFOUTA CALL VE10A BTFSC PA,2 ;WENN KNOPF ERNEUT GEDRÜCKT GOTO AM10 CALL EEOUT GOTO AJ6 ;--------- ANZEIGEMODE: qm - 1,5m DURCHMESSER AMO15 CALL ACLRA MOVLW Z1 MOVWF FSR MOVLW D'1' ;1 CALL CODA INCF FSR,F MOVLW D'5' ;5 CALL CODA MOVLW Z1 MOVWF FSR CALL KOMMAA ;, AM15 CALL ZIFOUTA CALL VE10A BTFSC PA,2 ;WENN KNOPF ERNEUT GEDRÜCKT GOTO AM15 CALL EEOUT GOTO AJ6 ;--------- ANZEIGEMODE: qm - 2m DURCHMESSER AMO20 CALL ACLRA MOVLW Z1 MOVWF FSR MOVLW D'2' ;2 CALL CODA INCF FSR,F MOVLW D'0' ;0 CALL CODA MOVLW Z1 MOVWF FSR CALL KOMMAA ;, AM20 CALL ZIFOUTA CALL VE10A BTFSC PA,2 ;WENN KNOPF ERNEUT GEDRÜCKT GOTO AM20 CALL EEOUT GOTO AJ6 ;--------- ANZEIGEMODE: qm - 2,5m DURCHMESSER AMO25 CALL ACLRA MOVLW Z1 MOVWF FSR MOVLW D'2' ;2 CALL CODA INCF FSR,F MOVLW D'5' ;5 CALL CODA MOVLW Z1 MOVWF FSR CALL KOMMAA ;, AM25 CALL ZIFOUTA CALL VE10A BTFSC PA,2 ;WENN KNOPF ERNEUT GEDRÜCKT GOTO AM25 CALL EEOUT GOTO AJ6 ;--------- ANZEIGEMODE: qm - REVATEC AMORE CALL ACLRA MOVLW Z1 MOVWF FSR MOVLW D'20' ;r CALL CODA INCF FSR,F MOVLW D'14' ;E CALL CODA AMR CALL ZIFOUTA CALL VE10A BTFSC PA,2 ;WENN KNOPF ERNEUT GEDRÜCKT GOTO AMR CALL EEOUT GOTO AJ6 ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ ORG 400 ;------------------------------------------------------------------------------ EEIN GOTO EEIN_ ;------------------------------------------------------------------------------ RS232 ;GIBT DATEN IM FORMAT 9600,8N2 AN DER 5V-RS232- ;SCHNITTSTELLE AUS WENN SICH ETWAS VERÄNDERT HAT ;DIE ÜBERTRAGUNG ERFOLGT MIT FOLGENDEM INHALT: ;BYTE 1: BIT 0,1,2,3,4,5,6 cm-BIT's ; BIT 7 = IMMER "H" ;BYTE 2: BIT 0 = cm-BIT 7 ; BIT 1 = cm-BIT 8 ; BIT 2 = cm-BIT 9 ; BIT 3 = "H" (NOCH FREI) ; BIT 4 = "H"->TRINKWASSER NACHFÜLLEN ; BIT 5 = "H"->WEGEN TROCKENLAUF ABGESCHALTET ; BIT 6 = "H"->TRINKWASSER "L"->REGENWASSER ; BIT 7 = IMMER "L" BTFSC LO,2 ;IN HBYTE DIE ZUSTANDS-BITS SETZEN BSF HBYTE,5 BTFSC LO,0 BSF HBYTE,4 BTFSC LO,3 BSF HBYTE,4 BTFSC LO,1 BSF HBYTE,3 MOVF LBYTE,W ;HBYTE, LBYTE IN'S FILE 1 ÜBERTRAGEN BSF FSR,5 ;REGISTER-FILE 1 MOVWF LBYTE BCF FSR,5 ;REGISTER-FILE 0 MOVF HBYTE,W BSF FSR,5 ;REGISTER-FILE 1 MOVWF HBYTE RLF HBYTE,F ;UMFORMATIEREN BCF HBYTE,0 BTFSC LBYTE,7 BSF HBYTE,0 BSF LBYTE,7 BTFSC TR,0 ;TOGGEL GOTO RSOU MOVF LBYTE,W ;AUF VERÄNDERUNG TESTEN SUBWF ND,W BTFSS STATUS,2 ;WENN BEIDE GLEICH GOTO RSOUT MOVF HBYTE,W SUBWF UT,W BTFSC STATUS,2 ;WENN UNGLEICH GOTO RSO3 RSOUT MOVF LBYTE,W ;ND, UT AKTUALISIEREN MOVWF ND MOVF HBYTE,W MOVWF UT RSOU MOVLW B'00110000' ;REGISTER 16 (ND), FILE 1 MOVWF FSR BTFSC TR,0 ;TOGGEL INCF FSR,F RSO1 MOVLW D'8' ;BITZÄHLER MOVWF BYTE2 BSF PC,3 ;STARTBIT CALL RSV RSO2 RRF INDAD,F BTFSC STATUS,0 ;CARRY-BIT TESTEN BCF PC,3 ;AM AUSGANG INVERTIERT ! BTFSS STATUS,0 ;CARRY-BIT TESTEN BSF PC,3 CALL RSV DECFSZ BYTE2,F GOTO RSO2 RRF INDAD,F ;JETZT STEHT ES WIEDER SO WIE VORHER BSF PC,3 ;STOPPBIT CALL RSV CALL RSV BCF PC,3 ;ENDE COMF TR,F ;TOGGEL-BYTE UMSCHALTEN RSO3 BCF FSR,5 ;REGISTER-FILE 0 RETLW 0 ;-------- RSV MOVLW D'23' ;VERZÖGERUNGSWERT MOVWF BYTE1 RSV1 NOP DECFSZ BYTE1,F GOTO RSV1 RETLW 0 ;------------------------------------------------------------------------------ ANZ1L ;UMRECHNUNGSLISTE IN qm 1m-DURCHMESSER MOVLW B'00000011' ;AUSWERTUNG HBYTE ANDWF HBYTE,F MOVF HBYTE,W CALL A1LH1 MOVWF PEGH MOVF HBYTE,W CALL A1LH2 MOVWF PEGL SWAPF LBYTE,W ;AUSWERTUNG LBYTE-OBEREN-4 ANDLW B'00001111' CALL A1LL1 ADDWF PEGL,F BTFSC STATUS,0 INCF PEGH,F MOVF LBYTE,W ;AUSWERTUNG LBYTE-UNTEREN-4 ANDLW B'00001111' CALL A1LL2 ADDWF PEGL,F BTFSC STATUS,0 INCF PEGH,F MOVF PEGH,W MOVWF HBYTE MOVF PEGL,W MOVWF LBYTE RETLW 0 A1LH1 ADDWF PCOUNT,F RETLW D'0' RETLW D'0' RETLW D'1' RETLW D'2' A1LH2 ADDWF PCOUNT,F RETLW D'0' RETLW D'201' RETLW D'146' RETLW D'91' A1LL1 ADDWF PCOUNT,F RETLW D'0' RETLW D'13' RETLW D'25' RETLW D'38' RETLW D'50' RETLW D'63' RETLW D'75' RETLW D'88' RETLW D'100' RETLW D'113' RETLW D'126' RETLW D'138' RETLW D'151' RETLW D'163' RETLW D'176' RETLW D'188' A1LL2 ADDWF PCOUNT,F RETLW D'0' RETLW D'1' RETLW D'2' RETLW D'2' RETLW D'3' RETLW D'4' RETLW D'5' RETLW D'5' RETLW D'6' RETLW D'7' RETLW D'8' RETLW D'9' RETLW D'9' RETLW D'10' RETLW D'11' RETLW D'12' ;------------------------------------------------------------------------------ ANZ2L ;UMRECHNUNGSLISTE IN qm 1,5m-DURCHMESSER CLRF PEGH MOVLW B'00000011' ;AUSWERTUNG HBYTE ANDWF HBYTE,W CALL A2LH2 MOVWF PEGL SWAPF LBYTE,W ;AUSWERTUNG LBYTE-OBEREN-4 ANDLW B'00001111' CALL A2LL1 ADDWF PEGL,F BTFSC STATUS,0 INCF PEGH,F MOVF LBYTE,W ;AUSWERTUNG LBYTE-UNTEREN-4 ANDLW B'00001111' CALL A2LL2 ADDWF PEGL,F BTFSC STATUS,0 INCF PEGH,F MOVF PEGH,W MOVWF HBYTE MOVF PEGL,W MOVWF LBYTE RETLW 0 A2LH2 ADDWF PCOUNT,F RETLW D'0' RETLW D'45' RETLW D'91' RETLW D'136' A2LL1 ADDWF PCOUNT,F RETLW D'0' RETLW D'3' RETLW D'6' RETLW D'8' RETLW D'11' RETLW D'14' RETLW D'17' RETLW D'20' RETLW D'23' RETLW D'25' RETLW D'28' RETLW D'31' RETLW D'34' RETLW D'37' RETLW D'40' RETLW D'42' A2LL2 ADDWF PCOUNT,F RETLW D'0' RETLW D'0' RETLW D'0' RETLW D'1' RETLW D'1' RETLW D'1' RETLW D'1' RETLW D'1' RETLW D'1' RETLW D'2' RETLW D'2' RETLW D'2' RETLW D'2' RETLW D'2' RETLW D'2' RETLW D'3' ;------------------------------------------------------------------------------ ANZ3L ;UMRECHNUNGSLISTE IN qm 2m-DURCHMESSER CLRF PEGH MOVLW B'00000011' ;AUSWERTUNG HBYTE ANDWF HBYTE,W CALL A3LH2 MOVWF PEGL SWAPF LBYTE,W ;AUSWERTUNG LBYTE-OBEREN-4 ANDLW B'00001111' CALL A3LL1 ADDWF PEGL,F BTFSC STATUS,0 INCF PEGH,F MOVF LBYTE,W ;AUSWERTUNG LBYTE-UNTEREN-4 ANDLW B'00001111' CALL A3LL2 ADDWF PEGL,F BTFSC STATUS,0 INCF PEGH,F MOVF PEGH,W MOVWF HBYTE MOVF PEGL,W MOVWF LBYTE RETLW 0 A3LH2 ADDWF PCOUNT,F RETLW D'0' RETLW D'80' RETLW D'161' RETLW D'241' A3LL1 ADDWF PCOUNT,F RETLW D'0' RETLW D'5' RETLW D'10' RETLW D'15' RETLW D'20' RETLW D'25' RETLW D'30' RETLW D'35' RETLW D'40' RETLW D'45' RETLW D'50' RETLW D'55' RETLW D'60' RETLW D'65' RETLW D'70' RETLW D'75' A3LL2 ADDWF PCOUNT,F RETLW D'0' RETLW D'0' RETLW D'1' RETLW D'1' RETLW D'1' RETLW D'2' RETLW D'2' RETLW D'2' RETLW D'3' RETLW D'3' RETLW D'3' RETLW D'3' RETLW D'4' RETLW D'4' RETLW D'4' RETLW D'5' ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ ORG 500 ;------------------------------------------------------------------------------ EEIN_ ;LIEST DIE WERTE AUS DEM EEPROM ;UND LEGT SIE IN DEN REGISTERN AB MOVLW ND MOVWF FSR MOVLW B'10000000' ;OPCODE + ADRESSE MOVWF EE EEI BSF PB,3 ;CS "H" BSF PB,5 ;STARTBIT "H" BSF PB,6 ;CLK "H" 1 NOP BCF PB,6 ;CLK "L" MOVLW D'8' MOVWF EZ ;RUNDENZÄHLER FÜR OPCODE ARO BCF PB,5 ;DI "L" BTFSC EE,7 BSF PB,5 BSF PB,6 ;CLK "H" 2 - 9 NOP BCF PB,6 ;CLK "L" RLF EE,F DECFSZ EZ,F GOTO ARO RLF EE,F ;ALTEN ZUSTAND WIEDER HERSTELLEN BCF PB,5 ;DI "L" BSF PB,6 ;CLK "H" 10 (DUMMYBYTE) NOP BCF PB,6 ;CLK "L" MOVLW D'8' ;RUNDENZÄHLER FÜR DATENLESEN MOVWF EZ REA BCF STATUS,0 ;CARRY "L" BTFSC PB,4 ;DO BSF STATUS,0 BSF PB,6 ;CLK "H" 11-18 NOP BCF PB,6 ;CLK "L" RLF INDAD,F DECFSZ EZ,F GOTO REA ;VERGLEICH MIT DER 2. HÄLFTE MOVLW D'8' ;RUNDENZÄHLER FÜR DATENLESEN MOVWF EZ RLF INDAD,F RE BTFSC STATUS,0 ;CARRY "L" GOTO R1 BTFSC PB,4 ;DO GOTO REX R1 BTFSS STATUS,0 ;CARRY "L" GOTO R2 BTFSS PB,4 ;DO GOTO REX R2 BSF PB,6 ;CLK "H" 19-27 NOP BCF PB,6 ;CLK "L" RLF INDAD,F DECFSZ EZ,F GOTO RE BCF PB,3 ;CS "L" INCF EE,F ;(OP-CODE) + EEPROM-ADRESSE INCF FSR,F ;ZEIGER FÜR ND, UT, TR, TZ, AM MOVLW (ND+D'128'+D'5') ;HIER DIE ZAHL DER REGISTER ;(SUB 128 WEIL FSR BIT 7 IMMER "H" IST) SUBWF FSR,W BTFSS STATUS,2 ;WENN NULL GOTO EEI CLRF EE ; CLRF EZ ;DIE BEIDEN REGISTER WERDEN FÜR TAGZ. GEBRAUCHT RETLW 0 REX MOVLW B'00100000' MOVWF STATUS ;SEITE 1 GOTO ERR ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ ORG 600 ;------------------------------------------------------------------------------ ANZ4L ;UMRECHNUNGSLISTE IN qm 2,5m-DURCHMESSER MOVLW B'00000011' ;AUSWERTUNG HBYTE ANDWF HBYTE,F MOVF HBYTE,W CALL A4LH1 MOVWF PEGH MOVF HBYTE,W CALL A4LH2 MOVWF PEGL SWAPF LBYTE,W ;AUSWERTUNG LBYTE-OBEREN-4 ANDLW B'00001111' CALL A4LL1 ADDWF PEGL,F BTFSC STATUS,0 INCF PEGH,F MOVF LBYTE,W ;AUSWERTUNG LBYTE-UNTEREN-4 ANDLW B'00001111' CALL A4LL2 ADDWF PEGL,F BTFSC STATUS,0 INCF PEGH,F MOVF PEGH,W MOVWF HBYTE MOVF PEGL,W MOVWF LBYTE RETLW 0 A4LH1 ADDWF PCOUNT,F RETLW D'0' RETLW D'0' RETLW D'0' RETLW D'1' A4LH2 ADDWF PCOUNT,F RETLW D'0' RETLW D'126' RETLW D'251' RETLW D'121' A4LL1 ADDWF PCOUNT,F RETLW D'0' RETLW D'8' RETLW D'16' RETLW D'24' RETLW D'31' RETLW D'39' RETLW D'47' RETLW D'55' RETLW D'63' RETLW D'71' RETLW D'79' RETLW D'86' RETLW D'94' RETLW D'102' RETLW D'110' RETLW D'118' A4LL2 ADDWF PCOUNT,F RETLW D'0' RETLW D'0' RETLW D'1' RETLW D'1' RETLW D'2' RETLW D'2' RETLW D'3' RETLW D'3' RETLW D'4' RETLW D'4' RETLW D'5' RETLW D'5' RETLW D'6' RETLW D'6' RETLW D'7' RETLW D'7' ;------------------------------------------------------------------------------ ANZ5L ;UMRECHNUNGSLISTE RETLW 0 ;------------------------------------------------------------------------------ END