Forum: Compiler & IDEs Neue Version: WinAVR-20090313


von Alfred E. Neumann (Gast)


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?

1
#define F_CPU 1044643
2
3
#include <stdlib.h> 
4
#include <avr/io.h>
5
#include <avr/interrupt.h>
6
7
#define IN_MODE     0
8
#define OUT_MODE    1
9
#define READTIMECOUNT  50        
10
11
void InitMCU(void);
12
void DispTemp(int16_t iTmpRd);
13
14
uint8_t flOperationmode = OUT_MODE;
15
uint8_t uiActionCounter=0;
16
uint8_t flReadTemp = 1;
17
18
int main(void)
19
{  
20
  TIMSK    |= (1<<TOIE1);  // Timer/Counter1 Overflow Interrupt Enable
21
  TCCR1B   |= (1<<CS10);  // Start Timer
22
23
  sei();          // SetInterruptEnable
24
  
25
  while(1)
26
    {    
27
    if (flReadTemp == 1)
28
    {
29
      cli();
30
      // tu was
31
      flReadTemp  = 0;
32
      sei();  
33
    }
34
  }
35
    return 0;
36
}
37
38
ISR(TIMER1_OVF_vect) 
39
{
40
  uiActionCounter++;          
41
  if (uiActionCounter >= READTIMECOUNT)   
42
  {
43
    flReadTemp = 1;  // Jetzt Auslesen
44
    uiActionCounter = 0;
45
    if (flOperationmode == IN_MODE) flOperationmode = OUT_MODE;
46
    else              flOperationmode = IN_MODE;
47
  }
48
}

von Alfred E. Neumann (Gast)


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

von Magnus Müller (Gast)


Lesenswert?

Deklariere "flReadTemp" als volatile

volatile uint8_t flReadTemp = 1;

von Magnus Müller (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

Siehe Interrupt

von Alfred E. Neumann (Gast)


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

von Falk B. (falk)


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

von Peter (Gast)


Lesenswert?

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

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

von Simon K. (simon) Benutzerseite


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.

von Alfred E. Neumann (Gast)


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

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.