Forum: Compiler & IDEs Schon wieder Optimierungsproblem?


von Joachim B. (jojo84)


Angehängte Dateien:

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:
1
#define  pwm_kanaele        24
2
#define  pwm_min          1
3
#define  pwm_max          0x7F
4
#define  anzahl_schieberegister  (pwm_kanaele >> 3)
5
6
unsigned char speed[pwm_kanaele];
7
unsigned char helligkeit [pwm_kanaele];
8
unsigned char schieberegister[anzahl_schieberegister];
9
char line[10];
10
unsigned char zufallszahl;
11
volatile unsigned char pwm_cycles = 0;
12
13
int main()
14
{
15
  //OSCCAL = 0xA5;
16
  OSCCAL = 0xFF;
17
18
  init();
19
20
  clear_shift_registers(anzahl_schieberegister);
21
22
  zufallszahl = zufallsgenerator(50);
23
  srand(zufallszahl);
24
25
  // Laden der Startwerte und Werte für Blendgeschwindigkeit pro PWM-Kanal
26
  // Ausgabe via UART zum Überprüfen, Anzahl der ausgegebenen Werte = pwm_kanaele
27
  for(unsigned char kanal = 0; kanal < pwm_kanaele; kanal++)
28
  {
29
    speed[kanal]    = rand() % (pwm_max + 1);
30
    helligkeit[kanal]  = rand() % (pwm_max + 1);
31
32
    itoa(helligkeit[kanal], line, 10);
33
    uart_send_s(line);          // <- muß auskommentiert werden?!
34
    send_cursor_return;          // <- muß auskommentiert werden?!
35
    send_new_line;            // <- muß auskommentiert werden?!
36
  }
37
38
  sei();
39
40
  while(1)
41
  {
42
    asm("NOP":);
43
  }
44
45
return 0;
46
}

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

von Floh (Gast)


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. :-)

von Oliver (Gast)


Lesenswert?

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

Oliver

von Joachim B. (jojo84)


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ß

von Stephan W. (sir_wedeck)


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.

von Joachim B. (jojo84)


Lesenswert?

OCH NÖÖÖ!!!

Verdammt, wie peinlich...

Danke Stephan!, Gefahr erkannt, Gefahr gebannt!

von Oliver (Gast)


Lesenswert?

Joachim B. schrieb:
> OCH NÖÖÖ!!!

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

qed

Oliver

von Joachim B. (jojo84)


Lesenswert?

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

closed =)

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.