Forum: Mikrocontroller und Digitale Elektronik NEC Protokoll für Harman AVR3550


von Jürgen (Gast)


Lesenswert?

Hallo,
folgende Situation:
Ich bin stolzer Besitzer von einem Harman/Kardon Resiver.
Jetzt möchte ich ihn zu einem Wecker aufrüsten.
Problem: Er hat keine Weckfunktion und wenn ich ihn einsteck geht er in 
den Standby-Modus. Jetzt habe ich mir überlegt, das Gerät an eine 
Schaltzeituhr anzuschließen und wenn diese angeht, ein Einschaltsignal 
über die IF-Schnittstelle zu senden.
Seit gestern morgen sitze ich schon. Nach langen suchen habe ich 
herausgefunden das Harman das NEC Protokoll verwendet. (Hoffe ich 
zumindest) Nach weiterem suchen habe ich leider die Befehlsliste des 
Protokolls nicht gefunden.

Kann mir vielleicht jemand helfen?

Danke,
Jürgen

PS: Ich weis, meine Rechtschreibung ist nicht gerade die beste;-)

von Hubert G. (hubertg)


Lesenswert?


von Düsendieb (Gast)


Lesenswert?

Jürgen schrieb:
> Problem: Er hat keine Weckfunktion und wenn ich ihn einsteck geht er in
> den Standby-Modus.

damit meinst Du den Stecker reinstecken?

kann der Receiver aus den Stand-By per IR Fernbedienung eingeschaltet 
werden?

Axel

von Jürgen (Gast)


Lesenswert?

Hubert G. schrieb:
> Vielleicht hilft dir das:
> http://www.sbprojects.com/knowledge/ir//ir.htm

Das habe ich auch schon gefunden. Allerdings steht nirgends der Befehl 
Standby.
Es fehlt auch welche Adresse ich für einen Resiver senden muss.
Dennoch danke für den Hinweis.

Düsendieb schrieb:
> damit meinst Du den Stecker rein stecken?

Genau das meine ich.

Düsendieb schrieb:
> kann der Receiver aus den Stand-By per IR Fernbedienung eingeschaltet
> werden?

Die original Fernbedienung kann es.

Für weitere Tipps bin ich dankbar.

von Jürgen (Gast)


Lesenswert?

Keiner eine Idee?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Jürgen schrieb:

> Das habe ich auch schon gefunden. Allerdings steht nirgends der Befehl
> Standby.

Standby suchst du nicht, denn du brauchst ja das Gegenteil.

Herumgooglen nach Codes sieht eigentlich positiv aus. Man findet in 
speziellen Foren die Codes für dieses Gerät im CCF Format für die sog. 
Philips Pronto remote control.

Und es gibt Tools/Seiten, um Codes aus dem CCF Format in etwas 
Lesbareres zu wandeln, aus dem man dann die Adresse und das Kommando 
entnehmen kann. Teilweise gibt es solche Decoder sogar mit Sourcecode.

> Es fehlt auch welche Adresse ich für einen Resiver senden muss.
> Dennoch danke für den Hinweis.

Hast du eine Original-Fernbedienung für deinen Harman AVR3550, um deren 
Befehle zu sniffen? Es gibt in der Codesammlung ein Projekt für einen 
IR-Code Sniffer bzw. Selbstlernende IR-FB.

Hast du schon überlegt, wie du letztlich von dem Selbstbau aus das IR 
Kommando senden willst?

Ich würde in Betracht ziehen, eine preiswerte Universal-FB zu schlachten 
und einfach z.B. über Relais oder µC deren Tasten zu betätigen. Das 
würde das Gefummel mit den Hexcodes, das Sniffen und die Synthese 
eigener IR-Signale umgehen.

von Stefan B. (stefan) Benutzerseite


Angehängte Dateien:

Lesenswert?

Im Anhang wäre mal so eine Decoderausgabe eines größeren AV-Systems in 
dem neben anderen AV-Geräten auch ein Harman AVR3550 steckt. Ich vermute 
die NEC1 Kommandos im Anfang des Listings sind die interessanten.

von Michael H. (michael_h45)


Lesenswert?

Jürgen schrieb:
> Keiner eine Idee?
IRMP
Mit dem IRMP das Signal für Standby\play\Radio oder was auch immer 
aufzeichnen und dann mit dem IRSND senden lassen.

von Jürgen (Gast)


Lesenswert?

Danke für eure Antworten.

Stefan B. schrieb:
> Man findet in
> speziellen Foren die Codes für dieses Gerät im CCF Format für die sog.
> Philips Pronto remote control.

Hast du mir einen Link dazu?

Stefan B. schrieb:
> Und es gibt Tools/Seiten, um Codes aus dem CCF Format in etwas
> Lesbareres zu wandeln, aus dem man dann die Adresse und das Kommando
> entnehmen kann.

Auch hier wär mir ein Link eine große Hilfe.

Die Original-Fernbedienung habe ich. Alerdings habe ich kein 
Speicherozi. Sonnst hätte ich schon längst eine Lösung.

Folgendes habe ich geplant:
Im Gerät habe ich 5V gefunden die nach dem einstecken vorhanden sind. 
Diese ändern sich auch nicht wen das Gerät läuft. An diese schließe ich 
einen attiny25 an. Den habe ich gerade rumligen. Dan habe ich aus einer 
alten Fernbedienung eines Videorekorders eine IF-LED ausgeschlachtet. 
Diese schließe ich natürlich über einen Vorwiederstand an einen Ausgang.
µC bekommt beim einstecken seine Versorgung, wartet kurtz, sendet das 
Komando, Gerät läuft. So zumindest die Idee.


Danke auch Stefan B.
Werde es jetzt mal mit Device: 112 Komando: 159 versuchen.

Was denkt Ihr. Habe ich das richtige rausgesucht?

von Jürgen (Gast)


Lesenswert?

Hallo noch mall,

bin ein kleines Stück weiter.
Hab es gewagt den AVR 3550 aufzuschrauben und an den IF Empfänger drei 
Drähte anzulöten. Mit meinem Oszi (Analog Grüpel) konnte ich feststellen 
dass das Signal der FB ankommt. Das meiner LED aber nicht.
Muss also erstmal genauer forschen wie die LED überhaupt angesteuert 
werden möchte.
Dann holl ich mir morgen das Speicher-Oszi aus dem Geschäft, sniffe mit 
und schreib es auf meinen Tiny. Hoffentlich klaps.

Danke für eure Hilfe.
Gute Nacht

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Hast du die 38 kHz Trägerfrequenz beachtet?

Beim NEC Protokoll ist ein 38 kHz Trägersignal vorgesehen, welches mit 
dem AN/AUS Timing gemäß den Bitwerten für Datentelegramm moduliert wird.

Wenn bereits überhaupt nix aus dem IR-Empfänger kommt, erkennt der kein 
IR-Signal mit richtiger Trägerfrequenz.

Üblicherweise zieht der IR-Empfänger eine Leitung LOW. Bei korrekter 
Trägerfrequenz und einkommenden Signalen müsstest du auf dieser Leitung 
560µs lange LOW-Phasen sehen.

Die Auswertung des aufmodulierten Datenstroms anhand der Abstände der 
LOW-Phasen ist wieder eine andere Sache.

von Jürgen (Gast)


Lesenswert?

Das soll folgendes heisen:
Ich steuer die LED über einen Vorwiederstand an. Mit einer Videokamera 
sehe ich, dass die LED leuchtet( dauerhaft). Wenn ich diese jetzt auf 
den IR-Empfänger im AVR 3550 richte, wird sich das Signal am Empfänger 
nicht ändern, da die 38 kHz Trägerfrequenz nicht eingehalten wird.
Richtig?

Mann ist das ein Schrott. :-( Wär ich doch nie auf so eine dumme Idee 
gekommen.
Geh jetzt erstmal frustriert ins Bett und morgen holl ich das Oszi. 
Werde meinem Tiny die Signale beibringen und erneut versuchen.
Wenns nicht klappt melde ich mich nochmal.
(Wenn ich darf)

Gute Nacht

von Jürgen (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

so langsam vergeht mir der Spass an der Sache.

Folgendes habe ich gemacht:
-Speicher-Oszi an Empfänger angeschloßen
-Auf der original FB An Taste gedrückt und aufgezeichnet
-Signal nachprogramiert und auf den Tiny gespielt.
-Zwischendurch aus dem Tiny ausgeschlossen. Falsche Fuses gesetzt 
(Externe Taktquele anstatt Ext Cristal osc.)
-Externe Taktquelle mit einem weiterm Tiny erstellt und Fuses repariert
-Feststellen müßen das es nicht funktioniert
-Grund rausgefunden:

Lass ich folgendes Program laufen dauert ein High 1.62 s und ein Low 
1.62 s.
1
#include <stdint.h>
2
#include <avr/io.h>
3
#include <util/delay.h>
4
5
6
int main(void)
7
{
8
9
  DDRB = 0xff;
10
11
  while(1)
12
13
  {
14
    _delay_ms(200);
15
    PORTB =0xff;
16
    _delay_ms(200);
17
    PORTB =0x00;
18
  }
19
20
}

Die Bilder zeigen welche Einstellungen ich gemacht habe.
Ein 4 MHz Quarz wird verwendet.

Wie bekomme ich die 200ms hin?

Hab ich was falsch gemacht?

von Michael H. (michael_h45)


Lesenswert?

Jürgen schrieb:
> Hab ich was falsch gemacht?
CLKDIV8 Fuse löschen. Sie teilt den Takt durch 8, dein uC lief also mit 
500kHz.

von Jürgen (Gast)


Lesenswert?

Michael H. schrieb:
> Jürgen schrieb:
>> Hab ich was falsch gemacht?
> CLKDIV8 Fuse löschen. Sie teilt den Takt durch 8, dein uC lief also mit
> 500kHz.

Danke, das war eine große Hilfe.
Jetzt dauert ein High nur noch 202 ms.

Wie genau muss die Zeit beim NEC Protokoll sein?

von Michael H. (michael_h45)


Lesenswert?

Jürgen schrieb:
> Wie genau muss die Zeit beim NEC Protokoll sein?
Das weiß keiner so genau...
Aber vergiss mal die 38kHz nicht. Nur mit _delay zu arbeiten, ist Mist.

Zaunpfahlwink: alle vorkommenden Zeiten sind Vielfache von 560us.

von Jürgen (Gast)


Angehängte Dateien:

Lesenswert?

Michael H. schrieb:
> Jürgen schrieb:
>> Wie genau muss die Zeit beim NEC Protokoll sein?
> Das weiß keiner so genau...
> Aber vergiss mal die 38kHz nicht. Nur mit _delay zu arbeiten, ist Mist.
>
> Zaunpfahlwink: alle vorkommenden Zeiten sind Vielfache von 560us.

Hab jetzt schnell in meinen Unterlagen gekramt und folgende 
Interup-Routine gefunden. Hab im Datenblatt geschaut und die Routine 
umgeschrieben.
Aber die LED LEDt nicht.
Habe ich was übersehen oder vergessen?

Das des so ausartet hätte ich nicht gedacht.

Danke für eure gedult.

Jürgen

von Jürgen (Gast)


Angehängte Dateien:

Lesenswert?

Halt, das ister der falsche Code.
Der stimmt.

von Michael H. (michael_h45)


Lesenswert?

Jürgen schrieb:
> Aber die LED LEDt nicht.
> Habe ich was übersehen oder vergessen?
* timerms wird nie verändert.
* Du initialisierst 2 Interrupts, fängst aber keinen in einer ISR ab. -> 
dein uC hängt beim Interrupt.

Generell als Idee: Bau dir einen Timer im CTC, der alle 650us auslöst 
und einen zweiten Timer im PWM-Mode, der dir 38kHz generiert. (Überlauf 
mit 76kHz und als Mode "Toggle Pin").

Im CTC-Timer-Interrupt entscheidest du anhand einer Zeichenkette, ob du 
den anderen Timer anschaltest oder nicht. Die Zeichenkette bestimmt den 
IR-Code.
fertig.


Oder du liest vielleicht doch endlich mal das hier: 
Beitrag "Re: NEC Protokoll für Harman AVR3550"

von Jürgen (Gast)


Lesenswert?

Okay, der Interupt läuft.
Aber ich habe das grundsätzliche Problem erkannt. Ich weis nicht was 
eine Trägerfrequenz ist.
Werde mich jetzt erstmall damit auseinandersetzten müßen.

Bin ja mall gespannt wie das funktioniert. Eine Frequenz auf einen Pin 
zujagen und gleichzeitig noch Informationen auf den selben zu schicken.

Ich berichte wenn ich nich weiter komme.

von Michael H. (michael_h45)


Lesenswert?

Jürgen schrieb:
> Okay, der Interupt läuft.
Sehr schön!

> Aber ich habe das grundsätzliche Problem erkannt. Ich weis nicht was
> eine Trägerfrequenz ist.
> Werde mich jetzt erstmall damit auseinandersetzten müßen.
http://www.sbprojects.com/knowledge/ir//ir.htm
bewährt!

von Jürgen (Gast)


Lesenswert?

Hallo,

Michael H. schrieb:
> Generell als Idee: Bau dir einen Timer im CTC, der alle 650us auslöst
> und einen zweiten Timer im PWM-Mode, der dir 38kHz generiert. (Überlauf
> mit 76kHz und als Mode "Toggle Pin").
>
> Im CTC-Timer-Interrupt entscheidest du anhand einer Zeichenkette, ob du
> den anderen Timer anschaltest oder nicht. Die Zeichenkette bestimmt den
> IR-Code.
> fertig.

Genau das versuche ich gerade umzusetzten und bleibe am PWM Signal schon 
hängen.

Der Timer läuft. Allerdings falsch.
Wenn ich richtig rechne brauch ich für 38 kHz ein Signal das 13.15789474 
µS High ist und die selbe Zeit Low ist. Also nehme ich den Prescaler der 
mir den Takt 4mHz durch 4 teilt => 1µS. Lade das Register OCR1A mit 0x0D 
(also 13) Somit bekome ich am Pin eine Frequenz von max. 38.4 kHz. 
Richtig?
Oder geht das genauer?

Folgenden Code habe ich dazu geschrieben:
1
#include <stdint.h>
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
5
int main(void)
6
{
7
  
8
9
  TCCR1 |= (1<<PWM1A)|(1<<COM1A0)|(1<<CS11)|(1<<CS10);
10
  OCR1A = 0x0D;
11
  DDRB = 0xff;
12
13
14
}
Lass ich diesen aber laufen, bekomme ich an Pin 6 folgendes Signal:
Ein High von 13µS und ein Low von 242µS zusammen also 255µS. Wo muss ich 
das Low definieren?

Michael H. schrieb:
> Oder du liest vielleicht doch endlich mal das hier:
> Beitrag "Re: NEC Protokoll für Harman AVR3550"

Das habe ich überflogen aber werde es nicht umsetzten. Weil ich nicht 
alle Teile da habe und ich dort auch nur Programe aufspielen muss ohne 
zu wiesen was sie überhaupt tun. Wenn ich es selber schreibe habe ich 
noch einen Lerneffekt dabei.

von Michael H. (michael_h45)


Lesenswert?

Jürgen schrieb:
> Wenn ich richtig rechne brauch ich für 38 kHz ein Signal das 13.15789474
> µS High ist und die selbe Zeit Low ist. Also nehme ich den Prescaler der
> mir den Takt 4mHz durch 4 teilt => 1µS. Lade das Register OCR1A mit 0x0D
> (also 13) Somit bekome ich am Pin eine Frequenz von max. 38.4 kHz.
> Richtig?
Das wäre schon sehr okay. Hier mal die Empfindlichkeit eines 
Infrarotempfängers abhängig von der Tragerfrequenzabweichung: 
http://www.mikrocontroller.net/attachment/81600/Clipboard.png
Lässt du den Prescaler bei 1, kommst du sogar noch näher an die 
Wunschzeiten.

> Ein High von 13µS und ein Low von 242µS zusammen also 255µS. Wo muss ich
> das Low definieren?
Die müssten eigentlich genau gleich lang sein. Ich vermute den Fehler 
woanders...
> Folgenden Code habe ich dazu geschrieben:
[...]
Dein Code sieht erst mal richtig aus.
Aber setz mal in deine main() noch ein
1
while(1) ;
damit der uC nicht resettet, denn vermute, dass genau das passiert, weil 
er "nichts" zu tun hat.



> nur Programe aufspielen muss ohne
> zu wiesen was sie überhaupt tun. Wenn ich es selber schreibe habe ich
> noch einen Lerneffekt dabei.
Gefällt mir!

von Jürgen (Gast)


Lesenswert?

So, Code geändert:
1
#include <stdint.h>
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
5
int main(void)
6
{
7
  
8
  TCCR1 |= (1<<PWM1A)|(1<<COM1A0)|(1<<CS10);
9
  OCR1A = 0x35;
10
  DDRB = 0xff;
11
  
12
13
  while(1)
14
  
15
  {
16
    PORTB |= (1<<PB5);
17
  }
18
19
}

Jetzt hat er was zu tun! :-)
Den Prescaler habe ich auf 1 gesetzt und Lade nun mit 53 vor.
Folgende veränderung:
High = ca.13µS Low= 51µS. Zusammen 64µS.
Passt also auch nicht.
Sonnst noch ne Idee?

von Michael H. (michael_h45)


Lesenswert?

So, Fehler gefunden
Jürgen schrieb:
1
  TCCR1 |= (1<<PWM1A)|(1<<COM1A0)|(1<<CS10);
             ^^^^^^^^
Lass das Bit mal ungesetzt. Du brauchst es für deinen Modus nicht.

von Jürgen (Gast)


Lesenswert?

Jetzt ist zwar High und low identisch mit 64µS (also insgesamt 128µS)
aber der Wert von OCR1A wird ignoriert. Selbst wenn ich da 00 oder ff 
reinschreibe bleiben die 64µS.
Kann das Leben den so schwer sein?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Welchen von den PWM Modi möchtest du denn benutzen?

Es gibt von den 16 theoretischen Modi nur vier bei denen OCR1A 
berücksichtigt wird. Siehe im Datenblatt Tabelle 'Waveform Generation 
Mode Bit Description'

von Jürgen (Gast)


Lesenswert?

Hallo,
Verstehe kein Wort.
Ich dachte der Code stimmt so. Ich möchte einfach nur das am Pin 6 (PB1) 
diese verflixten 38 kHz anliegen.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Naja, der Code stimmt ja offensichtlich nicht.

>> Das habe ich überflogen aber werde es nicht umsetzten. Weil ich nicht
>> alle Teile da habe und ich dort auch nur Programe aufspielen muss ohne
>> zu wiesen was sie überhaupt tun. Wenn ich es selber schreibe habe ich
>> noch einen Lerneffekt dabei.

Also ich hoffe jetzt nicht zu viel zu spoilern, aber in dem Datenblatt 
ist sind Formeln zur Berechnung der Frequenz an dem Ausgangspin OC1A in 
Abhängigkeit vom PWM-Modus, von der Taktrate (F_CPU bzw. tatsächlich 
benutztem Takt) und vom Prescaler. Die Auswahl des PWM-Modus richtet 
sich nach der gewünschten Signalform und bedingt dann die Art wie die 
Signalform beeinflusst wird also z.B. die Grenzen beim Vergleich mit 
TCNT1...

von Michael H. (michael_h45)


Lesenswert?

Jürgen schrieb:
> Verstehe kein Wort.
Langsam gehts mir genauso.
Ist es dem Tiny25 nicht beizubringen, den Pin OC1A abhängig vom 
OCR1A-Wert toggeln zu lassen?
Eine PWM ist kein Problem, aber getoggelt wird nur beim Überlauf des 
Timers.

Ich hab das Datenblatt in der letzten viertel Stunde jetzt 2 mal 
gelesen...

@Stefan: Die von dir angesprochenen Modi werden so im Datenblatt nicht 
für Timer1 erwähnt.

von Jürgen (Gast)


Lesenswert?

Ich versuchs gerade mal mit Timer 0.
Das muss doch irgendwie gehen.

von Michael H. (michael_h45)


Lesenswert?

So... beim dritten Lesen ist es mir aufgefallen.
Mittels OCR1A lassen sich tatsächlich nur PWMs erzeugen. Für den 
CTC-Mode (Clean Timer on Compare (Match)) gibt es bei diesem Tiny ein 
extra Register, nämlich OCR1C. Und dieses verflixte C hab ich jedes 
mal überlesen.

Auf alle Fälle:
1
OCR1C = 0x35;
2
TCCR1 = (1<<CTC1)|(1<<COM1A0)|(1<<CS10);
Erzeugt 38kHz an OC1A (PB1).

von Jürgen (Gast)


Lesenswert?

IIIIIIIIIPPPPPPPPPPIIIIIIIIIIIIEEEEEEEEEEE.

DANKE SCHÖN!

DAS WARS!

Jetzt gehts weiter.
So schwer kanns ja jetzt nicht mehr sein.

DANKE!

von Michael H. (michael_h45)


Lesenswert?

Jürgen schrieb:
> IIIIIIIIIPPPPPPPPPPIIIIIIIIIIIIEEEEEEEEEEE.
Mich ärgert die verschenkte Stunde noch ^^

von Jörg H. (idc-dragon)


Lesenswert?

Ich komme etwas spät, die Dinge sind ja schon fortgeschritten, aber:
Das Gerät hat doch auch eine serielle Schnittstelle? Kann man es nicht 
darüber einschalten?
Sowas habe ich mir nämlich gerade eben gebastelt: eine Art "Dongle" der 
einen AVR gleich einschaltet. Den Strom klaut er sich auch aus dem 
seriellen Port, etwas tricky. Das ist ein ATTiny25, drei Dioden, zwei 
Kondensatoren, ein Widerstand. Interesse?

(Das Programm in meinem tut noch etwas mehr: Wenn das Gerät an ist fragt 
es unablässig den Audiostatus ab und zieht eine Leitung, wenn das 
Mehrkanal ist. Damit will ich die (externen) Endstufen für Rear, Center, 
Sub schalten lassen.)

Jörg

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.