Forum: Compiler & IDEs AVR IR Problem


von Stefan H. (stefan_h16)


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.
1
#define PFIR_BASE_FREQ 38
2
void enableIRout()
3
{
4
5
    sbi(DDRA, 5);
6
    cbi(PORTA, PORTA5); // PORTA5 low
7
    TCCR1A = _BV(WGM10);
8
    TCCR1B = _BV(WGM12) | _BV(CS10);
9
10
    OCR1A = F_CPU / 2 / PFIR_BASE_FREQ / 1000;
11
    OCR1B = OCR1A / 3; // 33% duty cycle
12
13
}
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.
1
 inline void mark(int time) {
2
  // Sends an IR mark for the specified number of microseconds.
3
  // The mark output is modulated at the PWM frequency.
4
  TCCR1A |= (1<<(COM1B1));
5
  _delay_us(time);
6
}
7
8
9
10
 inline void space(int time) {
11
  // Sends an IR space for the specified number of microseconds.
12
  // A space is no output, so the PWM output is disabled.
13
  TCCR1A &= ~(1<<(COM1B1));
14
  _delay_us(time);
15
}
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

von Karl H. (kbuchegg)


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?

von Stefan H. (stefan_h16)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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?

von Stefan H. (stefan_h16)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

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.