Forum: Mikrocontroller und Digitale Elektronik PWM Programm erweitern


von chris (Gast)


Lesenswert?

Hallo zusammen,

ich habe mir den intelligenten Lösungsansatz aus folgendem Link 
angeschaut: http://www.mikrocontroller.net/articles/Soft-PWM

Das Ganze funktioniert auch wunderbar auf einem mega8. Wie ist es jetzt 
möglich Das Programm auf mehr kanäle zu erweitern? Insgesamt brauche ich 
17 Kanäle die auf 3 Ports des AVR aufgeteilt sind.

Hilfe wäre super :)
Danke

von MaWin (Gast)


Lesenswert?

Tja, da setzt du am Anfang noch ein port auf Ausgang
und schreibst die 4 Zeilen code mit diesem port hinter die 4 Zeilen Code 
des ersten ports in die Interrupt-Routine,
und dann setzt du NOCH ein Port mit zumindest einer Leitung auf Ausgang
und schreibst dessen 4 Zeilen Code hinter die 4 Zeilen des ersten und 
die 4 Zeilen des zweiten ports,wobei eine Schleife die von 0 bis 
exclusive 1 läuft nur ein mal duurchlauen wird mit konstatem Index, also 
ausgeschlüsselt werden kann.

von Falk B. (falk)


Lesenswert?

@  chris (Gast)

>Das Ganze funktioniert auch wunderbar auf einem mega8. Wie ist es jetzt
>möglich Das Programm auf mehr kanäle zu erweitern? Insgesamt brauche ich
>17 Kanäle die auf 3 Ports des AVR aufgeteilt sind.

Lesen?

"Da Gleiche gilt für mehr PWM-Kanäle, praktisch wurden schon bis zu 32 
Kanäle realisiert. Der Quelltext ist an den Stellen kommentiert."

MFG
Falk

von Tip (Gast)


Lesenswert?

chris schrieb:
> ich habe mir den intelligenten Lösungsansatz aus folgendem Link
> angeschaut: http://www.mikrocontroller.net/articles/Soft-PWM

> Lesen?

Anschauen und Lesen reicht nicht. Besser ist, wenn man das nicht nur 
kopiert sondern auch kapiert.

von chris (Gast)


Angehängte Dateien:

Lesenswert?

Tut mir Leid ich bin leider nicht gut im programmieren. Muss das 
Programm nur möglichst schnell am laufen haben (Chef meckert)...

Ich habe jetzt das Programm auf 24 Kanäle erweitert. Allerdings habe ich 
vermutlich alles falsch gemacht was man nur falsch machen kann. Alle 
LEDs an den Ausgängen flackern jetzt mit schätzungsweise 10-15 Hz.

Kann mal einer drüber gucken? Danke

von Falk B. (falk)


Lesenswert?

Wer lesen kann ist klar im Vorteil. Suche ALLE Vorkommen dieses 
Kommentars und befolge ihn.

// ändern uint16_t oder uint32_t für mehr Kanäle
1
uint8_t  pwm_mask_tmp[PWM_CHANNELS+1];        // ändern uint16_t oder uint32_t für mehr Kanäle

Meinst du nicht, dass du es dir hier "etwas" zu einfach machst?
1
    AUSGANG2_PORT = tmp;                         // Ports setzen zu Begin der PWM
2
      AUSGANG3_PORT = tmp;                         // Ports setzen zu Begin der PWM

von chris (Gast)


Lesenswert?

Ja das erste war mir auch eben aufgefallen habe ich in uint32 geändert. 
Ich weiß einfach nciht wie ich das mit den Ausgängen machen muss.

...

von Gruß an Chef (Gast)


Lesenswert?

chris schrieb:
> Tut mir Leid ich bin leider nicht gut im programmieren. Muss das
> Programm nur möglichst schnell am laufen haben (Chef meckert)...

Gruß an Chef,
entweder er gibt dir Zeit, dich da einzuarbeiten oder er vergibt das 
extern als Auftrag und muß dafür löhnen.

von Falk B. (falk)


Lesenswert?

@  chris (Gast)

>Ja das erste war mir auch eben aufgefallen habe ich in uint32 geändert.
>Ich weiß einfach nciht wie ich das mit den Ausgängen machen muss.

Ach, und wieso erwartet dein Chef dann von dir, dass du das 
programmierst, wenn du solche elementaren Dinge nicht weißt?
Oder gibt es den Chef gar nicht und es ist nur eine faule Ausrede?

von chris (Gast)


Lesenswert?

Nein! keine faule Ausrede ;) Bin Azubi und soll jetzt hier ein bisschen 
mit AVRs programmieren. Ich sagte "PWM wär doch was schönes" und habe 
mich damit selbst in die Falle geritten. Soll jetzt hier einen Haufen 
LEDs alle unterschiedlich Hell (einstellbar) leuchten lassen.

Irgendwie ist mir auch klar, dass ich mit den Codezeilen hier 
theoretisch nur alle Ports "klone"
1
AUSGANG1_PORT = tmp;                         // Ports setzen zu Begin der PWM
2
AUSGANG2_PORT = tmp;                         // Ports setzen zu Begin der PWM
3
AUSGANG3_PORT = tmp;                         // Ports setzen zu Begin der PWM

Würde mir noch einer einen Tipp geben? Würde mir das Ganze um einiges 
erleichtern...

von MaWin (Gast)


Lesenswert?

> Würde mir noch einer einen Tipp geben?

Na offenbar brauchst du auch 3 verschiedene tmp,
sonst werden halt alle 3 ports gleich leuchten.

von Falk B. (falk)


Lesenswert?

@  chris (Gast)

>Würde mir noch einer einen Tipp geben? Würde mir das Ganze um einiges
>erleichtern...

Grundlagen lernen. C-Buch und

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

tmp ist ein 32 Bit Integer, z.B. so.

tmp = 0xDDCCBBAA;

die Ports sind immer 8 Bit.

PORTA = 0xAA;

ist gleich mit

PORTA = tmp;

Die höherwertigen Bytes fallen weg. Also muss man die höherwertigen Bits 
und Bytes in die niederwertigen verschieben.

PORTB = tmp >> 8;

damit landet 0xBB im PORTB.

MFG
Falk

von Tip (Gast)


Lesenswert?

Statt Bitschieberei könnte auch eine union aus uint32 und char[4] o.ä. 
funktionieren.

von chris (Gast)


Lesenswert?

ich habe jetzt folgendes:
1
if (pwm_cnt == 0) {
2
AUSGANG1_PORT = tmp;                      // Ports setzen zu Begin der PWM
3
AUSGANG2_PORT = tmp >> 8;                 // Ports setzen zu Begin der PWM
4
AUSGANG3_PORT = tmp >> 16;                // Ports setzen zu Begin der PWM
5
                                                
6
pwm_cnt++;
7
}
8
else {
9
AUSGANG1_PORT &= tmp;                        // Ports löschen
10
AUSGANG2_PORT &= tmp >> 8;                   // Ports löschen
11
AUSGANG3_PORT &= tmp >> 16;                  // Ports löschen
12
                                                
13
if (pwm_cnt == pwm_cnt_max) {
14
pwm_sync = 1;                       // Update jetzt möglich
15
pwm_cnt  = 0;
16
}
17
else pwm_cnt++;
18
}
und diese Fehlermeldungen:
main.c:75: warning: assignment from incompatible pointer type
main.c:76: warning: assignment from incompatible pointer type

die sich auf diese Zeilen beziehen:
1
tmp_ptr8 = isr_ptr_mask;
2
isr_ptr_mask = main_ptr_mask;

Habe jetzt i der Mainschleife 24 Werte stehen. Der erste Port ist an 
solang alle Werte 255 sind. Ändere ich einen Werte (egal welchen) ändert 
sich die Helligkeit aller 8 LEDs am ersen Port diesem Wert entsprechend.

von Falk B. (falk)


Lesenswert?

Du hast eine Zeile vergessen.

uint8_t *isr_ptr_mask  = pwm_mask;              // Bitmasken fuer 
PWM-Kanäle

Hier müssen auch 32 Bit rein. Ist aber nicht eindeutig beschrieben, das 
gebe ich zu.

MFG
Falk

von chris (Gast)


Lesenswert?

DANKE!

es scheint zu funktionieren!

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.