Forum: Compiler & IDEs Problem mit Interrupts und Optimierung


von Markus H. (mhspecial)


Lesenswert?

Hallo,
ich bin nicht ganz fit in GCC, und hätte da mal eine Frage zu 
Optimierungen. In meinem kleinen Testprogramm möchte ich für 
Versuchsmessungen die sechs möglich Zustände an einem BLDC-Motor via 
Taster durchschalten.
Eine LED zeigt "Schaltzustand Eins". Ein Pwm Ausgang ist mit den anderen 
Ausgängen Hardwareseite verknüpft und eine Leistungsstufe 
nachgeschaltet.
Das Programm macht eigentlich schon genau das was es soll, nur kann ich 
es nicht optimiert kompilieren. Os, O1, O2 sowie O3 rationalisieren 
scheinbar meinen durch den Taster an PD2 generiert Interrupt weg...
In der Simulation laufen alle Optimierungen, aber auf dem Atmega8 nur 
das unoptimierte Programm O0.
Da das spätere Programm etwas umfangreicher seien soll, wäre es gut, 
wenn die Optimierung laufen würde.

Vielleicht kann mir ja jemand helfen...
MfG Markus


Hier mein Programm:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include "bldc.h"
4
5
6
// Ausgangszustände der Ports
7
static const uint8_t portout[8] = 
8
{0,0b00011000,0b00010010,0b00000110,0b00100100,0b00100001,0b00001001,0b00010101};
9
10
11
uint8_t var1;
12
13
14
int main(void){
15
16
  DDRB = 0b00111000;
17
  DDRC = 0b00111111;
18
  DDRD = 0x00;
19
20
  //waits(10);
21
22
  pwmein();
23
  pwmpower(60);
24
25
  int0_ein(1);
26
  sei();
27
  
28
  var1 = 1;
29
30
  while(1){
31
  
32
    PORTC = portout[var1];
33
    if(var1 == 1){
34
      PORTB |= (1 << PB5);}
35
    else{
36
      PORTB &= ~(1 << PB5);}
37
38
    //waits(1);
39
  }
40
}
41
42
43
ISR(INT0_vect){
44
  if(var1 < 6){
45
    var1 ++;}
46
  
47
  else{
48
    var1 = 1;};
49
}


und hier die selbstgefuschte bldc.h
1
// PWM einrichten und Leistung einstellen
2
void pwmein(){
3
TCCR2 = ((1 << WGM20) | (1 << COM21) | (1 << CS21));}
4
5
void pwmpower(uint8_t temp){
6
  OCR2 = temp;}
7
8
9
10
// Mal nen bissel warten....
11
// x us warten
12
void waitus(uint16_t time){
13
  TCNT1 = 0x00;
14
  OCR1A = time;
15
  TCCR1B = 0b00000010;
16
  
17
  while ( !(TIFR & ( 1 << OCF1A))) {;}
18
19
  TCCR1B = 0x00;
20
  OCR1A = 0x00;
21
  TIFR &= (1 << OCF1A);
22
  }
23
24
// x s warten
25
void waits(uint16_t time){
26
27
  uint16_t temp;
28
  for(temp = 1;temp <= time;temp ++){
29
    TCNT1 = 0x00;
30
    OCR1A = 31250;
31
    TCCR1B = 0b00000100;
32
  
33
    while ( !(TIFR & ( 1 << OCF1A))) {;}
34
35
    TCCR1B = 0x00;
36
    OCR1A = 0x00;
37
    TIFR &= (1 << OCF1A);
38
    }
39
  }
40
41
42
void int0_ein(uint8_t option){
43
  // Option 0: Pegel fällt auf logisch 0
44
  // Option 1: Pegel steigt auf logisch 1
45
  // Option 2: Logikpegel ändert sich
46
    
47
    if(option == 1){
48
      MCUCR |= ((1 << ISC01)|(1 << ISC00));
49
    }
50
51
    if(option == 0){
52
      MCUCR &= ~(1 << ISC00);
53
      MCUCR |= (1 << ISC01);
54
    }
55
    
56
    if(option == 2){
57
      MCUCR &= ~(1 << ISC01);
58
      MCUCR |= (1 << ISC00);
59
    }
60
61
    GICR |= (1 << INT0);
62
    }
63
64
65
void int1_ein(uint8_t option){
66
  // Option 0: Pegel fällt auf logisch 0
67
  // Option 1: Pegel steigt auf logisch 1
68
  // Option 2: Logikpegel ändert sich
69
    
70
    if(option == 1){
71
      MCUCR |= ((1 << ISC11)|(1 << ISC10));
72
    }
73
74
    if(option == 0){
75
      MCUCR &= ~(1 << ISC10);
76
      MCUCR |= (1 << ISC11);
77
    }
78
    
79
    if(option == 2){
80
      MCUCR &= ~(1 << ISC11);
81
      MCUCR |= (1 << ISC10);
82
    }
83
84
    GICR |= (1 << INT1);
85
    }

von Hc Z. (mizch)


Lesenswert?

Das Erste, was auffällt:  Du veränderst im Interrupt var1 (hätte es 
dafür keinen aussagekräftigeren Namen gegeben?), es ist aber nicht als 
volatile deklariert.

von Markus H. (mhspecial)


Lesenswert?

Vielen Dank, daran hat es gelegen...

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.