Hi Leute, möchte gerne ein Recheck der Frequenz 37.47kHz erzeugen. Welchen Modus nimmt man da? Teffe ich die genannte Frequenz überhaupt mit irgendeinem Vorteiler? Wie berechne ich sowas? Vielen Dank und Gruß Johannes
Hi CTC. Vorteiler 1. OCR=$61 ->37,616 kHz. Genauer gehts nicht. MfG Spess
Hallo, Taschenrechner? 7372800/37470 = 196,7654123298638911128903122498 geht also nicht. 7372800/197 = 37425,380710659898477157360406091 7372800/195 = 37616,326530612244897959183673469 Such es Dir aus... Gruß aus Berlin Michael
kann bitte jemand drüber schauen, wo mein Fehler liegt? irgendwie habe ich das Gefühl dass da die Frequenz nicht stimmt... #define F_CPU 7372800 #include <avr/io.h> #include <avr/interrupt.h> //#include <avr/signal.h> #include <util/delay.h> //ISR(TIMER1_COMPA_vect) //{ //PORTB ^= (1 << PB1); //} int main (void) { // OC1A auf Ausgang DDRB = (1 << PB1 ); //ATMega8 TCCR1A |= (1<<COM1A0) ; TCCR1B = (1<<WGM12) | (1<<CS10); OCR1A = 196; while(1) { } return 0; }
Du toggelst den Pin, zweimal getoggelt gibt eine Schwingung, also musst Du mit doppelter Frequenz toggeln und den halben errechneten Comp-Wert nehmen.
Hallo Johannes, mach es dir einfach und nehm den Timer 1 als Fast PWM mit TOP mit 196 in ICR1 und PWM-Wert in OCR1A/B 97. Dann hast du das Rechteck an den OC1A/B PINS (als Ausgang schalten!). Einmal gestartet läuft das Signal in Harware ohne Interrupt. Mein ICC sagt:
1 | //TIMER1 initialize - prescale:1
|
2 | // WGM: 14) PWM fast, TOP=ICRn
|
3 | // desired value: 37.47KHz
|
4 | // actual value: 37,616KHz (0,4%)
|
5 | void timer1_init(void) |
6 | {
|
7 | TCCR1B = 0x00; //stop |
8 | TCNT1H = 0xFF; //setup |
9 | TCNT1L = 0x3D; |
10 | OCR1AH = 0x00; //<= PWM-Wert TOP/2 |
11 | OCR1AL = 0x62; |
12 | OCR1BH = 0x00; |
13 | OCR1BL = 0x62; |
14 | ICR1H = 0x00; // Topwert |
15 | ICR1L = 0xC3; |
16 | TCCR1A = 0x02; |
17 | TCCR1B = 0x19; //start Timer |
18 | }
|
Leider verwendet ICC nicht einzelne Registerbits :-( gruß avr
Hi >mach es dir einfach und nehm den Timer 1 als Fast PWM >mit TOP mit 196 in ICR1 und PWM-Wert in OCR1A/B 97. >Dann hast du das Rechteck an den OC1A/B PINS (als Ausgang >schalten!). Einfacher als CTC? Und dann noch einen 16Bit-Timer verschwendet. Toller Tip. MfG Spess
Was heißt denn verschwendet, ist im uP doch vorhanden und kostet nix extra. Oder kennst Du alle Anforderungen des TE, um sagen zu können, die Hardware-Resourcen werden knapp? Wie hat mal jemand hier geschrieben: Man bekommt kein Geld vom Hersteller zurück, wenn man nicht alle Resourcen verwendet.
@spess53 Hast ja im prinzip recht. Also hier mit Rechteck auf OC2:
1 | //TIMER2 initialize - prescale:1
|
2 | // WGM: CTC
|
3 | // desired value: 74.8KHz
|
4 | // actual value: 74,473KHz (0,4%)
|
5 | void timer2_init(void) |
6 | {
|
7 | TCCR2 = 0x00; //stop |
8 | ASSR = 0x00; //set async mode |
9 | TCNT2 = 0x9E; //setup |
10 | OCR2 = 0x62; |
11 | TCCR2 = 0x19; //start |
12 | }
|
avr
Vielen Dank für die Hilfe. Hatte in meiner Lösung genau den Fehler, dass ich vergessen habe, dass ich toggle :-/ eine Frage hätte ich noch. Das nun erzeugte Signal ist die Trägerfrequenz für ein IR-LED. Wie kann ich nun das eigentliche Datensignal mit der Trägerfrequenz koppeln bzw modulieren? Nimmt man da dioden um die Signale zusammenzuführen? Derzeit habe ich ein Widerstand zwischen den beiden Portpins, aber irgendwie noch ein Fehlverhalten drin. Vielleicht weiss das jemand? gruß Johannes
Hi >Das nun erzeugte Signal ist die Trägerfrequenz für ein IR-LED. Bist du dir dann mit den 37.47kHz sicher? >Wie kann ich nun das eigentliche Datensignal mit der Trägerfrequenz koppeln Und-Verknüpfung. Falscher Controller. Der ATTiny28 ist für so etwas gemacht. MfG Spess
Hallo Johannes, für IR ist deine Frequenz etwas seltsamm. 36 oder 38 kHz ist üblicher. Zum Senden die IR-Diode mit Widerstand an OCx-Pin anschliessen. Entweder nach GND oder VCC, dann Logik beachten. Für die Impulse den Timer starten, für Pause stoppen und Pin auf High oder Low setzen (kein Strom durch IR-Diode). Mehr ist nicht nötig. gruß avr
Danke für die Info, wäre das so machbar? oder brauche ich da einen pnp und dann den Widerstand von der Basis gegen GND weglassen und alle daten in der software negieren??? oder kann ich nach wie vor ein npn benutzen. Vorher war das halt möglich, weil ich da nicht den Pullupwiderstand und die dioden hatte sondern nur eine npn treiberstufe. Stört der Pullup, den Tansistor irgendwie?? Gruß Jo
@avr: kannst du das vielleicht noch etwas erläutern? ich würde das gerne mit einem kleinen transistor machen, da mir 20mA durch die IR-Diode bissl wenig vorkommen und momentan nur 1m empfang habe bei rund 30mA. ich weiss nicht woran es liegt. Vermutlich die Trägerfrequenz.
Hi
>ich weiss nicht woran es liegt. Vermutlich die Trägerfrequenz.
Was benutzt du denn als Empfänger?
MfG Spess
Hi Spess, ein Samsung LCD der serie 5. Ich habe gute materialien gefunden über das protokoll, was sich mit meinen "messungen und schätzungen" gedeckt hat. Allerdings finde ich es seltsam, dass das was ich gestern von der Fernbedienung (org. Samsung) gemessen habe bei den Samsungunterlagen unter Toshibacode erklärt wird. ich füge es mal bei. gruß Jo
hat keiner eine idee oder ein vorschlag?
Hi Ich meinte primär das Teil, das dein Infrarotsignal empfängt. Diese sind, wie avr schon sagte, auf bestimmte Carrierfrequenzen abgestimmt. In deinem Fall sollten es 38kHz sein. Ein paar 100Hz Abweichung sind dabei uninteressant. >ich würde das gerne mit >einem kleinen transistor machen, da mir 20mA durch die IR-Diode bissl >wenig vorkommen und momentan nur 1m empfang habe bei rund 30mA. Wie hast du das ganze bemessen. IR-Sendedioden vertragen Impulsbelastungen von einigen 100mA (teilweise bis in den Ampere-Bereich). Näheres findest du im Datenblatt der Diode. Wenn deine 30mA der Impulsstrom sind, dann ist das massiv zu wenig. >ich weiss nicht woran es liegt.Vermutlich die Trägerfrequenz. Mit Sicherheit nicht. Siehe oben. > gemessen habe bei den Samsungunterlagen unter Toshibacode erklärt wird. Erfinder eines Codes und Anwender sind zwei Paar Schuhe. MfG Spess
Vielen Dank Spess, also an den Empfänger komme ich dummerweise nicht dran bzw es würde die garantie erlischen... Aus dem Grunde keine Ahnung was da drin steckt. Ich habe das alles auf Lochraster aufgebaut und die Spannungs versorgung hat so dünne kabel, dass da vermutlich nicht mehr als 30mA drin sind. Ich habe den Strom mit einen handelsüblichen Multimeter gemessen. Also nicht den Pulsstrom. ich betreibe die Diode mit 5V und einem 27R. In der Orginalfernbedienung ist nicht mal ein Widerstand drin gewesen, da kleiner Kurzschlussstrom, was mache ich falsch... Gruß Jo
Hi Wie sieht denn deine jetzige Schaltung aus? MfG Spess
Hi, sieht so aus... Gruß Jo
nachtrag: Und wenn ich an vcc und gnd noch nen elko von 220µ schalte, funktionierts nicht mehr wirklich... irgendwas stimmt mit der schaltung nicht... ich glaube ich muss das alles über ein portpin machen, aber bin da noch ganz frisch in dem bereich. Ich weiss auch nichts über die IR-Diode, weil die gerade in der universalfernbedienung drin war :-) Ich müsste quasi, das high vom datensignal modulieren. Also wenn das Datenbit high ist, soll der träger bzw der Timer losklappern und mein pin zusätzlich mit 38khz toggeln. Ist mein Datenbit low, wird der Timer gestoppt für die zeit. Klingt erstmal logisch und einfach, aber ich tu mich da softwaremäßig noch ziemlich schwer... macht die wellenlänge der IR-Diode was aus? Aber daran kanns nicht liegen, weil die UniversalFernbedienung mit dieser Diode ja auch über mehrere Meter funktioniert hat... gruß Jo
Hallo Johannes, bei der Schaltung gibt es Probleme mit Träger und Daten. Das ist unnötig. Wenn du den Träger mit dem Timer erzeugst und entsprechend den Daten den Timer startest oder stoppst (dann PIN auf low) brauchst du keine extra Datenleitung. Dann nur normal die IR-Diode mit Transistor und Basiswiderstand an diesen Signalpin. Beispiele für die Berechnung hier im Forum: http://www.mikrocontroller.net/articles/Basiswiderstand gruß avr
Vielen Dank avr,
so hatte ich es vor, werds mal aufbauen und testen ob ich das mit dem
timer hinbekomme...
Was genau machst du in deiner Routine mit dieser Zeile?
>TCNT2 = 0x9E; //setup
ich berechne OCR2 doch in meinem falle nach folgender Formel
fir= F_CPU/(2*N*(OCR2+1)) ?
Gruß jo
Für die Frequenz muß der Timer bis 0x62 zählen. ICC berechnet (warum auch immer) daher einen Startwert von 0x100-0x62 = 0x9e. Hat aber für dich jetzt keine Bedeutung. avr
genau das hat mich bissl irritiert... also berechne ich einfach mein OCR2 wer nach meiner genannten Formel und dann initialisiere ich den timer. wenn mein datensignal high ist, starte ich mein timer und toggel somit Pin OC2 und wenn ich eine 0 sende, stoppe ich den timer. ist das richtig? vielen dank nochmal für eure unterstützung... gruß Jo
Es funktioniert... nachdem ich die Schaltung neu aufgebaut habe und mit dem OCR2 rumgespielt hab.
Mehrere Meter sogar :-) Danke an spess und avr
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.