Problem mit Interrupt

Gast #985752
Hallo, Ich bin neuling in der Programierer Welt. Wollte gerne mal was 
mit einen Interrupt auslösen. Das Program erzeugt ein lauflicht und 
sobald  ich einen taster drücke gehen alle Lampen an und sollen auch an 
bleiben. Mein Problem ist nun das der Interrupt wohl ausgelöst wird, 
aber das Lauflicht danach weiter läuft. Bitte um euere Hilfe

Hier ist der Code
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <inttypes.h>
4
#include <avr/iom32.h>
5
#include <stdint.h>
6
#include <util/delay.h>  
7
#include <stdlib.h>            
8
#include  <stdio.h>
9
int i;
10
i=0;
11
ISR(INT2_vect)
12
  {
13
  PORTD=0xf0;
14
  i=2;
15
  }
16

17
main()
18
{
19
  DDRD = 0xF0;
20
  PORTD= 0x00;                          // D Ports als Eingänge festlegen
21
  DDRB = 0x00;                    // B Ports als Eingänge festlegen
22
  PORTB= 0xFF;                    // Pullup für Port B festlegen
23
  DDRA = 0x00;                    // C Port als Ausgänge festlegen
24

25
  DDRC = 0xFF;
26
  GICR |= (1<<INT2);                   // INT2 aktivieren#
27
  MCUCR |= ((1<<ISC01) | (1<<ISC00));  // bei steigender Flanke
28

29
  while(1)
30
    {
31
    sei();
32

33
    if(i==0)
34
    {
35
      PORTD=0x10;
36
      _delay_loop_2(65000);
37
      _delay_loop_2(65000);
38
      _delay_loop_2(65000);
39
      _delay_loop_2(65000);
40
      _delay_loop_2(65000);
41
      PORTD=0x20;
42
      _delay_loop_2(65000);
43
      _delay_loop_2(65000);
44
      _delay_loop_2(65000);
45
      _delay_loop_2(65000);
46
      _delay_loop_2(65000);
47
      PORTD=0x40;
48
      _delay_loop_2(65000);
49
      _delay_loop_2(65000);
50
      _delay_loop_2(65000);
51
      _delay_loop_2(65000);
52
      _delay_loop_2(65000);
53
      PORTD=0x80;
54
      _delay_loop_2(65000);
55
      _delay_loop_2(65000);
56
      _delay_loop_2(65000);
57
      _delay_loop_2(65000);
58
      _delay_loop_2(65000);
59
      }  
60
    }
61
}
Gast #985777
hallo, hat geklappt! Danke. Nun habe ich wieder ein Problem, da ich nun 
voltaile int nehme kann ich nun den wert h nicht mehr hochzählen, wollte 
nun das Programm so schreiben das 5 mal das Interrupt auslösen muss 
bevor alle Lampen angehn. aber mit h+1 geht das nicht mehr.
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <inttypes.h>
4
#include <avr/iom32.h>
5
#include <stdint.h>
6
#include <util/delay.h>  
7
#include <stdlib.h>                //einbinden der bibliotheken
8
#include  <stdio.h>
9
volatile int i;
10
volatile int h;
11
ISR(INT2_vect)
12
  {
13
  h+1;
14
  }
15

16
main()
17
{
18
  DDRD = 0xF0;
19
  PORTD= 0x00;                          // D Ports als Eingänge festlegen
20
  DDRB = 0x00;                    // B Ports als Eingänge festlegen
21
  PORTB= 0xFF;                    // Pullup für Port B festlegen
22
  DDRA = 0x00;                    // C Port als Ausgänge festlegen
23

24
  DDRC = 0xFF;
25
  GICR |= (1<<INT2);                   // INT0 aktivieren#
26
  MCUCR |= ((1<<ISC01) | (1<<ISC00));          // bei steigender Flanke
27

28
  while(1)
29
    {
30
    sei();
31

32
    if(i==0)
33
    {
34
      PORTD=0x10;
35
      _delay_loop_2(65000);
36
      _delay_loop_2(65000);
37
      _delay_loop_2(65000);
38
      _delay_loop_2(65000);
39
      _delay_loop_2(65000);
40
      PORTD=0x20;
41
      _delay_loop_2(65000);
42
      _delay_loop_2(65000);
43
      _delay_loop_2(65000);
44
      _delay_loop_2(65000);
45
      _delay_loop_2(65000);
46
      PORTD=0x40;
47
      _delay_loop_2(65000);
48
      _delay_loop_2(65000);
49
      _delay_loop_2(65000);
50
      _delay_loop_2(65000);
51
      _delay_loop_2(65000);
52
      PORTD=0x80;
53
      _delay_loop_2(65000);
54
      _delay_loop_2(65000);
55
      _delay_loop_2(65000);
56
      _delay_loop_2(65000);
57
      _delay_loop_2(65000);
58
      }
59
      
60
    if(h<=5)
61
    {
62
    i==1;
63
    PORTD=0xF0;  
64
    }
65
    }
66
}
#985867
Hallo,

müßte
>  h+1; // zu h wird 1 addiert und das Ergebnis dann weggeworfen, weil es keine 
Zuweisung gibt?

nicht eher
h = h+1;
oder
h +=1;  // verkürzte Schreibweise
oder h++; // erhöht h um 1

heißen?

PS: bin immernoch ASM-Programmierer, der sowas zum C üben benutzt... :)

Gruß aus Berlin
Michael
Gast #985879
@Michael U. korrekt.
1
    if(h<=5)
2
    {
3
    i==1;
4
    PORTD=0xF0;  
5
    }
Hier gibt's auch noch was zu bemängeln. Da wird i mit 1 verglichen(!), 
das Ergebnis daraus (falls es jemals so beabsichtigt war) verworfen.
Gast #985905
Habe das nun umgeändert auf...

...
1
ISR(INT2_vect)
2
  {
3
   h++;
4
  }
5

6
und....
7

8
if(h==5)
9
  {
10
  i=2;
11
  PORTD=0xF0;  
12
  }

nun müsste er doch eigentlich nach dem 5ten mal auslösen des interrupts 
die lampen an machen und das andere Programm unterbrechen da i=2 ist, 
oder versehe ich mich da? Auf jedenfall macht er es nicht.
wenn ich anstatt If (h==5) nun if (h>=5) schreibe macht er es sofort 
nach dem ersten mal auslösen des interrupts und nicht wie gewollt nach 
dem 5ten mal
Gast #986076
>Hat sonnst keiner eine Idee?

Du hast gerade entdeckt das Taster prellen ;)
Wenn du einmal drückst löst das mehrere Interrupts aus.
Leg mal einen 100nF Kondensator parallel zum Taster.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.