Forum: Mikrocontroller und Digitale Elektronik NEC IR Code mit Bascom senden


von Peterle (Gast)


Lesenswert?

hi,

ich suche eine möglichkeit mit einem atmega8 (o.ä.) verschiede ir codes 
von nec zu senden.

mit dem programm von hier:
http://www.mcselec.com/index.php?option=com_content&task=view&id=223&Itemid=57
habe ich mir ein paar tasten der org. fernbedienung ausgelesen.


nun möchte ich die Codes mit einem avr senden.

wenn ich z.b. die taste 1 auf der fernbedienung drücke, dann bekomme ich 
als rückmeldung auf dem lcd-display:
1
programmzeile= Lcd Address ; " " ; Command
2
ausgabe= 2 208
das wären dann adress 2 und command 208


wie stelle ich es jetzt an, damit die die 2/208 über eine ir-diode 
wieder senden kann?

mfg

von Karl (Gast)


Lesenswert?

Du musst das Protokoll nachbilden (siehe Dein Link), was natürlich 
aufwendiger ist, als eine fertige BASCOM-Lösung. An Deiner Stelle würde 
ich auf RC5 wechseln. Für mehr Infos siehe BASCOM-Hilfe (Suche nach 
RC5).

von Peterle (Gast)


Lesenswert?

rc5 kann ich schon senden und empfangen.
den kann ich hier aber nicht verwenden.

es geht aber um einen mediaplayer, der leider nun mal den nec ir code 
braucht.

von Karl (Gast)


Lesenswert?

Es steht eigentlich alles im Link. Letztendlich muss man die Pulssequenz 
nachbilden. Das müsste ich mich jetzt eine Weile hinsetzen, um das zu 
programmieren. Unmöglich erscheint es jedenfalls nicht. Mit einem Quarz 
am AVR kann man sicherlich waitms / waitus benutzen, um die 
entsprechenden Zeiten einzustellen.

von Peterle (Gast)


Lesenswert?

das war auch schon mein gedanke.

ich müßte doch nur eine ir diode nur immer ein/ausschalten lassen und 
dabei die zeiten einhalten, so wie im ersten link angegeben.

also z.b. simpel so erklärt:
1
9ms an
2
450us aus
3
logisch 1 = 560us an
4
           1690us aus
5
logisch 0 = 560us an
6
            560us aus


also müßte es nach den angaben vom beispiel oben(a=2 / c=208) in binär 
gewandelt werden, wobei ich das von hinten "lesen" müsste, wenn ich das 
richtig verstanden habe.

also =
address = 2 = 01000000
command = 208 = 11010000

ergibt dann
1
9ms(an) 0.450ms(aus) und dazu folgende zustaende 00000010 11111101 00001011 11110100

von holger (Gast)


Lesenswert?

>also z.b. simpel so erklärt:
>
>logisch 1 = 560us an

Falsch. Du musst für 560us ein 36kHz Signal ausgeben.
Geht am einfachsten mit dem PWM Modul.

von Peterle (Gast)


Lesenswert?

nochwas, was ich noch nicht gemacht habe...

pwm sagt mir was vom dimmen her, nur wie sende ich das mit einer ir 
diode?

von Karl (Gast)


Lesenswert?

Hab' jetzt nur kurz rein gesehen. 0 und 1 werden über die Signalzeit 
bestimmt. Dazu musst Du erst 560µs lang mit 38 kHz einen Puls senden. 
Nach insgesamt 2.25 ms die nächste 560µs Pulssequenz für eine 1 bzw. 
1.12 ms für eine 0. Um einen Befehl zu senden, musst Du 2x die Adresse 
senden 01011 etc. (1x invertiert) und 2x das Kommando (wieder 1x 
invertiert). Vorher noch 9ms lang den AGC Burst (wahrscheinlich 9ms lang 
das 38 kHz Signal) senden.

Hast Du ein Oszilloskop?

PWM mit Bascom ist nicht so schwer und recht gut in der Hilfe erklärt 
(auch viele Beispile im Internet). Man braucht aber nicht unbedingt die 
BASCOM-PWM-Funktion für ein 38 kHz-Signal.

von Karl (Gast)


Lesenswert?

PS. PWM ist ja vereinfacht gesehen ein Ein- bzw. Auschaltvorgang. Du 
schaltest die IR-Diode (mit 38 kHz) ein und aus.

von Peterle (Gast)


Lesenswert?

ein oszilloskop habe ich nicht.

das senden habe ich verstanden, nur kapier ich nicht, wie ich das mit 
den 36khz hinbekommen soll.

von Karl (Gast)


Lesenswert?

z.B. so
1
Config Portx.y = Output
2
Clk Alias Portx.y
3
..
4
Config Timer0 = Timer , Prescale = 1    'oder Timer1                    
5
On Timer0 Timer_isr
6
Enable Interrupts
7
...
8
Timer_isr:
9
   Timer0 = 12  'hier Timerpreset                                            
10
   Toggle Clk
11
Return

Das toggelt den Pinx.y mit einer bestimmten Frequenz, die abhängig von 
der Frequenz des AVRs ist.

Zur Berechnung des Timerpresets siehe z.B. hier:

http://www.bunbury.de/technik/berechnung/timerberechnung.htm

Wie geschrieben, BASCOM-PWM ist sicherlich auch möglich. Hier würde ich 
Dich auf die Hilfe oder das Internet verweisen. Ein kleines Oszi wäre 
nicht schlecht, dann könntest Du direkt sehen, was Du programmiert hast.

von Karl (Gast)


Lesenswert?

Irgendwo im Programm musst Du den Timer starten und stoppen. Lese gerade 
"duty-cycle is 1/4 or 1/3". Das muss man auch noch berücksichtigen. Für 
BASCOM-PWM siehe z.B hier:

http://www.rn-wissen.de/index.php/Bascom_und_PWM

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Peterle schrieb:

> ich müßte doch nur eine ir diode nur immer ein/ausschalten lassen und
> dabei die zeiten einhalten, so wie im ersten link angegeben.
>
> also z.b. simpel so erklärt:
> 9ms an
> 450us aus

Falsch: 4500us aus, nicht 450.

Siehe dazu auch

  http://www.mikrocontroller.net/articles/IRMP#Pulse-Distance_Protokolle

> logisch 1 = 560us an
>            1690us aus
> logisch 0 = 560us an
>             560us aus

Diese Timings stimmen.

Ich rate Dir, 38kHz und nicht 36kHz als Modulationsfrequenz zu wählen. 
Die meisten Geräte mit NEC-Protokoll benutzen 38kHz. Damit dürftest Du 
die Reichweite Deines IR-Senders signifikant erhöhen.

Gruß,

Frank

von Weingut P. (weinbauer)


Lesenswert?

Habs so gemacht, dass ich nen 16-Bit Timer im CTC laufen lassen hab, der 
selbständig den Ausgang toggelt in Hardware, damit geh ich auf nen FET, 
mit nem zweiten FET, den ich als Tor verwende schalte ich die 38 kHz 
nurnoch durch ... so kann ich beliebige Codes generieren.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Fhutdhb Ufzjjuz schrieb:
> Habs so gemacht, dass ich nen 16-Bit Timer im CTC laufen lassen hab, der
> selbständig den Ausgang toggelt in Hardware, damit geh ich auf nen FET,
> mit nem zweiten FET, den ich als Tor verwende schalte ich die 38 kHz
> nurnoch durch ... so kann ich beliebige Codes generieren.

Ein wenig kompliziert... es reicht doch, die PWM einfach ein- und 
auszuschalten. Dann reicht ein Pin und diese Einfachst-Schaltung:

  http://www.mikrocontroller.net/articles/IRMP#IRSND_-_Infrarot-Multiprotokoll-Encoder

Gruß,

Frank

von Peterle (Gast)


Lesenswert?

hi,

habe jetzt mit folgendem programm die 36khz am laufen:
1
   $regfile = "m32def.dat"
2
   $crystal = 8000000
3
4
   Config Pina.0 = Output
5
   Led Alias Porta.0
6
   
7
   Config Timer0 = Timer , Prescale = 1
8
   On Timer0 Timer_irq
9
   Const Timervorgabe = 45
10
   Enable Timer0
11
   Enable Interrupts
12
13
Do
14
Loop
15
16
Timer_irq:
17
   Timer0 = Timervorgabe
18
   Toggle Led
19
Return

nur wie "baue" ich es ein, das die daten auch gesendet werden.
9ms(an) 0.450ms(aus) und dazu folgende zustaende 00000010 11111101 
00001011 11110100?

wo kommen denn die zustände logisch1 und logisch0 rein?

von Karl (Gast)


Lesenswert?

Peterle, Du hast Dir die Beschreibung des Protokolls nicht richtig 
angesehen. Ganz oben auf dem von Dir eingestellten Link, ist ein Bild, 
das eigentlich alles sagt.

"A logical "1" takes 2.25ms to transmit, while a logical "0" is only 
1.12ms."

Also, Du sendest 560µS das 38kHz Carrier-Signal (rund 21x) und nach 
2.25ms - 560µS das nächste 38kHz Carrier-Signal, damit hast Du eine 
logische 1 übertragen. Eine logische 0 ist insgesamt nur 1.12 ms lang.

Beim "Toggeln" musst Du den "Duty Cyle" beachten. Die ist bei bei dem 
aktuellen Code 50%. Vielleicht funktioniert es ja damit, ansonsten heißt 
das Zauberwort "PWM".

Wie man komplette Befehle überträgt, ist unter "Protocol" beschrieben.

Um etwas zu senden, müsstet Du Dir eine Funktion bauen, die ein Byte 
(also 8 Bit) "01010..." einließt und 560µS das 38kHz-Signal sendet und 
danach jeweils die entsprechenden ms für das jeweilige Bit (0 oder 1) 
wartet. Am Anfang jeder Befehlsfolge noch 9 ms den AGC-Burst (also 
einfach die Diode für 9ms an) senden und danach 4.5 ms warten. Du musst 
jedes Byte normal und invertiert senden, (invertiert: 0=1 und 1=0).
Insgesamt überträgst Du 8 Byte:

AGC-Burst + AdressByte + AdressByte(invertiert) + CommandByte + 
CommandByte(invertiert)

von Klaus D. (kolisson)


Lesenswert?

Hallöchen,

anbei ein Bascom Code, der bei mir seit 2010 erfolgreich mit NEC
läuft. leider ist er nicht sonderlich kommentiert.
Vielleicht nutz es dir aber trotzdem irgendwie.

Gruss Klaus

(Mod.: Anhang gelöscht, siehe Beitrag 12.04.2012 17:49)

von Peterle (Gast)


Lesenswert?

@ karl
den teil habe ich schon verstanden. mir ist nur nicht klar, wie ich die 
sache in den code bekomme.

wenn ich mir da den code von klaus anschaue, dann wird mir klar, das ich 
das so nicht hinbekomme.


ich bekomme ja schon fehlermeldungen, wenn ich den code für meinen 
momentanen atmega32 umschreibe:
1
Tccr1b.wgm13 = 1
2
Invalid datatype [[0011] 0[WGM13]]
3
Variable not dimensioned [ 0-> 0]

dann habe ich keine 2mhz quarz am laufen, nur einen 8mhz in betrieb.

von Karl (Gast)


Lesenswert?

Etwas in der Art findest Du auch hier:

Beitrag "Conrad Funksteckdosen 433Mhz über 433mhz sender steuern"

Du müsstest halt immer noch das Carrier Signal vorher senden. Weiß 
nicht, ob ich Zeit finde, das mal als Programm zu schreiben. Zum testen 
fehlt mir jedenfalls die Möglichkeit.

von Klaus D. (kolisson)


Lesenswert?

Peterle schrieb:
> ich bekomme ja schon fehlermeldungen, wenn ich den code für meinen
> momentanen atmega32 umschreibe:

Ein Mega 32 ist eben nicht Registerkompatibel mit M88.
Wenn es ein 40 Pinner sein muss könntest du den M644 nehmen.
Ansosnten halt mal meinen Code analysieren und kapieren.
Dann kannst du ihn auf M32 anpassen

Gruss k.

von Peterle (Gast)


Lesenswert?

atmega644 habe ich und programm ist durchgelaufen.

nur ein 2mhz quarz habe ich nicht da.
kann man das "auf die schnelle" an 8mhz anpassen?

von Klaus D. (kolisson)


Lesenswert?

Du musst den Takt (fuse) auf intern RC 8Mhz einstellen (also keinen 
Quarz)
und den Divide by 8 ausschalten. Das Programm schaltet dann automatisch
nach dem Start auf 2 Mhz herunter.

'setze takt auf 2 mhz
ldi r25,$80
ldi r24 ,$02
!out $61,r25
!out $61,r24


Gruss Klaus

von Peterle (Gast)


Lesenswert?

den 644 habe ich auf intern 8mhz zurückgestellt und divide by 8 
ausgeschaltet.

trotzdem macht das programm nix und sendet nix, egal welche taste ich 
drücke.
es ist immer nur die controll_led an und geht nie aus.

zudem sehe ich in deinem programm nicht durch, woher soll ich es auch 
kennen, fange gerade mit bascom an.

kann man das programm nicht einfach für folgende situation umbauen:
taster am mega 8(o.ä) wird gedrück und sendet einem ir befehl mit adress 
2 und command 208 - fertig

alles was ich bisher gemacht habe, sind einige beispiele aus dem bascom 
buch vom c.kühnel und die klappten.

aber die sachen aus dem code vom kolisson werd ich mit meinen 
kenntnissen und dem buch nie rausbekommen.
selbst nach 4h google qualt mir nur der schädel und langsam gebe ich den 
mist auf und kauf mir wieder playmobil...

von Klaus D. (kolisson)


Lesenswert?

Na dann quäl dich mal heute nicht mehr.
Wie gesagt habe das proggi mal in 2010 geschrieben. Schaltpläne
habe ich im Algemeinen nicht. So langsam wird mir aber wieder
klar, was ich mir dabei in 2010 gedacht hatte.
Sicherlich benötigst du noch einige Hinweise für die Schaltung, die
ich dir morgen mal aufschreiben werde.

Also schlaf erstmal gut und ich meld mich dann morgen nochmal
mit den entscheidenen Tipps.

Gruss Klaus

p.s. ich sehe auch ein, dass mein Programm eher speziell ist
und nicht so einfach mit einem Bascom Buch zu entschlüsseln ist.

von Weingut P. (weinbauer)


Lesenswert?

Frank M. schrieb:
> Fhutdhb Ufzjjuz schrieb:
>> Habs so gemacht, dass ich nen 16-Bit Timer im CTC laufen lassen hab, der
>> selbständig den Ausgang toggelt in Hardware, damit geh ich auf nen FET,
>> mit nem zweiten FET, den ich als Tor verwende schalte ich die 38 kHz
>> nurnoch durch ... so kann ich beliebige Codes generieren.
>
> Ein wenig kompliziert... es reicht doch, die PWM einfach ein- und
> auszuschalten. Dann reicht ein Pin und diese Einfachst-Schaltung:
>
> 
http://www.mikrocontroller.net/articles/IRMP#IRSND_-_Infrarot-Multiprotokoll-Encoder
>
> Gruß,
>
> Frank

stimmt schon, hab das aber so gemacht, weil ich damit ne halbduplex 
IR-Verbindung per UART gebaut hab und mit die Option anderer Protokolle 
offen halten wollte.
Als zweites Tor hab ich daher einfach den TX genommen und kann so 
einfach per UTXC die Daten hinaus schaufeln und als Gegenstück nen TSOP, 
der per URXC die Daten wieder herein schiebt ... klaro könnt man in nem 
Timer per Software auch ne UART oder was auch immer emulieren ...
Viele Wege führen ans Ziel :)

von Klaus D. (kolisson)


Lesenswert?

Hallo Peterle,
nun wollte ich dir eben die versprochenen paar Zeilen Hinweise zusenden
und habe dann schon bei der ersten Überprüfung feststellen müssen,
dass der 644 zwar Registerkompatibel mit M88 ist, allerdings nicht
"Portbezeichnungskompatibel".
Ich habe dann in meiner Not mal im Web nachgeschaut ob es nicht einen
tollen Link für dich gibt. Offenbar gibt es in der Hinsicht aber nix
und ich nehme das jetzt sportlich und versuche das, was ich vor 2 Jahren
verzapft habe so gut zu verstehen, dass ich dir da helfen kann.

Also, es ist in Arbeit und ich muss darüber grinsen, dass man doch 
besser
nicht immer in der ersten Reihe stehen sollte, wenn Freiwillige gesucht 
werden.

Also , bis später.

Gruss k.

ps.
Es ist kein Wunder, dass es bei dir mit 644 nicht funzt.

von Klaus D. (kolisson)



Lesenswert?

Als Einleitung zum Verständnis meiner NEC Fernbedienung habe ich mal
ein paar Fotos gemacht. Das kann ggf. den Code für den M88 erklären 
helfen
und ich werde nachher wieder auf die Bilder verweisen.

Zunächst aber einmal einige Hinweise auf die Fotos:

der Grund der FB war, die Bedienung auf das notwendige Minimum zu
begrenzen.
Wie man im Bild sehen kann

1.
"Lisson_fernbedienung__Ohropaxdose_macht_6_Tasten__auf_2_Ebenen" sehen 
kann
hat die FB 6 Tasten für die Grundfunktionen.
Links unten befindet dich ein weiterer Tacttaster, der wie eine 
Shifttaste
gedrückt gehalten wird um die Belegung der anderen 6 Taster auf selten
genutze Sonderfunktionen zu verlegen.

2. Das Bild "Lisson_fernbedienung_Dioden_f_r_Tasten.jpg " zeigt eine
mögliche Einbauart der für die Interruptsteuerung der Sleepmodes
notwendigen Dioden am Tastenport. Eine Fernbedienung soll ja schlafen,
wenn man diese nicht benutzt wird. Obwohl ich zu meinem Erstaunen
gar keinen Sleepmode sondern nur einen "Powerdown " habe hält die
Batterie etwa 1,5 Jahre.

In der Datei "keyboard.pdf " sieht man das Grundprinzip der 
Intgesteuerten
Tastenabfrage. Die im PDF gezeigten Widerstände befinden sich allerdings
innerhalb des Atmel als sogenannte Pullups.
Der Atmel geht also schlafen, wenn man nichts tut.

Da aber das Erwecken aus dem Dornröschenschlaf nur über Level-Int
geht wird vor dem Schlafengehen der für die Tasten wichtige Flanken
(Edge) Int umgestellt.

Siehe Code :
' *************************lets go for sleep
If Tastenport = 63 Then                                     ' nix 
gedrückt
Config Int1 = Low Level
Powerdown
Config Int1 = Falling
End If


Loop Until Key <> 0

Nach dem Powerdown geht er wieder auf "falling edge" um die Tasten
abzufragen.

Um in Worten zu beschreiben, was unbedingt beachtet werden muss,
sage ich mal so:

Damit das gerät von einem Tastendruck auch etwas mitbekommt und
nicht dauerschläft müssen Dioden (1N4148) eingebaut werden.
fast so , wie im Bild "keyboard.pdf ".
Beim Mega 88 und meiner Software sitzen die 6 Dioden mit der Kathode
auf den 6 Eingängen des Port C. Alle Anoden sind zusammengfasst und über
einen Pullup auf Plus geschaltet.
Der Punkt zwischen den Anoden und dem Pullup ist an INT1 angeschlossen.
Wenn nun eine (von 6 gegen GND) Tasten gedrückt wird , ändert sich
das Potenzial am Portpin auf Low. Durch die Dioden-Veroderung
(kein Tippfehler) geht auch INT1 auf Low. Dadurch wird der Tasten-Int
ausgelöst und der uC wacht auf. Nun schaut er, wer ihn geweckt hat.
Er stellt also fest, welche Taste die "Böse " war und lädt aus dem
EEprom den gewählten Code in das Ram (cache Speicher).

Siehe dazu :

$eeprom

Progplus:
Data &B11111111
Data &B11111111
Data &B00000000
Data &B10101010
Data &B00101010
Data &B00101000
Data &B10001000
Data &B10100010
Data &B00100010
Data &B10101010
Data &B10101010
Data &B10001000
Data &B10001000
Data &B10001000
Data &B10001000
Data &B10000001

Das letzte  Bit dieses Buffers habe ich dazu verwendet um eine
Repeatfunktion auszulösen. Die Repeatfunktion ist Bestandteil
des NEC Protocols.

Hier der Repeat Code:
Repeatcode:
Data &B11111111
Data &B11111111
Data &B00001000
Data &B00000000
Data &B00000000
Data &B00000000
Data &B00000000
Data &B00000000
Data &B00000000
Data &B00000000
Data &B00000000
Data &B00000000
Data &B00000000
Data &B00000000
Data &B00000000
Data &B00000000



Das ist interessant, wenn man z.B. die Lautstärke regeln will. Da 
drüchkt man ja nicht 20mal die gleiche Taste, sondern man hält diese 
gedrückt.
Der Repeatcode sagt dem Empfänger, das man das gleiche nochmal möchte.

Bei der Funktion "Mute" wäre das wieder kontraproduktiv, da ein 
festhalten der taste ständig zwischen "Ton an" und "Ton aus" wechseln 
würde.

Wichtig zu wissen:
Die IR Sende LED muss am OC1A angeschlossen werden.
Beim Mega 88 ist es PB1 und bein 644 ist es PD5.
In der Software ggf. anpassen !
Das mag die Migration erschweren.
Die Control LED liegt mit Anode auf +UB (da wird GND geschaltet)
sie ist also bei Peterle immer an um zu zeigen, dass der uC schläft.

Nun Peterle,
ich hoffe, ich konnte dich etwas erhellen, und ich sehe ein,
dass mein Geheimcode geheim hätte bleiben sollen.
Nun habe ich baer keine Lust mehr, kann dir aber anbieten,
dass ich dir beizeiten eine Version für deinen 644 offenbare.



Gruss Klaus

von Klaus D. (kolisson)


Lesenswert?

HINWEIS:
Beim Durchforsten meines Quelltextes, den ich
Autor: Klaus De lisson (kolisson)
Datum: 10.04.2012 14:40  gepostet habe , ist mir eine ziemliche
Eselei aufgefallen. Da wird im Programm das Osccal-Register manipuliert.
Dies mag für meinen persönlichen Prozessor sinnvoll gewesen sein,
könnte aber für viele Newcomer zum Desaster werden.
Deswegen habe ich meinen Beitrag vom 10.04.2012 14:40 gemeldet und
ich hoffe zur Löschung beantragt.

Zur Wiedergutmachung habe ich allerdings diesen hier verfasst:
Beitrag "Tipp: ATMEGA und die Kalibrierung des internen RC Oscillators / Baudrate"



@Autor: Peterle (Gast)

na du, bist du schon wieder bei Playmobil ?
oder mit anderen Worten: "Noch Interesse oder nicht ?"


Gruss klaus

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.