IR Empfänger - Auslesen TSOP Status in Pin Change Interrupt

Gast #3030820
Lesenswert?
• ▲
▼
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
Angehängte Dateien:
#3030859
Lesenswert?
• ▲
▼
Mike schrieb:


>
> 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?

Prinzipiell geht das schon.
Wenn du dann auch noch das PINB Register abfrägst und nicht das PORTB 
Register, dann funktioniert das dann auch sogar.
So hast du jetzt nur abgefragt, ob der Pullup eingeschaltet ist :-)

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.