Advertisement
Guest User

Untitled

a guest
Nov 18th, 2019
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.96 KB | None | 0 0
  1.  
  2. #define LED PORTA.RA5
  3. #define BTN PORTB.RB5
  4. #define DIR PORTD.RD4
  5.  
  6. /*
  7. Variaveis referente ao tratamento do protocolo
  8. */
  9. #define SLAVE_ADRESS 1
  10. char buffer[20];
  11.  
  12.  
  13.  
  14. /*
  15. Function codes
  16. */
  17. const char READ_COIL = 0x01;
  18. const char WRITE_COIL = 0x05;
  19.  
  20. const char READ_INPUT_REGISTER = 0x03;
  21.  
  22. unsigned int read_temperature();
  23. void crc_calc_and_send(char dataLenght);
  24. void crc_calc(char dataLenght);
  25. void send_buffer(char dataLenght);
  26. void decode_packet();
  27.  
  28. unsigned int temp = 0;
  29. bit led_status;
  30.  
  31. //DHT11 DEFINITONS
  32. sbit DHT11_Pin at PORTB.B0;
  33. sbit DHT11_DIR at TRISB.B0;
  34. extern unsigned int DHT11_TMP;
  35. extern unsigned int DHT11_HUM;
  36. extern char DHT11_CHKSM;
  37. //END OF DHT11 DEFINITONS
  38.  
  39. void main() {
  40.  
  41.      int timeout = 0;
  42.      char packet_index = 0;
  43.  
  44.  
  45.      TRISA = 0b11011111;
  46.      TRISB = 0xFF;
  47.      TRISD = 0;
  48.  
  49.      LED = 0;
  50.      led_status = 0;
  51.  
  52.      DIR = 0; //listening for bus data
  53.      
  54.      ADC_Init();       /* Initialize the ADC module */
  55.      DHT11_init();
  56.  
  57.  
  58.      UART1_init(9600);
  59.      Soft_UART_Init(&PORTB, 5, 4, 9600, 0); // debug stuff , rx pin RB5 and tx pin RB4
  60.      
  61.      while(1){
  62.  
  63.        timeout++;
  64.        delay_us(1);
  65.  
  66.        if(timeout == 3640){ //timeout if no data is received
  67.          timeout = 0;
  68.          packet_index = 0;
  69.        }
  70.        
  71.        if(!UART1_data_ready()) // don't proceed if UART is not ready
  72.          continue;
  73.  
  74.        buffer[packet_index] = UART1_read(); // read packet
  75.      //  Soft_UART_Write( buffer[packet_index]); //debug stuff
  76.  
  77.        packet_index++;
  78.        timeout = 0;
  79.  
  80.        if(packet_index < 8) // continue reading packet
  81.          continue;
  82.  
  83.  
  84.  
  85.        // packet end, start decoding
  86.        
  87.        packet_index = 0;   //reset index
  88.  
  89.        if(buffer[0] != SLAVE_ADRESS) // don't proceed if slave id doesn't match
  90.          continue;
  91.  
  92.        decode_packet();
  93.      }
  94.  
  95. }
  96.  
  97. void decode_packet(){
  98.    char function_code = buffer[1];
  99.  
  100.    if(function_code == READ_COIL){
  101.        if(buffer[2] == 0x00 && buffer[3] == 0x02){ //check register number
  102.                     buffer[2] = 0x01;   //1 byte count
  103.                   if(BTN)
  104.                     buffer[3] = 0x00; // input state
  105.                   else
  106.                     buffer[3] = 0x01; // input state
  107.  
  108.                     crc_calc_and_send(4);
  109.        }
  110.    }
  111.  
  112.  
  113.    if(function_code == WRITE_COIL){
  114.       if(buffer[2] == 0x30 && buffer[3] == 0x20){ //check register number
  115.              if(buffer[4] == 0xFF){
  116.                LED = 1;
  117.                led_status = 1;
  118.              }
  119.  
  120.              if(buffer[4] == 0x00){
  121.                LED = 0;
  122.                led_status = 0;
  123.              }
  124.  
  125.              crc_calc_and_send(6);
  126.       }
  127.    }
  128.  
  129.    if(function_code == READ_INPUT_REGISTER){
  130.        if(buffer[4] == 0x00 && buffer[5] == 0x01){  //check size of data
  131.        
  132.          if(buffer[2] == 0x00 && buffer[3] == 0x01){ //check register number (potenciometer)
  133.          
  134.              buffer[2] = 0x00;   //2 byte count
  135.              buffer[3] = 0x02;   //2 byte count
  136.  
  137.  
  138.              buffer[4] = 0;
  139.              buffer[5] = ADC_Read(0) >> 2; // convert 10 bits adc value to 8 bits
  140.  
  141.              crc_calc_and_send(6);
  142.          }
  143.          
  144.          if(buffer[2] == 0x00 && buffer[3] == 0x02){ //check register number (dht11 temp)
  145.  
  146.              buffer[2] = 0x00;   //2 byte count
  147.              buffer[3] = 0x02;   //2 byte count
  148.  
  149.            
  150.              Dht11_Start();
  151.              DHT11_Read();
  152.  
  153.              if(DHT11_CHKSM==((DHT11_TMP>>8)+(DHT11_HUM>>8)+(DHT11_TMP&0xff)+(DHT11_HUM&0xff))){
  154.              
  155.               buffer[4] = 0;
  156.               buffer[5] = DHT11_TMP>>8; // convert dht11 temp value to 8 bits
  157.             }
  158.  
  159.              crc_calc_and_send(6);
  160.          }
  161.          
  162.          if(buffer[2] == 0x00 && buffer[3] == 0x03){ //check register number (dht11 temp)
  163.  
  164.              buffer[2] = 0x00;   //2 byte count
  165.              buffer[3] = 0x02;   //2 byte count
  166.  
  167.  
  168.              Dht11_Start();
  169.              DHT11_Read();
  170.  
  171.              if(DHT11_CHKSM==((DHT11_TMP>>8)+(DHT11_HUM>>8)+(DHT11_TMP&0xff)+(DHT11_HUM&0xff))){
  172.  
  173.               buffer[4] = 0;
  174.               buffer[5] = DHT11_HUM>>8; // convert dht11 temp value to 8 bits
  175.             }
  176.  
  177.              crc_calc_and_send(6);
  178.          }
  179.          
  180.          if(buffer[2] == 0x00 && buffer[3] == 0x04){ //check register number (ds18b20 temp)
  181.  
  182.              buffer[2] = 0x00;   //2 byte count
  183.              buffer[3] = 0x02;   //2 byte count
  184.  
  185.  
  186.              Ow_Reset(&PORTC, 5);                         // Onewire reset signal
  187.              Ow_Write(&PORTC, 5, 0xCC);                   // Issue command SKIP_ROM
  188.              Ow_Write(&PORTC, 5, 0x44);                   // Issue command CONVERT_T
  189.              Delay_us(120);
  190.  
  191.              Ow_Reset(&PORTC, 5);
  192.              Ow_Write(&PORTC, 5, 0xCC);                   // Issue command SKIP_ROM
  193.              Ow_Write(&PORTC, 5, 0xBE);                   // Issue command READ_SCRATCHPAD
  194.              
  195.              buffer[5] = Ow_Read(&PORTC, 5);  // Write MSB
  196.              buffer[4] = Ow_Read(&PORTC, 5);  // Write LSB
  197.  
  198.              crc_calc_and_send(6);
  199.          }
  200.        }
  201.    }
  202.    
  203. }
  204.  
  205. void crc_calc_and_send(char data_lenght){
  206.   crc_calc(data_lenght);
  207.   send_buffer(data_lenght + 2);
  208. }
  209.  
  210. void crc_calc(char data_lenght){
  211.   unsigned int checksum = 0xFFFF;
  212.   char j;
  213.   char i;
  214.  
  215.   unsigned char lowCRC;
  216.   unsigned char highCRC;
  217.  
  218.   for(j = 0; j < data_lenght; j++){
  219.     checksum ^= (unsigned int)buffer[j];
  220.     for(i = 8;i > 0; i--){
  221.       if((checksum) & 0x0001)
  222.         checksum = (checksum >> 1)^0xA001;
  223.       else
  224.         checksum >>=1;
  225.     }
  226.   }
  227.  
  228.   highCRC = checksum >> 8;
  229.   lowCRC = checksum;
  230.   buffer[data_lenght] = lowCRC;
  231.   buffer[data_lenght + 1] = highCRC;
  232. }
  233.  
  234. void send_buffer(char data_lenght){
  235.      char i = 0;
  236.      
  237.      DIR = 1;
  238.      delay_ms(5);
  239.      
  240.      for(i = 0; i < data_lenght; i++){
  241.        UART1_write(buffer[i]);
  242.      }
  243.  
  244.      delay_ms(5);
  245.      DIR = 0;
  246. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement