Forum: Mikrocontroller und Digitale Elektronik IR Fernbedienung mit IRSND


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Andreas (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

wende mich nun an euch, da ich aktuell nicht mehr weiter weiß.

Habe versucht eine IR Fernbedienung zu Programmieren.
Dazu das IRSND Projekt verwendet.
In ein Atmel Studio 6 Projekt geladen.

Wenn ich eine Taste drücke, wird die IR LED auch angesteuert.
(Mit der Digitalkamera angeschaut)

Zur Kontrolle der Befehle verwende ich das IRMP mit UART Ausgabe.
Dies funktioniert mit einer "echten" Fernbedienung super. :-)
Hier werden auch die originalen NEC Codes problemlos dargestellt.


Nur leider meine mit IRSND programmierte Sache wird nicht erkannt.
Somit denke ich, dass da irgendwas in meinem Code nicht passt.
Verwende hierbei die gleichen Codes wie meine richtigen Fernbedienungen, 
die erkannt werden.


HW ist ein:
Mega8 mit 8MHz Quarz
Alternativ auch mit einem Mega16 probiert.
Bei beiden das gleiche.
FuseBits sind auf externen Quarz eingestellt (mit internem Takt hats 
auch nicht funktioniert)

IR LED blinkt zwar, aber scheinbar werden nicht die richtigen Werte 
gesendet.
IR LED am richtigen Ausgang vom Mega8 angeschlossen.
In der IRSNDconfig.h eingestellt.
Aufbau der IR LED genau wie im Artikel beschrieben (mit Transistor usw).

Anbei der c Code.
Hier werden aktuell nur zwei Taster abgefragt, die dann das NEC Signal 
senden sollten.
Aber leider ist das gesendete Signal nicht passend?
(Ob ein Signal gesendet wird, oder die LED nur irgendwie blinkt kann ich 
leider nicht testen)

Hab zwar den IRSND Artikel schon mehrmals gelesen, aber irgendwie mach 
ich scheinbar was falsch :-)
Nur ich weiß nicht was.
Hat jemand einen Tipp für mich was ich falsch mache?


Später möchte ich natürlich mehrere Taster und mehrere Signale senden.
Auch (sofern ich es schaffe) soll eine Taster wenn er länger als 1 sek 
betätigt wird ein anderes Signal senden.
So zumindest der Plan :-)

Grüße
Andreas

von Christian S. (roehrenvorheizer)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wie jeder leicht erkennt, ist die irsnd.h -Datei zwar eingebunden, aber 
niemand außer Dir kann den geheimen Inhalt mit den magischen 
Einstellungen erkennen. Vielleicht wird sich dort noch ein Fehler 
finden, den es zu korrigieren gilt. Möglichkeiten gibt es sicher 
genügend.

MfG

von Andreas (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi Christian,

danke für deine schnelle Antwort.
Anbei nun alle Dateien, die im Gesamtverbund verwendet werden.
Angepasst habe ich die
irsndconfig.h wegen der Zuordnung des Ausganges der IR LED
Sowie meine Fernbedienung...c Datei, in der ich etwas rumgewurschtelt 
habe.
Der Rest ist noch original aus dem Grundprojekt.

Gruß
Andreas

von Frank M. (ukw) (Moderator) Benutzerseite


Bewertung
1 lesenswert
nicht lesenswert
Andreas schrieb:
> Mega8 mit 8MHz Quarz
> ...
> FuseBits sind auf externen Quarz eingestellt (mit internem Takt hats
> auch nicht funktioniert)

Nenne bitte die Werte der Fusebits und vergleiche sie mit

http://eleccelerator.com/fusecalc/fusecalc.php?chip=atmega8

> Zur Kontrolle der Befehle verwende ich das IRMP mit UART Ausgabe.

Sehr gut. Aktiviere bitte IRMP_LOGGING und zeige bitte die UART-Ausgabe, 
wenn Du etwas von der FB empfängst und dann nochmal, was reinkommt, wenn 
Du IRSND verwendest. Läuft IRMP bei Dir auch auf einem ATmega8? Sind die 
Fusebits identisch?

Es wäre auch hilfreich, wenn Du den Schaltplan, wie Du die IR-LED 
ansteuerst, hier zeigst. Ebenso eine Skizze, wie die Taster 
angeschlossen sind.

Ich vermute, dass der ATmega8 für IRSND gar nicht mit 8 MHz läuft. Das 
kannst Du leicht überprüfen mittels folgender Schleife und einer 
beliebigen LED mit sichtbarem Licht:
    while (1)
    {
        schalte_led_ein ();
        _delay_ms (1000);
        schalte_led_aus ();
        _delay_ms (1000);
    }

Die LED müsste dann im Sekundenrhytmus blinken.

P.S.
Nicht vergessen, den Optimizer einzuschalten, am besten mit -Os. Sonst 
laufen die Delay-Routinen nicht korrekt.

: Bearbeitet durch Moderator
von Frank M. (ukw) (Moderator) Benutzerseite


Bewertung
1 lesenswert
nicht lesenswert
Nachtrag:

Ich sehe in Fernbedienung_mit_IRSND_mega8.c folgendes:
#define F_CPU 8000000L
#include "irsnd.h"

Das ist unschön. F_CPU sollte global im Projekt Deiner 
Entwicklungsumgebung und nicht im Source definiert werden. Das wird so 
auch ausdrücklich in der Doku zu IRMP/IRSND empfohlen.

Grund: Das Schreiben in den Source kann zu Inkonsistenzen führen, 
nämlich zum Beispiel, wenn Du einen abweichenden Wert in irsnd.c und in 
Fernbedienung_mit_IRSND_mega8.c schreibst, weil Du vergessen hast, an 
beiden Stellen zu ändern.

Also lösche bitte alle #defines von F_CPU in den Sourcen und definiere 
F_CPU einmal in Deinem Atmel Studio 6 Projekt. Wie das geht, findest 
Du hier in diversen Threads.

P.S.
Wenn ich mir das angehängte irsnd.c anschaue, dann sehe ich folgendes:
#include "irsnd.h"

#ifndef F_CPU
#  error F_CPU unkown
#endif

Wenn das wirklich der Stand ist, den Du verwendest, sollte das 
Compilieren abbrechen, da Du hier kein F_CPU definiert ist. Wenn es 
trotzdem genau so durch den Compiler geht, dann musst Du ja schon eine 
projektweite Einstellung gemacht haben. Wie lautet dann diese und warum 
hast Du F_CPU dann doch nochmal Fernbedienung_mit_IRSND_mega8.c 
definiert, was dann gar nicht mehr notwendig ist?

Irgendwas stimmt hier nicht....

: Bearbeitet durch Moderator
von Andreas (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hi Frank,

danke für die super Antwort :-)

Habe mein eigenes
#define F_CPU 8000000L
aus meiner Fermbedienung...c Datei gelöscht, es kam kein Fehler beim 
compilieren.
Danach die F_CPU mit 8MHz global im Projekt gesetzt.
Jetzt weiß ich auch, dass man sowas auch machen kann.
Hab hier im Forum einen super Screenshot dazu gefunden :-)

-> jetzt funktioniert es
im putty, das ich mit dem IRMP (läuft auch auf einem Mega 8 mit 8MHz) 
verbunden habe sehe ich nun die IRSND Signale.
Sind die gleichen wie mit der richtigen Fernbedienung.
TOP
Freut mich jetzt richtig, dass es funktioniert.

Im IRMP hab ich das F_CPU setzen auch über den Source Code gesetzt.
War scheinbar Zufall, dass es geklappt hat.

Auf das globale Setzen der F_CPU wäre ich niemals alleine drauf 
gekommen.

Aber jetzt weiß ich wie sowas geht und werde es zukünftig immer so 
machen.
Vielen vielen Dank Frank.

Jetzt muss ich nur noch schauen wie man es macht, eine Taste mit zwei 
Signalen zu belegen.
Taste kurz drücken ist "Wert1"
Taste länger drücken ist "Wert2"

Gruß
Andreas

von Frank M. (ukw) (Moderator) Benutzerseite


Bewertung
1 lesenswert
nicht lesenswert
Andreas schrieb:
> -> jetzt funktioniert es

Freut mich!

> im putty, das ich mit dem IRMP (läuft auch auf einem Mega 8 mit 8MHz)
> verbunden habe sehe ich nun die IRSND Signale.
> Sind die gleichen wie mit der richtigen Fernbedienung.

Sehr gut.

> Im IRMP hab ich das F_CPU setzen auch über den Source Code gesetzt.
> War scheinbar Zufall, dass es geklappt hat.

Ja, das solltest Du auch noch anpassen. Lohnt sich.

> Taste kurz drücken ist "Wert1"
> Taste länger drücken ist "Wert2"

Du könntest in der Timer-ISR einen Zähler (static uint16_t in der ISR) 
mitlaufen lassen, wenn Du eine Taste drückst. Überschreitet der Zähler 
einen magischen Wert, setze ein Flag (muss dann global als volatile 
definiert werden), dass die Taste länger gedrückt wurde. Beispiel: Wenn 
der Wert 7500 erreicht hat, weisst Du, dass eine halbe Sekunde vergangen 
ist.

Sobald Du die Taste loslässt, setzt Du den Zähler auf 0.

Das Flag wertest Du dann in der Hauptschleife aus. Nicht vergessen, 
dieses wieder zurückzusetzen!

Viel Spaß, Frank

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.