void OW_selectPort(unsigned char port) { switch(port) { case 1: ow_set_bus(&PIND,&PORTD,&DDRD,PD4); break; case 2: ow_set_bus(&PIND,&PORTD,&DDRD,PD5); break; case 3: ow_set_bus(&PIND,&PORTD,&DDRD,PD6); break; } }
void set1WirePin(struct IO_pin *vpin, uint8_t power_mode) { uint8_t port_num = 0; uint8_t pin_num = 0; uint8_t eeprom_virt_data_addr = 0; #ifndef OW_ONE_BUS //set current pin to current used 1 wire bus ow_set_bus(vpin->PPIN, vpin->PPORT, vpin->PDDR, vpin->pin); #endif for (uint8_t vpin_num = 0; vpin_num < COUNT_IO_PINS; vpin_num++) { port_num = vpin_num/8; pin_num = vpin_num%8; eeprom_virt_data_addr = VIRTUAL_DATA_START + (port_num * (VIRTUAL_PORT_PINCOUNT * VIRTUAL_DATA_LENGTH)) + (pin_num * VIRTUAL_DATA_LENGTH); if(&io_pins[port_num].pins[pin_num] == vpin) { I2C_MAIN_DEBUG("Found OW PIN[0x%x;0x%x]\r\n", port_num, pin_num); //reset data txbuffer[eeprom_virt_data_addr] = 0; txbuffer[eeprom_virt_data_addr + 1] = 0xFF; txbuffer[eeprom_virt_data_addr + 2] = 0; txbuffer[eeprom_virt_data_addr + 3] = 0; break; } } DS18X20_start_meas( power_mode, NULL ); }
void read1WirePin(struct IO_pin *vpin, uint8_t power_mode) { uint8_t port_num = 0; uint8_t pin_num = 0; uint8_t ram_virt_data_addr = 0; uint16_t result; uint8_t subzero, cel, cel_frac_bits; uint8_t *tempID = 0; for (uint8_t vpin_num = 0; vpin_num < COUNT_IO_PINS; vpin_num++) { port_num = vpin_num/8; pin_num = vpin_num%8; ram_virt_data_addr = VIRTUAL_DATA_START + (port_num * (VIRTUAL_PORT_PINCOUNT * VIRTUAL_DATA_LENGTH)) + (pin_num * VIRTUAL_DATA_LENGTH); if(&io_pins[port_num].pins[pin_num] == vpin) { //try to find virtual pin by given pointer I2C_MAIN_DEBUG("Found OW PIN[0x%x;0x%x]\r\n", port_num, pin_num); tempID = &rxbuffer[ram_virt_data_addr]; //get 1 wire rom code pointer #ifndef OW_ONE_BUS //set current pin to current used 1 wire bus ow_set_bus(vpin->PPIN, vpin->PPORT, vpin->PDDR, vpin->pin); #endif if ( ss%10 == 5 ) { I2C_MAIN_DEBUG("st OW\r\n"); DS18X20_start_meas( power_mode, NULL ); } if (ss % 10 == 8) { I2C_MAIN_DEBUG("rd OW\r\n"); txbuffer[ram_virt_data_addr]++; //raise seqnr if (DS18X20_read_meas(tempID, &subzero, &cel, &cel_frac_bits) == DS18X20_OK) { result = DS18X20_temp_to_decicel(subzero, cel, cel_frac_bits); // Minuswerte: if (subzero) result *= (-1); I2C_MAIN_DEBUG("T:%i\r\n", result); txbuffer[ram_virt_data_addr + 1] = 0; //set data ok txbuffer[ram_virt_data_addr + 2] = result >> 8; //high byte txbuffer[ram_virt_data_addr + 3] = result & 0xFF; //low byte } else {
void OW_selectPort(unsigned char port) { switch(port) { // hack in to work #ifdef PD4 case 1: ow_set_bus(&PIND,&PORTD,&DDRD,PD4); break; case 2: ow_set_bus(&PIND,&PORTD,&DDRD,PD5); break; case 3: ow_set_bus(&PIND,&PORTD,&DDRD,PD6); break; #else case 1: ow_set_bus(&PIND,&PORTD,&DDRD,PORTD4); break; case 2: ow_set_bus(&PIND,&PORTD,&DDRD,PORTD5); break; case 3: ow_set_bus(&PIND,&PORTD,&DDRD,PORTD6); break; #endif //SBNG S3 L has 5busses } }
void hw_init() { /* Status LED */ DDRB |= (1<<PB1); /* Init onewire */ #ifndef OW_ONE_BUS ow_set_bus(&PINB,&PORTB,&DDRB,PB0); #endif /* Init controller */ ctrl_init(); }
void init_temperature(void) { nTempSensors = 0; uint8_t bus; for( bus = 0; bus < N_1W_BUS; bus++ ) { #ifndef OW_ONE_BUS ow_set_bus(&PINB,&PORTB,&DDRB,PB0+bus); #endif //uint8_t sc = search_sensors(bus); } }
static void request_temperature_measurement(void) { uint8_t bus; for( bus = 0; bus < N_1W_BUS; bus++ ) { #ifndef OW_ONE_BUS ow_set_bus(&PINB,&PORTB,&DDRB,PB0+bus); #endif // if( DS18X20_start_meas( DS18X20_POWER_PARASITE, NULL ) != DS18X20_OK) if( DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL ) != DS18X20_OK) { // Error starting temp mesaure. REPORT_ERROR(ERR_FLAG_1WIRE_START_FAULT); //ow_error_cnt++; //ow_bus_error_cnt[bus]; count_1w_bus_error( bus ); //led1_timed( 200 ); } } }
void read_temperature_data(void) { uint8_t i; for ( i = 0; i < nTempSensors; i++ ) { uint16_t out; #ifndef OW_ONE_BUS ow_set_bus(&PINB,&PORTB,&DDRB,PB0+gTempSensorBus[i]); #endif if ( DS18X20_read_meas_word(&gTempSensorIDs[i][0], &out) != DS18X20_OK ) { REPORT_ERROR(ERR_FLAG_1WIRE_READ_FAULT); //ow_error_cnt++; //ow_bus_error_cnt[i]++; count_1w_bus_error( i ); continue; } //led2_timed( 15 ); currTemperature[i] = out; } }
int main( void ) { uint8_t nSensors, i; int16_t decicelsius; uint8_t error; uart_init((UART_BAUD_SELECT((BAUD),F_CPU))); #ifndef OW_ONE_BUS ow_set_bus(&PINA,&PORTA,&DDRA,PA6); #endif sei(); uart_puts_P( NEWLINESTR "DS18X20 1-Wire-Reader Demo by Martin Thomas" NEWLINESTR ); uart_puts_P( "-------------------------------------------" ); nSensors = search_sensors(); uart_put_int( (int)nSensors ); uart_puts_P( " DS18X20 Sensor(s) available:" NEWLINESTR ); #if DS18X20_VERBOSE for (i = 0; i < nSensors; i++ ) { uart_puts_P("# in Bus :"); uart_put_int( (int)i + 1); uart_puts_P(" : "); DS18X20_show_id_uart( &gSensorIDs[i][0], OW_ROMCODE_SIZE ); uart_puts_P( NEWLINESTR ); } #endif for ( i = 0; i < nSensors; i++ ) { uart_puts_P( "Sensor# " ); uart_put_int( (int)i+1 ); uart_puts_P( " is a " ); if ( gSensorIDs[i][0] == DS18S20_FAMILY_CODE ) { uart_puts_P( "DS18S20/DS1820" ); } else if ( gSensorIDs[i][0] == DS1822_FAMILY_CODE ) { uart_puts_P( "DS1822" ); } else { uart_puts_P( "DS18B20" ); } uart_puts_P( " which is " ); if ( DS18X20_get_power_status( &gSensorIDs[i][0] ) == DS18X20_POWER_PARASITE ) { uart_puts_P( "parasite" ); } else { uart_puts_P( "externally" ); } uart_puts_P( " powered" NEWLINESTR ); } #if DS18X20_EEPROMSUPPORT if ( nSensors > 0 ) { eeprom_test(); } #endif if ( nSensors == 1 ) { uart_puts_P( NEWLINESTR "There is only one sensor " "-> Demo of \"DS18X20_read_decicelsius_single\":" NEWLINESTR ); i = gSensorIDs[0][0]; // family-code for conversion-routine DS18X20_start_meas( DS18X20_POWER_PARASITE, NULL ); _delay_ms( DS18B20_TCONV_12BIT ); DS18X20_read_decicelsius_single( i, &decicelsius ); uart_put_temp( decicelsius ); uart_puts_P( NEWLINESTR ); } for(;;) { // main loop error = 0; if ( nSensors == 0 ) { error++; } uart_puts_P( NEWLINESTR "Convert_T and Read Sensor by Sensor (reverse order)" NEWLINESTR ); for ( i = nSensors; i > 0; i-- ) { if ( DS18X20_start_meas( DS18X20_POWER_PARASITE, &gSensorIDs[i-1][0] ) == DS18X20_OK ) { _delay_ms( DS18B20_TCONV_12BIT ); uart_puts_P( "Sensor# " ); uart_put_int( (int) i ); uart_puts_P(" = "); if ( DS18X20_read_decicelsius( &gSensorIDs[i-1][0], &decicelsius) == DS18X20_OK ) { uart_put_temp( decicelsius ); } else { uart_puts_P( "CRC Error (lost connection?)" ); error++; } uart_puts_P( NEWLINESTR ); } else { uart_puts_P( "Start meas. failed (short circuit?)" ); error++; } } uart_puts_P( NEWLINESTR "Convert_T for all Sensors and Read Sensor by Sensor" NEWLINESTR ); if ( DS18X20_start_meas( DS18X20_POWER_PARASITE, NULL ) == DS18X20_OK) { _delay_ms( DS18B20_TCONV_12BIT ); for ( i = 0; i < nSensors; i++ ) { uart_puts_P( "Sensor# " ); uart_put_int( (int)i + 1 ); uart_puts_P(" = "); if ( DS18X20_read_decicelsius( &gSensorIDs[i][0], &decicelsius ) == DS18X20_OK ) { uart_put_temp( decicelsius ); } else { uart_puts_P( "CRC Error (lost connection?)" ); error++; } uart_puts_P( NEWLINESTR ); } #if DS18X20_MAX_RESOLUTION int32_t temp_eminus4; for ( i = 0; i < nSensors; i++ ) { uart_puts_P( "Sensor# " ); uart_put_int( i+1 ); uart_puts_P(" = "); if ( DS18X20_read_maxres( &gSensorIDs[i][0], &temp_eminus4 ) == DS18X20_OK ) { uart_put_temp_maxres( temp_eminus4 ); } else { uart_puts_P( "CRC Error (lost connection?)" ); error++; } uart_puts_P( NEWLINESTR ); } #endif } else { uart_puts_P( "Start meas. failed (short circuit?)" ); error++; } #if DS18X20_VERBOSE // all devices: uart_puts_P( NEWLINESTR "Verbose output" NEWLINESTR ); DS18X20_start_meas( DS18X20_POWER_PARASITE, NULL ); _delay_ms( DS18B20_TCONV_12BIT ); DS18X20_read_meas_all_verbose(); #endif if ( error ) { uart_puts_P( "*** problems - rescanning bus ..." ); nSensors = search_sensors(); uart_put_int( (int) nSensors ); uart_puts_P( " DS18X20 Sensor(s) available" NEWLINESTR ); error = 0; } _delay_ms(3000); } }
int main( void ) { uint8_t i=0; int16_t decicelsius; uint8_t error; uint8_t delayCounter=0; hw_init(); uart_init((UART_BAUD_SELECT((BAUD),F_CPU))); memset(&sensor_fw, 0, sizeof(_sensor_data)); /* init 485 write */ DDRB |= 0b0000001; //1 = output, 0 = input //PORTB |= 0b00000001; //Enable pin 5 internal pullup PORTB &= 0b11111110; //Enable pin 5 internal pullup read //PORTB |= 0b00000001; //Enable pin 5 internal pullup 485 write led_g_on(); _delay_ms(1000); led_y_on(); _delay_ms(1000); led_r_on(); _delay_ms(1000); led_r_off(); _delay_ms(1000); led_y_off(); _delay_ms(1000); led_g_off(); #ifndef OW_ONE_BUS ow_set_bus(&PIND,&PORTD,&DDRD,PD6); #endif led_g_on(); search_bus(); led_g_off(); sei(); sensor_fw.fw_state = FW_STATE_SENSOR_START_MEAS; for(;;) { // main loop switch (sensor_fw.fw_state) { case FW_STATE_SENSOR_SEARCH: led_g_on(); search_bus(); led_g_off(); uart_puts_P("FW_STATE_SENSOR_SEARCH? =0\n"); sensor_fw.fw_state = FW_STATE_SENSOR_START_MEAS; break; case FW_STATE_SENSOR_START_MEAS: if ( sensor_fw.sensor_num == 0 ) { sensor_fw.fw_state = FW_STATE_SENSOR_SEARCH; uart_puts_P("error sensor num =0\n"); break; } if ( DS18X20_start_meas( DS18X20_POWER_PARASITE, NULL ) == DS18X20_OK) { sensor_fw.fw_state = FW_STATE_SENSOR_DELAY_750ms; //reset_timeout(); } else { sensor_fw.fw_state = FW_STATE_SENSOR_SEARCH; uart_puts_P("error start mes faul =0\n"); } break; case FW_STATE_SENSOR_DELAY_750ms: //if (TCNT1 > 5400) //750 ms _delay_ms( DS18B20_TCONV_12BIT ); { sensor_fw.fw_state = FW_STATE_SENSOR_READ_I; i = 0; } break; case FW_STATE_SENSOR_READ_I: if ( DS18X20_read_decicelsius(&sensor_fw.sensors[i].id[0], &decicelsius ) == DS18X20_OK ) { sensor_fw.sensors[i].temp = decicelsius; uart_puts_P( "Sensor# " ); uart_put_int( (int)i + 1 ); uart_puts_P(" = "); uart_put_temp( decicelsius ); uart_puts_P( NEWLINESTR ); } else { //uart_puts_P( "CRC Error (lost connection?)" ); sensor_fw.fw_state = FW_STATE_SENSOR_SEARCH; uart_puts_P("error lost connection? =0\n"); break; } i++; if (i >= sensor_fw.sensor_num) { sensor_fw.fw_state = FW_STATE_SENSOR_DELAY_5s; delayCounter = 0; //reset_timeout(); } //uart_puts_P( NEWLINESTR ); break; case FW_STATE_SENSOR_DELAY_5s: //if (TCNT1 > (5 * TICKS_PER_SEC)) /*5s*/ _delay_ms( 1000 ); { if(delayCounter > 5) sensor_fw.fw_state = FW_STATE_SENSOR_START_MEAS; delayCounter++; } break; case FW_STATE_READ_COMM: { //uart_puts_P( "Communication cmd rx\n" ); switch(sensor_fw.comm.rxbuff[2]) { case 0x01: sensor_fw.comm.txbuff[0] = 0x7E; sensor_fw.comm.txbuff[1] = 0x01; // dev_id sensor_fw.comm.txbuff[2] = 0x02; // len sensor_fw.comm.txbuff[3] = 0x00; // len sensor_fw.comm.txbuff[4] = 0xBB; // data sensor_fw.comm.txbuff[5] = 0xBB; // data sensor_fw.comm.txbuff[6] = 0x00; // crc sensor_fw.comm.txbuff[7] = 0x00; // crc uart_putData(sensor_fw.comm.txbuff,8); break; } sensor_fw.comm.rxlen = 0; sensor_fw.comm.valid_cmd = 0; sensor_fw.fw_state = FW_STATE_SENSOR_START_MEAS; } break; } if(sensor_fw.comm.valid_cmd) { sensor_fw.fw_state = FW_STATE_READ_COMM; } //_delay_ms(3000); } }
void handle_input(char* input) { if (state == START) { if (strcmp("set fan\r", input) == 0) { print_usb("enter fan speed, 0...40 \n\r"); /* advance state machine */ state = SET_FAN; } else if (strcmp("set pump\r", input) == 0) { print_usb("enter pump speed, 0...200 \n\r"); /* advance state machine */ state = SET_PUMP; } else if (strcmp("set led\r", input) == 0) { print_usb("enter led brightness, 0...255 \n\r"); /* advance state machine */ state = SET_LED; } else if (strcmp("read temp\r", input) == 0) { print_usb("reading temp... \n\r"); /* advance state machine */ state = READ_TEMP; } else { /* didnt understand string */ print_usb("did not understand command \n\r"); /* dont change state */ state = START; } } else if (state == SET_LED) { static uint16_t pwm; char *garbage = NULL; pwm = strtol(input, &garbage, 0); OCR4A = pwm; print_usb("led set. \n\r"); /* go back to start */ state = START; } else if (state == SET_FAN) { static uint16_t pwm; char *garbage = NULL; pwm = strtol(input, &garbage, 0); OCR3A = pwm; print_usb("fan set. \n\r"); /* go back to start */ state = START; } else if (state == SET_PUMP) { static uint16_t pwm; char *garbage = NULL; pwm = strtol(input, &garbage, 0); OCR4B = pwm; print_usb("pump set. \n\r"); /* go back to start */ state = START; } else if (state == READ_TEMP) { uint8_t nSensors; char maxres_buffer[10]; ow_set_bus(&PIND, &PORTD, &DDRD, PD4); ow_reset(); /* search for temperature sensors */ nSensors = search_sensors(); /* classify sensors */ classify_sensors(nSensors); /* measure temperature */ measure_temp(nSensors, temp_eminus4); DS18X20_format_from_maxres(temp_eminus4[0], maxres_buffer, 10); print_usb("\n\r "); print_usb("temp max res 1: "); print_usb(maxres_buffer); print_usb("\n\r "); DS18X20_format_from_maxres(temp_eminus4[1], maxres_buffer, 10); print_usb("temp max res 2: "); print_usb(maxres_buffer); print_usb("\n\r "); /* go back to start */ state = START; } else { CDC_Device_SendString(&USB_Interface, "went into unknown state!? \n\r"); state = START; } }