Ich würde gerne mit einen ATMEGA8 die Lautstärke meines Fernsehers
einstellen können. Ich habe schon herausgefunden das mein Sony Fernseher
mit einer Trägerfrequenz von 40kHz läuft.
Meine IR-Diode hängt am Port PB2.
Nur ich schaffe es einfach nicht die LED mit 40kHz blinken zu lassen.
Kann mir daher einer sagen wie ich den Timer einstellen muss wenn der
Controller mit 12MHz läuft?
>Nur ich schaffe es einfach nicht die LED mit 40kHz blinken zu lassen.>Kann mir daher einer sagen wie ich den Timer einstellen muss wenn der>Controller mit 12MHz läuft?
Taschenrechner und Datenblatt?
warum ein "?"
doch doch, du kannst sicher sein, das steht dort.
Mag sein, das man nicht exakt 40khz erwischt, aber das ist garnicht so
wichtig, da gibt es große Tolleranzen.
Habe mir folgendes ausgerechnet:
12000000 / 1024 = 11718,75
11718,75 * 3 = 35156,25 Hz = 35,15625kHz
TCCR1A = (1<<COM1B0);
TCCR1B = (1<<WGM12) | (1<<CS10) | (1<<CS12);
OCR1B = 0x02;
sei();
und in der Hauptschleife dann nur noch den Timer ein und ausschalten!
Sollte das dann so gehen?
>es fehlt noch, dass du interrupts anschaltest.
habe ich mit sei;
>35 khz sind allerdings etwas weit daneben. kann aber trotzdem klappen =>
ausprobieren.
gibt es eine möglichkeit das ich näher heran komme ohne den quarz zu
tauschen?
ichim schrieb:
> Habe mir folgendes ausgerechnet:> 12000000 / 1024 = 11718,75> 11718,75 * 3 = 35156,25 Hz = 35,15625kHz>>> TCCR1A = (1<<COM1B0);> TCCR1B = (1<<WGM12) | (1<<CS10) | (1<<CS12);> OCR1B = 0x02;> sei();
1) Ein OCR-Wert von 2 bedeutet "/ 3", nicht "* 3".
2) Beim Pin-Toggeln fehlt für die Berechnung der Ausgangsfrequenz auch
noch der Faktor 2.
2) OCR1B? Für den CTC-Mode muss der Wert nach OCR1A.
3) Thema Interrupt freigeben: die Vorredner meinten damit nicht nur
global mit sei(), sondern auch speziell den Timer-Interrupt. Ist aber
beides hier unnötig, du hast schließlich gar keine ISR.
>1) Ein OCR-Wert von 2 bedeutet "/ 3", nicht "* 3".
und was ist der unterschied zwischen beiden?
>2) Beim Pin-Toggeln fehlt für die Berechnung der Ausgangsfrequenz auch
noch der Faktor 2.
12000000 / 1024 = 11718,75
40000 / 11718,75 = 3,413333 / 2 = 1,70667 = OCR1A = 0x01
Probe:
Mhz Vorteiler OCR1A Toggeln
12000000 / 1024 = 11718,75 *2 = 23437,5 * 2 = 46,875kHz
Naja Passt das noch???
Kommt man irgendwie näher an die Frequenz????
ichim schrieb:
>>1) Ein OCR-Wert von 2 bedeutet "/ 3", nicht "* 3".> und was ist der unterschied zwischen beiden?
Hä? Du erwartest von mir jetzt nicht ernsthaft, den Unterschied zwischen
Multiplikation und Division zu erklären, oder?
> Naja Passt das noch???
Nein. Dein Rechenweg ist immer noch falsch.
Übrigens gibt es im Datenblatt exakt zu dieser Anwendung (Pin-Toggeln im
CTC-Modus) eine Formel für den Zusammenhang OCR-Wert <-> Frequenz.
Warum überhaupt den Vorteiler von 1024?
12MHz / (2 * 40KHz) = 150! Das ist dein Zählerwert, fertig.
Dann hast du ein 40KHz Rechteck.
Deine Rechnung oben kann ich nicht nachvollziehen.
Marvin schrieb:
> 12MHz / (2 * 40KHz) = 150! Das ist dein Zählerwert, fertig.> Dann hast du ein 40KHz Rechteck.
Naja, eigentlich fehlt noch ein "-1", aber dieser kleine Fehler wird den
Empfänger sicher nicht stören. ;-)
Die Interrupts brauche ich für den RS232 Empfang.
Der empfänger wartet mähmlich auf 3 Bytes auf der Seriellenschnittstelle
1.Byte Protokoll
2.Byte Adresse
3.Byte Daten
somit kann ich über RS232 so ziemlich alle geräte bei mir Ein- und
Ausschalten
Anbei nochmals der neueste quelltext der SIRC-Sende routine:
einfach Send_SIRC(1,20) aufrufen um den TV stumm zu schalten
Hallo Zusammen,
ich versuche den Code zu verstehen. Ist mir soweit auch alles klar. Ich
verstehe nur noch nicht, an welcher Stelle eine Umwandlung von Dezimal
nach Binär passiert.
Lt. ichim schaltet der Aufruf "Send_SIRC(1,20)" den Fernseher aus.
Passiert die Umwandlung hier ?
>>if ((daten >> i)&1)
Übersetzung : arbeite die Variable "daten" bitweise(!) nach rechts ab ?
Was bedeutet jier die Bitmanipulation UND 1 ?
Kann mich da mal jemand aufklären ?
Danke und Gruß
tom
>> if ((daten >> i)&1)>> Übersetzung : arbeite die Variable "daten" bitweise(!) nach rechts ab ?>> Was bedeutet jier die Bitmanipulation UND 1 ?
& ist hier C-Operator für Bitweise-UND
Bitweise-UND Wahrheitstabelle:
a b a&b
========
0 0 0
1 0 0
0 1 0
1 1 1
daten = 0b00110101; // Beispiel
1 dezimal = 0b00000001 binär = 0x01 hexadezimal
i daten>>i (daten>>i)&1
=========================
0 00110101 00000001
1 00011010 00000000
2 00001101 00000001
3 00000110 00000000
4 00000011 00000001
5 00000001 00000001
6 00000000 00000000
7 00000000 00000000
8 00000000 00000000
Ist doch nicht schwer, oder?
>> "Send_SIRC(1,20)"
Schickt also eine 1 und dann neunzehn Mal eine 0. Schwupp ist der TV
aus.
tom schrieb:
> Den Artikel habe ich vorher schon gelesen. Finde da aber irgendwie nicht> die Lösung zu meiner Frage ??
Mit welchem Teil dieses Satzes aus dem Artikel
<quote>
Bits prüfen
Will man prüfen ob ein oder mehrere Bits in einer Variable gesetzt oder
gelöscht sind, muss man sie mit einer Bitmaske UND verknüpfen. Die
Bitmaske muss an den Stellen der zu prüfenden Bits eine '1' haben, an
allen anderen eine '0'.
</quote>
hast du Schwierigkeiten?
(Das ist ernst gemeint. Wenn du damit ein Problem hast, kann man darüber
nachdenken den Artikel so zu verändern, dass das Problem ausgeräumt
wird)
ich habe hier ienen atmega32 auf einen Pollin Net IO Board, dürfte ja
der gleiche code sein wenn ich das richtig aus dem Datenblat entnommen
habe....
Habe die LED wie auf dem anhang angeschlossen. Es hat einmal geblinkt,
aber bekomme es jetzt nicht mehr zum laufen...
jemand ne idee?
erstmal danke für die Antwort.
Die LED scheint nich zu laufen, habe sie testweise mit Widerständen an
VCC und Grpund angeschlossen. Hier leuchtet sie, wenn auch schwach, aber
es tut sich was...
> deine Software liest den Port zurück und sieht dann immer ne Null.
Damit meinst du wohl diese Zeile oder??
TCCR1A = 0;
Deine IR-LED leuchtet? Fürs Auge oder mit IR-Empfänger gemessen? Die
meisten IR-LEDs halten nur 100mA Dauerstrom aus. Hoffe, du weißt das.
Sieht nach AVR aus. Da kenne ich mich nicht aus. Das Problem gibts aber
bei vielen Controllern, z.B. 8051. Ube(sat) ist unter der Schwelle zu
HIGH.
Also die IR - LED leuchtet wenn ich sie durch meine Handykamera
betrachte... (aber eben nicht am Pin mt der PWM)
Verstehe nicht 100% was du mit Ube(sat) meinst. Vermute mal, das du auf
die Spannung am Controler-Pin anspielst?! Die soll nicht ausreichend
sein um die Diode durchzuschalten? Gut möglich, habe leider kein
Messgerät hier ums zu überprüfen.
Jemand noch ne Idee wie ich dem Problem systematisch auf den Grund gehen
kann?
Was mir im zuletzt geposteten Programm auffällt:
Die entsprechenden Port-Pins werden nie auf Ausgang gesetzt.
Wenn mich mein Gedächtnis nicht trügt, dann werden die aber nicht
automatisch auf Output gesetzt, nur weil man da eine PWM drauf schaltet.
Damit würde sich deine Beobachtung wie folgt erklären:
Was der Timer macht: Er schaltet ständig den Pullup Widerstand zu und
ab. Das reicht aber nicht, damit eine LED leuchtet.
Ok, danke für den Tipp. Habe das Programm wie folgt geändert:
1
voidIR_LED_ON(void){
2
TCCR1A|=(1<<COM1B0);
3
DDRD|=(1<<PD5);
4
}
5
6
voidIR_LED_OFF(void){
7
TCCR1A=0;
8
DDRD&=~(1<<PD5);
9
10
}
Jetzt blinkt eine normale (grüne) LED mit der oben geposteten
Transistorschaltung. Aber nur wenn ich an das Basisbein des Transistos
zusätzlich meinen Daumen halte. hää?
Johannes Xy schrieb:> Ok, danke für den Tipp. Habe das Programm wie folgt geändert:>>
1
voidIR_LED_ON(void){
2
>TCCR1A|=(1<<COM1B0);
3
>DDRD|=(1<<PD5);
4
>}
5
>
6
>voidIR_LED_OFF(void){
7
>TCCR1A=0;
8
>DDRD&=~(1<<PD5);
9
>
10
>}
Die DDR Einstellung macht man einmal am Programmanfang und danach lässt
du sie in Ruhe!
Was soll denn das bringen, wenn du den Pin beim Abschalten der LED
wieder auf Eingang stellst? Lass ihn doch auf Ausgang. Du willst ja
haben, dass der µC aktiv den Pin auf 0 zieht
hoppala,
ja das ist wohl nicht so klug, das hätte selbst ich als Anfänger mir
denken können.
Hab die DDR Konfiguration an den Anfang gebracht.
Um noch mal zurück auf deinen Satz zu kommen:
>Was der Timer macht: Er schaltet ständig den Pullup Widerstand zu und>ab. Das reicht aber nicht, damit eine LED leuchtet.
Ich bin etwas unsicher, meinst du damit, die Aufurfe LED ON und OFF
sollten den PD4 jeweils auf HIGH und LOW setzen?
und wie weiter oben schon angemekrt, es ist in dem Schaltbild falsch.
>kleine Korrektur zu dem Schaltbild, mein Tranistor hängt an OC1B...
Johannes Xy schrieb:> hoppala,> ja das ist wohl nicht so klug, das hätte selbst ich als Anfänger mir> denken können.>> Hab die DDR Konfiguration an den Anfang gebracht.> Um noch mal zurück auf deinen Satz zu kommen:>>>Was der Timer macht: Er schaltet ständig den Pullup Widerstand zu und>>ab. Das reicht aber nicht, damit eine LED leuchtet.>> Ich bin etwas unsicher, meinst du damit, die Aufurfe LED ON und OFF> sollten den PD4 jeweils auf HIGH und LOW setzen?
Nein.
Der Timer steuert schon ganz von alleine das Port Register an. Das ist
ja auch bei einer PWM seine Aufgabe.
Nur sollte der Pin dann auch auf Ausgang stehen. Denn der Timer macht ja
intern im Grunde auch nichts anderes, als wie wenn du händisch ein Bit
in einem PORT Register setzt. Und die Auswirkung dieses Bitsetzens hängt
nun mal davon ab, ob der Pin in diesem PORT auf Eingang oder auf Ausgang
steht.
Man sollte sich die Logik an I/O-Pins sehr genau zu Gemüte führen. Da
gibt es je nach Controller-Familie kleine Unterschiede, die sich oft
auch im Befehlssatz widerspiegeln. Was wird wann wo gelesen, Pin-Zustand
oder Latch-Zustand usw.
Offensichtlich ist kein Scope vorhanden? Auch kein Multimeter? Der
Finger an der Basis, ist halt kurios. Vielleicht den Transistor falsch
angeschlossen oder schlecht gelötet?
Ube(sat) ist die Sättigungsspannung des Transistors bei Vollaussteuerung
an seinem Steuereingang Basis. Das Teil wird über den Strom gesteuert!
Nehmen wir an, du schreibst ein HIGH am Controller raus. Dann fließt ein
Basisstrom vom Controller über den Widerstand in den Transistor. Bei
richtiger Auslegung des Widerstands, haste dann an der Basis ca. 0,6V.
Über den Widerstand fast 4,4V. Am Controller-Pin eine Differenz von
vielleicht 0,1 oder 0,2V zu VCC.
ACHTUNG: Liest der Controller den Pin-Status ein, dann sieht er immer
ein LOW. Vorausgesetzt, der Ausgang ist als Eingang konfiguriert! Sollte
der Basiswiderstand fehlen, weil der Controller eh einen Stromausgang
hat (z.B. beim PCF8574), dann würde er die Basisspannung einlesen, die
kann aber nie höher als ca. 0,8V sein! Hoffe jetzt ist es klar.
Danke für die Erklärung.
Ich habe jetzt noch mal die Transistorschaltung durchgerechnet und bin
auf ein Basiswiderstand von 1.5K gekommen (bei hFE = 35, Ic = 100mA)
Schaltung wie in dem Schaltbild angefügt aufgebaut, LED leuchtet :).
Aber sie leuchtet die ganze Zeit, kein blinken! Argh.
Code sieht jetzt wie folgt aus:
Mit dem AVR-Code kann ich dir leider nicht weiterhelfen. Teste es doch
durch SelbstAVRspielen. Wenns dann geht, ist es ein Softwareproblem.
Einen BR337 gibt es nicht und oben war es noch ein BC337. Hoffentlich
machst du im Code nicht genauso viele Fehler. Ein AVR verzeiht nix!
Johannes Xy schrieb:> void IR_LED_OFF(){> TCCR1B = 0;>
Dir ist aber schon klar, dass du dir hier die komplette restliche
Konfiguration des Timers (CTC Mode, Vorteiler) über den Haufen
geschossen hast?