Forum: Mikrocontroller und Digitale Elektronik Externer Interrupt beim output pin


von al3ko (Gast)


Angehängte Dateien:

Lesenswert?

Moin Leute,

Ich versuche mich gerade an Interrupts und habe mir dazu folgenden 
Beitrag durchgelesen:
https://sites.google.com/site/qeewiki/books/avr-guide/external-interrupts

Anbei mein Code:
1
#include <avr/io.h>
2
#define F_CPU 1000000
3
#include <util/delay.h>     
4
#include <avr/interrupt.h>    
5
6
7
int main(void)
8
{
9
10
  DDRB |= (1<<PB0); // PB0 declared as output pin
11
  DDRD |= (1<<PD6); // PD6 declared as output pin
12
  DDRD &= ~(1<<PD2); // Declared as input
13
  PORTD |= (1<<PD2); // Activate internal pull-up resistor
14
  sei(); // Enable interrupts
15
   MCUCR |=  (0x00); // Sets the external interrupt INT0 to low level
16
  GICR |= (0x40); // External interrupt pin is enabled
17
18
  
19
   while(1) {
20
      PORTD &= ~(1<<PD6);
21
      PORTB |= (1<<PB0); // Sets output high
22
    _delay_ms(100);
23
    PORTB &= ~(1<<PB0); // Sets output low
24
    _delay_ms(100);
25
26
27
     
28
   }           
29
}
30
31
ISR(INT0_vect)
32
{
33
  PORTB &= ~(1<<PB0);
34
  PORTD |= (1<<PD6); // Sets PD6 high when interrupt occurs
35
}

Im Datenblatt des Atmega8 steht nun, dass die Interruptroutine auch 
ausgelöst werden kann, wenn der INT0 Pin als Ausgang definiert ist. Dazu 
habe ich den Code wie folgt umgeschrieben:
1
#include <avr/io.h>
2
#define F_CPU 1000000
3
#include <util/delay.h>     
4
#include <avr/interrupt.h>    
5
6
7
// volatile uint8_t test;
8
9
int main(void)
10
{
11
12
  DDRB |= (1<<PB0); // PB0 declared as output pin
13
  DDRD |= (1<<PD6); // PD6 declared as output pin
14
  /*
15
  DDRD &= ~(1<<PD2); // Declared as input
16
  PORTD |= (1<<PD2); // Activate internal pull-up resistor
17
  */
18
  DDRD |= (1<<PD2); // Declared as output pin
19
  sei(); // Enable interrupts
20
   MCUCR |=  (0x00); // Sets the external interrupt INT0 to low level
21
  GICR |= (0x40); // External interrupt pin is enabled
22
23
  
24
   while(1) {
25
      PORTD &= ~(1<<PD6);
26
      PORTB |= (1<<PB0); // Sets output high
27
    _delay_ms(100);
28
    PORTB &= ~(1<<PB0); // Sets output low
29
    _delay_ms(100);
30
31
32
     
33
   }           
34
}
35
36
ISR(INT0_vect)
37
{
38
  PORTB &= ~(1<<PB0);
39
  PORTD |= (1<<PD6); // Sets PD6 high when interrupt occurs
40
}
Leider leuchtet die LED nun nicht so wie gehofft, was bedeutet, dass ich 
entweder ein gravierendes Missverständnis bezüglich 
Interrupts/Datenblatt habe oder irgendwo im Code stimmt etwas nicht. Von 
alleine komme ich leider nicht drauf, weshalb ich gerne um eure Hilfe 
bitten möchte.

Vielen Dank.

Gruß

von Daniel (Gast)


Lesenswert?

Taster entprellen bzw. sollten Taster nicht im Interrupt eingelesen 
werden.

von al3ko (Gast)


Lesenswert?

Hi,
Daniel schrieb:
> Taster entprellen bzw. sollten Taster nicht im Interrupt eingelesen
> werden.
Taster entprellen steht auf meiner ToDo Liste, soweit bin ich (noch) 
nicht. Warum sollten Taster nicht im Interrupt eingelesen werden?

von Karl H. (kbuchegg)


Lesenswert?

al3ko schrieb:
> Hi,
> Daniel schrieb:
>> Taster entprellen bzw. sollten Taster nicht im Interrupt eingelesen
>> werden.
> Taster entprellen steht auf meiner ToDo Liste, soweit bin ich (noch)
> nicht. Warum sollten Taster nicht im Interrupt eingelesen werden?

Interrupt == externer Interrupt
Weil es dir nichts bringt. Um die Entprellung kommst du sowieso nicht 
rum. Ganz im Gegenteil wirds mit externem Interrupt programmtechnisch 
oft komplizierter als mit einem Timer.

Aber noch ist das ja nicht das Thema.

von al3ko (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> al3ko schrieb:
>> Hi,
>> Daniel schrieb:
>>> Taster entprellen bzw. sollten Taster nicht im Interrupt eingelesen
>>> werden.
>> Taster entprellen steht auf meiner ToDo Liste, soweit bin ich (noch)
>> nicht. Warum sollten Taster nicht im Interrupt eingelesen werden?
>
> Interrupt == externer Interrupt
> Weil es dir nichts bringt. Um die Entprellung kommst du sowieso nicht
> rum. Ganz im Gegenteil wirds mit externem Interrupt programmtechnisch
> oft komplizierter als mit einem Timer.
>
> Aber noch ist das ja nicht das Thema.

Hmm,
okay. Dann belasse ich es einfach mal dabei und werde das Thema 
Interrupt wieder aufgreifen, wenn ich ein wenig weiter bin. Dann 
überlege ich mir nun erstmal eine geeignete Tasterentprellung :)

Gruß

von Maxx (Gast)


Lesenswert?

Wenn du einen Taster an dem Interrupt-auslösenden Pin hast, dann 
konfigurier den als Eingang.

Dass er als Ausgang einen Interrupt auslöst bezieht sich auf den 
Pegelwechsel als Ausgang. Er löst dann bei einem Programmatisch 
ausgelösten Pegelwechsel aus.

Zudem hast du so über Taster und Ausgangspin einen Kurzschluss

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.