mikrocontroller.net

Forum: Compiler & IDEs Schon wieder Optimierungsproblem?


Autor: Joachim B. (jojo84)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend!

Ich bin schon wieder an einem Punkt angekommen, an dem ich wirklich 
frunstriert bin, weil ich den Fehler nicht finden kann!
Folgender Code ist für eine 24-kanälige SW-PWM auf einem Atmega8 und 
macht Probleme:
#define  pwm_kanaele        24
#define  pwm_min          1
#define  pwm_max          0x7F
#define  anzahl_schieberegister  (pwm_kanaele >> 3)

unsigned char speed[pwm_kanaele];
unsigned char helligkeit [pwm_kanaele];
unsigned char schieberegister[anzahl_schieberegister];
char line[10];
unsigned char zufallszahl;
volatile unsigned char pwm_cycles = 0;

int main()
{
  //OSCCAL = 0xA5;
  OSCCAL = 0xFF;

  init();

  clear_shift_registers(anzahl_schieberegister);

  zufallszahl = zufallsgenerator(50);
  srand(zufallszahl);

  // Laden der Startwerte und Werte für Blendgeschwindigkeit pro PWM-Kanal
  // Ausgabe via UART zum Überprüfen, Anzahl der ausgegebenen Werte = pwm_kanaele
  for(unsigned char kanal = 0; kanal < pwm_kanaele; kanal++)
  {
    speed[kanal]    = rand() % (pwm_max + 1);
    helligkeit[kanal]  = rand() % (pwm_max + 1);

    itoa(helligkeit[kanal], line, 10);
    uart_send_s(line);          // <- muß auskommentiert werden?!
    send_cursor_return;          // <- muß auskommentiert werden?!
    send_new_line;            // <- muß auskommentiert werden?!
  }

  sei();

  while(1)
  {
    asm("NOP":);
  }

return 0;
}

Sieht erstmal nicht wild aus... ein bißchen Initialisierung, dann werden 
Zufallszahlen erstellt und dann soll nurnoch auf Interrupts gewartet 
werden.
Jetzt kommt aber das seltsame: so, wie der Code oben ist bleibt der 
Controller immer in der Schleife zur Ausgabe der Werte! Und meine ISR 
wird überhaupt nicht aufgerufen :( !
Wenn ich aber
1.) sei() auskommentiere "funktioniert" es. D.h. es werden 24 Werte 
ausgegeben und dann passiert nichts mehr (klar)
2.) die UART-Routinen auskommentiere "funktioniert" es auch. D.h. es 
werden keine Werte ausgegeben, aber meine ISR wird aufgerufen. Und wenn 
ich
3.) die Optimierung ausschalte, dann werden (24 * n) Werte ausgegeben 
(also z.B. 24, 144 oder 120), und dann wird fleißig die ISR 
aufgerufen...

Und das versteh ich einfach nicht. In den Anhang habe ich die Listings 
der vier "Varianten" gepackt. Ich würde mich echt freuen, wenn sich 
jemand die Listings mal angucken könnte. Ich hatte nicht das Gefühl 
totalen Müll programmiert zu haben, aber das scheit wohl doch der Fall 
zu sein...

Gruß
Joachim

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mach mal an die Variablen, die du auch in der ISR verwendest, ein 
volatile.
Außerdem wärs nett, den gesamten Code zu zeigen. :-)

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein vollständiger C-Code wäre hilfreich. Durch das lss-Geraffel wühle 
ich mich nicht durch.

Oliver

Autor: Joachim B. (jojo84)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jaaa, ich hab gehadert, weil es mehrere Header- und Quelldateien sind. 
Da hatte ich gehofft, daß der Code oben zusammen mit Listings reichen 
würde...

Wäre es für euch OK, wenn ich das Projekt vollständig als zip anhänge 
oder sind euch Einzeldateien lieber?

Floh schrieb:
> mach mal an die Variablen, die du auch in der ISR verwendest, ein
> volatile.

Hab ich schon. Und ALLE Variablen zu volatilisieren(?) brachte nix... 
Ich ja leider nicht so, daß ich noch nix probiert hätte...

Oliver schrieb:
> Durch das lss-Geraffel wühle
> ich mich nicht durch.

Kann ich dir nicht verübeln, mir macht das auch nicht wirklich Spaß. 
Aber in den Sources kann ich nix finden... :(

Gruß

Autor: Stephan W. (sir_wedeck)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

das war mal wieder klar:

>1.) sei() auskommentiere "funktioniert" es. D.h. es werden 24 Werte
>ausgegeben und dann passiert nichts mehr (klar)
1. mal geraten und Fehler erkannt! Wer weiß was es ist?

RICHTIG:
// RXCIE, TXCIE, RXEN, TXEN
UCSRB |= ((1<<RXCIE) | (1<<TXCIE) | (1<<RXEN) | (1<<TXEN));

(aus dem Beispiel vom Ersten "geht garnicht"!)

Stephan

PS: Bitte C-Files hoch laden, kann man besser lesen als die lss Files.

Autor: Joachim B. (jojo84)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OCH NÖÖÖ!!!

Verdammt, wie peinlich...

Danke Stephan!, Gefahr erkannt, Gefahr gebannt!

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Joachim B. schrieb:
> OCH NÖÖÖ!!!

Joachim B. schrieb:
> Aber in den Sources kann ich nix finden... :(

qed

Oliver

Autor: Joachim B. (jojo84)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt aber nicht lustig machen ;) !
Hab ja erkannt, daß ich doof bin ;)
QED -_0 !

closed =)

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.