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