mikrocontroller.net

Forum: Compiler & IDEs Neue Version: WinAVR-20090313


Autor: Alfred E. Neumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich bin heute auf die neueste Version von WinAVR (20090313) umgestiegen, 
seitdem geht mein Programm nicht mehr!

Kann mir jemand sagen, warum die if-Anweisung im main() nur beim ersten 
Durchlauf aufgerufen wird, danach dann nie mehr?

#define F_CPU 1044643

#include <stdlib.h> 
#include <avr/io.h>
#include <avr/interrupt.h>

#define IN_MODE     0
#define OUT_MODE    1
#define READTIMECOUNT  50        

void InitMCU(void);
void DispTemp(int16_t iTmpRd);

uint8_t flOperationmode = OUT_MODE;
uint8_t uiActionCounter=0;
uint8_t flReadTemp = 1;

int main(void)
{  
  TIMSK    |= (1<<TOIE1);  // Timer/Counter1 Overflow Interrupt Enable
  TCCR1B   |= (1<<CS10);  // Start Timer

  sei();          // SetInterruptEnable
  
  while(1)
    {    
    if (flReadTemp == 1)
    {
      cli();
      // tu was
      flReadTemp  = 0;
      sei();  
    }
  }
    return 0;
}

ISR(TIMER1_OVF_vect) 
{
  uiActionCounter++;          
  if (uiActionCounter >= READTIMECOUNT)   
  {
    flReadTemp = 1;  // Jetzt Auslesen
    uiActionCounter = 0;
    if (flOperationmode == IN_MODE) flOperationmode = OUT_MODE;
    else              flOperationmode = IN_MODE;
  }
}

Autor: Alfred E. Neumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
(ähhh, zu früh auf senden gedrückt)

Den Code habe ich jetzt natürlich stark verkürzt, damit er auch 
einigermaßen lesbar ist!

Könnte es sein, dass die while(1)-Schleife wegoptimiert wird? 
(Allerdings haben verschiedene Optimierungsschalter keine Änderung 
bewirkt)

Ich bin schier am verzweifeln!

Freue mich auf Ideen,

Grüße,

Alfred E. Neumann

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deklariere "flReadTemp" als volatile

volatile uint8_t flReadTemp = 1;

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ausserdem solltest du auch andere Variablen, welche sowohl in der main, 
als auch in einer ISR verwendet werden, als volatile anlegen.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe Interrupt

Autor: Alfred E. Neumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tatsächlich war die neue WinAVR schuld!
Nach deinstallation von Version 20090313 und Neuinstallation von 
20071221 gings wieder einwandfrei! Ohne Änderung des Codes.

Über volatile (auch über static u.ä.) sollte ich mir tatsächlich mal 
grundlegende Gedanken machen!

Vielen Dank,

Alfred E. Neumann

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Alfred E. Neumann (Gast)

>Tatsächlich war die neue WinAVR schuld!

Sehr unwahrscheinlich. Eher hat der alte WinAVR etwas gutmütiger 
compiliert und WENIGER optimiert, sodass deine fehlenden volatile nicht 
aufgefallen sind.

MFG
Falk

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Über volatile (auch über static u.ä.) sollte ich mir tatsächlich mal
>grundlegende Gedanken machen!

Ich empfehle Dir sehr eindringlich:  Mach es...!!!

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alfred E. Neumann schrieb:
> Tatsächlich war die neue WinAVR schuld!

Nur weil das Symptom behoben ist, ist der Fehler noch lange nicht 
behoben.

Autor: Alfred E. Neumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ihr habt selbstverständlich recht!
Da war ich wohl viel zu vorschnell zu dieser Aussage hingerissen.
Richtig deklariert gehts auch sofort!

Ich hab mir auch sofort ein Buch geholt um dieses Veräumnis 
auszubessern!

Grüße,

Alfred

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.