; Programm TEMPREG3.asm; Temperaturregler fuer EAM, vollstaendiges Programm ; Eingaben über Tasten, Speichern der Daten im internen EEPROM, Messen und Regeln ; PIC 16F84, f = 4,000 MHz ; Dieter Kohtz, April 2001 LIST P=16F84 ; Registerzuweisung IND equ 0 RTCC equ 1 PC equ 2 STAT equ 3 FSR equ 4 PORTA equ 5 PORTB equ 6 EEDATA equ 8 ;EEPROM-Datenregister EEADR equ 9 ;EEPROM-Adress-Register PCLATH equ 0A INTCON equ 0B EINER equ 0C ;BCD-Einer ZEHN equ 0D ;BCD-Zehner HUND equ 0E ;BCD-Hunderter ZWISCH equ 0F ZWISCH1 equ 10 ZAEHL equ 11 ZAEHL1 equ 12 ZAEHL2 equ 13 STWRT equ 14 ;LCD-Steuerwort ADRLCD equ 15 ;LCD-RAM-Adresse ADRES equ 16 ;AD-Resultat PULSW equ 17 ;Pulsweite SOLLW equ 18 ;Sollwert, binaer SOLH equ 19 ;Sollwert, BCD-Hunderter SOLZ equ 1A ;Sollwert, BCD-Zehner SOLE equ 1B ;Sollwert, BCD-Einer STELLG equ 1C ;Stellgroesse STLH equ 1D ;Stellgrad, BCD-Hunderter STLZ equ 1E ;Stellgrad, BCD-Zehner STLE equ 1F ;Stellgrad, BCD-Einer FLAG equ 20 OPTREG equ 1 ;Bank1 TRISA equ 5 TRISB equ 6 EECON1 equ 8 ; EECON2 equ 9 ; Konstanten ; Ziele w equ 0 f equ 1 ; bit Z equ 2 ; Zerobit in STAT C equ 0 ; Carrybit in STAT RP0 equ 5 ; Seitenwahlbit in STAT GIE equ 7 ; INTCON WREN equ 2 ; EECON1 WR equ 1 ; EECON1 RD equ 0 ; EECON1 EEIF equ 4 ; EECON1 rel equ 0 ; Relaisbit in FLAG stlg equ 1 ; Stellgradbit in FLAG sol equ 2 ; Sollwertbit in FLAG sda equ 7 ; SDA = RB7 scl equ 6 ; SCL = RB6 cs equ 0 ; CS = RA0 ;Makrodefinitionen bank0 macro bcf STAT,RP0 endm bank1 macro bsf STAT,RP0 endm adreep macro K,R ;Macro fuer EEPROM-Adresse (Speichern) ;K = Adresse, R = Register movlw K movwf EEADR movf R,w movwf EEDATA endm ;********************************************************************************* org 0 goto ini ;******************************************************************************** eetab addwf PC,f ; Tabelle der Voreinstellwerte dt 19,00,02,05,19,00,01,00,00 ; Assembler-Direktive "dt" = define table ;******************************************************************************** ;Pause von 1 ms Dauer durch RTCC-Ueberlauf nach 125 x 8 us ;********************************************************************************* pause1 movlw .131 movwf RTCC movf RTCC,w btfss STAT,Z goto $-2 return ;********************************************************************************* ;Pause in adw von 20 us Dauer ;********************************************************************************* pause movlw 6 movwf ZAEHL1 decfsz ZAEHL1,f goto $-1 return ;********************************************************************************* start movlw .131 ; Voreinstellung fuer RTCC: 131 = 256 -125 movwf RTCC bank1 ; Reg.-Seite1 movlw 02 ; RTCC vorbereiten (Intern, Vorteiler 8; 8us x 125 = 1000us) movwf OPTREG ; nun laeuft er schon (~1 ms bis Ueberlauf) bank0 ; Reg.- Seite 0 return ; ;******************************************************************************* ; Ausgaberoutine fuer das LCD ;**************************************************************************************************************************** ausg movwf PORTB ; Datenteil der Anweisung an Port B movf STWRT,w ; Steuerwort nach w btfss STWRT,3 ; RA3 = 1? goto $+3 ; nein: zur UND-Verknuepfung iorwf PORTA,f ; ja: ODER-Verknuepfung goto $+2 ; so bleibt Aenderung von RA3 andwf PORTA,f ; ohne Einfluss auf RA0 und RA4 bsf PORTA,2 ; E = 1 (Freigabe) nop nop bcf PORTA,2 ; E = 0 call pause1 ; 1 ms Verzoegerung nop return ;**************************************************************************************************************************** ; Bereitet Ports A und B fuer LCD-Ansteuerung vor ;**************************************************************************************************************************** lcport bank1 ; S. 1 movlw 03 movwf TRISA ; RA2, RA3 und RA4 = Ausgang clrf TRISB ; Port B = Ausgang bank0 ; S. 0 return ;**************************************************************************************************************************** ; laedt LCD-Adresse und bereitet Datenausgabe vor ;**************************************************************************************************************************** lcads movlw b'10111' movwf STWRT ; Steuerwort fuer RA3= 0 (Befehle ausgeben) movf ADRLCD,w ; LCD-Adresse call ausg movlw b'01000' ; Steuerwort fuer: RA3=1 (Daten ausgeben) movwf STWRT return ;**************************************************************************************************************************** ;Vorbereitung des LCD ;**************************************************************************************************************************** lcdini call lcport ; Initialisierung des LCD mit Dauerwerten nop ; Daten bleiben so lange erhalten, movlw b'10111' ; bis sie durch andere Befehle ueberschrieben werden movwf STWRT ; RA3 = 0 (Befehl ausgeben) movlw 01 ; Befehl fuer Display Loeschen call ausg movlw .65 ; Verzoegerung ca. 65 ms movwf ZAEHL1 ; nach Loeschen empfohlen call pause1 decfsz ZAEHL1,f goto $-2 movlw b'00000110' ; Befehl fuer Ausgangszustand: Adresse erhoehen, call ausg ; nicht schieben movlw b'00001100' ; Befehl fuer Einschalten, Cursor aus call ausg movlw b'00111000' ; Befehl fuer Funktion: 8 Bit, 2 Zeilen call ausg return ;******************************************************************************** ; Binaer-BCD-Umsetzung , Umzuwandelnde Zahl in w, Ergebnisse in EINER, ZEHNund HUND (max 255d) ; Von der Zahl wird 10d so oft abgezgen, bis der Rest < 10d ist; bei jeder Subtraktion wird ZEHN um 1 erhoeht ; ist ZEHN = 10d, wird HUND um 1 erhoeht und Zehn zu Null gemacht. ;******************************************************************************** binbcd nop clrf ZEHN clrf HUND movwf EINER ;w in EINER wdh movlw .10 subwf EINER,w ;EINER - 10 in w btfss STAT,C ;EINER < 10d? goto fertig ;ja: Ruecksprung movwf EINER ;nein: (EINER-10) in EINER incf ZEHN,f ;ZEHN + 1 movlw .10 subwf ZEHN,w btfss STAT,C ;ZEHN = 10d? goto wdh ;nein: wiederholen clrf ZEHN ;ja: ZEHN = 0 incf HUND,f ;und HUND + 1 goto wdh fertig return ;******************************************************************************* ; HUND, ZEHN und EINER werden von BCD zu binaer umgewandelt, Ergebnis in ZWISCH1, max = 255d (FFh) ;********************************************************************************* bcdbin clrf ZWISCH1 movf HUND,w movwf ZWISCH1 call mult10 ;10 x HUND movf ZEHN,w addwf ZWISCH1,f ;10 x HUND + ZEHN call mult10 ;10 x (10 x HUND + ZEHN) movf EINER,w addwf ZWISCH1,f ;10 x (10 x HUND) + EINER return mult10 bcf STAT,C ;Multiplikation mit 10d rlf ZWISCH1,w movwf ZWISCH ; (N) x 2 in ZWISCH rlf ZWISCH1,f rlf ZWISCH1,f rlf ZWISCH1,f ; (N) x 8 movf ZWISCH,w addwf ZWISCH1,f ; (N) x 10 return ;******************************************************************************** ; Dieses UP erhoeht EINER, ZEHN und HUND mit allen erforderlichen Uebertraegen ;******************************************************************************* add movf HUND,w ; Max.-Wert 127 testen xorlw 1 btfss STAT,Z ; HUND = 1? goto addi ; nein: addieren btfsc FLAG,stlg ; ja: Einstellflag gesetzt? return ; ja: bei HUND = 1 UP verlassen movf ZEHN,w ; sonst: ZEHN testen xorlw 2 btfss STAT,Z ; ZEHN = 2? goto addi ;nein: addieren movf EINER,w xorlw 7 btfss STAT,Z ; EINER = 7? goto addi ; nein: addieren return ;ja: UP verlassen, da Max.-Wert 127 erreicht addi incf EINER,f ; (EINER) + 1 movlw .10 subwf EINER,w btfss STAT,Z ; (EINER) = 10d? return ; nein: fertig clrf EINER ; ja: (EINER) = 0 incf ZEHN,f ; und (ZEHN) + 1 movlw .10 subwf ZEHN,w btfss STAT,Z ; (ZEHN) = 10d? return ; nein: fertig clrf ZEHN ; ja: (ZEHN) = 0 incf HUND,f ; und (HUND) + 1 return ;**************************************************************************************************************************** ; Dieses UP erniedrigt EINER, ZEHN und HUND mit allen erforderlichen Uebertraegen ;**************************************************************************************************************************** subtr movf HUND,w ; Untergrenze 000 abfragen xorlw 0 btfss STAT,Z ; HUND = 0? goto $+9 ; nein: erniedrigen movf ZEHN,w ; ja: ZEHN testen xorlw 0 btfss STAT,Z ;ZEHN = 0? goto $+5 ;nein: erniedrigen movf EINER,w xorlw 0 btfsc STAT,Z ;EINER = 0? return ; ja: Untergrenze erreicht: UP verlassen movlw 01 ; nein: erniedriegen subwf EINER,f ; (EINER) - 1 btfsc STAT,C ; Uebertrag? (Carrybit = 0?) return ; nein: fertig movlw 09 ; ja: (EINER) = 9 setzen movwf EINER movlw 01 ; und 1 von ZEHN subtrahieren subwf ZEHN,f ; und so weiter btfsc STAT,C return movlw 09 movwf ZEHN movlw 01 subwf HUND,f return ;******************************************************************************** zuend bank1 bcf TRISA,4 ;Relaisausgang aktiv bank0 bcf STAT,C ;vor Schieben C loeschen rrf STELLG,w ;STELLG halbieren movwf PULSW ; movf PULSW,f btfsc STAT,Z ;(PULSW) = 0? retlw 0 ;ja: UP verlassen mit w = 0 ohne Zuendung bcf PORTA,4 ; nein: Relaisausgang ein bsf FLAG,rel retlw 1 ; UP verlassen mit w = 1 ;******************************************************************************** period movlw .125 movwf ZAEHL2 ;1 Taktperiode = 125 x anz. = ca. 5 s call zuend xorlw 0 btfss STAT,Z ;w = 0? goto weit1 ;nein: Relais bleibt ein bsf PORTA,4 ;Relais aus bcf FLAG,rel weit1 call anz ;ca. 40 ms anzeigen call eingang btfss PORTB,2 ;Taste S? retlw 0 ;ja: Taste S: UP mit w = 0 verlassen call adw ;AD-Wandlung erfolgt innerhalb von period bcf STAT,C rrf ADRES,w ;ADRES/2 nach w call binbcd ;Anzeige vorbereiten btfss FLAG,rel ;Relais aktiv? goto weit2 ;nein: nur noch ZAEHL2 erniedrigen decfsz PULSW,f ;ja: PULSW erniedrigen, PULSW = 0? goto weit2 ;nein: weiter bsf PORTA,4 ;ja:Relais aus bcf FLAG,rel ;und Relaisflag loeschen weit2 decfsz ZAEHL2,f goto weit1 ;wiederholen retlw 1 ;Ende einer Taktperiode: w = 1 ;******************************************************************************** eingang bank1 movlw b'00000111' movwf TRISB ; RB0,1,2 = Eingang bcf OPTREG,7 ; Pullups aktiviert bcf TRISA,1 ; RA1 = Ausgang bank0 bcf PORTA,1 ; RA1 = 0 als Massepegel der Tasten return ;******************************************************************************** wpause movlw 5 movwf ZAEHL2 call anz ;5 mal anz = ca. 200 ms decfsz ZAEHL2,f goto $-2 return ;******************************************************************************** ;Eingabe von Sollwert bzw. Stellgrad ;******************************************************************************** eingabe movlw .10 movwf ZAEHL ; ZAEHL = 10d frag call anz wdhsol call eingang btfss PORTB,0 ; Taste Auf? goto auf ; ja: zu auf btfss PORTB,1 ; Taste AB? goto ab ; ja: zu ab btfss PORTB,2 ; Taste S? return ; ja: UP verlassen movlw .10 ; keine Taste movwf ZAEHL ; ZAEHL = 10d, wenn Taste losgelassen goto frag ; Tastenabfrage wiederholen auf movf ZAEHL,f btfss STAT,Z ; ZAEHL = 0? goto slowauf ; nein: ZAEHL herunterzaehlen call add ;ja: call anz ;kurze Pause: schnell hochzaehlen goto wdhsol slowauf decf ZAEHL,f call add ; langsam erhoehen call wpause ; 200 ms = 5 x anz goto wdhsol ; zurueck zur Tastenabfrage ab movf ZAEHL,f ; btfss STAT,Z ;ZAEHL = 0? goto slowab ;nein: langsam weiter call subtr ;ja: schnell weiter call anz ;kurze Pause goto wdhsol ;zurueck slowab decf ZAEHL,f call subtr call wpause ; 200 ms = 5 x anz4 goto wdhsol ; zurueck zur Tastenabfrage ;******************************************************************************** lolas call eingang btfsc PORTB,2 ; Loslassen von Taste S erwarten return call anz goto lolas ;******************************************************************************** schreep bank1 bsf EECON1,WREN bcf INTCON,GIE movlw 55 movwf EECON2 movlw 0AA movwf EECON2 bsf EECON1,WR btfsc EECON1,WR goto $-1 bcf EECON1,WREN bcf EECON1,EEIF bank0 return ;******************************************************************************** lseep bank1 ; aus EEPROM lesen bsf EECON1,RD bank0 movf EEDATA,w ; Ergebnis in w return ;******************************************************************************** flagspch adreep 08,FLAG call schreep return ;******************************************************************************** solspch movf HUND,w ;Sollwert (HUND,ZEHN,EINER) movwf SOLH ; uebertragen und adreep 01,HUND ; im EEPROM speichern call schreep movf ZEHN,w movwf SOLZ adreep 02,ZEHN call schreep movf EINER,w movwf SOLE adreep 03,EINER call schreep call bcdbin movf ZWISCH1,w movwf SOLLW adreep 0,SOLLW ;Sollwert binaer im EEPROM speichern call schreep return ;******************************************************************************** stgspch movf HUND,w ;Stellgrad (HUND, ZEHN, EINER) movwf STLH adreep 05,HUND ; uebertragen und call schreep ; im EEPROM speichern movf ZEHN,w movwf STLZ adreep 06,ZEHN call schreep movf EINER,w movwf STLE adreep 07,EINER call schreep return ;******************************************************************************** stelspch adreep 04,STELLG call schreep return ;******************************************************************************** adw clrf ADRES ; ADRES loeschen clrf PORTB ; PORTB loeschen bank1 ; Registerseite 1 movlw b'10111111' ; Laden von TRISB mit binaer 10111111 fuehrt zu: movwf TRISB ; RB7 = Eingang, RB6 = Ausgang bcf TRISA,cs ; RA0 = Ausgang bank0 ; Registerseite 0 call pause ; 20 us Pause bcf PORTA,cs ; CS = 0: ADW gibt Daten aus movlw 08 ; ZAEHL mit 8 laden movwf ZAEHL ; fuer 8-maligen Schleifendurchlauf bcf STAT,C ; Carrybit loeschen (meist vor Schiebebefehl noetig) wdh2 bsf PORTB,scl ; CLOCK = 1, hoechstwertiges Bit liegt an PORTB,da btfsc PORTB,sda ; DATA = 0/1? goto setzen ; DATA = 1 bcf ADRES,7 ; DATA = 0: Bit 7 in ADRES loeschen goto weiter setzen bsf ADRES,7 ; Bit 7 in ADRES setzen weiter rlf ADRES,f ; ADRES links schieben durch Carry! bcf PORTB,scl ; CLOCK = 0 decfsz ZAEHL,f ; ZAEHLherunterzaehlen und auf 0 testen goto wdh2 ; ZAEHL ist nicht 0: wiederholen rlf ADRES,f ; BIT = 0: noch einmal nachschieben! bsf PORTA,cs ; CS = 1: Ausgang hochohmig return ;************************************************************************************************************************************ ;Vollstaendige LCD-Anzeige, Dauer ca. 40 ms ;************************************************************************************************************************************ anz call lcport ; Portdefinition fuer Anzeige movlw 80 movwf ADRLCD ; LCD-Start-Adresse 1. Zeile call lcads ; Schreiben an Startadresse vorbereitet movlw 53 ; ASCII-Z. fuer "S" call ausg movlw 4F ; ASCII-Z. fuer "O" call ausg movlw 4C ; ASCII-Z. fuer "L" call ausg movlw 4C ; ASCII-Z. fuer "L" call ausg movlw 20 ; ASCII-Leerzeichen call ausg btfss FLAG,sol ; FLAG,sol gesetzt? goto $+0B ; nein: springen zu Festwerte schreiben movlw 30 ; ja: Eingegebene Werte schreiben addwf HUND,w ; Durch Addieren von 30h call ausg ; werden die ASCII-Ziffern gebildet movlw 30 addwf ZEHN,w call ausg movlw 30 addwf EINER,w call ausg goto $+0A ; Festwerte uebergehen movlw 30 ; Festwerte schreiben addwf SOLH,w ; Durch Addieren von 30h call ausg ; werden die ASCII-Ziffern gebildet movlw 30 addwf SOLZ,w call ausg movlw 30 addwf SOLE,w call ausg movlw 0DF call ausg ; ASCII-Grad-Symbol movlw 43 call ausg ; ASCII-Z. fuer "C" movlw 3B call ausg ; ASCII-Semikolon movlw 20 call ausg ; Leerzeichen movlw 53 ; ASCII-Z. fuer "S" call ausg movlw 54 ; ASCII-Z. fuer "T" call ausg movlw 4C ; ASCII-Z. fuer "L" call ausg movlw 47 ; ASCII-Z. fuer "G" call ausg movlw 0C0 movwf ADRLCD ; LCD-Start-Adresse 2. Zeile call lcads ; laden und wieder Schreiben vorbereiten movlw 49 ; ASCII-Z. fuer "I" call ausg movlw 53 ; ASCII-Z. fuer "S" call ausg movlw 54 ; ASCII-Z. fuer "T" call ausg movlw 20 call ausg ; Leerzeichen movlw 20 call ausg ; Leerzeichen btfss FLAG,sol ; FLAG,sol gesetzt? goto $+2 ; nein: FLAG,stlg testen goto $+3 ; ja: drei Leerzeichen btfss FLAG,stlg ; FLAG,stlg gesetzt? goto $+8 ; nein: Leerzeichen uebergehen movlw 20 ; ja : drei Leerzeichen call ausg movlw 20 call ausg movlw 20 call ausg goto $+0A ; Meswertanzeige uebergehen movlw 30 ; Messwerte schreiben addwf HUND,w ; Durch Addieren von 30h call ausg ; werden die ASCII-Ziffern gebildet movlw 30 addwf ZEHN,w call ausg movlw 30 addwf EINER,w call ausg movlw 0DF call ausg ; ASCII-Grad-Symbol movlw 43 call ausg ; ASCII-Z. fuer "C" movlw 3B call ausg ; ASCII-Semikolon movlw 20 call ausg ; Leerzeichen btfss FLAG,stlg ; FLAG,stlg gesetzt? goto $+0B ; nein: Festwerte schreiben movlw 30 ; ja: Variable Werte schreiben addwf HUND,w ; Durch Addieren von 30h call ausg ; werden die ASCII-Ziffern gebildet movlw 30 addwf ZEHN,w call ausg movlw 30 addwf EINER,w call ausg goto $+0A ; Festwerte uebergehen movlw 30 ; Festwerte schreiben addwf STLH,w ; Durch Addieren von 30h call ausg ; werden die ASCII-Ziffern gebildet movlw 30 addwf STLZ,w call ausg movlw 30 addwf STLE,w call ausg movlw 25 call ausg ; ASCII-%-Zeichen return ;******************************************************************************** ; Nur Messwerte anzeigen (Alternative von ca. 4 ms Dauer, falls kuerzere Taktperiode erforderlich) ;******************************************************************************** anzm call lcport movlw 0C5 movwf ADRLCD ; LCD-Start-Adresse 2. Zeile, Pos. 5 call lcads ; laden und wieder Schreiben vorbereiten movlw 30 ; Messwerte schreiben addwf HUND,w ; Durch Addieren von 30h call ausg ; werden die ASCII-Ziffern gebildet movlw 30 addwf ZEHN,w call ausg movlw 30 addwf EINER,w call ausg return ;******************************************************************************** ; Hauptprogramm: ;******************************************************************************** ini movlw .21 ; Gesamtes RAM (21 Stellen) loeschen movwf EINER ; mit indirekter Adressierung movlw 0D movwf FSR ; Erste Adresse = 0Dh clrf IND incf FSR,f decfsz EINER,f ; EINER fungiert hier als Zaehler goto $-3 ; und ist deshalb am Ende auch geloescht test movlw 01 movwf EEADR call lseep ; Adresse 1 des EEPROMs lesen xorlw 0FF btfss STAT,Z ; Inhalt = FFh? (PIC neu?) goto reglad ; nein: eelad ueberspringen eelad clrf ZAEHL ; Die ersten 9 Speicherplaetze movf ZAEHL,w ; des EEPROM werden mit movwf EEADR ; Voreinstellwerten fuer Sollwert call eetab ; und Stellgrad aus eetab geladen movwf EEDATA call schreep incf ZAEHL,w xorlw 9 btfsc STAT,Z ; ZAEHL = 9? (in w!) goto $+3 ; ja: beenden incf ZAEHL,f ; nein: ZAEHL hochzaehlen goto $-0A ; und wiederholen reglad movlw 9 ; 9 Register aus EEPROM laden movwf ZAEHL ; fuer EEPROM-Adressen 0 bis 8 vorbereiten movlw 18 movwf FSR ; Adresse von SOLLW ins FSR clrf EEADR ; EEPROM-Adresse = 0 call lseep ; EEPROM lesen movwf IND ; und Inhalt im indizierten Register ablegen incf EEADR,f ; EEPROM-Adresse erhoehen incf FSR,f ; FSR erhoehen decfsz ZAEHL,f goto $-5 call start bsf PORTA,4 ; Lastrelais aus, call lcdini ; Portdefinition und LCD-Initialisierung call anz ; Basisanzeige goto messen ;******************************************************************************** ;Stellgradeingabe ;******************************************************************************** stell bsf PORTA,4 ;Lastrelais aus bsf FLAG,stlg ;Stellgradflag setzen bcf FLAG,sol ;Sollwertflag loeschen movlw 5 movwf EEADR ;gespeicherter Wert fuer STLH call lseep ;aus EEPROM fuer Anzeige movwf HUND movlw 6 movwf EEADR ;gespeicherter Wert fuer STLZ call lseep ;aus EEPROM fuer Anzeige movwf ZEHN movlw 7 movwf EEADR ;gespeicherter Wert fuer STLE call lseep ;aus EEPROM fuer Anzeige movwf EINER call lolas ;Loslassen von S erwarten call eingabe ;Anzeige erfolgt waehrend Eingabe call stgspch ;Anzeige Stellgrad speichern call bcdbin ;eingestellten Stellgrad umwandeln movf ZWISCH1,w ;und daraus die bcf STAT,C ;Stellgroesse berechnen: rrf ZWISCH1,w ;ZWISCH1/2 in w rlf ZWISCH1,f ;ZWISCH1* 2 addwf ZWISCH1,w ;ZWISCH1* 2,5 in w movwf STELLG ;Stellgrad*2,5 = Stellgroesse call stelspch ;STELLG speichern! goto soll ;******************************************************************************** ; Sollwerteingabe ;******************************************************************************** soll bsf FLAG,sol ;Sollwertflag setzen bcf FLAG,stlg ;Stellgradflag loeschen movlw 1 movwf EEADR ;gespeicherter Wert fuer SOLH call lseep ;aus EEPROM fuer Anzeige movwf HUND movlw 2 movwf EEADR ;gespeicherter Wert fuer SOLZ call lseep ;aus EEPROM fuer Anzeige movwf ZEHN movlw 3 movwf EEADR ;gespeicherter Wert fuer SOLE call lseep ;aus EEPROM fuer Anzeige movwf EINER call lolas ;Warten auf Loslassen von Taste S call eingabe ;Anzeige erfolgt waehrend Eingabe call solspch ;Sollwert speichern goto messen ;******************************************************************************** ;Messmodus, Anzeige erfolgt waehrend period ;******************************************************************************** messen call lolas ;Warten auf Loslassen von Taste S bcf FLAG,stlg bcf FLAG,sol ; beide Flags loeschen wdhms call period ; Eine Taktperiode aufrufen: 128x40 ms = ca. 5 s xorlw 0 ; AD-Wandler wird in period aufgerufen btfsc STAT,Z ; wurde Taste S gedrueckt (w = 0)? goto stell ; ja: zu stell bcf STAT,C ; nein: weiter rrf ADRES,f ; ADRES/2 (Anpassung an Messbereich) movf ADRES,w ; nach w call binbcd ; Anzeige vorbereiten movf ADRES,w ; Istwert nach w subwf SOLLW,w ; btfss STAT,C ; ADRES > SOLLW? goto $+6 ; ja: STELLG = 0 movlw 4 movwf EEADR ; nein: STELLG aus EEPROM call lseep ; laden und weiter movwf STELLG goto wdhms clrf STELLG ;STELLG = 0 goto wdhms ;******************************************************************************** end