16 Kanal Software-PWM, Bitte um Hilfe

OP #2715329
Lesenswert?

Hallo.

Nachdem ich letztes Jahr an diesem Projekt gescheitert bin, versuche ich 
derzeit wieder das Beispiel 3 ("Intelligenter Lösungsansatz") aus diesem 
Artikel:
http://www.mikrocontroller.net/articles/Soft-PWM
auf 16 Ports auszuweiten, was soweit auch funktioniert.

Was nicht funktioniert, ist ein Wechsel der PWM-Werte, also der 
Helligkeiten mit denen die LEDs leuchten.

Ich habe ein [16][100] array erzeugt, das für die 16 Kanäle jeweils 100 
Helligkeitswerte enthält.
Es soll jeweils beim ersten Helligkeitswert begonnen werden, nach kurzer 
Zeit soll dann der nächste Helligkeitswert geladen werden usw.

Aus
1
memcpy(pwm_setting, t1, 8);
2
   pwm_update();

wurde
1
if (flag == 1)      // Daten sollen aktualisiert werden
2
    {
3
      flag = 0;
4
      if (spalte >= 100)
5
      {
6
        spalte=0;
7
      }       
8
      for (i=0;i<16;i++)  // aus jeder Zeile ein Wert
9
      {
10
        rowstatus[i] = i;    // Für freie Zuordnung der Zeilen hier ändern
11
        memcpy(&pwm_setting[i], &array[i][spalte],1);  // Schreibe Elemente aus Spalte "spalte" in pwm_setting
12
      }
13
//      if ( PINC & (1<<PINC0) ) {spalte++;}  // Für zukünftige Benutzung
14
      spalte++;
15
      pwm_update();
16
    }

Mit 8 Kanälen hat das mit dieser Methode schonmal funktioniert (nein, 
den genauen Quelltext habe ich vermutlich nicht mehr), mit 16 Kanälen 
zuckt die Kiste nur rum, bei Bedarf könnte ich ein Video liefern.

Der Code kompiliert sauber durch, ich hänge den Quelltext und das 
Makefile an. Damit es wirklich vollständig ist kommt dazu noch eine 
Textdatei mit dem Output von make und avrdude.

Da ich keine Ahnung habe was da noch kaputt sein könnte, möchte ich 
hiermit um Hilfe bitten.

Schonmal vielen Dank und Grüße, Andi M
Angehängte Dateien:
#2715355
Lesenswert?

@Markus Müller (mmvisual)

>War es denn nicht schon so, dass ich letztes Jahr einen STM32F103
>empfohlen habe, der jede Menge Timer drin hat und bis zu 32
>unterschiedliche PWM Kanäle?

Weichei. Echte Männer (tm) machen das in Software. ;-)

>Siehe Artikel STM32
>Damit wäre das Projekt nicht gescheitert.

Ist es gar nicht. Man muss nur mal drei Minuten nachdenken und 
feststellen, dass man das Array problemlos in den Flash legen kann, 
davon hat auch der AVR genug.

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmspeicher_.28Flash.29
OP #2715375
Lesenswert?

Karl Heinz Buchegger schrieb:
> Lass mich mal rechnen
>
> uint8_t array[16][101]
>
> 16*101*1 Byte macht 1616 Bytes.
>
> Wieviel SRAM hat der Mega8 noch mal?
>
> PS: Um 1 Byte von A nach B zu kopieren, ist memcpy ein wenig wie Kanonen
> auf Spatzen.

Es läuft!

Triviale Änderung, schon gehts \o/

Vielen vielen Dank!


Auf die Größe hatte ich auch schonmal geguckt, habe aber dabei nur 
geguckt wie groß die .hex-Datei ist und wieviel Speicher der Atmel so 
hat, da muss ich mich irgendwo vertan haben.

Vielen Dank nochmal, ich freue mich gerade wie ein Schnitzel :)
OP #2715452
Lesenswert?

1
Writing | ################################################## | 100% 1.33s
2

3
avrdude: 2996 bytes of flash written
4
avrdude: verifying flash memory against main.hex:
5
avrdude: load data flash data from input file main.hex:
6
avrdude: input file main.hex auto detected as Intel Hex
7
avrdude: input file main.hex contains 2996 bytes
8
avrdude: reading on-chip flash data:
9

10
Reading | ################################################## | 100% 1.09s
11

12
avrdude: verifying ...
13
avrdude: 2996 bytes of flash verified
14
avrdude: reading input file "0xe4"
15
avrdude: writing lfuse (1 bytes):

Was zum Teufel?




Der STM32 wäre für größere Projekte vermutlich die bessere Wahl. Da ich 
aber immernoch versuche zu lernen mit dem AVR-Ding umzugehen, möchte ich 
eigentlich nicht gleich die nächste Architektur anfangen.
Aber danke für den Tipp, vielleicht erinenre ich mich dran wenn ich mal 
sehr viele Kanäle brauche.

Grüße, Andi M

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