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


von Johannes (Gast)


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

von spess53 (Gast)


Lesenswert?

Hi

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

MfG Spess

von Michael U. (amiga)


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

von Johannes (Gast)


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;
}

von MWS (Gast)


Lesenswert?

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

von avr (Gast)


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:
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

von spess53 (Gast)


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

von kurz (Gast)


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.

von avr (Gast)


Lesenswert?

@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

von Johannes (Gast)


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

von spess53 (Gast)


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

von avr (Gast)


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

von Johannes (Gast)


Angehängte Dateien:

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

von Johannes (Gast)


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.

von spess53 (Gast)


Lesenswert?

Hi

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

Was benutzt du denn als Empfänger?

MfG Spess

von Johannes (Gast)


Angehängte Dateien:

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

von Johannes (Gast)


Lesenswert?

hat keiner eine idee oder ein vorschlag?

von spess53 (Gast)


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

von Johannes (Gast)


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

von spess53 (Gast)


Lesenswert?

Hi

Wie sieht denn deine jetzige Schaltung aus?

MfG Spess

von Johannes (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

sieht so aus...

Gruß Jo

von Johannes (Gast)


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

von avr (Gast)


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

von Johannes (Gast)


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

von gast (Gast)


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

von Johannes (Gast)


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

von Johannes (Gast)


Lesenswert?

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

von Johannes (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.