Problem mit Interrupt

Gast #985752
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

@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
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren