;************************************************************** ; Programm sendet Druck, Temp, Bat1 und Bat2-Spannung ; zeigt die Steig/sink Rate an. Schwenkt Kamera (Taste: y,x) ; Wechselt PORTB6 und 7 (Taste: o,p). Setzt Druckmessung auf Null ; (Taste: g) ; Rs232 ist 4800bps 4Mhz Pictakt ; ; Pinbelegung ;* ---------------------------------- ;* PORTA: 0 VBat2 Temp. ;* 1 VBat1 10V ;* 2 VBat3 12V ;* 3 Druck ;* 4 - ;* 5 - MCLR ;* 6 - OSC2 ;* 7 - OSC1 ;* ;* PORTB: 0 RS232 In ;* 1 RS232 Out ;* 2 Wassersensor ;* 3 - ;* 4 Kamera ;* 5 Kamera ;* 6 - ;* 7 - list p=16f88 #include in Equ 0 ;Rs232 Eingang out Equ 1 ;Rs232 Ausgang Wass Equ 2 ;Wassersensoren KA Equ 4 ;Kamera+ KD Equ 5 ;Kamera- B6 Equ 6 B7 Equ 7 Rs1 Equ 0x20 ; Bit von RS232 RsStart Equ 0x21 ; Rs Startsignal RsCont Equ 0x22 ; Control Byte per Rs232 w_copy Equ 0x23 ; Backup für w register s_copy Equ 0x24 ; Backup für Statusregister Inter Equ 0x25 ; Interrupt ausgelöst cycl_1 Equ 0x26 ; RS232 Routine cycl_2 Equ 0x27 rs232in Equ 0x28 Byte Equ 0x29 Temp Equ 0x2A LSD_temp equ 0x2B ; Wandeln BIN zu BCD MSD_temp equ 0x30 HUN_temp equ 0x31 result_l equ 0x32 ; Wandeln AD-Konverter result_h equ 0x33 counter equ 0x34 loop1 equ 0x35 ;Wartezeit loop2 equ 0x36 DivDruck Equ 0x37 ;diff. Druck, ist zu soll Trend Equ 0x38 ;Druck-Trend Pos/Neg TrendAkt Equ 0x39 ;Aktueller Trend Rechne Equ 0x3A ;Dividiere Temp. AktTemp Equ 0x3B ;Wert aus A/D ;************************************************************** ; Hier starten ;************************************************************** org 0 goto Init ; Sprung zum Hauptprogramm ;************************************************************** ; Interrupt ;************************************************************** org 4 movwf w_copy ; w retten swapf STATUS, w ; STATUS retten movwf s_copy ;************************ ;Zeichen empfangen ;************************ Eingabe call ser_RX ; Code von RS232 empfangen movwf RsStart ; Start signal "a" call ser_RX movwf Rs1 ; Dummy zeichen call ser_RX movwf Rs1 ; Dummy zeichen call ser_RX movwf Rs1 ; Dummy zeichen call ser_RX movwf Rs1 ; Dummy zeichen call ser_RX movwf RsCont ; Control Byte empfangen test BSF Inter,0 ;Flag0 auf 1 wenn Daten angekommen BSF Inter,1 ;Flag1 auf 1 wenn interrupt bcf INTCON, INTF ; RB0-Interrupt-Flag löschen swapf s_copy, w ; STATUS zurück movwf STATUS swapf w_copy, f ; w zurück mit flags swapf w_copy, w RETFIE ;interrupt ende ;************************************************************** ;Interuppt Einstellen ;************************************************************** Init bsf STATUS, RP0 ; auf Bank 1 umschalten bCf OPTION_REG, INTEDG ; PortB0 wechsel an -Flanke interrupt bcf STATUS, RP0 ; auf Bank 0 zurückschalten bsf INTCON, INTE ; RB0-interrupt erlauben bsf INTCON, GIE ; Interrupt generell erlauben ;************************************************************** ; Port A+B einstellen ;************************************************************** bsf STATUS, RP0 ; auf Bank 1 umschalten BCF OPTION_REG, 7 ; Pull-UP ein movlw B'00000101' ; PortB 1-7 output 0,2=In movwf TRISB movlw B'00011111' ; PortA alle In movwf TRISA bcf STATUS, RP0 ; auf Bank 0 zurückschalten clrf PORTA clrf PORTB ; alle ausschalten BANKSEL ANSEL ;analog in PA3-PA0 MOVLW B'00001111' MOVWF ANSEL BANKSEL ADCON0 MOVLW B'01011001' ;set A/D zu PA3 und zeit 1/8tosc MOVWF ADCON0 BANKSEL ADCON1 ;A/D einstellen MOVLW B'00000000' ;Quelle ist Vdd-Vss Left-bit MOVWF ADCON1 BANKSEL 0 ;************************************************************** ; initialisierung der Zellen ;************************************************************** CLRF DivDruck ;Lösche Differenz Soll zu Ist Druck CLRF Trend ;Löschen Trend werte CLRF TrendAkt ;************************************************************** ;Ablauf je nach Taste ;************************************************************** Decode BCF Inter,0 ;flag für interrupt löschen MOVFW RsStart ;Bei "a" los SUBLW 'a' BTFSC STATUS, Z GOTO Los GOTO PWM ;********************* Los BTFSC RsCont,7 Goto SetzY BCF PORTB,KA GOTO TasteX SetzY BSF PORTB,KA ;********************* TasteX BTFSC RsCont,6 GOTO SetzX BCF PORTB,KD GOTO EndTaste SetzX BSF PORTB,KD EndTaste GOTO PWM ; weiter ausführen ;************************************************************** ;Werte abfragen und Ausgeben ;************************************************************** PWM CLRF RsStart ;Lösche letzte Daten CLRF RsCont Call Warte call CAdc ;wandeln Druck MOVFW result_l Call BinBCD ;Druck an RS232 ausgeben Call Warte Call BatVolt1 ;Bat.1 Voltage abfragen Call BinBCD ;Bat. Voltage an RS232 ausgeben Call BatVolt2 ;Bat.2 Temp abfragen Call BinBCD ;Bat. Voltage an RS232 ausgeben Call BatVolt3 ;Bat.3 Voltage abfragen Call BinBCD ;Bat. Voltage an RS232 ausgeben Call SteigR ;Trend Ausgeben Call BinBCD Call Wasser ;Wassersensoren abfragen ;************************************************************** ;Pause und bei Neu RS232 zu Decode ;************************************************************** Wait MOVLW .250 MOVWF loop2 Wart MOVLW .250 MOVWF loop1 Top NOP NOP NOP BTFSC Inter,0 ;Sprung wenn neues signal an RS23 Goto Decode NOP NOP NOP DECFSZ loop1, F GOTO Top DECFSZ loop2, F GOTO Wart ;************************************************************** Weiter BCF Inter,1 ;Lösche Flag nach Int. MOVLW .13 ;Zeilenanfang CALL Send_RS MOVLW .12 ;Seitenanfang CALL Send_RS Goto PWM ;Rücksprung ;************************************************************** ;Druck Trend Anzeigen ;************************************************************** SteigR RRF TrendAkt,F ;Bits nach Rechts schieben RRF TrendAkt,F RRF TrendAkt,F RRF TrendAkt,F RRF TrendAkt,F RRF TrendAkt,F MOVLW 'D' ;Sende DIFF ' ' CALL Send_RS MOVLW 'I' ;, CALL Send_RS MOVLW 'F' ;, CALL Send_RS MOVLW 'F' ;, CALL Send_RS MOVLW ' ' ; CALL Send_RS MOVFW TrendAkt ;Diff. Neu zu Alten Druck SUBWF Trend,W BTFSS STATUS,C ;Wenn Neg. Zahl Goto NegZahl MOVWF result_l ;Speichern in result_l Weiter3 MOVFW TrendAkt ;AktTrend wird zu alten Trend MOVWF Trend MOVFW result_l ;Nach W laden Return NegZahl SUBLW .255 ;Wenn Neg. Zahl in Pos. wandeln MOVWF result_l ;Speichern in result_l MOVLW '<' ;Sende < bei Neg. Zahl CALL Send_RS GOTO Weiter3 ;************************************************************** ;Wassersensor Abfragen und Textausgabe ;************************************************************** Wasser BTFSC PORTB, Wass ;Wassersensor Nass? Goto Trocken MOVLW 'A' ;Sende ALARM CALL Send_RS MOVLW 'L' ;, CALL Send_RS MOVLW 'A' ;, CALL Send_RS MOVLW 'R' ;, CALL Send_RS MOVLW 'M' ;, CALL Send_RS MOVLW .7 ;Beep CALL Send_RS GOTO EndWas Trocken MOVLW ' ' ;Sende Leer CALL Send_RS MOVLW ' ' ;, CALL Send_RS MOVLW ' ' ;, CALL Send_RS MOVLW ' ' ;, CALL Send_RS MOVLW ' ' ;, CALL Send_RS MOVLW ' ' ;, CALL Send_RS MOVLW ' ' ;, CALL Send_RS MOVLW ' ' ;, CALL Send_RS MOVLW ' ' ;, CALL Send_RS EndWas MOVLW ',' ;komma CALL Send_RS Return ;************************************************************** ;BAT.1 Voltage an PA1 abfragen ;************************************************************** BatVolt1 BCF ADCON0,CHS2 ;A/D zu PA1 BCF ADCON0,CHS1 BSF ADCON0,CHS0 Call Warte BSF ADCON0,2 ;A/D los Schlaf1 BTFSC ADCON0,2 GOTO Schlaf1 MOVFW ADRESH MOVWF result_l MOVLW 'B' ;Sende Bat- CALL Send_RS MOVLW 'a' ;, CALL Send_RS MOVLW 't' ;, CALL Send_RS MOVLW '1' ;, CALL Send_RS MOVLW '-' ;, CALL Send_RS Call Warte return ;************************************************************** ;BAT.3 Voltage an PA2 abfragen 12V ;************************************************************** BatVolt3 BCF ADCON0,CHS2 ;A/D zu PA2 BSF ADCON0,CHS1 BCF ADCON0,CHS0 Call Warte BSF ADCON0,2 ;A/D los Schlaf3 BTFSC ADCON0,2 GOTO Schlaf3 MOVFW ADRESH MOVWF result_l MOVLW 'B' ;Sende Bat- CALL Send_RS MOVLW 'a' ;, CALL Send_RS MOVLW 't' ;, CALL Send_RS MOVLW '3' ;, CALL Send_RS MOVLW '-' ;, CALL Send_RS Call Warte return ;************************************************************** ;BAT.2 Voltage an PA0 abfragen für TEMPERATUR ;************************************************************** BatVolt2 BANKSEL ADCON1 BSF ADCON1,ADFM ;Rechts-Ausrichten BANKSEL 0 BCF ADCON0,CHS2 ;A/D zu PA0 BCF ADCON0,CHS1 BCF ADCON0,CHS0 Call Warte BSF ADCON0,2 ;A/D los Schlaf2 BTFSC ADCON0,2 GOTO Schlaf2 BANKSEL ADRESL MOVFW ADRESL ;Low Zelle BANKSEL 0 ;******************************* ;Wandeln A/D Wert in Temperatur ;******************************* MOVWF AktTemp ;Umwandeln AdresL in echte CLRF Rechne ;Temperatur DurchR MOVLW .3 ;Teile Temp. durch 3 SUBWF AktTemp,F INCF Rechne,F BTFSC STATUS,C GOTO DurchR MOVLW .25 ;Rechne -25 SUBWF Rechne,F MOVFW Rechne ;Temp. nach result_l MOVWF result_l ;****************************** MOVLW 'T' ;Sende Temp- CALL Send_RS MOVLW 'e' ;, CALL Send_RS MOVLW 'm' ;, CALL Send_RS MOVLW 'p' ;, CALL Send_RS MOVLW '-' ;, CALL Send_RS BANKSEL ADCON1 BCF ADCON1,ADFM ;Links-Ausrichten BANKSEL 0 Call Warte return ;************************************************************** ;Daten von ADC in drei DEZ-Zahlen Wandeln (HUN, MSD, LSD_temp) ;************************************************************** BinBCD movfw result_l clrf MSD_temp movwf LSD_temp gtenth1 movlw .10 subwf LSD_temp,W BTFSS STATUS,C goto BinBCD_out movwf LSD_temp incf MSD_temp, F goto gtenth1 BinBCD_out BCD1 MOVFW MSD_temp clrf HUN_temp movwf MSD_temp gtenth movlw .10 subwf MSD_temp,W BTFSS STATUS,C goto EndBCD1 movwf MSD_temp incf HUN_temp, F goto gtenth EndBCD1 ;************************************************************** ;Sendet 3Dez-Zahlen via RS232 ;************************************************************** eins MOVFW HUN_temp ;Hunderter ADDLW .48 call Send_RS MOVFW MSD_temp ;Zehner ADDLW .48 call Send_RS MOVFW LSD_temp ;Einer ADDLW .48 call Send_RS MOVLW ' ' ;Leer CALL Send_RS MOVLW ' ' ;, CALL Send_RS Return ;************************************************************** ; A/D Druck an PA3 abfragen ;************************************************************** CAdc BCF ADCON0,CHS2 ;A/D zu PA3 BSF ADCON0,CHS1 BSF ADCON0,CHS0 Call Warte BSF ADCON0,2 ;A/D los Schlaf BTFSC ADCON0,2 GOTO Schlaf MOVFW ADRESH ;Druck nach result_l MOVWF result_l BANKSEL ADRESL MOVFW ADRESL ;Unteres Druck Byte nach Trend BANKSEL 0 MOVWF TrendAkt Call Warte return ;************************************************************* ;empfangen eines Byte nach 'byte', 'rs232in' und w ;************************************************************** ser_RX clrf Byte ;! Nullsetzen movlw 8 movwf cycl_1 ; 8 mal btfsC PORTB, in ; warten bis Startbit goto ser_RX call Pause ; Zeitverzögerung 1/2 Bit btfsC PORTB, in goto ser_RX RX_2 call Warte ; Zeitverzögerung 1 Bit btfsS PORTB, in ; bcf STATUS, C ; high -> 0 btfsC PORTB, in ; bsf STATUS, C ; low -> 1 ; rrf Byte, f ; decfsz cycl_1, f ; goto RX_2 ; 8 mal call Warte ; Zeitverzoegerung 1 bit btfsS PORTB, in ; Stop-Bit 1 goto ser_RX ; wenn kein StopBit 1 movf Byte, w movwf rs232in return ;********************************************************** ;ein bit zeitverzoegerung ; dieses timing muß genau stimmen (5%) ; ; empfang 4 MHz 10 MHz ; 2400 Bps = 69d 173d ; 4800 Bps = 34d 86d ; 9600 Bps = 16d 43d Warte movlw D'34' ; 9600 Bps / 4 MHz empfangen movwf cycl_2 Warte1 ; 6 Zyklen-Schleife nop nop nop decfsz cycl_2, 1 goto Warte1 return ;********************************************************** ;1/2 bit zeitverzoegerung ; dieses Timing ist nicht ganz so kritisch (25%) ; ; 4 MHz 10 MHz ; 2400 Bps = 416T = 63d 157d ; 4800 Bps = 31d 78d ; 9600 Bps = 15d 39d ; Pause movlw D'31' ; 9600 Bps / 4 MHz movwf Temp Pause2 ; 3 Zyklen Schleife decfsz Temp, f goto Pause2 return ;************************************************************* ;senden des Bytes, das im Register W steht ;************************************************************* Send_RS ; Ausgabe eines Bytes seriell movwf Byte ; Byte in w BTFSC Inter,1 ;Sprung wenn vorher Int. ausgelöst Goto Weiter ;damit keine falsche Daten senden movlw 8 ; es werden 8 Bit gesendet movwf cycl_1 bsf PORTB, out call Warte_s ; 1 Stopbit (1) bcf PORTB, out call Warte_s ; 1 Startbit (0) Send_1 rrf Byte, f ; aktuelles Bit in das Carry-Flag schieben btfsc STATUS, C bsf PORTB, out ; Lo wenn Bit = 1 btfss STATUS, C bcf PORTB, out ; Hi wenn Bit = 0 call Warte_s ; 1 Bit lang warten decfsz cycl_1, f ; waren das schon 8 Bit? goto Send_1 ; nein, es geht weiter bsf PORTB, out ; Byte zuende, 1 Stoppbit (1) senden call Warte_s return ;ein Bit Zeitverzoegerung mit einer Warteschleife ; ; senden 4 MHz 10 MHz ; 2400 Bps = 69d 173d ; 9600 Bps = 15d 43d Warte_s movlw D'34' ; 4800 Bps / 4 MHz senden movwf cycl_2 ; WarteNoch nop nop nop decfsz cycl_2, 1 goto WarteNoch return ;************************************************************** End