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
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.
@ 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
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.
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
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 |
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. ...
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.
@ 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?
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...
> Würde mir noch einer einen Tipp geben?
Na offenbar brauchst du auch 3 verschiedene tmp,
sonst werden halt alle 3 ports gleich leuchten.
@ 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
Statt Bitschieberei könnte auch eine union aus uint32 und char[4] o.ä. funktionieren.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.