Forum: Compiler & IDEs Problem mit Interrupt


von Blackbull (Gast)


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
}

von dummy (Gast)


Lesenswert?

>int i;

volatile int i;

von Blackbull (Gast)


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
}

von Michael U. (amiga)


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

von nixversteh (Gast)


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.

von Blackbull (Gast)


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

von Blackbull (Gast)


Lesenswert?

habe ich mit:

volatile int i;
volatile int h;

gemahct


Hat sonnst keiner eine Idee?

von holger (Gast)


Lesenswert?

>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.

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.