list p=16f877a ; list directive to define processor #include ; processor specific variable definitions ; __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _RC_OSC & _WRT_OFF & _LVP_ON & _CPD_OFF EXTERN LCD_AN ;***********************Variablendefinition*************************** D_SENSOR_DATA UDATA 0x040 ;start of general purpose registers COUNTER_SEN res 1 ; Counter in Init TEMP_DATA res 1 ; TEMP_DATA TEMP_ACK RES 1 ; TEMP_ACK TEMP_TEST res 1 ; TEMP_TEST ADDR_COMM res 1 ; Address and Command HIGH_BYTE res 1 ; Oberste 8 bit LOW_BYTE res 1 ; untere 8 bit GLOBAL HIGH_BYTE, LOW_BYTE EXTERN DELAY_30ms #define SENSOR_DATA PORTA, 1 #define SENSOR_SCK PORTB, 2 #define SENSOR_DATA_DIR TRISA, 1 #define SENSOR_SCK_DIR TRISB, 2 PROG1 Code ; START ;ORG 0x000 goto START_SHT ; ;org 0x0005 ; Interrupt ;retfie START_SHT GLOBAL START_SHT ;***********************Init**************************************** movlw 0x005 movwf HIGH_BYTE movwf LOW_BYTE movwf ADDR_COMM movlw b'00000101' ; Messe Feuchte movwf ADDR_COMM bsf STATUS, RP0 ; Bank1 bcf SENSOR_SCK_DIR ; Output bcf SENSOR_DATA_DIR ; Output bcf STATUS, RP0 ; Bank0 ;***********************Transmission*Start**************************** bsf SENSOR_DATA bsf SENSOR_SCK bcf SENSOR_DATA bcf SENSOR_SCK bsf SENSOR_SCK bsf SENSOR_DATA movlw d'8' movwf COUNTER_SEN ;***********************Feuchte messen**************************** SEND_BIT_TO_SENSOR bcf SENSOR_SCK btfss ADDR_COMM,7 goto SEND_NULL bsf SENSOR_DATA goto SEND_BIT SEND_NULL bcf SENSOR_DATA SEND_BIT bsf SENSOR_SCK rlf ADDR_COMM,f ; rotate decfsz COUNTER_SEN,F goto SEND_BIT_TO_SENSOR bcf SENSOR_SCK bsf STATUS, RP0 bsf SENSOR_DATA_DIR ; Input bcf STATUS, RP0 bsf SENSOR_SCK btfss SENSOR_DATA ; Acknowledge bekommen? goto ACK_GET_FROM_SENSOR goto ACK_LOST ;***********************Get Acknowledge**************************** ACK_GET_FROM_SENSOR ; Ack bekommen ;movlw b'00001111' ;movwf PORTB bcf SENSOR_SCK movlw d'30' movwf COUNTER_SEN call DELAY_30ms ;***********************Daten empfangen**************************** WAIT_FOR_SENSORDATA btfss SENSOR_DATA goto READ_DATA decfsz COUNTER_SEN,f goto WAIT_FOR_SENSORDATA goto ACK_LOST ; wenn keine Daten dann ende ;***********************Lese*Daten********************************* READ_DATA call GET_BYTE movf ADDR_COMM,w movwf HIGH_BYTE ; oberes Byte call SEND_ACK_TO_SENSOR call GET_BYTE movf ADDR_COMM,w movwf LOW_BYTE ; unteres Byte call SEND_ACK_TO_SENSOR call GET_BYTE goto geschafft ;***********************Get*Byte*********************************** GET_BYTE clrf ADDR_COMM movlw d'8' movwf COUNTER_SEN GET_BYTE_LOOP bsf SENSOR_SCK btfss SENSOR_DATA goto GET_ZERO_BIT bsf ADDR_COMM,0 goto GOT_BIT GET_ZERO_BIT bcf ADDR_COMM,0 GOT_BIT bcf SENSOR_SCK decfsz COUNTER_SEN,f goto GET_NEXT_BIT goto DONE GET_NEXT_BIT rlf ADDR_COMM,f ; rotate goto GET_BYTE_LOOP DONE return ;***********************Sende*Acknowledge**************************** SEND_ACK_TO_SENSOR bsf STATUS,RP0 bcf SENSOR_DATA bcf STATUS, RP0 bcf SENSOR_DATA bsf SENSOR_SCK bcf SENSOR_SCK bsf STATUS, RP0 bsf SENSOR_DATA bcf STATUS, RP0 return ;***********************Kein* Acknowledge**************************** ACK_LOST movlw b'11110000' movwf HIGH_BYTE movlw b'00001111' movwf LOW_BYTE geschafft bsf PORTB,2 ;movwf PORTB ;***********************Ende**************************************** ABM goto LCD_AN ;return ;goto ABM end