mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 37.47kHz Rechteck erzeugen mit 7.3728MHz Quarz, welcher Timer Modus?


Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

CTC. Vorteiler 1. OCR=$61 ->37,616 kHz. Genauer gehts nicht.

MfG Spess

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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;
}

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du toggelst den Pin, zweimal getoggelt gibt eine Schwingung, also musst 
Du mit doppelter Frequenz toggeln und den halben errechneten Comp-Wert 
nehmen.

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
//TIMER1 initialize - prescale:1
// WGM: 14) PWM fast, TOP=ICRn
// desired value: 37.47KHz
// actual value: 37,616KHz (0,4%)
void timer1_init(void)
{
 TCCR1B = 0x00; //stop
 TCNT1H = 0xFF; //setup
 TCNT1L = 0x3D;
 OCR1AH = 0x00;        //<= PWM-Wert  TOP/2
 OCR1AL = 0x62;
 OCR1BH = 0x00;
 OCR1BL = 0x62;
 ICR1H  = 0x00;        // Topwert
 ICR1L  = 0xC3;
 TCCR1A = 0x02;
 TCCR1B = 0x19; //start Timer
}


Leider verwendet ICC nicht einzelne Registerbits :-(

gruß avr

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: kurz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@spess53

Hast ja im prinzip recht. Also hier mit Rechteck auf OC2:

//TIMER2 initialize - prescale:1
// WGM: CTC
// desired value: 74.8KHz
// actual value: 74,473KHz (0,4%)
void timer2_init(void)
{
 TCCR2 = 0x00; //stop
 ASSR  = 0x00; //set async mode
 TCNT2 = 0x9E; //setup
 OCR2  = 0x62;
 TCCR2 = 0x19; //start
}

avr

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Johannes (Gast)
Datum:
Angehängte Dateien:
  • preview image for rc.PNG
    rc.PNG
    3,5 KB, 324 Downloads

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>ich weiss nicht woran es liegt. Vermutlich die Trägerfrequenz.

Was benutzt du denn als Empfänger?

MfG Spess

Autor: Johannes (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hat keiner eine idee oder ein vorschlag?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Wie sieht denn deine jetzige Schaltung aus?

MfG Spess

Autor: Johannes (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

sieht so aus...

Gruß Jo

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es funktioniert... nachdem ich die Schaltung neu aufgebaut habe und mit 
dem OCR2 rumgespielt hab.

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mehrere Meter sogar :-) Danke an spess und avr

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.