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!
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
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
@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.
Wegen dem Forum, das habe ich verwechselt, der Beitrag wurde aber
netterweise verschoben.
Mit dem Kondensator habe ich leider auch kein besseres Ergebnis
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.
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 ?
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