Hallo zusammen, Ich stehe gerade am Beginn eines Hardware-Projekts für die Schule. Hierbei muss ich einen Treiber für eine RGB-LED-Matrix (WS2812) für den XMC1100 (32MHZ) schreiben. Folgendes Problem: Laut Datasheet muss ich dazu eine Frequenz-Periodendauern von 0.35us erreichen, was ich nach Messen mit dem Oszilloskop mit einfachem bit_write in C-Code nicht schaffe. Damit komme ich auf gerade mal auf eine Frequenz-Periodendauer von ca. 7,4us. Mein Lehrer hat mir den Tipp gegeben PWM dazu zu benutzen. Leider steh ich, was Microcontroller angeht noch am absoluten Anfang und werde aus dem Material im Internet nicht wirklich schlau. Hinweis: In der Library für den XMC1100 gibt es folgende Funktionen: -pwm1_init() -pwm1_start() -pwm1_start_interrupt() -pwm1_stop -pwm1_duty_cycle(uint8_t value) -pwm1_duty_cycle_period(uint8_t compare, uint8_t period) Kann mir irgendjemand sagen, ob mein Vorhaben mit PWM überhaupt umsetzbar ist und mir einen Tipp geben, wie ich PWM am besten dafür einsetze? PS: Falls ihr weitere Details braucht, fragt einfach. Ich bin dankbar für jederlei Hilfe ;)
Deine PWM braucht 3 Zustaende. 0-Bit, 1-Bit, kein-Bit. Du musst eine Traegerfrequenz ausrechnen und Duty-Cycles dafuer, um diese 3 Zustaende brauchbar dargestellt zu bekommen, und die Daten dafuer rechtzeitig bereitstellen, da du nicht nur 1 Bit uebertragen musst, sondern 24 pro LED. Was uebrigens auch sehr gut geht: einen SPI-Kanal verwenden. Die haben in der Regel einen FIFO oder sogar einen DMA-Kanal. Da kann man dann ganze Zeilen vorbereiten und mit einem einzigen Transfer am Stueck rausschieben.
Florentin R. schrieb: > Laut Datasheet muss ich dazu eine Frequenz-Periodendauern von 0.35us > erreichen Nein. Das ist nur der kürzeste Impuls, den du erzeugen musst. Die Periodendauer liegt bei 1,25µs. > was ich nach Messen mit dem Oszilloskop mit einfachem > bit_write in C-Code nicht schaffe. Damit komme ich auf gerade mal auf > eine Frequenz-Periodendauer von ca. 7,4us. Oha, was ist das denn das für ein grottiger Prozessor, der bei 32MHz Takt nichts besseres zu vollbringen vermag? Mit dem hatte ich (wohl zum Glück) noch nie zu tun. > Mein Lehrer hat mir den Tipp > gegeben PWM dazu zu benutzen. Das könnte auf jeden Fall ein gangbarer Ansatz sein. Man müßte sich halt anschauen, was diese PWM kann. Wenn's der Lehrer empfohlen hat, wird's wohl damit gehen. > Leider steh ich, was Microcontroller > angeht noch am absoluten Anfang und werde aus dem Material im Internet > nicht wirklich schlau. Tja, dass du dies änderst, ist wohl die Intention der Aufgabe. Also setz' dich auf deinen Arsch und lerne. Verstehe, was PWM eigentlich tut, denke dir aus, wie man diese Fähigkeiten für die Aufgabe einsetzen könnte, finde heraus, was die konkrete PWM-Einheit kann und wie du sie entsprechend deiner Idee zur Nutzung konfigurieren müsstest. Und dann setzt du das einfach in Code um. So geht Programmieren.
Florentin R. schrieb: > XMC1100 ... > mit einfachem bit_write in C-Code nicht schaffe. > Damit komme ich auf gerade mal auf > eine Frequenz-Periodendauer von ca. 7,4us. Das wären ja gerade mal 135 kHz, kann ich mir kaum vorstellen. Das hundertfache wäre normal. Kann es sein, dass du mit "bit_write in C-Code" eine Bibliotheksfunktion meinst? Wer weiß, was die sonst noch alles macht!? Informiere dich, wie man direkt auf die Port Register zugreift, ohne eine Funktion aufzurufen. Das muss gehen. PWM halte ich für keine gute Idee. Denn dann musst du die Pulsbreite für jedes einzelne Bit variieren. Es ist fraglich, ob der Mikrocontroller seine Interrupt-Handler überhaupt schnell genug aufrufen kann. Und wenn man stattdessen den richtigen Moment per Polling ermittelt, kann man es auch gleich ganz zu Fuß mit delay-Schleifen machen. Nächstes mal wenn du fragen zu deinem Programm hast, dann zeige uns dein Programm. Damit wir nicht aneinander vorbei reden, oder über heiße Luft.
Wenn du zum ersten Mal mit XMC arbeitest, empfehle ich Dir, die Entwicklungsumgebune DAVE von Infineon zu verwenden (kann kostenlos herunter geladen werden). Damit kannst Du Apps verwenden für PWM oder Pin-Ansteuerung, die eine gut dokuentiert API zur Verfügung stellen. Du braucht nicht "bare metal" zu programmieren. Das ist bei einfachen Projekten unnötig und völlig ineffizient. Ein Pin-Toggle dauert beim XMC1100 und diesen APIs übrigens 50ns (Optimierung -O1 einschalten). Es hat mit ca. 5 Min. gekostet, ein entsprechends Projekt mit DAVE aufzusetzen und auf einem XMC2Go Board zu testen.
Marc schrieb: > Ein Pin-Toggle dauert beim XMC1100 und diesen APIs übrigens 50ns > (Optimierung -O1 einschalten). Es hat mit ca. 5 Min. gekostet, ein > entsprechends Projekt mit DAVE aufzusetzen und auf einem XMC2Go Board zu > testen. Du lässt den XMC mit 20MHz laufen?
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.