Gast
#3030820
Hallo zusammen, ich habe einen kleinen IR Empfänger programmiert (Code siehe Anlage), der auch soweit funktioniert: - Empfang von Startbit, 32 Datenbits, Stopbit - anschließend Anzeige der Puls- und Pauselängen (in Interrupt-Counts) auf 4x7 LED Display Dazu zeichne ich die jeweiligen Puls- und Pauselängen in einem Array mit 68 Integers auf (= 2 * (1+32+1)) So weit, so gut. Nun habe ich versucht, das Programm so zu modifizieren, dass die jeweiligen Puls- und Pauselängen in zwei Arrays (à 34 Elementen) getrennt aufgezeichnet werden. Dazu folgende (kleine) Programmmodifikation: void(main) ... // Modus "IR Signal empfangen" if (modus==0) { if (signal_changed==1) { cli(); counts_pulse[zaehler_phasen]=interrupt_count; signal_changed=0; interrupt_count=0; sei(); } if (signal_changed==2) { cli(); counts_pause[zaehler_phasen]=interrupt_count; signal_changed=0; interrupt_count=0; zaehler_phasen++; sei(); } if ((zaehler_phasen>=34)) { modus=1; } } ... ISR(PCINT_vect) { // IR LED an --> Wechsel aus>an --> Dauer Pausephase if (PORTB & (1<<PB0)) { signal_changed=2; } // IR LED aus --> Wechsel an>aus --> Dauer Pulsephase else { signal_changed=1; } timer_config_start; } ... Während das Originalprogramm (siehe Anlage) einwandfrei funktioniert, werden nach der Modifikation im Array counts_pulse relativ unsinnige Zahlen (zwischen 100 und 250) gesammelt und angezeigt. Irgendwie finde ich den Fehler partout nicht - zwei Ideen/Fragen: 1) Kann ich direkt in der ISR(PCINT_vect) den aktuellen Status des Pin mit (PORTB & (1<<PB0)) abfragen und daraus schließen, ob es sich um einen Wechsel an>aus oder aus>an handelt? Oder ist das (aus irgendwelchen Gründen) unzuverlässig? 2) Falls 1 geht, ist da sonst ein dummer Logikfehler im Programm? Danke für Eure Hilfe VG Mike