Externer Interrupt beim output pin

Gast #2858874
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ß
Angehängte Dateien:
#2858914
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.
Gast #2858920
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ß
Gast #2858922
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.