Forum: Mikrocontroller und Digitale Elektronik External Interrupt bei ATmega8


von Marco (Gast)


Lesenswert?

Guten Abend allerseits,

Ich versuche schon den ganzen Tag die externen Interrupts des Atmega8 zu 
benutzen. Ich habe dazu ein kleines Testprogramm geschrieben bei dem 
nach dem Starten des Controllers LED 1 und 2, also PORTC0 und PORTC1 aus 
sind. Sobald zum ersten Mal ein Int request kommt soll die entsprechende 
LED bis zum Reset des Controllers angehen. Leider funktioniert das Ganze 
aus irgendeinem Grund nicht.

Kann mir eventuell irgendjemand helfen?

Vielen Dank im Vorraus
Marco B

Hier mein Testprogramm:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
5
6
void portinit (void);
7
void ext_int (void);
8
9
10
11
ISR( INT0_vect  )
12
{
13
  PORTC &= ~(_BV(PC0)); //LED on -> Bit löschen (invertiert[STK500])
14
}
15
16
17
18
ISR( INT1_vect  )
19
{
20
  PORTC &= ~(_BV(PC1)); //LED on -> Bit löschen (invertiert[STK500])
21
}
22
23
24
void main(void)
25
{
26
27
  portinit();
28
  ext_int();
29
30
  PORTC |= _BV(PC0);  //LED off -> Bit setzen (invertiert[STK500])
31
  PORTC |= _BV(PC1);  //LED off -> Bit setzen (invertiert[STK500])
32
33
  sei();        // interrups global aktiviert
34
35
  while (1);
36
37
}
38
39
40
void portinit ()    
41
{
42
43
  DDRD  |= _BV(DDD2)|_BV(DDD3);  //PD2 & PD3 als input 
44
  PORTD |= _BV(PD2)|_BV(PD3);     //PUllupwiderstände aktivieren
45
46
}
47
48
49
void ext_int ()
50
{
51
  
52
  MCUCR |= _BV(ISC11)|_BV(ISC01); //INT0 & INT1 interrupt request bei falling edge
53
  GICR  |= _BV(INT1)|_BV(INT0);   //INT0 & INT1 interrupt enable
54
55
}

von Walter S. (avatar)


Lesenswert?

sehe jetzt gerade nicht dass PC initialisiert wird??

von Stefan E. (sternst)


Lesenswert?

Die Pins, an denen die LEDs hängen, sind nicht als Output konfiguriert.

>  DDRD  |= _BV(DDD2)|_BV(DDD3);  //PD2 & PD3 als input

Nö. Nochmal in das Datenblatt schauen.

von Marco (Gast)


Lesenswert?

oups,

ich hab gedacht ich müsste die DDR Bits für den input setzen und für den 
output nicht. Dabei ist es andersherum. hab ich wohl irgendwie verdreht. 
Danke für die Hilfe
Marco B

von Matthias (Gast)


Lesenswert?

Einfache Grundregel: Nach Reset muß alles ungefährlich sein.

Stell dir vor, du hast einen Spannung von einem niederohmigen Sensor 
direkt an einem Pin liegen. Wenn der uC beim Reset die Pins 
standardmäßig als Ausgang schalten würde, könnte das den uC schnell den 
Ausgangs-FET kosten.

MfG

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.