示例#1
0
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;
}
示例#2
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);
}
示例#3
0
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++;
    }
}
示例#4
0
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);
}
示例#5
0
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);
}