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=LcdAddress;" ";Command
2
ausgabe=2208
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
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).
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.
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.
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
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.
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.
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
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
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.
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
hi,
habe jetzt mit folgendem programm die 36khz am laufen:
1
$regfile="m32def.dat"
2
$crystal=8000000
3
4
ConfigPina.0=Output
5
LedAliasPorta.0
6
7
ConfigTimer0=Timer,Prescale=1
8
OnTimer0Timer_irq
9
ConstTimervorgabe=45
10
EnableTimer0
11
EnableInterrupts
12
13
Do
14
Loop
15
16
Timer_irq:
17
Timer0=Timervorgabe
18
ToggleLed
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?
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)
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)
@ 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
Invaliddatatype[[0011]0[WGM13]]
3
Variablenotdimensioned[0->0]
dann habe ich keine 2mhz quarz am laufen, nur einen 8mhz in betrieb.
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.
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.
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
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...
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.
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 :)
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.
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
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