Forum: Mikrocontroller und Digitale Elektronik Infrarot Empfänger -> Attiny44


von Christian O. (hightec)


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.

von Dieter F. (Gast)


Lesenswert?

Wo und wie hast Du denn F_CPU definiert?

von Christian O. (hightec)


Lesenswert?

Das F_CPU habe ich im Makefile auf 8 Mhz gesetzt. Oder muss das im Code 
nochmal extra gemacht werden?

von Dieter F. (Gast)


Lesenswert?

Christian O. schrieb:
> Oder muss das im Code
> nochmal extra gemacht werden?

Nö, reicht aus.

Läuft er auch mit 8 MHz?  CKDIV8 Fuse deaktiviert?

Ich gehe davon aus, dass Du die Optimierungen lt. Artikel aktiv hast und 
die irmpconfig.h entsprechend angepasst ist.

von Christian O. (hightec)


Lesenswert?

OMG.. Danke  ich habe vergessen die CKDIV8 Fuse zu deaktivieren. Ein 
Haken raus und schon geht alles :D

Vielen vielen Dank.

von Dieter F. (Gast)


Lesenswert?

Christian O. schrieb:
> OMG.. Danke  ich habe vergessen die CKDIV8 Fuse zu deaktivieren.
> Ein
> Haken raus und schon geht alles :D
>
> Vielen vielen Dank.

Gerne - frohes Fest :-)

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.