Guten Morgen liebe Forengemeinde.
Im Rahmen eines Weihnachtsgeschenkes möchte ich den Infrarot-Empfänger
(https://cdn-reichelt.de/documents/datenblatt/A500/TSOP312SERIES_DATASHEET.pdf)
auf einem Attiny44 zum laufen bekommen.
Ich hatte es vorher zu testzwecken auf einem Atmega mit dem gleichen
Code laufen gehabt und es funktionierte einwandfrei.
Nun habe ich eine kleine Platine angefertigt, diese habe ich schon
mehrmal überprüft und hardwaretechnisch ist alles ok. Das Signal den
TSOP kommt am Pin PB0 des Attiny44 an (gebrüft mit Osziloskop).
Nun muss der Fehler in meiner Software liegen. Ich benutze als Grundlage
den Source Code aus de IRMP-Artikel
(http://www.mikrocontroller.net/articles/IRMP)
Ich habe schon geprüft ob ich die Variablen des Timer 1_init() ändern
muss, aber die Register scheinen die gleichen wie beim Atmega8 zu sein.
Ich habe auch schon getestet ob die CompA_Vect-ISR läuft und auch dies
scheint zu funktionieren. (habe einen Ausgang pollen lassen).
Nun verzweifel ich ein wenig, da der Attiny beim besten willen kein
IR-Signal erkennt. Was habe ich falsch gemacht?
1 | #include <avr/io.h>
|
2 | #include <util/delay.h>
|
3 | #include <avr/interrupt.h>
|
4 |
|
5 |
|
6 | #include "irmp.h"
|
7 |
|
8 | static void
|
9 | timer1_init (void)
|
10 | {
|
11 | #if defined (__AVR_ATtiny45__) || defined (__AVR_ATtiny85__) // ATtiny45 / ATtiny85:
|
12 |
|
13 | #if F_CPU >= 16000000L
|
14 | OCR1C = (F_CPU / F_INTERRUPTS / 8) - 1; // compare value: 1/15000 of CPU frequency, presc = 8
|
15 | TCCR1 = (1 << CTC1) | (1 << CS12); // switch CTC Mode on, set prescaler to 8
|
16 | #else
|
17 | OCR1C = (F_CPU / F_INTERRUPTS / 4) - 1; // compare value: 1/15000 of CPU frequency, presc = 4
|
18 | TCCR1 = (1 << CTC1) | (1 << CS11) | (1 << CS10); // switch CTC Mode on, set prescaler to 4
|
19 | #endif
|
20 |
|
21 | #else // ATmegaXX:
|
22 | OCR1A = (F_CPU / F_INTERRUPTS) - 1; // compare value: 1/15000 of CPU frequency
|
23 | TCCR1B = (1 << WGM12) | (1 << CS10); // switch CTC Mode on, set prescaler to 1
|
24 | #endif
|
25 |
|
26 | #ifdef TIMSK1
|
27 | TIMSK1 = 1 << OCIE1A; // OCIE1A: Interrupt by timer compare
|
28 | #else
|
29 | TIMSK = 1 << OCIE1A; // OCIE1A: Interrupt by timer compare
|
30 | #endif
|
31 | }
|
32 |
|
33 | #ifdef TIM1_COMPA_vect // ATtiny84
|
34 | #define COMPA_VECT TIM1_COMPA_vect
|
35 | #else
|
36 | #define COMPA_VECT TIMER1_COMPA_vect // ATmega
|
37 | #endif
|
38 |
|
39 | ISR(COMPA_VECT) // Timer1 output compare A interrupt service routine, called every 1/15000 sec
|
40 | {
|
41 |
|
42 | (void) irmp_ISR();
|
43 |
|
44 |
|
45 |
|
46 | // call irmp ISR
|
47 | // call other timer interrupt routines...
|
48 | }
|
49 | int main(void){
|
50 | DDRA |= (1 << DDA0);
|
51 |
|
52 | IRMP_DATA irmp_data;
|
53 |
|
54 | irmp_init();
|
55 | timer1_init();
|
56 | sei ();
|
57 | int status;
|
58 | status = 0;
|
59 | while (1)
|
60 | {
|
61 | if (irmp_get_data(&irmp_data))
|
62 | {
|
63 | PORTA |= (1<<PA0);
|
64 | _delay_ms(500);
|
65 | PORTA &= ~(1<<PA0);
|
66 |
|
67 |
|
68 |
|
69 |
|
70 |
|
71 | }
|
72 | }
|
73 | }
|
In der IRMPconfig habe ich den Pin PB0 eingestellt und auf 15000
interrupts gesetzt.
Ich hoffe ihr könnt mir helfen, damit ich das Weihnachtsgeschenk heute
noch abliefern kann ;-)
Vielen Dank schonmal.