uint8_t onewire_read_temp (struct onewire_temp_sensor *sensor) //Temperatur eines DS18x20 auslesen und umrechnen { uint8_t spad[9]; uint8_t i; uint8_t crc = 0; float temp_f; //einzelnen Sensor ansprechen onewire_reset(); if (onewire_presence_pulse == 0) { return 0; } onewire_send_byte(match_rom); for (i=0; i<8; i++) { onewire_send_byte(sensor->rom[i]); } //Scratchpad auslesen onewire_send_byte(read_spad); for (i=0; i<9; i++) { spad[i] = onewire_read_byte(); } //CRC Check for (i=0; i<9; i++) { crc = _crc_ibutton_update(crc, spad[i]); } //Temperatur berechnen if (crc == 0) { //0,5°C Bit löschen spad[temperature_lsb] &= ~(1<<0); //Temperatur umrechnen if (spad[temperature_msb] == 0) { temp_f = spad[temperature_lsb]/2.0; } else { i = ~(spad[temperature_lsb]); temp_f = i+1; temp_f = (temp_f*(-1))/2.0; } //Nachkommaberechnung temp_f = temp_f-0.25+(16.0-spad[count_remain])/16.0; //Umrechnung, um Kommazahl als Int zu speichern und abspeichern sensor->temperature = temp_f*100; return 1; } return 0; }
void onewire_send_command(uint8_t *rom, uint8_t command) { //1Wire-Slave über die 64-bit Adresse ansprechen unsigned char i; onewire_reset(); for (i=0; i<8; i++) { onewire_send_byte(*rom); rom++; } onewire_send_byte(command); }
void onewire_read_rom(uint8_t *rom) { //Lesen der 64-bit Adresse onewire_reset(); onewire_send_byte(read_rom); /*Schleifenzähler läuft rückwärts, weil der Slave mit dem letzten Byte (Family-Code) anfängt und so der ROM-Code richtig herum in "adresse" steht*/ for (uint8_t i=8; i>0; i--) { *rom = onewire_read_byte(); rom++; } }
int main() { U32 T_LED = 0L; // time of last digit update U32 Tow = 0L; // 1-wire time U32 T_btns = 0L; // buttons timer U8 old_btns_state = 0; U8 show_temp = 0; // =0 to show number; = 1 to show temp // Configure clocking CLK_CKDIVR = 0; // F_HSI = 16MHz, f_CPU = 16MHz // Configure pins CFG_GCR |= 1; // disable SWIM LED_init(); CCR |= 0x28; // make shure that we are on level 3 - disabled SW priority // Configure Timer1 // prescaler = f_{in}/f_{tim1} - 1 // set Timer1 to 1MHz: 16/1 - 1 = 15 TIM1_PSCRH = 0; TIM1_PSCRL = 15; // LSB should be written last as it updates prescaler // auto-reload each 1ms: TIM_ARR = 1000 = 0x03E8 TIM1_ARRH = 0x03; TIM1_ARRL = 0xE8; // interrupts: update TIM1_IER = TIM_IER_UIE; // auto-reload + interrupt on overflow + enable TIM1_CR1 = TIM_CR1_APRE | TIM_CR1_URS | TIM_CR1_CEN; onewire_setup(); eeprom_default_setup(); // enable all interrupts enableInterrupts(); set_display_buf("---"); if(get_starting_val()){ matchROM = 1; // if ROMs not empty, start scanning starting_val = 0; // reset starting value } start_temp_reading(); // Loop do { if(((U16)(Global_time - T_time) > temper_delay) || (T_time > Global_time)){ T_time = Global_time; if(show_temp){ // show temperature temper_delay = TEMPER_delay; show_temp = 0; if(!temp_ready || temp_readed == ERR_TEMP_VAL){ set_display_buf("eab"); }else{ temp_ready = 0; if(temp_readed > -100 && temp_readed < 1000){ display_int((int)temp_readed, 0); display_DP_at_pos(1); }else{ // display only integer part display_int((int)temp_readed/10, 0); } } if(matchROM) ++starting_val; }else{ // show number show_temp = 1; temper_delay = NUMBER_delay; if(matchROM){ if(get_starting_val()){ display_int(starting_val+1,0); read_next_sensor(); }else{ starting_val = 0; if(start_temp_reading()){ if(!get_starting_val()){ matchROM = 0; set_display_buf("eee"); }else{ display_int(starting_val+1,0); read_next_sensor(); } } } }else{ start_temp_reading(); } } } if((U8)(Global_time - T_LED) > LED_delay){ T_LED = Global_time; show_next_digit(); } if((U8)(Global_time - T_btns) > BTNS_delay){ T_btns = Global_time; if(!block_keys && old_btns_state != buttons_state){ U8 pressed = old_btns_state & ~buttons_state; // pressed buttons are ones if(pressed){ // some buttons were pressed if(pressed & STORE_BTN){ if(onewire_reset()){ delete_notexistant = 0; block_keys = 1; onewire_send_byte(OW_READ_ROM); while(OW_BUSY); ow_process_resdata = store_last_ROM; onewire_receive_bytes(8); } }else if(pressed & DELETE_BTN){ delete_notexistant = 1; }else if(pressed & DELALL_BTN){ U8 i; for(i = 0; i < MAX_SENSORS; i++){ erase_saved_ROM(i); set_display_buf("---"); matchROM = 0; } } //display_int(pressed, 0); }else{ // some buttons released //display_int(~old_btns_state & buttons_state, 0); // released are ones } } old_btns_state = buttons_state; } if(Global_time != Tow){ // process every byte not frequently than once per 1ms Tow = Global_time; process_onewire(); } if(waitforread){ if(onewire_reset()){ ow_process_resdata = send_read_seq; waitforread = 0; if(!matchROM){ ow_data_array[0] = OW_READ_SCRATCHPAD; ow_data_array[1] = OW_SKIP_ROM; onewire_send_bytes(2); }else{ read_next_sensor(); } } } } while(1); }
void onewire_start_temp(void) { // Temperaturmessung an allen DS18x20 starten onewire_reset(); onewire_send_byte(skip_rom); onewire_send_byte(convert_t); }
void readAddress(){ onewire_send_byte(0x33); }