Forum: Compiler & IDEs Compiler interpretiert falsch, überspringt z.B. if Bedingungen, was tun?


von delicious_cake (Gast)


Lesenswert?

Hallo,

ich arbeite an einem kleinen LED Dimmer Projekt. Naja, mittlerweile ist 
es nicht mehr so klein. Bis heute hat alles einwandfrei funktioniert, 
bis ich die Funktion für das Faden eines Wertes auf einen beliebigen 
anderen in einer beliebigen Zeit von nur einer LED auf alle verfügbaren 
ausgebaut habe.

Zuerst hat sich der µC nach der Initialisierung der USB Schnittstelle 
resetet, bzw. ist zum Start zurück gesprungen und hat von vorne 
begonnen.

Dann habe ich alle USB Teile auskommentiert. Jetzt arbeitet der µC fast 
richtig. Es wird regelmaeßig durch eine Timer Overflow die Variabe next 
von false auf true gesetzt. Dann soll Hauptprogramm in der 
Endlosschleife durch das Freigabesignal, also next=true, durch eine 
if-Bedingung der Helligkeitswert einer LED veraendert werden. Aber die 
Zeile wird ignoriert, und der µC faengt am anfang der endlosschleife 
wieder an.

Der Compiler arbeitet mit der optimierungsstufe s, aber auch ohne 
optimierung tritt der fehler noch auf.

wodurch kann so ein Fehler hervorgerufen werden und wie kann man das 
vermeiden?

ich freue mich über jede hilfreiche antwort.
delicious_cake

von mhz (Gast)


Lesenswert?

je nach USB Implementierung

ist es eine Software USB  geschichte wird vlt die ISR irgendwo blockiert
da der AVR keine ISR Prioritäten kennt kann das auch mal in die hose 
gehen ..

deine next variable ist aber hoffentlich eine
1
volatile unsigned char next;

von mhz (Gast)


Lesenswert?

und häng deinen quellcode mal an ...

von delicious_cake (Gast)


Lesenswert?

mein µC ist ein AT90USB162 und arbeitet mit dem LUFA USB Stack als USB 
HID.

die Variable next ist global als bool definiert. so hat es jetzt ja 
schon die ganze zeit funktioniert.

von delicious_cake (Gast)


Lesenswert?

Hier ist ausschnittsweise mein code. nicht alles ist zur 
veröffentlichung gedacht
1
bool  next = false;
2
3
ISR(TIMER0_COMPA_vect)
4
{
5
    next = true; 
6
}
7
8
//PWM nach mikrocontroller.net
9
ISR(TIMER1_COMPA_vect)
10
{
11
   /*PWM ROUTINE*/
12
}
13
14
void init_led_hw(void)
15
{
16
    //Init Clock
17
    CLKPR = 0x80;  //Freischalten des CLKPR Clock Prescaler Registers
18
    CLKPR = 0x00;  //Ausschalten der Clockteilung
19
20
21
    SET_BIT(LATCHDDR, 2);// DDRC = 0x04; /* Pin 2 von Port C auf Output schalten */
22
    SET_BIT(LATCH, 2); //PORTC = 0x04; /* Pint 2 von Port C auf high schalten um das Latch durchzuschalten */
23
24
    LEDS1_OFF;    //turn off the LEDs on PORT1
25
    LEDS2_OFF;    //turn off the LEDs on PORT2
26
27
    LED_PORT1_DDR |= 0xFF;  //set led port 1 as output
28
    LED_PORT2_DDR |= 0xFF;  //set led port 2 as output
29
30
31
    //Timer0 in Normal Mode (count from 0 to 255, reset, count from 0 to 255, ...)
32
    TCCR0A = TIMER0_CTC_INIT;    
33
  TCCR0B = TIMER_CLOCKSPEED_1024; 
34
  OCR0A = 249; 
35
    TIMSK0   |= (1 << OCIE0A); 
36
37
  //Timer1 in Normal Mode (count from 0 to 65535, reset, count from 0 to 65535, ...)
38
    TCCR1A = TIMER1_NORMAL_16_INIT;  
39
    TCCR1B = TIMER_CLOCKSPEED_FULL;  
40
41
    TIMSK1   |= (1 << OCIE1A);  
42
}
43
44
45
46
int main(void)
47
{
48
//lokale Variablen für das LED-Fading FADE_LED
49
int t[PWM_CHANNELS], i=0;
50
unsigned char ticker[PWM_CHANNELS], sekundentimer[PWM_CHANNELS], steps_done[PWM_CHANNELS];
51
52
  //LUFA initialization
53
  //SetupHardware();  
54
  //LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
55
56
  //LED Dimmer initialization
57
  init_led_hw();
58
  sei();
59
60
fade_init(0, 255, 3); //led0,  zielhelligkeit 255, dauer des fades: 3 sek
61
fade_init(1, 255, 5); //led1,  zielhelligkeit 255, dauer des fades: 5 sek
62
fade_init(2, 255, 10);//led2,  zielhelligkeit 255, dauer des fades: 10 sek
63
64
pwm_update();
65
66
67
//MAIN PROGRAMM
68
for (;;)
69
  {
70
    //HID_Device_USBTask(&Generic_HID_Interface);
71
    //USB_USBTask();
72
    
73
    if(next == true)
74
      {  
75
        next=false;
76
        
77
        for (i=0;i<PWM_CHANNELS;i++)
78
          {} //end for
79
        pwm_update();
80
      } //end if
81
  } //end endless for
82
} //end void

von Karl H. (kbuchegg)


Lesenswert?

delicious_cake schrieb:
> Hier ist ausschnittsweise mein code. nicht alles ist zur
> veröffentlichung gedacht

Ein LED-Fader?
Ja, ist schon klar. Ist Hi-Tech

1
volatile bool  next = false;

weiter schau ich nicht

von delicious_cake (Gast)


Lesenswert?

gut danke. das löst die haelfte meines problems. das andere, bei 
aktivierter usb schnittstelle besteht weiterhin. ist irgendwie auch 
klar.

von delicious_cake (Gast)


Lesenswert?

gut danke. das löst die haelfte meines problems. das andere, bei 
aktivierter usb schnittstelle besteht weiterhin. ist irgendwie auch 
klar.

Karl heinz Buchegger schrieb:
> Ein LED-Fader?
> Ja, ist schon klar. Ist Hi-Tech

immerhin können mehrere über bluetooth kommunizieren und über usb kann 
mann alle bedienen. (die bluetooth pc programmierung hab ich nohc nicht 
ganz raus.)

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.