PWM Programm erweitern

Gast #2251187
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
Gast #2251203
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.
#2251212
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
Gast #2251323
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
Angehängte Dateien:
#2251342
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
Gast #2251363
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.
#2251372
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?
Gast #2251384
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...
#2251399
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
Gast #2251442
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.

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