Infrarot Empfänger -> Attiny44

OP #3937363
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren