Forum: Mikrocontroller und Digitale Elektronik PWM mit daisy chained 74hc595


von Basti H. (basti1508)


Lesenswert?

Hallo zusammen,

ich habe einen atmega8 an dem 4 74hc595 Schieberegister hängen. An jedem 
der ausgänge hängt ein LED.

Ich möchte jetzt jeden Port der Schieberegister zum pwm port werden 
lassen. Ich habe davon shon ein arduino sketch gefunden der soetwas 
macht, jedoch versteh ich die logik noch nicht ganz. In normalem C habe 
ich leider nix gefunden.

Kann mir jemand erklären (nich unbedingt code eher logik) wie ich die 
pwm zum laufen bekomme.

Würde mich außerordentlich über eine Antwort freuen !

Grüße

Basti Himmi

von Stephan B. (matrixstorm)


Lesenswert?

UiUi PWM mit Schieberegistern.

Da kommt fuer dich nur noch Software-PWM in Frage.
Vermutlich wird das ganze auch zu langsam - auf welchem Takt laeuft denn 
dein M8 ?

http://www.mikrocontroller.net/articles/AVR-Tutorial:_PWM#PWM_in_Software

MfG

: Bearbeitet durch User
von MaWin (Gast)


Lesenswert?

Der 74HC595 hat einen OE Eingang. Verbinde ihn mit einem Pin den uC Wenn 
alle LEDs  gleich gedimmt werden sollen, schaltet man den prozentual ein 
und aus, 50" für halbe Helligkeit.
Sollen LEDs unterschiedliche Graustufen haben, muss man jedesmal die 
74HC595 mit neuen Daten beschicken.

von Peter D. (peda)


Lesenswert?

Basti Himmi schrieb:
> Ich habe davon shon ein arduino sketch gefunden

Schön für Dich.
Und wo ist der Link darauf?
Wo Dein Schaltplan?

Generell, wenn man Hilfe will:
Mit Informationsgeiz nur äußerst sparsam umgehen!

von Peter D. (peda)


Lesenswert?

Mal so geraten: der Sketch benutzt die Bit Angle Modulation. Das ergibt 
die geringste CPU-Last.

von Basti H. (basti1508)


Lesenswert?

Ich finde gerade den sketch den ich meinte nicht mehr... aber der hier 
is glaub ich so ähnlich: http://forum.arduino.cc/index.php?topic=44008.0

mein atmega8 läuft momentan noch ohne quarz, ich häng jetzt aber einen 
16 Mhz quarz dran.

Schaltplan kann ich leider nicht posten.

ziel ist das jede LED ihre eigene grayscale hat.

von Karl H. (kbuchegg)


Lesenswert?

Ui.
Ich hab jetzt nicht den Beitrag komplett durchgelesen, sondern mir nur 
die ersten beiden Codestücke angesehen, aber die sind in der Praxis 
unbrauchbar.

D.h. ganz unbrauchbar sind sie nicht. Immerhin zeigen sie in einfachem 
Code, wie ein 595 grundsätzlich angesteuert wird. Auf elektrischer 
Ebene.
Aber speziell wenn es dann in den Bereich Helligkeitssteuerung geht, ist 
das viel zu langsam, die Ansteuerung mittels digitalWrite zu machen.

OK. Plan.
Wie siehts aus. Kannst du grundsätzlich die Schieberegister ansteuern? 
Also erst mal ohne Helligkeitssteuerung? Einfach nur gezielt Output-Pins 
an den Schieberegistern auf 0 bzw. auf 1 zu setzen?
Das ist erst mal Grundvoraussetzung. Fürs erste, um die Technik dahinter 
zu verstehen, mittels digitalWrite und danach mittels SPI Modul.

Der Teil darf erst mal keine Probleme aufwerfen. Ansonsten brauchen wir 
uns über PWM gar nicht unterhalten.

: Bearbeitet durch User
von Basti H. (basti1508)


Lesenswert?

Ich mach das nicht mit dem arduino playground foo sondern mit normalem 
C.

Die Ansteuerung einzelner leds funktioniert schon perfekt.

Ich mache das im moment mit einem uint32_t in dem ich die on/off states 
der 32 Leds speichere, und shifte das dann komplett.

Mir fehlt nur die Logik wie das Software pwm funktionieren sollte.

von Stephan B. (matrixstorm)


Lesenswert?

Basti Himmi schrieb:
> Mir fehlt nur die Logik wie das Software pwm funktionieren sollte.

siehe http://www.mikrocontroller.net/articles/Soft-PWM

von Basti H. (basti1508)


Lesenswert?

ah okay sehr gut ich werde mal versuchen den code auf die Benutzung mit 
den 74hc595 anzupassen.

Dieser artikel sagt, dass die mittlere methode 93 takte zum arbeiten 
braucht.

Wie kann ich das denn messen wie viele takte meine routine braucht?

von Stephan B. (matrixstorm)


Lesenswert?

Hallo

Basti Himmi schrieb:
> Wie kann ich das denn messen wie viele takte meine routine braucht?

Anhand der Maschinenbefehle aus denen deine Funktionen aufgebaut sind, 
und der Anzahl der Taktcyclen die jeder braucht.
(http://matrixstorm.com/avr/files/doc0856.pdf)

MfG

von Basti H. (basti1508)


Lesenswert?

Ah okay cooles Paper werd ich mir mal in Ruhe durchlesen. Hab grad bei 
stöbern noch gesehen dass man auch nach Interrupt-request-bits suchen 
kann um zu sehen ob seine ISR zu lang ist.

Leider habe ich noch nicht herausgefunden wie ich an diese requestbits 
komme. Dann weiß ich zwar nicht wie lang sie ist, aber auf jeden fall 
DASS sie zu lang ist :)

von Karl H. (kbuchegg)


Lesenswert?

Wenn dich nur das 'zu lang' interessiert, gibt es noch eine einfachere 
Möglichkeit.

Nach dem Eintritt in die ISR einen Portpin auf 1 setzen. Vor dem Return 
aus der ISR den Portpin wieder auf 0.

Dann mit dem Oszi den Pin beobachten: Das Puls-Pausenverhältnis dessen, 
was du am Oszi sieht, zeigt dir unmittelbar, wieviel Zeit deine ISR im 
Verhältnis zur Zeit zwischen 2 Aufrufen braucht. Siehst du praktisch nur 
noch eine 'Linie' bei 5V, dann ist sie zu lang :-)

Müsste ich mal probieren: Anstatt eines Oszi eine LED anklemmen. Die 
Helligkeit der LED erzählt dir dann, wie es um den Zeitbedarf der ISR 
steht. Glimmt die nur so vor sich hin, dann ist alles in Butter. Ist sie 
aber hell, dann sollte man sich mal Gedanken machen :-) Du hast dann 
praktisch eine PWM, die dir den Resourcen-Verbrauch der PWM anzeigt. Pun 
intended.

: Bearbeitet durch User
von Walter T. (nicolas)


Lesenswert?

Peter Dannegger schrieb:
> Bit Angle Modulation

Gibt es zu diesem Stichwort irgendwelche fundierte Informationen? Google 
spuckt mir dazu nur Forenfragen aus...

von Karl H. (kbuchegg)


Lesenswert?

Such nach 'Binary Code Modulation'.

Gleich einer der ersten paar Links war bei mir ein Volltreffer.

http://www.batsocks.co.uk/readme/art_bcm_3.htm

Die Idee dazu ist genial. Kannte ich vorher auch noch nicht, obwohl ich 
den Begriff vorher schon mal gehört habe.

: Bearbeitet durch User
von Walter T. (nicolas)


Lesenswert?

Ah, einfach eine Umkehrung des Wägeverfahrens. Einfach und sinnvoll. 
Danke für die Erweiterung meines Horizonts!

: Bearbeitet durch User
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.