Forum: Mikrocontroller und Digitale Elektronik Soft-PWM und gleichzeitig UART Empfang


von Reto H. (huberret)


Lesenswert?

Hallo,

ich möchte auf einem ATmega168 gerne per Soft-PWM LEDs dimmen. Im selben 
Programm kommuniziere ich auch über die UART Schnittstelle.
In dieser Kombination werden mir aber die Interrupts ziemlich sicher die 
UART Kommunikation stören, oder? Gibt es irgend eine Möglichkeit dies zu 
verhindern? Die Interrupts kurzzeitig abschalten um über die UART zu 
kommunizieren kann ich ja auch nicht, sonst wird das Dimmen 
unterbrochen...

Oder gibt es eine andere Lösung die LEDs zu dimmen? Wenn möglich ohne 
zusätzliche Hardware, da das Hardwaredesign bereits steht...


Danke,

Reto

von Läubi .. (laeubi) Benutzerseite


Lesenswert?


von MaWin (Gast)


Lesenswert?

Jeder halbwegs fähige chinesische Leuchtschriftbauer
bekommt das problemlos hin, also git dir einen Ruck und lege
die typische deutsche Bedenkenträgerschaft ab.

Es gibt 4 Methoden, das Programm zu schreiben:

PWM per Interrupt, UART per Interrupt
PWM per Interrupt, UART in der Programmhauptschleife
PWM in der Programmhauptschleife, Empfäng vom UART per Interrupt
PWM in der Hauptschleife, UART-Empfang auch.

Alle 4 Varianten funktionieren.

Entscheidend ist, daß du pro Interrupt oder pro Hauptschleifendurchlauf 
nur kurze Dinge tust.
Also genau das gerade angekommene Zeichen vom UART abholen und im 
Empfangsbuffer ablegen und fertig.

Die Auswertung, ob das Kommando vollständig ist und welches Kommando es 
war, macht dann die Programmhauptschleife bei nächster Gelegenheit.

Ebenso kannst du dich PWM-mässig nur ums Einschalten oder Ausschalten 
kümmern, nicht um einschalten-warten-ausschalten in einem Block.

Wenn du so weit bist, daß zum dimmen (dem realen ein- und ausschalten) 
von 1024 LEDs im schnellsten Fall, des 1/256 Helligkeitssteps, nur ein 
Blockmove von 128 bytes notwendig ist (das waren noch Zeiten beim Z80 
mit REP OUTSW), weil alles andere in den Zeiten der längeren 
Dimmintervalle bis 1/2 vorbereitet wurde, dann kannst du programmieren.

Vorher lernst du nur.

von Reto H. (huberret)


Lesenswert?

MaWin schrieb:
> typische deutsche Bedenkenträgerschaft

Ich muss Dich enttäuschen, ich bin Schweizer. :-)

Meine Idee war eigentlich "PWM per Interrupt, UART in der 
Programmhauptschleife". Und beim Interrupt wirklich nur gerade LED 
einschalten, bzw. ausschalten. Testen kann ich das leider erst morgen, 
weil ich erst dann den ISP wieder habe...

Mein "schweizer Bedenken" geht halt dahin, dass wenn genau während dem 
Empfang eines Zeichens über UART ein Interrupt kommt, ich das Zeichen 
verlieren bzw. nicht vollständing empfangen werde. Aber falls das nicht 
allzu oft vorkommt...

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Reto H. schrieb:
> dass wenn genau während dem
> Empfang eines Zeichens über UART ein Interrupt kommt, ich das Zeichen
> verlieren bzw. nicht vollständing empfangen werde

Und woraus leitest du diese Bedenken ab? Die UART ist ein unabhängiges 
Hardwaremodul, welches auch bei Interrupts korrekt arbeitet, wenn das 
nicht so wäre, hätten Interrupts überhaupt keinen Sinn.

von Ulrich (Gast)


Lesenswert?

Wenn man wenigstens für die UART die Hardware nutzt und da nicht auch 
noch ein Software UART macht, hat man von der Hardware einen Puffer für 
fast 2 Zeichen - bei 9600 Baud sind das rund 2 ms. Da kommt es auf die 
kleine Verzögerung durch Software PWM nicht an. Wenn der Interrupt da 
länger braucht hat man da was falsch gemacht.

Für LEDs braucht man auch keine so hohe PWM Frequenz und das Auge 
bemerkt es auch kaum wenn wegen eines Interrupts von der UART die LED 
mal für vielleicht 10-50 µs länger öder kürzer an ist.

von Reto H. (huberret)


Lesenswert?

Ulrich schrieb:
> hat man von der Hardware einen Puffer für
> fast 2 Zeichen

Ah, das ist ja interessant! Wusste ich nicht... Dann sollte es wirklich 
kein Problem geben. Vielen Dank für Eure Hilfe.

von Falk B. (falk)


Lesenswert?

Lies mal was über Interrupt und Multitasking. Dann geht das. 
Auch als Schweizer, die ja nicht gerade für ihre Schnelligkeit berühmt 
sind ;-)

MfG
Falk

P S Ich hab mal mit dem Soft-PWM einen DMX512 Empfänger gebaut. Da 
wurden 20 Kanäle gedimmt und nebenher DMX512 mit 250kBaud empfangen. 
Lief problemlos. ;-)

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.