www.mikrocontroller.net

Forum: Compiler & IDEs AVR IR Problem


Autor: Stefan H. (stefan_h16)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe vor einiger Zeit angefangen mit AVR und schon einiges mit 
meinem Arduino Nano aufgebaut.
Zuerzeit versuche ich meinen Attiny24 als IR Fernbedienung für ein 
spezielles Protokoll zu nutzen. Dabei soll der Timer genutzt werden um 
die 38 kHz Trägerfrequenz für die IR-Diode bereitzustellen. Je nachdem 
ob dann ein High oder Low gesendet werden soll, sollte der entsprechende 
Ausgang ein oder ausgeschaltet werden für ein definierte Zeit.
Mit meinem Arduino Nano hab ich das ganze mit viel Hilfe aus dem 
Internet schon erfolgreich gebaut, jetzt wollte ich es auf den kleinen 
ATTiny24 portieren. Leider wird das Signal vom Empfänger nicht erkannt 
und ich habe keine Idee wie ich vorgehen soll.
#define PFIR_BASE_FREQ 38
void enableIRout()
{

    sbi(DDRA, 5);
    cbi(PORTA, PORTA5); // PORTA5 low
    TCCR1A = _BV(WGM10);
    TCCR1B = _BV(WGM12) | _BV(CS10);

    OCR1A = F_CPU / 2 / PFIR_BASE_FREQ / 1000;
    OCR1B = OCR1A / 3; // 33% duty cycle

}
Diese Funktion sollte den Timer 1 auf die Generierung der 38 kHz 
einstellen. Tut er das wirklich ? Trotz Studium unzähliger Texte zum 
Thema bin ich mir da nicht sicher.
 inline void mark(int time) {
  // Sends an IR mark for the specified number of microseconds.
  // The mark output is modulated at the PWM frequency.
  TCCR1A |= (1<<(COM1B1));
  _delay_us(time);
}



 inline void space(int time) {
  // Sends an IR space for the specified number of microseconds.
  // A space is no output, so the PWM output is disabled.
  TCCR1A &= ~(1<<(COM1B1));
  _delay_us(time);
}
Diese beiden Funktionen sollen den PWM ein bzw ausschalten für eine 
bestimmte Zeit um High oder Low zu senden.
Die IR Diode hängt an PA5 (OC1B) und über einen Widerstand an GND.

Machen die Funktionen das was ich will und hat irgendjemand eine Idee 
wie ich das mit vernünftigen Hardware aufwand debugge ?

Danke im Vorraus

Stefan

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan H. schrieb:

> Diese Funktion sollte den Timer 1 auf die Generierung der 38 kHz
> einstellen. Tut er das wirklich ?

Wie sieht deine händische Berechnung aus?
Hast du die Basisannahmen (zb Taktfrequenz) überprüft?

Autor: Stefan H. (stefan_h16)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Stefan H. schrieb:
>
>> Diese Funktion sollte den Timer 1 auf die Generierung der 38 kHz
>> einstellen. Tut er das wirklich ?
>
> Wie sieht deine händische Berechnung aus?
> Hast du die Basisannahmen (zb Taktfrequenz) überprüft?

Also Ziel ist ein Phase Correct PWM Mode implementieren. Ohne Vorteiler. 
Die Frequenz ist die des internen Taktgebers (8 MHZ). Wenn ich das 
Datenblatt richtig verstanden habe sollte dafür die korrekte frequenz 
von 38 kHz entstehen.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan H. schrieb:
> Die Frequenz ist die des internen Taktgebers (8 MHZ).

Ist sie das auch wirklich, oder hast du die CKDVI8-Fuse noch aktiv
und daher nur 1 MHz Takt?

Autor: Stefan H. (stefan_h16)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch schrieb:
> Stefan H. schrieb:
>> Die Frequenz ist die des internen Taktgebers (8 MHZ).
>
> Ist sie das auch wirklich, oder hast du die CKDVI8-Fuse noch aktiv
> und daher nur 1 MHz Takt?

Kaum hatte ich die CKDVI8 Fuse geändert hat das Programm schon perfekt 
funktioniert. Die Umstellung vom kompletten Arduinosystem auf nackte 
Controller ist doch komplizierter als gedacht :). Vielen Dank.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wobei die CKDIV8-Fuse nur eine Voreinstellung für den Taktteiler
vornimmt: es steht dir frei, den Taktteiler in jedem Falle zur Laufzeit
neu einzustellen, dann bist du von dieser Fuse komplett unabhängig.

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.