Forum: Mikrocontroller und Digitale Elektronik IR Dekoder - Problem mit Interrupt-/Programmsteuerung


von Mike (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe ein Programm geschrieben, um ein IR-Signal zu dekodieren und 
die übertragenen Daten auf einem 4x7 LED Display anzuzeigen. Code siehe 
Anlage. Leider habe ich das Phänomen, dass das Programm nicht zuverlässg 
funktioniert, sondern eher "sporadisch" - d. h. ich sende immer wieder 
das gleiche Signal, und so in der Hälfte der Fälle wird es richtig 
entschlüsselt und angezeigt (State Machine zum Empfang durchlaufen) - in 
der anderen Hälfte nicht (leider erkenne ich keine wirkliche 
Regelmäßigkeit...). Manchmal scheint das Programm aus dem Modus 1 
"Anzeige Ergebnis" nicht mehr richtig in den Modus 0 "IR-Signal 
empfangen" zurück zu kommen.

Ich hatte vor ein paar Tagen schon mal ähnliche Probleme, die auf 
verschiedene Anfängerfehler zurückzuführen waren (siehe Thread 
Beitrag "Compiler Optimization Level (-O1) ändert Ablauflogik?") Nun denke ich, alle Eure 
Hinweise beachtet zu haben und finde (wieder mal) partout keine Fehler 
im Programm...

Ist da noch ein genereller Fehler in der Ablauflogik und/oder 
Interruptsteuerung drin, so dass das Programm nur "auf gut Glück" mal 
funktioniert?

Und noch ein Randproblem: Ich habe eine Schleife zur Ausgabe der 
empfangenen Daten:

<c>for (i=0;i<4;i++)
{
  displayZahl(datenbyte[i],dauer);
  _delay_ms(500);
}</c>

Da ist es so, dass manchmal (unregelmäßig) zwei Zahlen ohne die 
gewünschte Pause von einer halben Sekunde angezeigt werden...

Hat jemand eine Idee?

Vielen Dank!

von Axel S. (a-za-z0-9)


Lesenswert?

Gibt es eigentlich irgendeinen Grund, warum du nicht IRMP 
verwendest?


XL

von Mike (Gast)


Lesenswert?

Axel Schwenke schrieb:
> Gibt es eigentlich irgendeinen Grund, warum du nicht IRMP
>
> verwendest?

Ja, gibt verschiedene Gründe: ich möchte (später mal) einen eigenen 
Sender und Empfänger für verschiedene ferngesteuerte Anwendungen basteln 
(z. B. Weichensteuerung LEGO-Eisenbahn). IRMP ist mir für diesen Zweck 
zu "mächtig", d. h. es kann viel mehr als ich benötige. Und vor allem 
möchte ich das Programm verstehen - habe bei IRMP bei Zeile 2578 
aufgegeben ;-) Und last but not least: Bin ziemlicher Anfänger und 
möchte vor allem was lernen...

von Bernie (Gast)


Lesenswert?

... oder - bevor du alle mit deinen 13K Programm-Code
abschreckst, erst mal erzählst, wie dein Algorithmus
funktionieren SOLL?

Entweder geht man LOGISCH falsch ran, da gibts hier bestimmt
genug Unterstützung.

Oder man hat Probleme mit SYNTAX und AUSFÜHRUNG:

Dann ist es besser, man programmiert erst mal die
grundsätzlichen Programmteile einzeln und testet sie.

Mit KONKRETEN Problemen in einzelnen Programmteilen findet
sich auch schnell jemand, der in einem ÜBERSCHAUBAREN
Programm-Abschnitt nach Fehlern sucht.

von Mike (Gast)


Lesenswert?

Bernie schrieb:
> ... oder - bevor du alle mit deinen 13K Programm-Code
>
> abschreckst, erst mal erzählst, wie dein Algorithmus
>
> funktionieren SOLL?

das hatte ich in dem referenzierten Thread gemacht:

Mike schrieb:
> siehe Thread
>
> Beitrag "Compiler Optimization Level (-O1) ändert Ablauflogik?"

ok, war etwas missverständlich, sorry. Bin aber gerade dem Fehler auf 
der Spur (so hoffe ich) - so dass ich es vielleicht selbst schaffe - bin 
da schon ein paar Tage dran... :-(


Bernie schrieb:
> Mit KONKRETEN Problemen in einzelnen Programmteilen findet
>
> sich auch schnell jemand, der in einem ÜBERSCHAUBAREN
>
> Programm-Abschnitt nach Fehlern sucht.

Leider lässt sich die Problemstelle beim IR-Dekodieren nicht so leicht 
eingrenzen, aber vielleicht finde selbst noch was.

Aber ein ganz konkretes Problem bei der Anzeige der Ergebnisse:

<c>for (i=0;i<4;i++)
{
  displayZahl(datenbyte[i],dauer);
  _delay_ms(500);
}</c>

Wie kann es passieren, dass z. B. zwischen der ersten und zweiten (oder 
dritten und vierten) Zahl KEINE Pause von einer halben Sekunde eingelegt 
wird? Hier habe ich keinen Schimmer, das ist ja sehr "atomar" und wüsste 
auch nicht was/wie ich da noch eingrenzen und testen könnte...

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.