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
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
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.
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!
Mal so geraten: der Sketch benutzt die Bit Angle Modulation. Das ergibt die geringste CPU-Last.
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.
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
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.
Basti Himmi schrieb: > Mir fehlt nur die Logik wie das Software pwm funktionieren sollte. siehe http://www.mikrocontroller.net/articles/Soft-PWM
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?
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
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 :)
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
Peter Dannegger schrieb: > Bit Angle Modulation Gibt es zu diesem Stichwort irgendwelche fundierte Informationen? Google spuckt mir dazu nur Forenfragen aus...
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.