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
Kann mir keiner von euch helfen?? Bin für jeden Tipp dankbar!! mfg Andy
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.
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!
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.