Forum: Mikrocontroller und Digitale Elektronik Drehencoder und Pwm funktionieren nicht zusammen (Bascom)


von Thomas R. (Gast)


Lesenswert?

Hy, ich bin gerade am verzweifeln, ich habe einen Attiny2313 an zwei 
MOSFETs als Treiberstufe angeschlossen, um die 3A je LED-Kanal per PWM 
zu betreiben, das funktioniert einwandfrei, Anfaden und Ausfaden klappt 
problemlos.
Jetzt habe ich mir bei Reichelt zwei Drehencoder mit Taster bestellt und 
angeschlossen, funktionieren auch wunderbar.
Wenn ich jetzt jedoch beides kombinieren will spinnt Alles nur noch rum, 
ich kann die blauen LED's nur noch über PWM aktivieren, wenn die Weißen 
bereits an sind und die Blauen gehen auch mit den Weißen zusammen aus, 
obwohl ich das gar nicht so programiert habe, habe auch schon mal die 
Taster versucht, da klappt es einen neuen Wert fürs PWM zu übergeben, da 
kann ich auch beide Kanäle getrennt betreiben.

Ich habe auch schon den Timer mal durch 64 geteilt, da sieht man sehr 
deutlich, dass die Blauen bei einer Rechtsdrehung des Encoders kurz 
angehen, aber danach sofort wieder aus, wenn ich die Weißen anmache, 
dann bleiben die Blauen auch an.

Also ich stehe vor einem Großen Rätsel und hoffe, dass es ein einfacher 
Fehler ist.

Hier mal der aktuelle Code:

$regfile = "2313def.dat"
$crystal = 8000000
$prog &HFF , &HE4 , &HDF , &H00                             ' generated. 
Take care that the chip supports all fuse bytes.

Led1 Alias Portd.0
Led2 Alias Portd.4
Tast1 Alias Pinb.0
Tast2 Alias Pinb.1

Led1 = 0
Led2 = 0

Config Led1 = Output
Config Led2 = Output
Config Pinb.0 = Input
Config Pinb.1 = Input
Config Pinb.2 = Input
Config Pinb.3 = Input
Config Pinb.4 = Input
Config Pinb.5 = Input

Dim D As Byte
Dim E As Byte
Dim Weis As Byte
Dim Blau As Byte
Dim Pwm As Byte

Config Timer0 = Timer , Prescale = 1
On Timer0 On_timer0
Enable Timer0
Enable Interrupts

Do

If Tast1 = 1 Then
Waitms 100            <-zum entprellen, da der Befehl debounce ebenfalls 
nur kurz die led aufleuchten lässt
Gosub Taster
End If

If Tast2 = 1 Then
Waitms 100
Gosub Taster2
End If

E = Encoder(pinb.3 , Pinb.2 , Wrechts , Wlinks , 0)
D = Encoder(pinb.5 , Pinb.4 , Brechts , Blinks , 0)

Loop

End

On_timer0:
Incr Pwm

Gosub Led_blau
Gosub Led_weis
Return

Led_blau:

   If Blau <= Pwm Then
   Led2 = 0
   Else
   Led2 = 1
   End If
   Return

Led_weis:

   If Weis <= Pwm Then
      Led1 = 0
   Else
      Led1 = 1
   End If
Return


Taster2:
Weis = 0
Blau = 0
Return

Taster:
Weis = 255
Blau = 255
Return

Wlinks:
Weis = 0
Return

Wrechts:
Weis = 255
Return

Blinks:
Blau = 0
Return

Brechts:
Blau = 255
Return



Die vielen Gosub's sind einfach noch versuche gewesen, einfach die 
blauen vor den weißen abzufragen, aber das brachte leider auch keine 
Änderung

Ich hoffe ihr könnt mir helfen!

von Peter D. (peda)


Lesenswert?

Da Du ja im GCC-Forum postest, könnte Dir bestenfalls jemand sagen, wie 
narrensichere Entprellroutine, Drehgeber einlesen und Software-PWM in C 
aussehen.

Auch ist Dein Code ja super mangelhaft kommentiert und der 
Programmablaufplan ist super nichtexistent.

Wenn Du unnütze Gosubs hast, ist es natürlich super nett von Dir, diese 
drin zu lassen, obwohl Du festgestellt hast, daß sie wirkungslos sind.


Ein kleines bischen Entgegenkommen Deinerseits ist schon erforderlich, 
wenn Du Hilfe erwartest.


Peter

von hdadhgdag (Gast)


Lesenswert?

sieht mir nach hardwarefehler aus ... pullup, pulldown etc.

von Thomas R. (Gast)


Lesenswert?

Die Taster und Encoder sind über Pulldown-Widerstände an GND 
angeschlossen, funktionieren ja auch problemlos, nur wenn Encoder und 
PWM zusammen laufen soll gibt es Probleme

von D. S. (jasmin)


Lesenswert?

Wieso ist das hier ein GCC Forum ?
Wieso seid ihr so muffig ?

von gelegentlich (Gast)


Lesenswert?

@Peter Dannegger, Seltsam, diese Schulmeisterei von dir. Dein Code z.B. 
fboot.c  ist wohl auch nicht besser kommentiert. Kann es sein , dass du 
auf Leute herabsiehst, die bascom nutzen? Du doch genug Zuspruch hier. 
Da könntest du doch drüber stehen und die anderen mal machen lassen. Und 
wenn du mal das Forum verwechselst, stünde dir ein "sorry" gut.

von D. S. (jasmin)


Lesenswert?

löte einmal 100 nf von den Drehgeberkontakten nach Masse.
Das hilft gigantisch !

Dietmar

von Thomas R. (Gast)


Lesenswert?

Wegen dem Forum, das habe ich verwechselt, der Beitrag wurde aber 
netterweise verschoben.

Mit dem Kondensator habe ich leider auch kein besseres Ergebnis

von MWS (Gast)


Lesenswert?

Thomas,

ich denke Bascom hat seinen Ruf weg, weil jeder sich geeignet und 
berufen fühlt solchen Murkscode zu programmieren, und es in Bascom 
aufgrund der geringeren Anforderungen einfacher möglich ist, etwas zu 
erzeugen, bei dem der Compiler nicht mehr meckert. Ob das dann Sinn hat, 
ist eine andere Sache. Mglw. daher die allergische Reaktion von Peter.

Gäbe da verschiedene Verdächtige, einmal fehlen Angaben zu $HWSTACK und 
$SWSTACK, beide Speicherbereiche werden hier jedoch benutzt, siehe 
Aufruf ISR und in der ISR eine Gosub...

Die Drehencoder, die bei Reichelt zu finden sind, sind optische Typen 
mit Fototransistor nach Masse, da prellt im Übrigen nix, nahm bereits 
an, daß C's da keinen Effekt haben.

Und, was sind denn Pulldown Widerstände in diesem Zusammenhang ??? Der 
ENC 62P22-H0S z.B. benötigt Pullups, den mit Pulldown zu beschalten wäre 
völliger Krampf. Im obigen Code könnten sogar die internen PUp's des 
2313 reichen, diese werden jedoch nicht eingeschaltet.

Außerdem, der 2313 hat 4 PWM's, die völlig ohne Prozessorlast das Dimmen 
erledigen könnten. Du verwendest aber eine Soft-PWM, noch dazu mit 
Gosubs drin. Da schüttelt es mich. Eine ISR soll so klein und schnell 
wie möglich sein, noch dazu wenn sie oft aufgerufen wird, und Du 
verlängerst sie zusätzlich durch sinnlose Gosubs.

Ich kann mir vorstellen, daß die Prozessorlast, die durch die SoftPWM 
erzeugt wird, die Encoderabfrage ins Schleudern bringt, deshalb erster 
Ratschlag: Auf HW PWM umstellen.

Weiterer Vorschlag zur Fehlersuche: erst einmal nur einen Encoder in der 
Loop abfragen, sinnvollen Code in die Subs reinschreiben, um die Werte 
um eins zu erhöhen, so wie's wahrscheinlich später vorgesehen ist. Dann 
ist auch die Fehlersuche einfacher.

von D. S. (jasmin)


Lesenswert?

E = Encoder(pinb.3 , Pinb.2 , Wrechts , Wlinks , 0)
D = Encoder(pinb.5 , Pinb.4 , Brechts , Blinks , 0)



Du wertest weder D noch E aus und Du springst keinerlei Labels an 
(Wrechts Wlinks...).

Ich habe jetzt auch keine Muße den Versuch zu unternehmen wasw Du da 
eigentlich programmieren wolltest.

Grundsätzlich erkenne ich aber auch keine "Struktur" in Deinem Vorhaben 
?????????????????????

Welche Einzelprogramme sollen denn da funktioniert haben ?

von Peter D. (peda)


Lesenswert?

gelegentlich wrote:
> @Peter Dannegger, Seltsam, diese Schulmeisterei von dir.

Ich wollte nur ausdrücken, daß es wenig nützt, wenn man aus der ersten 
Rage heraus irgendwas dahinpostet. Damit kriegt man wenig Hilfe.

Man sollte erstmal in Ruhe die wichtigsten Punkte klären, also:

- Was ist die Funktion des Programms (muß kein picobello PAP sein)?
- Was erwartet man an welcher Stelle?
- Was passiert stattdessen (Abweichung vom Gewünschten)?

Und natürlich das Programm möglichst reduzieren, daß der Fehler noch 
auftritt.
Alle möglichen probierten Sachen drinnlassen, die nur die Übesicht 
erschweren, ist nicht gerade doll.


> Dein Code z.B.
> fboot.c  ist wohl auch nicht besser kommentiert.

Ich stelle ja auch keine Fragen dazu, er funktioniert ja.
Falls aber jemand was nicht versteht, beantworte ich es gerne, nur muß 
er fragen.


> Kann es sein , dass du
> auf Leute herabsiehst, die bascom nutzen?

Ich habe etwas Probleme, die Bascom-Blackboxen (Libfunktionen) zu 
verstehen, daher wäre speziell dazu ein Kommentar nützlich.
Ich habe aber sehr oft den Eindruck, daß Blackboxen benutzt werden, ohne 
in die Hilfe zu schauen. Daß es dann krachen muß, ist ja klar.
Ich erwarte, daß die Poster hier so erwachsen sind und selber erstmal 
die Doku lesen. Sie ans Händchen nehmen zu müssen, habe ich keine Lust.


> Da könntest du doch drüber stehen und die anderen mal machen lassen.

Würde Dir Schweigen im Walde und die Fehler ungenannt lassen, besser 
helfen?
Daß meine Art manchmal etwas direkt ist, kommt schon vor.


> Und
> wenn du mal das Forum verwechselst, stünde dir ein "sorry" gut.

Der Beitrag wurde verschoben.


Peter

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.