/**************************************************************** * Funktion: * * Initialisierung des Timer 1 (Impulsgenerierung für 433MhZ- * * Sender) * * => OK (30.06.2007) * ****************************************************************/ void init_timer1 (void) { // OC1B-Pin (PB6) mit Timer verbunden (Datenblatt Seite 134) // normale Funktion aktivieren TCCR1A &= ~(1< kein Interrupt TIMSK &= ~(1< Interrupt return; } // ############# Definition der Zeiten ################## // Werte für Startsequenz (Funk-Sendedaten) #define TIME_LOW_STARTSEQUENZ 60 // 470µs #define TIME_T_STARTSEQUENZ 91 // 800µs // Werte für Datenübertragung (Funk-Sendedaten) #define TIME_LOW_DATEN 48 // 470µs #define TIME_HIGH_DATEN 101 // 750µs #define TIME_T_DATEN 138 // 1200µs // Werte für Pause zwischen den Datenpaketen (Funk-Sendedaten) #define TIME_PAUSE 415 // 3600µs // Interrupt-Handler /**************************************************************** * Interrupt-Handler: * * Timer/Counter1 Overflow. => Periodendauer des gesendeten * * Funksignals. * => OK (__.06.2007) * ****************************************************************/ SIGNAL(SIG_OVERFLOW1) { if (funk.ucState == FUNK_DATENSEQUENZ) { // 11. High-Flanke von Datensequenz? if (funk.ucFunkBitZaehler == 11) { OCR1B = TIME_HIGH_DATEN; // Zeit für Sendepegel High ICR1 = TIME_PAUSE; // Periodendauer T (Zeit bis zum Überlauf) funk.ucFunkdatenZaehler++; // Datenzähler erhöhen funk.ucFunkBitZaehler = 0; // Bitzähler löschen } // 1. High-Flanke von Datensequenz? if (funk.ucFunkBitZaehler == 1) { ICR1 = TIME_T_DATEN; // Periodendauer T (Zeit bis zum Überlauf) OCR1B = TIME_HIGH_DATEN; // Zeit für Sendepegel High } funk.ucFunkBitZaehler++; // Zähler erhöhen } if (funk.ucState == FUNK_STARTSEQUENZ) { // 7. High-Flanke von Startsequenz? if (funk.ucFunkBitZaehler == 7) { //OCR1B = TIME_LOW_STARTSEQUENZ; // Zeit für Sendepegel High ICR1 = TIME_PAUSE; // Periodendauer T (Zeit bis zum Überlauf) funk.ucFunkdatenZaehler = 1; // Datenzähler auf 1 stellen funk.ucFunkBitZaehler = 0; // Bitzähler löschen funk.ucState = FUNK_DATENSEQUENZ; // Status auf nächsten Step setzen } funk.ucFunkBitZaehler++; // Zähler erhöhen } }