#include #include #include #include int tag=1; // Tagbetrieb=1 , Nachtbetrieb=0 uint8_t zeichen; // Variable zeichen void print(char buffer[]); //----------- Empfangen ---------------------------- SIGNAL(SIG_UART_RECV) // USART RX interrupt { zeichen = UDR; // Empfangen des Zeichens switch (zeichen) { case 'T': // Wenn Zeichen ein 'T' dann ... tag=1; // Tagbetrieb break; case 'N': // Wenn Zeichen ein 'N' dann ... tag=0; // Nachtbetrieb break; default: print("ungueltig "); } } //----------- Senden ----------------------------- void print(char buffer[]) { int32_t i; for ( i=0; buffer[i]!=0; i++ ) // For-Schleife: Abbruch wenn Zeichenfolge { // zu Ende ist, sonst "i" inkrementieren while (bit_is_clear(UCSRA,5)) // Solange Zeichen noch nicht vollständig... { ; // ...übermittelt wurde, tue nichts! (warte) } UDR = buffer[i]; // Danach: Sende aktuelles ("i"-tes) Zeichen } } //----------- Hauptprogramm ------------------------- int main (void) { DDRC = 0b00000000; // Port C als Eingang UBRRL = 23; // 9600Baud siehe Baudratentabelle UCSRB = 0b10011000; // Sender ein UCR = UCSRB uint16_t x; // Variable zeichen sei(); while (1) { ADCSR=0b11000101; // ADC Einstellen und Starten while (bit_is_set(ADCSR,6)); // Warten bis Umwandlung von PINC0 erfolgt ist. x=ADCW; // Wert aus dem ADC holen if (tag==1) // Bei Tagbetrieb { print("T"); // Sende Tagbetrieb timer16(1000); if (x<=800) // Temp kleiner als 150 = 18°C { print("H"); // Heizen senden } else { print("X"); // nicht Heizen } } if (tag==0) // Bei Nachbetrieb { print("N"); // Sende Nachtbetrieb timer16(1000); print("A"); // Sende Absenkung timer16(1000); if (x<=400) // Temp kleiner als 100 = 15°C { print("H"); // Heizen senden } else { print("X"); // nicht Heizen } } timer16(1000); // warte eine halbe Sekunde } }