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