Forum: Mikrocontroller und Digitale Elektronik IR Empfänger - Auslesen TSOP Status in Pin Change Interrupt


von Mike (Gast)


Angehängte Dateien:

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

von Karl H. (kbuchegg)


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 :-)

von Mike (Gast)


Lesenswert?

Oh Mann, danke für den Hinweis :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.