Schon wieder Optimierungsproblem?

OP #2016967
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
Angehängte Dateien:
OP #2016988
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ß
#2016994
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.

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