Forum: Mikrocontroller und Digitale Elektronik Interrupt INT0 mit Atmel Studio6/7 aktivieren!?


von U. (Gast)


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
}

: Verschoben durch User
von Felix Adam (Gast)


Lesenswert?

Im MCUCR im ATmega328P findet sich nix zu INT0. Schaue mal ins 
Datenblatt zum ATmega328P unter External Interrupts.

MCUCR muss geändert werden in EICRA und GIMSK wird zu EIMSK.

von U. (Gast)


Lesenswert?

Super, dass war es! Vielen Dank. :) Ich schaue mir das gleich mal an im 
Datenblatt.

von K. (Gast)


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.

von Dieter F. (Gast)


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).

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.