Einen wunderschönen Abend ;-)
Nachdem ich nun endlich meinen ATtiny programmieren kann habe ich wieder
ein Problem :-( und hoffe auf einen Wink mit dem Zaunpfahl von euch...
Vorab ich benutze nun das Evaluationsboard 2.0.1 von Pollin :-S und die
DEMO von Bascom-AVR
Das Programm was ich geschrieben habe soll mit Taster 1 die LED 1
einschalten und mit Taster 2 die LED 2 einschalten, wenn ich Taster 3
betätige soll die LED 2 wieder erlöschen und wenn ich Taster 1 nochmal
betätige soll die LED 1 ebenfalls erlöschen...
Nun klappt es bis zum einschalten der LED 2...aber danach klappt gar
nichts mehr wie es soll...scheint so als würde sich das Programm
irgendwie aufhängen, oder habe ich mir den Hänger selber programmiert?
Ich denke mir wäre schon geholfen wenn mir irgendwer erklären könnte wie
ich bei Bascom den Simulator dazu bewegen kann mir zu zeigen was aktuell
im MC abläuft wenn ich die Tasten betätige...
Für jede Hilfe wäre ich dankbar...
Es gibt bei modernen AVRs die Möglichkeit durch Schreiben des
Pin-Registers mit 'ner 1 diesen Pin zu toggeln, wobei der 2313 noch
nicht dazugehören dürfte.
Damit und sowieso ist das Schreiben des Pin-Registers wie im Code
Unsinn.
Jetzt habe ich das pinregister entfernt und muss feststellen das die
LED1 nur noch schwach leuchtet und die zweite LED gar nicht mehr
angeht....is vllt. doch nicht so ein Schwachsinn mit dem Pinregister...
Hallo Wilfried,
das eigentliche Problem ist:
mit PIN werden die Eingänge abgefragt
mit PORT Ausgänge
Dies ist auch schon bei den Config-Anweisungen oben zu beachten.
Im selben Zusammenhang kannst du diesen PINs und PORTs alias
zuweisen....
so kannst du dann im folgenden Quelltext direkt abfragen:
IF taster1=1 then LED1=1
...
gruß
Wilfried Bergmann schrieb:> doch nicht so ein Schwachsinn mit dem Pinregister...
Wenn Du glaubst Du weisst Bescheid, muss ich ja gar nicht erst
antworten.
Wo wurde denn jetzt das Pinregister entfernt?
Etwa aus dem Config-Teil?
Und womit, mit der Flex? ;-)
Ach so...ich dachte pin und port stellen nur eine alternative da...okay
dann änder ich es gleich mal :-)
Ja ich habe den Configteil entfernt gehabt, das ist doch das Pinregister
oder was meinst du? Schließlich sind die Pins doch nur dort
aufgelistet...aufgelistet=Register?
Wilfried Bergmann schrieb:> Ja ich habe den Configteil entfernt gehabt, das ist doch das Pinregister
Bei Config ... darf Pin geschrieben werden.
> oder was meinst du? Schließlich sind die Pins doch nur dort> aufgelistet...aufgelistet=Register?
Nein, ich meinte das hier:
> If Led2 = 1 Then Pind.6 = 1
If Pind.2 = 1 And Led1 = 0 Then Set Led1 'Taster 1 drücken= LED 1 an
21
If Led1 = 1 Then Portd.5 = 1
22
If Portd.5 = 1 And Pind.3 = 1 Then Set Led2 'LED 1 an + Taster 2 drücken=LED 2 an
23
If Led2 = 1 Then Portd.6 = 1
24
If Portd.5 = 1 And Portd.6 = 1 And Pind.4 = 1 Then Reset Led2 'LED 1 an + LED 2 an + Taster 2 drücken=LED 2 aus
25
If Led2 = 0 Then Portd.6 = 0
26
If Portd.5 = 1 And Pind.2 = 1 Then Reset Led1 'LED 1 an + Taster 1 drücken = LED 1 aus
27
If Led1 = 0 Then Portd.5 = 0
28
Loop
29
30
End
Aber nun leuchtet die LED 1 nur solange wie ich den Taster gedrückt
halte...wie kann ich denn das Bit nun "Led1" halten ohne dauerhaft
Taster 1 zu drücken?
Also kann der 2313 die Bits Led1 Led2 und Led3 nicht verstehen? Dann
erklärt sich nun mein Problem ;-)
Danke...
If Pind.2 = 1 And Portd.5 = 0 Then Toggle Portd.5 'Taster 1 drücken= LED 1 an
16
17
If Portd.5 = 1 And Pind.3 = 1 Then Toggle Portd.6 'LED 1 an + Taster 2 drücken=LED 2 an
18
19
If Portd.5 = 1 And Portd.6 = 1 And Pind.4 = 1 Then Toggle Portd.6 'LED 1 an + LED 2 an + Taster 2 drücken=LED 2 aus
20
21
If Portd.5 = 1 And Pind.2 = 1 Then Toggle Portd.5 'LED 1 an + Taster 1 drücken = LED 1 aus
22
23
Loop
24
25
End
Ist das jetzige Programm...aber LED 1 (PORTD.5)leuchtet nun nur für die
Dauer des drückens auf...und nur dann lässt sich die LED 2 einschalten
mit Taster 2 und ausschalten mit Taster 3....
Wie bekomme ich es denn nun hin das LED 1 dauerhaft leuchtet, nach
einmaligem drücken von Taster 1?
Du schreibst viel Code um Dich selbst zu verwirren... Erst Bits als
Zwischenspeicher, die bereits recht zweckfrei anwesend sind, aber dann
wieder Portbits auf deren Zustände abfragen.
Und ja, der 2313 versteht Bits schon.
Wie wär's denn wenn Du erstmal eine LED mit einem Taster toggelst? Dann
wirst Du sehen, dass bereits wegen Tastenprellen Probleme entstehen, die
man dann wieder mit Debounce beseitigen kann.
Jetzt habe ich es so geschrieben:
$regfile = "2313def.dat"
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32
Taster1 Alias Pind.2
Config Taster1 = Input
Taster2 Alias Pind.3
Config Taster2 = Input
Taster3 Alias Pind.4
Config Taster3 = Input
Led1 Alias Portd.5
Config Led1 = Output
Led2 Alias Portd.6
Config Led2 = Output
Do
If Taster1 = 1 And Led1 = 0 Then Toggle Led1 'Taster 1
drücken= LED 1 an
If Led1 = 1 And Taster2 = 1 Then Toggle Led2 'LED 1 an +
Taster 2 drücken=LED 2 an
If Led1 = 1 And Led2 = 1 And Taster3 = 1 Then Toggle Led2 'LED 1 an +
LED 2 an + Taster 2 drücken=LED 2 aus
If Led1 = 1 And Taster1 = 1 Then Toggle Led1 'LED 1 an +
Taster 1 drücken = LED 1 aus
Loop
End
Ich hoffe das es soweit richtig ist.
Mit einer LED habe ich es geschafft gehabt und das Problem mit dem
prellen der Taster auch erkannt, aber den Debounce befehl bekomme ich
nicht richtig angewendet...
Das war das Programm von gestern und es klappt...
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32
Config Pind.2 = Input
Config Pind.3 = Input
Config Portd.5 = Output
Do
If Pind.2 = 1 And Portd.5 = 0 Then Toggle Portd.5
If Portd.5 = 1 And Pind.2 = 0 And Pind.3 = 1 Then Toggle Portd.5
Loop
End
Jedoch glaube ich nicht das das die LED1 wegen prellen nicht
eingeschaltet bleibt, ich glaube an den Bedingungen dafür liegt es. Doch
ich habe keine Idee wie ich die Bedingungen ändern kann...
Wilfried Bergmann schrieb:> Ich hoffe das es soweit richtig ist.
Sieht sehr merkwürdig aus, aber teste halt, dann siehst Du, ob's geht.
Diesen Code könntest Du auch im Simulator schrittweise durchgehen, dann
merkst Du vielleicht besser, was falsch ist.
Nicht vergessen, der uC rennt durch diesen Code mit einer
Wahnsinnsgeschwindigkeit und nicht so gemächlich, wie Du Dir das
vielleicht vorstellst.
$regfile = "2313def.dat"
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32
Taster1 Alias Pind.2
Config Taster1 = Input
Taster2 Alias Pind.3
Config Taster2 = Input
Taster3 Alias Pind.4
Config Taster3 = Input
Led1 Alias Portd.5
Config Led1 = Output
Led2 Alias Portd.6
Config Led2 = Output
Do
If Taster1 = 1 And Led1 = 0 Then
Toggle Led1 'Taster 1
drücken= LED 1 an
Gosub Warte_solange_taste1_low
End If
If Led1 = 1 And Taster2 = 1 Then Toggle Led2 'LED 1 an +Taster
2 drücken=LED 2 an
If Led1 = 1 And Led2 = 1 And Taster3 = 1 Then Toggle Led2 'LED 1
an + LED 2 an + Taster 2 drücken=LED 2 aus
If Led1 = 1 And Taster1 = 1 Then Toggle Led1 'LED 1 an + Taster
1 drücken = LED 1 aus
Loop
Warte_solange_taste1_low:
Do
Waitms 250
Loop Until Taster1 = 0
Return
End
ich habe jetzt das geschrieben, wegen dem debounce:
$regfile = "2313def.dat"
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32
Taster1 Alias Pind.2
Config Taster1 = Input
Taster2 Alias Pind.3
Config Taster2 = Input
Taster3 Alias Pind.4
Config Taster3 = Input
Led1 Alias Portd.5
Config Led1 = Output
Led2 Alias Portd.6
Config Led2 = Output
Do
Debounce Taster1 , 1 , Taster_1 , Sub
Debounce Taster2 , 1 , Taster_2 , Sub
Debounce Taster3 , 1 , Taster_3 , Sub
If Taster1 = 1 And Led1 = 0 Then Toggle Led1 'Taster 1
drücken= LED 1 an
If Led1 = 1 And Taster2 = 1 Then Toggle Led2 'LED 1 an +
Taster 2 drücken=LED 2 an
If Led1 = 1 And Led2 = 1 And Taster3 = 1 Then Toggle Led2 'LED 1 an +
LED 2 an + Taster 2 drücken=LED 2 aus
If Led1 = 1 And Taster1 = 1 Then Toggle Led1 'LED 1 an +
Taster 1 drücken = LED 1 aus
Loop
End
Taster_1:
If Led1 = 0 Then
Led1 = 1
Else
Led1 = 0
End If
Taster_2:
If Led2 = 0 Then
Led2 = 1
End If
Taster_3:
If Led2 = 1 Then
Led2 = 0
End If
sieht ja so ähnlich aus wie von Charly...deins probier ich mal aus,
danke.
bei meinem Programm reagieren die Tasten nur noch sporadisch, aber wenn
sie reagieren klappt es :-S
P.S.
@ Charly
die Led1 lässt sich nicht mehr ausschalten...
aber wofür sind die 250ms? das verstehe ich nicht...
die 250ms sind eine eine 'billigst' entprellung
auch wuerd ich nicht Toggle verwenden sondern die
zustaende explizit setzen
DU HAST BEI DEINEN UNTERPROGRAMMEN KEINE RETURNS (hab i grad gesehen)
ps. du wirst staunen was so ein return ausmacht ;)
Moin moin :-)
Die returns habe ich eingefügt gehabt und die Zustände habe ich auch
festgelegt gehabt...aber eine großartige Änderung ist leider nicht
eingetreten, mir fiel halt nur auf das ich mit dem Anfang und dem Ende
der Loop-Schleife selber die LED 1 immer eingeschaltet hatte :-S
Jetzt habe ich das Programm nochmal abgeändert. Dennoch verstehe ich
nicht wieso ich die LED2 einschalten kann ohne das die LED1
eingeschaltet ist? Sieht jemand von euch den Fehler? Oder kann mir
Jemand erklären wie ich es mit Bascom mir live anzeigen lassen kann,
also was der Controller aktuell macht?
P.S.
Wilfried Bergmann schrieb:> Jetzt habe ich das Programm nochmal abgeändert. Dennoch verstehe ich> nicht wieso ich die LED2 einschalten kann ohne das die LED1> eingeschaltet ist?
Ich seh hier
>
1
> Taster_2:
2
> If Led2 = 0 Then
3
> Led2 = 1
4
>
5
> End If
6
> Return
7
>
8
> Taster_3:
9
> If Led2 = 1 Then
10
> Led2 = 0
11
>
12
> End If
13
> Return
14
>
keinen Zusammenhang zwischen Led2 und dem Zustand von Led1.
Das Logikgeplänkel da in der Mitte deines Programms tu ich mir jetzt
nicht an auseinanderzudröseln. Das ist so unübersichtlich und komplex,
damit trickst du dich maximal selber aus.
Bau den Zusammenhang der Schaltmöglichkeiten von Led2 und Led1 hier ein
und gut ists.
Wilfried Bergmann schrieb:> Jemand erklären wie ich es mit Bascom mir live anzeigen lassen kann
Gar nicht. Du kannst es simulieren, d.h. der Simulator im PC tut so, als
ob er AVR Code ausführt. Ein Durchgehen im Einzelschritt kann dann die
Erkenntnis bringen, vor allem wenn man sich den Status der Ports und der
Variablen anschaut.
Allerdings musst Du dann die Bedienung des Simulators erlernen, von nix
kommt also nix.
Debounce ist im Simulator störend und sollte zwecks Simulierbarkeit
auskommentiert werden.
Wilfried Bergmann schrieb:> Ui...danke :-) das habe ich voll übersehen...ich änder es dann mal eben> ;-)>> Was meinst du denn mit logikgeplänkel?
Den Teil hier
1
If A = 0 Then B = 0
2
If A = 0 And Taster1 = 1 Then A = 1
3
If A = 1 Then Led1 = 1
4
If A = 1 And Taster2 = 1 Then B = 1
5
If A = 1 And B = 1 Then Led2 = 1
6
If A = 1 And B = 1 And Taster3 = 1 Then B = 0
7
If A = 1 And Taster1 = 1 Then A = 0
8
If A = 0 Then B = 0
total unübersichtlich und Variablennamen wie 'A' oder 'B' tragen nicht
gerade dazu bei, dass man die Logik leicht und schnell nachvollziehen
kann.
Okay klingt schon einleuchtend das "A" und "B" als Variabeln nicht sehr
förderlich sind..,aber ich habe auch keine bessere Idee sie zu
benennen...
Dennoch danke ich euch für eure Hilfe :-) denn mit dem jetzigen Programm
klappt es so wie ich es mir vorgestellt habe freu