Forum: Mikrocontroller und Digitale Elektronik Flackern beim Senden von COM


von Andy (Gast)


Angehängte Dateien:

Lesenswert?

Hallo alle miteinander,

Ich habe ein Problem mit meinem Programm (im Anhang). Und zwar hab ich
ein ganz einfaches Programm für eine RGB-LED geschrieben, wo jeder
Kanal über die serielle Schnittstelle dimmbar ist (PWM). Nun hab ich
das Problem, dass jedesmal wenn ich einen Wert sende, die LEDs
flackern. Das stört mich sehr, da das nicht schön aussieht.

Kann mir vielleicht jemand sagen, woher das kommt. Wäre euch sehr
dankbar!

Vielen Dank .. Andy

von Andy (Gast)


Lesenswert?

Kann mir keiner von euch helfen??

Bin für jeden Tipp dankbar!!

mfg
Andy

von Wolfram (Gast)


Lesenswert?

Ich habe zwar noch nie mit BASCOM programmiert, aber wenn ich meinen
Basickenntnissen trauen kann, machst du einiges falsch.
Die Interruptroutine wird aufgerufen wenn EIN Zeichen an der seriellen
Schnittstelle empfangen wurde. Warum liest du in der Interruptroutine
die folgenden Zeichen ein??? Dein Puffer Buf ist nicht im geringsten
gegen Überlauf geschützt, was machst du bei einer fehlerhaften
Übertragung? In der Interruptroutine machst du ein Print.
Mal zusammenrechnen, Annahme dein Befehl ist 6 Byte lang (Größe von
Buf)
wenn das erste Zeichen empfangen wird blockiert der Interrupt deine
SoftwarePWM. Da du versuchst im Interrupt die weiteren Zeichen zu
empfangen also für 6 Byte + 1 Zeichen Senden.
7Byte bei 2400 Baud (8 Daten ,1 Stopbit, N)(10Bit)
2400 Baud /10 =240 Byte /s
1/240(Byte/s)*7Zeichen
das macht ca 30ms die dein Interrupt blockiert.(+ Verarbeitungszeit) Da
kann es schonmal leicht flackern.

von Andy (Gast)


Lesenswert?

Aha, das erklärt einiges!

Nun, ich bin noch ziemlicher Anfänger mit AVR und Bascom. Wie mach ich
das richtig? Gibt es dazu ein Bascom-Tutorial oder hat jemand ein
einfaches Beispielprogramm?

Danke für eure Hilfe!

von thkais (Gast)


Lesenswert?

Prinzipiell in der RS232-Interrupt-Routine nur die Zeichen in den Puffer
schreiben, die Auswertung im Hauptprogramm machen.
Die Software-PWM mit einem Timer-Interrupt machen.

von Lupin (Gast)


Lesenswert?

> Wie mach ich das richtig?

Mit C.

von Wolfram (Gast)


Lesenswert?

z.B.
der Interrupt wird bei jedem Zeichen das empfangen wird aufgerufen
wenn also ein Zeichen kommt füllst du den Puffer auf, wenn ein ganzer
Befehl da ist wertest du ihn aus und veränderst deine Statusvariablen.

also Interrupt ungefähr:
Hole das Zeichen
wenn der Puffer nicht schon voll ist, in Puffer
steht im Puffer ein kompletter Befehl?
wenn ja auswerten

da sind natürlich noch ein paar Feinheiten wie Überlauf, ungültiger
Befehl etc.

anderer Möglichkeit:
im Interrupt werden nur die Zeichen in einen Puffer geschoben und im
Hauptprogramm wird überprüft ob ein gültiger Befehl vorliegt.

von Andy (Gast)


Lesenswert?

Vielen Dank zunächst einmal für eure rasche Hilfe.
Ich weiß, ich bin nervig, aber ich bräuchte ein kurzes Programmbeispiel
(in Bascom), damit ich das verstehen kann. Bin halt noch ein blutiger
Anfänger gg.

@Wolfram: Hast du vielleicht einen Programmcode, wo das vorkommt, oder
wo finde ich sowas?

Ich habe auch schon gegoogelt, aber nix ordentliches gefunden.

Danke!

mfg
Andy

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.