int main() { int temp = GetTempFromTsic(); unsigned char temperature[4]; CalculateTemp(temp , temperature); RFM12_send_Temperature(temperature); } int GetTempFromTsic() { int temp = 0; while(!temp) { temp = ReadTsic(); } return temp; } int ReadTsic() { int Temp = 0, TempH = 0 , TempL = 0; //Power Up TSIC und warten 125 µs PORTD |= (1 << PD5); _delay_us(125); //Interrupts an sei(); while(PIND & (1<> 8); unsigned char TStrobeL = (unsigned char) TStrobe; Timer1_stop(); //Get First data byte and Parity bit for(char i = 0; i < 9; i++) { Timer1_CtcMode(TStrobeL , TStrobeH); while(!ISR.flagTimer1); Timer1_stop(); ISR.flagTimer1 = 0; if(PIND & (1<> 1; TempL = TempL >> 1; Temp = (TempH << 8) + TempL; //DEBUG /*unsigned char data[2]; data[0] = TempH; data[1] = TempL; EEPROM_write(data , 0 , 2);*/ //falls OK dann Adc zurückgeben ansonsten Fehler Code NULL if(!OK) {return 0;} else {return Temp;} } char Parity(int Hi , int Lo) { int TestH = Hi; int TestL = Lo; char ParityChk = 0; //parity bits prüfen und danach löschen unsigned char ChkSum1 = 0, ChkSum2 = 0; //parity bits holen unsigned char parity1 = (unsigned char) (TestH & 0x01); unsigned char parity2 = (unsigned char) (TestL & 0x01); //parity bits löschen TestH = TestH >> 1; TestL = TestL >> 1; unsigned char help1 = (unsigned char) TestH; unsigned char help2 = (unsigned char) TestL; for(unsigned char i = 0; i < 8; i++) //bits addieren { ChkSum1 += ((help1 >> i) & 0x01); ChkSum2 += ((help2 >> i) & 0x01); } ChkSum1 = ChkSum1 % 2; ChkSum2 = ChkSum2 % 2; if( (parity1 == ChkSum1) && (parity2 == ChkSum2) ) { ParityChk = 1; } else { ParityChk = 0; } return ParityChk; } void CalculateTemp(unsigned int temp , unsigned char *data) { long int cal = (long int) temp; cal = cal * 2000; cal = cal / 2047; cal = cal - 500; unsigned char hun = (unsigned char) (cal / 1000); unsigned char zen = (unsigned char) ((cal - (hun * 1000)) / 100); unsigned char ein = (unsigned char) (cal - (hun * 1000) - (zen * 100)) / 10; unsigned char dez = (cal - (hun * 1000) - (zen * 100) - (ein * 10)); //auf ASCII bringen hun += 0x30; zen += 0x30; ein += 0x30; dez += 0x30; *data++ = hun; *data++ = zen; *data++ = ein; *data++ = '.'; *data++ = dez; } void Timer1_stop() { TCCR1A = 0x00; //PWM aus TCNT1L = 0x00; TCNT1H = 0x00; //Zählregister des Timers auf 0 setzten TCCR1B = 0x00; //CPU Takt durch 1024 und CTC Modus ein TIMSK = 0x00; //Output Compare Interrupt ein } //initialisiert Timer so Überlauf-ISR void Timer1_NormalMode() { TCCR1A = 0x00; //PWM aus TCNT1L = 0x00; TCNT1H = 0x00; //Zählregister des Timers auf 0 setzten TCCR1B = 0x01; //CPU Takt durch 1 } //initialisiert Timer so Überlauf-ISR void Timer1_CtcMode(unsigned char low , unsigned char high) { OCR1AH = high; //für CTC Modus vergleicher setzen OCR1AL = low; TCCR1A = 0x00; //PWM aus TCNT1L = 0x00; TCNT1H = 0x00; //Zählregister des Timers auf 0 setzten TIMSK = 0x10; //Output Compare Interrupt ein TCCR1B = 0x09; //CPU Takt durch 1 und CTC Modus ein } //CTC Interrupt ISR(TIMER1_COMPA_vect) { ISR.flagTimer1 = 1; }