Interrupt INT0 mit Atmel Studio6/7 aktivieren!?

Gast #4418522
Lesenswert?

Hallo,
ich wollte den Aufbau (Siehe Link im Quellcode) nachbauen und setze 
dafür ein Atmega328PU ein. Dieser wird über ein 16Mhz Quarz angesteuert. 
Ich setze ein TSOP4838 am INT0 ein.
Ich arbeite mit AtmelStudio6. Es scheint hier aber so, als wenn INT0 
nicht arbeitet. Der Code scheint für AtmelStudio < 6 erstellt worden zu 
sein, weil er "GICR" nicht kennt. Ich habe folgendes gefunden:
1
#define GIMSK _SFR_IO8(0x3B)
2
#define GICR GIMSK
Scheint aber nicht zu funktionieren....

Hat jemand eine Idee, wie ich diesen Code für AtmelStudio6 bauen kann, 
so dass INT0 auslöst?

Danke!
1
// Avr rc5 remote control:
2
// http://wiki.electronics-irc.net/Avr_rc5_remote_control
3
// mein Testaufbau: Atmega328PU @ 16Mhz Quarz (nicht 3,...Mhz)
4

5
#include <avr/interrupt.h>
6
#include <avr/io.h>
7
#include <util/delay.h>
8

9
// definiere für Atmega328p --> GICR (richtig?)
10
#define GIMSK _SFR_IO8(0x3B)
11
#define GICR GIMSK
12

13
//#define PB5 (1 << 5)
14

15
typedef union {
16
  uint16_t raw;
17
  struct {
18
    unsigned cmd    : 6;  // LSB
19
    unsigned addr   : 5;
20
    unsigned toggle : 1;
21
    unsigned start  : 2;
22
    unsigned        : 2;  // MSB
23
  };
24
} rc5data;
25

26
static volatile int flag = 0;
27
static volatile rc5data data;
28

29
void init_int0()
30
{
31
  // Interrupt on INT0 pin going low
32
  MCUCR = (1 << ISC01);
33
  
34
  // Turn on INT0!
35
  GICR |= (1 << INT0);
36
}
37

38
ISR (INT0_vect)
39
{
40
  int pos = 0;
41
  
42
  if (!flag) {
43
    data.raw = 0;
44
    
45
    // triggers on falling edge of start bit 1.
46
    _delay_ms(1);//_delay_ms(0.2);
47
    
48
    while (pos < 14) {
49
      data.raw = (data.raw << 1) | ((~PIND & 0x04) >> 2); //PIND2 <-- IR Empfänger
50
      _delay_ms(10); //_delay_ms(1.8);
51
      pos++;
52
    }
53
    
54
    flag = 1;
55
  }
56
}
57

58
int main()
59
{
60
  init_int0();
61
  DDRB = 0xFF;
62
  
63
  sei();     // Enable interrupts
64

65
  while(1) {
66
    
67
    while(!flag);
68

69
    /* set PB5 pin of PORTB high */
70
    PORTB = (1 << PB5); 
71
    _delay_ms(500);
72

73
    /* set all pins of PORTB low */
74
    PORTB = 0x00;
75
    _delay_ms(500);
76
      
77
    // Do with data from the remote control here what you like.
78
    flag = 0;
79
    
80
  }
81
  
82

83
  return 0;
84
}
Gast #4418791
Lesenswert?

Ich greife mir mal virtuell an den Kopf.

Warum schaust Du nicht direkt in das Datenblatt ?
Mit einer einfachen Suche wäre die Antwort doch direkt selbst zu finden 
gewesen.

Naja - lesen will gelernt sein.
Gast #4418823
Lesenswert?

U. schrieb:
> _delay_ms(1);//_delay_ms(0.2);

Weißt Du eigentlich auch nur ansatzweise, was Du da machst?

U. schrieb:
> // mein Testaufbau: Atmega328PU @ 16Mhz Quarz (nicht 3,...Mhz)

Scharf - und deshalb meinst Du, alles durch ungefähr mal 5 - passt schon 
:-)

Ich hasse diese Hinweise eigentlich - aber wie wäre es mit einem 
Einstieg über LED's blinken lassen etc. ?

Also entweder Du findest jemanden, der Dir das hinbiegt oder Du musst 
Dich halt selbst schlau machen. Das fängt bei den Grundlagen an ...

Ach ja, Datenblätter muss man dabei auch lesen - Englisch-Kenntnisse 
sind da von Vorteil. Das ist eine "harte Schule" - aber da muss man 
durch (wenn man es selbst machen will).

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