inline __attribute__((gnu_inline)) void therm_delay(uint16_t delay){ while(delay--) asm volatile("nop"); } #include #include #include #include #include //#include #define F_CPU 3000000UL //3MHz #define LOOP_CYCLES 8 //Wiederholt es 8 mal #define us(num) (num/(LOOP_CYCLES*(1/(F_CPU/1000000.0)))) #define THERM_CMD_CONVERTTEMP 0x44 #define THERM_CMD_RSCRATCHPAD 0xbe #define THERM_CMD_WSCRATCHPAD 0x4e #define THERM_CMD_CPYSCRATCHPAD 0x48 #define THERM_CMD_RECEEPROM 0xb8 #define THERM_CMD_RPWRSUPPLY 0xb4 #define THERM_CMD_SEARCHROM 0xf0 #define THERM_CMD_READROM 0x33 #define THERM_CMD_MATCHROM 0x55 #define THERM_CMD_SKIPROM 0xcc #define THERM_CMD_ALARMSEARCH 0xec //Thermometer anschluss #define THERM_PORT PORTD #define THERM_DDR DDRD #define THERM_PIN PINC #define THERM_DQ PD0 //Utils #define THERM_INPUT_MODE() THERM_DDR&=~(1<>=1; } } void therm_read_temperature(char *buffer) { //buffer länge muss 12 bits grß sein uint8_t temp_sensor_value[2]; //reset skip rom und fangen an zulesen therm_reset(); therm_write_byte(THERM_CMD_SKIPROM); therm_write_byte(THERM_CMD_CONVERTTEMP); //warte bis er fertig gelesen hat while(!therm_read_bit()); //reset, skip rom und lese scratchpad therm_reset(); therm_write_byte(THERM_CMD_SKIPROM); therm_write_byte(THERM_CMD_RSCRATCHPAD); //Lese nur die erste beiden bytes vom scratchpad temp_sensor_value[0]=therm_read_byte(); temp_sensor_value[1]=therm_read_byte(); therm_reset(); //sende temp an lcd anzeige //writeTemperature(temperature, 2); //pi_regler(temperature, temp_sensor_value, esum); }