NEC Protokoll für Harman AVR3550

Gast #1994801
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;-)
Gast #1994873
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.
Persönliche Seite #1995288
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.
Gast #1995332
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?
Gast #1995433
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
Persönliche Seite #1995447
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.
Gast #1995517
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
Gast #1996644
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?
Angehängte Dateien:
Gast #1996880
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
Angehängte Dateien:
#1996894
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"
Gast #1996985
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.
Gast #1997791
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.
#1997839
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!
Gast #1997942
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?
Gast #1997995
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?
Persönliche Seite #1998276
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...
#1998285
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.
#1998310
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).
#1998651
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren