Forum: Mikrocontroller und Digitale Elektronik 16 Kanal Software-PWM, Bitte um Hilfe


von Andi M. (rootsquash)


Angehängte Dateien:

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

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?
Siehe Artikel STM32
Damit wäre das Projekt nicht gescheitert.

von Falk B. (falk)


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

von Andi M. (rootsquash)


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

von Andi M. (rootsquash)


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

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Dann viel Spaß beim lernen ;-)

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.