mikrocontroller.net

Forum: Compiler & IDEs Problem mit Interrupts und Optimierung


Autor: Markus Horn (mhspecial)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <avr/io.h>
#include <avr/interrupt.h>
#include "bldc.h"


// Ausgangszustände der Ports
static const uint8_t portout[8] = 
{0,0b00011000,0b00010010,0b00000110,0b00100100,0b00100001,0b00001001,0b00010101};


uint8_t var1;


int main(void){

  DDRB = 0b00111000;
  DDRC = 0b00111111;
  DDRD = 0x00;

  //waits(10);

  pwmein();
  pwmpower(60);

  int0_ein(1);
  sei();
  
  var1 = 1;

  while(1){
  
    PORTC = portout[var1];
    if(var1 == 1){
      PORTB |= (1 << PB5);}
    else{
      PORTB &= ~(1 << PB5);}

    //waits(1);
  }
}


ISR(INT0_vect){
  if(var1 < 6){
    var1 ++;}
  
  else{
    var1 = 1;};
}


und hier die selbstgefuschte bldc.h
// PWM einrichten und Leistung einstellen
void pwmein(){
TCCR2 = ((1 << WGM20) | (1 << COM21) | (1 << CS21));}

void pwmpower(uint8_t temp){
  OCR2 = temp;}



// Mal nen bissel warten....
// x us warten
void waitus(uint16_t time){
  TCNT1 = 0x00;
  OCR1A = time;
  TCCR1B = 0b00000010;
  
  while ( !(TIFR & ( 1 << OCF1A))) {;}

  TCCR1B = 0x00;
  OCR1A = 0x00;
  TIFR &= (1 << OCF1A);
  }

// x s warten
void waits(uint16_t time){

  uint16_t temp;
  for(temp = 1;temp <= time;temp ++){
    TCNT1 = 0x00;
    OCR1A = 31250;
    TCCR1B = 0b00000100;
  
    while ( !(TIFR & ( 1 << OCF1A))) {;}

    TCCR1B = 0x00;
    OCR1A = 0x00;
    TIFR &= (1 << OCF1A);
    }
  }


void int0_ein(uint8_t option){
  // Option 0: Pegel fällt auf logisch 0
  // Option 1: Pegel steigt auf logisch 1
  // Option 2: Logikpegel ändert sich
    
    if(option == 1){
      MCUCR |= ((1 << ISC01)|(1 << ISC00));
    }

    if(option == 0){
      MCUCR &= ~(1 << ISC00);
      MCUCR |= (1 << ISC01);
    }
    
    if(option == 2){
      MCUCR &= ~(1 << ISC01);
      MCUCR |= (1 << ISC00);
    }

    GICR |= (1 << INT0);
    }


void int1_ein(uint8_t option){
  // Option 0: Pegel fällt auf logisch 0
  // Option 1: Pegel steigt auf logisch 1
  // Option 2: Logikpegel ändert sich
    
    if(option == 1){
      MCUCR |= ((1 << ISC11)|(1 << ISC10));
    }

    if(option == 0){
      MCUCR &= ~(1 << ISC10);
      MCUCR |= (1 << ISC11);
    }
    
    if(option == 2){
      MCUCR &= ~(1 << ISC11);
      MCUCR |= (1 << ISC10);
    }

    GICR |= (1 << INT1);
    }

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus Horn (mhspecial)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank, daran hat es gelegen...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.