mikrocontroller.net

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


Autor: delicious_cake (Gast)
Datum:

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

Autor: mhz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
volatile unsigned char next; 

Autor: mhz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und häng deinen quellcode mal an ...

Autor: delicious_cake (Gast)
Datum:

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

Autor: delicious_cake (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier ist ausschnittsweise mein code. nicht alles ist zur 
veröffentlichung gedacht
bool  next = false;

ISR(TIMER0_COMPA_vect)
{
    next = true; 
}

//PWM nach mikrocontroller.net
ISR(TIMER1_COMPA_vect)
{
   /*PWM ROUTINE*/
}

void init_led_hw(void)
{
    //Init Clock
    CLKPR = 0x80;  //Freischalten des CLKPR Clock Prescaler Registers
    CLKPR = 0x00;  //Ausschalten der Clockteilung


    SET_BIT(LATCHDDR, 2);// DDRC = 0x04; /* Pin 2 von Port C auf Output schalten */
    SET_BIT(LATCH, 2); //PORTC = 0x04; /* Pint 2 von Port C auf high schalten um das Latch durchzuschalten */

    LEDS1_OFF;    //turn off the LEDs on PORT1
    LEDS2_OFF;    //turn off the LEDs on PORT2

    LED_PORT1_DDR |= 0xFF;  //set led port 1 as output
    LED_PORT2_DDR |= 0xFF;  //set led port 2 as output


    //Timer0 in Normal Mode (count from 0 to 255, reset, count from 0 to 255, ...)
    TCCR0A = TIMER0_CTC_INIT;    
  TCCR0B = TIMER_CLOCKSPEED_1024; 
  OCR0A = 249; 
    TIMSK0   |= (1 << OCIE0A); 

  //Timer1 in Normal Mode (count from 0 to 65535, reset, count from 0 to 65535, ...)
    TCCR1A = TIMER1_NORMAL_16_INIT;  
    TCCR1B = TIMER_CLOCKSPEED_FULL;  

    TIMSK1   |= (1 << OCIE1A);  
}



int main(void)
{
//lokale Variablen für das LED-Fading FADE_LED
int t[PWM_CHANNELS], i=0;
unsigned char ticker[PWM_CHANNELS], sekundentimer[PWM_CHANNELS], steps_done[PWM_CHANNELS];

  //LUFA initialization
  //SetupHardware();  
  //LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);

  //LED Dimmer initialization
  init_led_hw();
  sei();

fade_init(0, 255, 3); //led0,  zielhelligkeit 255, dauer des fades: 3 sek
fade_init(1, 255, 5); //led1,  zielhelligkeit 255, dauer des fades: 5 sek
fade_init(2, 255, 10);//led2,  zielhelligkeit 255, dauer des fades: 10 sek

pwm_update();


//MAIN PROGRAMM
for (;;)
  {
    //HID_Device_USBTask(&Generic_HID_Interface);
    //USB_USBTask();
    
    if(next == true)
      {  
        next=false;
        
        for (i=0;i<PWM_CHANNELS;i++)
          {} //end for
        pwm_update();
      } //end if
  } //end endless for
} //end void

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

volatile bool  next = false;

weiter schau ich nicht

Autor: delicious_cake (Gast)
Datum:

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

Autor: delicious_cake (Gast)
Datum:

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

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.