Problem mit Interrupts und Optimierung

OP #1535590
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
    }

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 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.