Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define LED PORTA.RA5
- #define BTN PORTB.RB5
- #define DIR PORTD.RD4
- /*
- Variaveis referente ao tratamento do protocolo
- */
- #define SLAVE_ADRESS 1
- char buffer[20];
- /*
- Function codes
- */
- const char READ_COIL = 0x01;
- const char WRITE_COIL = 0x05;
- const char READ_INPUT_REGISTER = 0x03;
- unsigned int read_temperature();
- void crc_calc_and_send(char dataLenght);
- void crc_calc(char dataLenght);
- void send_buffer(char dataLenght);
- void decode_packet();
- unsigned int temp = 0;
- bit led_status;
- //DHT11 DEFINITONS
- sbit DHT11_Pin at PORTB.B0;
- sbit DHT11_DIR at TRISB.B0;
- extern unsigned int DHT11_TMP;
- extern unsigned int DHT11_HUM;
- extern char DHT11_CHKSM;
- //END OF DHT11 DEFINITONS
- void main() {
- int timeout = 0;
- char packet_index = 0;
- TRISA = 0b11011111;
- TRISB = 0xFF;
- TRISD = 0;
- LED = 0;
- led_status = 0;
- DIR = 0; //listening for bus data
- ADC_Init(); /* Initialize the ADC module */
- DHT11_init();
- UART1_init(9600);
- Soft_UART_Init(&PORTB, 5, 4, 9600, 0); // debug stuff , rx pin RB5 and tx pin RB4
- while(1){
- timeout++;
- delay_us(1);
- if(timeout == 3640){ //timeout if no data is received
- timeout = 0;
- packet_index = 0;
- }
- if(!UART1_data_ready()) // don't proceed if UART is not ready
- continue;
- buffer[packet_index] = UART1_read(); // read packet
- // Soft_UART_Write( buffer[packet_index]); //debug stuff
- packet_index++;
- timeout = 0;
- if(packet_index < 8) // continue reading packet
- continue;
- // packet end, start decoding
- packet_index = 0; //reset index
- if(buffer[0] != SLAVE_ADRESS) // don't proceed if slave id doesn't match
- continue;
- decode_packet();
- }
- }
- void decode_packet(){
- char function_code = buffer[1];
- if(function_code == READ_COIL){
- if(buffer[2] == 0x00 && buffer[3] == 0x02){ //check register number
- buffer[2] = 0x01; //1 byte count
- if(BTN)
- buffer[3] = 0x00; // input state
- else
- buffer[3] = 0x01; // input state
- crc_calc_and_send(4);
- }
- }
- if(function_code == WRITE_COIL){
- if(buffer[2] == 0x30 && buffer[3] == 0x20){ //check register number
- if(buffer[4] == 0xFF){
- LED = 1;
- led_status = 1;
- }
- if(buffer[4] == 0x00){
- LED = 0;
- led_status = 0;
- }
- crc_calc_and_send(6);
- }
- }
- if(function_code == READ_INPUT_REGISTER){
- if(buffer[4] == 0x00 && buffer[5] == 0x01){ //check size of data
- if(buffer[2] == 0x00 && buffer[3] == 0x01){ //check register number (potenciometer)
- buffer[2] = 0x00; //2 byte count
- buffer[3] = 0x02; //2 byte count
- buffer[4] = 0;
- buffer[5] = ADC_Read(0) >> 2; // convert 10 bits adc value to 8 bits
- crc_calc_and_send(6);
- }
- if(buffer[2] == 0x00 && buffer[3] == 0x02){ //check register number (dht11 temp)
- buffer[2] = 0x00; //2 byte count
- buffer[3] = 0x02; //2 byte count
- Dht11_Start();
- DHT11_Read();
- if(DHT11_CHKSM==((DHT11_TMP>>8)+(DHT11_HUM>>8)+(DHT11_TMP&0xff)+(DHT11_HUM&0xff))){
- buffer[4] = 0;
- buffer[5] = DHT11_TMP>>8; // convert dht11 temp value to 8 bits
- }
- crc_calc_and_send(6);
- }
- if(buffer[2] == 0x00 && buffer[3] == 0x03){ //check register number (dht11 temp)
- buffer[2] = 0x00; //2 byte count
- buffer[3] = 0x02; //2 byte count
- Dht11_Start();
- DHT11_Read();
- if(DHT11_CHKSM==((DHT11_TMP>>8)+(DHT11_HUM>>8)+(DHT11_TMP&0xff)+(DHT11_HUM&0xff))){
- buffer[4] = 0;
- buffer[5] = DHT11_HUM>>8; // convert dht11 temp value to 8 bits
- }
- crc_calc_and_send(6);
- }
- if(buffer[2] == 0x00 && buffer[3] == 0x04){ //check register number (ds18b20 temp)
- buffer[2] = 0x00; //2 byte count
- buffer[3] = 0x02; //2 byte count
- Ow_Reset(&PORTC, 5); // Onewire reset signal
- Ow_Write(&PORTC, 5, 0xCC); // Issue command SKIP_ROM
- Ow_Write(&PORTC, 5, 0x44); // Issue command CONVERT_T
- Delay_us(120);
- Ow_Reset(&PORTC, 5);
- Ow_Write(&PORTC, 5, 0xCC); // Issue command SKIP_ROM
- Ow_Write(&PORTC, 5, 0xBE); // Issue command READ_SCRATCHPAD
- buffer[5] = Ow_Read(&PORTC, 5); // Write MSB
- buffer[4] = Ow_Read(&PORTC, 5); // Write LSB
- crc_calc_and_send(6);
- }
- }
- }
- }
- void crc_calc_and_send(char data_lenght){
- crc_calc(data_lenght);
- send_buffer(data_lenght + 2);
- }
- void crc_calc(char data_lenght){
- unsigned int checksum = 0xFFFF;
- char j;
- char i;
- unsigned char lowCRC;
- unsigned char highCRC;
- for(j = 0; j < data_lenght; j++){
- checksum ^= (unsigned int)buffer[j];
- for(i = 8;i > 0; i--){
- if((checksum) & 0x0001)
- checksum = (checksum >> 1)^0xA001;
- else
- checksum >>=1;
- }
- }
- highCRC = checksum >> 8;
- lowCRC = checksum;
- buffer[data_lenght] = lowCRC;
- buffer[data_lenght + 1] = highCRC;
- }
- void send_buffer(char data_lenght){
- char i = 0;
- DIR = 1;
- delay_ms(5);
- for(i = 0; i < data_lenght; i++){
- UART1_write(buffer[i]);
- }
- delay_ms(5);
- DIR = 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement