Soft-PWM und gleichzeitig UART Empfang

#2250015
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
Gast #2250031
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.
#2250090
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...
Persönliche Seite #2250098
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.
Gast #2250110
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren