;************************************************************** ; Programm steuert ROV über RS232 sendet Byte:OutL,OutR,OutUp ; OutLamp,Control. ; Control-Byte: Bit0 Vor Motor Retour ; Bit1 Up Motoren Retour ; Bit4 Lampe L/R Wechseln ; Bit5 Relais Lampe EIN,AUS ; Bit6 Taste X gedrückt (Kamera) ; Bit7 Taste Y gedrückt (Kamera) ; Rs232 ist 4800bps 4Mhz Pictakt ; ; Pinbelegung ; ---------------------------------- ; PORTA: 0 Poti Links/Rechts ; 1 Poti Vor/Retour ; 2 Poti Up/Down ; 3 Poti Lampe Helligkeit ; 4 - ; 5 - MCLR ; 6 - OSC2 ; 7 - OSC1 ; ; PORTB: 0 ; 1 RS232 Out ; 2 ; 3 ; 4 Control LED ; 5 Lampe Toggle L/R ; 6 X Kamera ; 7 Y Kamera list p=16f88 #include ;PORTB Belegung in Equ 0 out Equ 1 ;Rs232 Ausgang Led Equ 4 ;LED TaLa Equ 5 ;Taste Lampe Wechseln TaY Equ 6 ;Taste Y Kamera TaX Equ 7 ;Taste X Kamera w_copy Equ 0x21 ; Backup für w register s_copy Equ 0x22 ; Backup für Statusregister cycl_1 Equ 0x24 ; RS232 Routine cycl_2 Equ 0x25 rs232in Equ 0x26 Byte Equ 0x27 Temp Equ 0x28 InLR Equ 0x29 ;Wert von PotiLR InVR Equ 0x2A ;Wert von PotiVR InUpDo Equ 0x2B ;Wert von PotiUp InLamp Equ 0x2C ;Wert von PotiLampe OutL Equ 0x2D ;Sende Wert MotorL OutR Equ 0x2E ;Sende Wert MotorR OutUp Equ 0x2F ;Sende Wert MotorUp OutLamp Equ 0x30 ;Sende Wert Lampe stufe Control Equ 0x31 ;Sende Control daten Tasten Equ 0x32 ;PortB nach Tasten loop1 equ 0x35 ;Wartezeit loop2 equ 0x36 TempUp equ 0x40 ;Temp Zellen TempVR equ 0x41 TempLR equ 0x42 AltL equ 0x43 ;Daten von letzter Sendung AltR equ 0x44 AltUp equ 0x45 AltLamp equ 0x46 AltCont equ 0x47 DiffZelle equ 0x48 ;************************************************************** ; Port A+B einstellen ;************************************************************** bsf STATUS, RP0 ; auf Bank 1 umschalten BCF OPTION_REG, 7 ; Pull-UP ein movlw B'11101100' ; PortB 1=IN 0=Output 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' ;0=Digital 1=Analog 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 ;************************************************************** ;Vor/Rück PA1 abfragen ;************************************************************** Start BCF ADCON0,CHS2 ;A/D zu PA1 BCF ADCON0,CHS1 BSF ADCON0,CHS0 Call Warte_s BSF ADCON0,2 ;A/D los Schlaf1 BTFSC ADCON0,2 GOTO Schlaf1 MOVFW ADRESH ;Wert nach InVR MOVWF InVR Call Warte_s ;************************************************************** ;Links/Rechts an PA0 abfragen ;************************************************************** BCF ADCON0,CHS2 ;A/D zu PA0 BCF ADCON0,CHS1 BCF ADCON0,CHS0 Call Warte_s BSF ADCON0,2 ;A/D los Schlaf2 BTFSC ADCON0,2 GOTO Schlaf2 MOVFW ADRESH ;Wert nach InLR MOVWF InLR Call Warte_s ;************************************************************** ;Up/Down PA2 abfragen ;************************************************************** BCF ADCON0,CHS2 ;A/D zu PA2 BSF ADCON0,CHS1 BCF ADCON0,CHS0 Call Warte_s BSF ADCON0,2 ;A/D los Schlaf3 BTFSC ADCON0,2 GOTO Schlaf3 MOVFW ADRESH ;Wert nach InUpDo MOVWF InUpDo Call Warte_s ;************************************************************** ;Lampe Hell/Dunkel PA3 abfragen ;************************************************************** BCF ADCON0,CHS2 ;A/D zu PA3 BSF ADCON0,CHS1 BSF ADCON0,CHS0 Call Warte_s BSF ADCON0,2 ;A/D los Schlaf4 BTFSC ADCON0,2 GOTO Schlaf4 MOVFW ADRESH ;Wert nach InLamp MOVWF InLamp Call Warte_s ;************************************************************** ;PortB Tasten Einlesen ;************************************************************** MOVFW PORTB ;Port nach Zelle Tasten MOVWF Tasten BTFSS Tasten,TaX ;Taste X abfragen und Control Goto SetzX ;setzen BCF Control,6 Goto Next1 SetzX BSF Control,6 ;***************** Next1 BTFSS Tasten,TaY ;Taste Y abfragen und Control Goto SetzY ;setzen BCF Control,7 Goto Next2 SetzY BSF Control,7 ;***************** Next2 BTFSS Tasten, TaLa ;Taste Lampe L/R gedrückt? GOTO Toggle ;dann Control setzen GOTO EndTa Toggle BTFSC Control,4 ;Toggle Lampe L/R Goto SetzLa BSF Control,4 GOTO EndTa SetzLa BCF Control,4 GOTO EndTa EndTa ;************************************************************* ;Poti Auf/Ab Berechnung ;************************************************************* MOVLW .128 ;Poti Up/Down SUBWF InUpDo,W BTFSS STATUS,C ;Wenn <128 zu Ab GOTO Ab ;sonst Auf ;****************** Auf MOVLW .128 ;Diff. zu 128 SUBWF InUpDo,F MOVFW InUpDo ;Up Wert zur Ausgabe MOVWF OutUp BCF Control,1 ;RelaisUp Retour OFF Goto EndUp ;****************** Ab MOVFW InUpDo ;Diff. zu 128 SUBLW .128 MOVWF InUpDo MOVFW InUpDo ;Up Wert zur Ausgabe MOVWF OutUp BSF Control,1 ;RelaisUp Retour ON GOTO EndUp EndUp ;************************************************************* ;Poti Hell/Dunkel AUS ;************************************************************* MOVLW .10 ;Poti auf AUS position? SUBWF InLamp,W BTFSC STATUS,C ;Wenn <9 Relais Lampe AUS GOTO WertLamp ;sonst EIN GOTO AusLamp WertLamp BCF Control,5 ;Relais Lampe ON MOVFW InLamp ;Wert Ausgeben MOVWF OutLamp GOTO EndLamp AusLamp BSF Control,5 ;Relais Lampe OFF MOVLW .0 ;Wert Ausgeben Null MOVWF OutLamp EndLamp ;************************************************************* ;Poti Vor/Rück Berechnung ;************************************************************* MOVLW .128 ;Poti Vor/Rück SUBWF InVR,W BTFSS STATUS,C ;Wenn <128 zu Retour GOTO Retour ;sonst Vorwärts ;****************** Vorw MOVLW .128 ;Diff. zu 128 SUBWF InVR,F MOVFW InVR ;Vorwärts Wert zu Ausgabe MOVWF OutL MOVWF OutR BCF Control,0 ;Relais Retour OFF Goto Kurve ;****************** Retour MOVFW InVR ;Diff. zu 128 SUBLW .128 MOVWF InVR MOVFW InVR ;Vorwärts Wert zu Ausgabe MOVWF OutL MOVWF OutR BSF Control,0 ;Relais Retour ON GOTO Kurve ;************************************************************* ;Poti Links/Rechts Berechnung ;************************************************************* Kurve MOVLW .128 ;Poti Links/Rechts SUBWF InLR,W BTFSS STATUS,C ;Wenn <128 zu Links GOTO Links ;**************************** ;Bei Rechtskurve ;**************************** MOVLW .128 ;Diff. zu 128 SUBWF InLR,F ;**************************** MOVFW InLR ADDWF OutL,F ;Plus LMotor BTFSS STATUS,C ;Nicht grösser als 255 Goto Anpass1 MOVLW d'255' MOVWF OutL ;**************************** Anpass1 MOVFW InLR ;Minus RMotor SUBWF OutR,F BTFSC STATUS,C ;Nicht kleiner als 1 Goto EndKurv MOVLW d'1' MOVWF OutR GOTO EndKurv ;**************************** ;Bei Linkskurve ;**************************** Links MOVFW InLR ;Diff. zu 128 SUBLW .128 MOVWF InLR ;**************************** MOVFW InLR ADDWF OutR,F ;Plus RMotor BTFSS STATUS,C ;Nicht grösser als 255 Goto Anpass2 MOVLW d'255' MOVWF OutR ;**************************** Anpass2 MOVFW InLR ;Minus LMotor SUBWF OutL,F BTFSC STATUS,C ;Nicht kleiner als 1 Goto EndKurv MOVLW d'1' MOVWF OutL EndKurv ;************************************************************* ;Ausgabe der Daten (Wenn neue Anstehend) ;************************************************************* MOVFW OutL ;Nur Senden wenn Daten SUBWF AltL,W ;anders als letzte sendung MOVWF DiffZelle BTFSC STATUS,Z GOTO Test1 MOVLW .1 SUBWF DiffZelle,W BTFSC STATUS,Z GOTO Test1 MOVLW .255 SUBWF DiffZelle,W BTFSC STATUS,Z GOTO Test1 GOTO AltZuNeu ;**************************** Test1 MOVFW OutR SUBWF AltR,W MOVWF DiffZelle BTFSC STATUS,Z GOTO Test2 MOVLW .1 SUBWF DiffZelle,W BTFSC STATUS,Z GOTO Test2 MOVLW .255 SUBWF DiffZelle,W BTFSC STATUS,Z GOTO Test2 GOTO AltZuNeu ;**************************** Test2 MOVFW OutUp SUBWF AltUp,W MOVWF DiffZelle BTFSC STATUS,Z GOTO Test3 MOVLW .1 SUBWF DiffZelle,W BTFSC STATUS,Z GOTO Test3 MOVLW .255 SUBWF DiffZelle,W BTFSC STATUS,Z GOTO Test3 GOTO AltZuNeu ;**************************** Test3 MOVFW OutLamp SUBWF AltLamp,W MOVWF DiffZelle BTFSC STATUS,Z GOTO Test4 MOVLW .1 SUBWF DiffZelle,W BTFSC STATUS,Z GOTO Test4 MOVLW .255 SUBWF DiffZelle,W BTFSC STATUS,Z GOTO Test4 GOTO AltZuNeu ;**************************** Test4 MOVFW Control SUBWF AltCont,W MOVWF DiffZelle BTFSC STATUS,Z GOTO TestEnd MOVLW .1 SUBWF DiffZelle,W BTFSC STATUS,Z GOTO TestEnd MOVLW .255 SUBWF DiffZelle,W BTFSC STATUS,Z GOTO TestEnd GOTO AltZuNeu TestEnd GOTO Start ;Alles gleich, zu Start ;************************************************************* ;Neue Daten überschreiben Alte Daten ;************************************************************* AltZuNeu MOVFW OutL ;Neue Daten in AltenDaten ablegen MOVWF AltL MOVFW OutR MOVWF AltR MOVFW OutUp MOVWF AltUp MOVFW OutLamp MOVWF AltLamp MOVFW Control MOVWF AltCont ;************************************************************* ;Neue Daten anstehend d.h Senden ;************************************************************* Ausgabe MOVLW 'a' ;Sende Anfang "a" CALL Send_RS ;**************************************** ;Sendet Invertiert OutL+OutL mit Totband ;**************************************** MOVLW .5 ;Totzone -/+5 SUBWF OutL,W BTFSS STATUS,C CLRF OutL MOVFW OutL ;OutL+OutL ADDWF OutL,F BTFSS STATUS,C ;Nicht>255 GOTO Sende1 MOVLW .255 MOVWF OutL Sende1 COMF OutL,F ;Invertiert Ausgeben OutL MOVF OutL,F ;Aber wenn 0 dann 1 senden BTFSC STATUS,Z INCF OutL,F MOVFW OutL CALL Send_RS ;**************************************** ;Sendet Invertiert OutR+OutR mit Totband ;**************************************** MOVLW .5 ;Totzone -/+5 SUBWF OutR,W BTFSS STATUS,C CLRF OutR MOVFW OutR ;OutR+OutR ADDWF OutR,F BTFSS STATUS,C ;Nicht>255 GOTO Sende2 MOVLW .255 MOVWF OutR Sende2 COMF OutR,F ;Invertiert Ausgeben OutR MOVF OutR,F ;Aber wenn 0 dann 1 senden BTFSC STATUS,Z INCF OutR,F MOVFW OutR CALL Send_RS ;**************************************** ;Sendet Invertiert OutUp+OutUp mit Totband ;**************************************** MOVLW .5 ;Totzone -/+5 SUBWF OutUp,W BTFSS STATUS,C CLRF OutUp MOVFW OutUp ;OutUp+OutUp ADDWF OutUp,F BTFSS STATUS,C ;Nicht>255 GOTO Sende3 MOVLW .255 MOVWF OutUp Sende3 COMF OutUp,F ;Invertiert Ausgeben OutUp MOVF OutUp,F ;Aber wenn 0 dann 1 senden BTFSC STATUS,Z INCF OutUp,F MOVFW OutUp CALL Send_RS ;**************************************** ;Sendet OutLamp ;**************************************** Sende4 MOVF OutLamp,F ;Aber wenn 0 dann 1 senden BTFSC STATUS,Z INCF OutLamp,F MOVFW OutLamp CALL Send_RS ;**************************************** ;Sendet Control Byte ;**************************************** MOVFW Control ;Ausgeben Control-Byte CALL Send_RS BSF PORTB,Led ;Control LED leuchtet Call Wait BCF PORTB,Led ;Control LED AUS Goto Start ;************************************************************* ;senden des Bytes, das im Register W steht ;************************************************************* Send_RS ; Ausgabe eines Bytes seriell movwf Byte ; Byte in w movlw 8 ; es werden 8 Bit gesendet movwf cycl_1 bcf PORTB, out call Warte_s ; 1 Stopbit (1) bsf PORTB, out call Warte_s ; 1 Startbit (0) Send_1 rrf Byte, f ; aktuelles Bit in das Carry-Flag schieben btfsc STATUS, C bcf PORTB, out ; Lo wenn Bit = 1 btfss STATUS, C bsf 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 bcf 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 = 16d 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 ;************************************************************** ;Pause (688ms) ;************************************************************** Wait MOVLW .250 MOVWF loop2 Wart MOVLW .250 MOVWF loop1 Top NOP NOP NOP Nop Nop NOP NOP NOP DECFSZ loop1, F GOTO Top DECFSZ loop2, F GOTO Wart Return ;************************************************************** End