Compiler interpretiert falsch, überspringt z.B. if Bedingungen, was tun?

Gast #1850750
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
Gast #1850758
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;
Gast #1850766
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
Gast #1850779
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.)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren