Forum: Mikrocontroller und Digitale Elektronik XMC1100 bit-schreiben Frequenz erhöhen


von Florentin R. (knusperflo)


Lesenswert?

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 ;)

von Hannes (Gast)


Lesenswert?

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.

von c-hater (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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.

von Marc (Gast)


Lesenswert?

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.

von mh (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.