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...
>Für jede Hilfe wäre ich dankbar...
Ok, Quelltext wird nicht als Bild gepostet.
Ähm...heißt Quelltext soll eingetippt werden oder was meinst du damit? Dann schreibe ich ihn hier nochmal hin:
1 | $regfile = "2313def.dat" |
2 | $crystal = 2000000 |
3 | $hwstack = 40 |
4 | $swstack = 16 |
5 | $framesize = 32 |
6 | |
7 | Config Pind.2 = Input 'Taster 1 |
8 | Config Pind.3 = Input 'Taster 2 |
9 | Config Pind.4 = Input 'Taster 3 |
10 | Config Pind.5 = Output 'LED 1 |
11 | Config Pind.6 = Output 'LED 2 |
12 | |
13 | Dim Led1 As Bit |
14 | Dim Led2 As Bit |
15 | Dim Taster1 As Bit |
16 | Dim Taster2 As Bit |
17 | Dim Taster3 As Bit |
18 | |
19 | Do |
20 | If Pind.2 = 1 And Led1 = 0 Then Set Led1 'Taster 1 drücken= LED 1 an |
21 | If Led1 = 1 Then Pind.5 = 1 |
22 | If Pind.5 = 1 And Pind.3 = 1 Then Set Led2 'LED 1 an + Taster 2 drücken=LED 2 an |
23 | If Led2 = 1 Then Pind.6 = 1 |
24 | If Pind.5 = 1 And Pind.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 Pind.6 = 0 |
26 | If Pind.5 = 1 And Pind.2 = 1 Then Reset Led1 'LED 1 an + Taster 1 drücken = LED 1 aus |
27 | If Led1 = 0 Then Pind.5 = 0 |
28 | Loop |
29 | |
30 | End |
:
Bearbeitet durch User
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
so nun habe ich das Programm so geschrieben:
1 | $regfile = "2313def.dat" |
2 | $crystal = 4000000 |
3 | $hwstack = 40 |
4 | $swstack = 16 |
5 | $framesize = 32 |
6 | |
7 | Config Pind.2 = Input |
8 | Config Pind.3 = Input |
9 | Config Pind.4 = Input |
10 | Config Portd.5 = Output |
11 | Config Portd.6 = Output |
12 | |
13 | Dim Led1 As Bit |
14 | Dim Led2 As Bit |
15 | Dim Taster1 As Bit |
16 | Dim Taster2 As Bit |
17 | Dim Taster3 As Bit |
18 | |
19 | Do |
20 | 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...
:
Bearbeitet durch User
led1 alias portd.6 ebenso mit led2 und mit den Tastern genauso die dim Anweisungen mueesen wech vlG Charly
1 | $regfile = "2313def.dat" |
2 | $crystal = 4000000 |
3 | $hwstack = 40 |
4 | $swstack = 16 |
5 | $framesize = 32 |
6 | |
7 | Config Pind.2 = Input |
8 | Config Pind.3 = Input |
9 | Config Pind.4 = Input |
10 | Config Portd.5 = Output |
11 | Config Portd.6 = Output |
12 | |
13 | |
14 | Do |
15 | 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?
:
Bearbeitet durch User
bau das prg mit 'alias' um unn poste es nochmal hast du Skype?
:
Bearbeitet durch User
Neee ich habe kein skype am pc... Mit alias aufbauen? Ich versuche es mal.
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...
:
Bearbeitet durch User
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...
:
Bearbeitet durch User
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 ;)
:
Bearbeitet durch User
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.
1 | $regfile = "2313def.dat" |
2 | $crystal = 4000000 |
3 | $hwstack = 40 |
4 | $swstack = 16 |
5 | $framesize = 32 |
6 | |
7 | Taster1 Alias Pind.2 |
8 | Config Taster1 = Input |
9 | |
10 | Taster2 Alias Pind.3 |
11 | Config Taster2 = Input |
12 | |
13 | Taster3 Alias Pind.4 |
14 | Config Taster3 = Input |
15 | |
16 | Led1 Alias Portd.5 |
17 | Config Led1 = Output |
18 | |
19 | Led2 Alias Portd.6 |
20 | Config Led2 = Output |
21 | |
22 | Dim A As Bit |
23 | Dim B As Bit |
24 | Do |
25 | |
26 | Debounce Taster1 , 1 , Taster_1 |
27 | Debounce Taster2 , 1 , Taster_2 |
28 | Debounce Taster3 , 1 , Taster_3 |
29 | |
30 | If A = 0 Then B = 0 |
31 | If A = 0 And Taster1 = 1 Then A = 1 |
32 | If A = 1 Then Led1 = 1 |
33 | If A = 1 And Taster2 = 1 Then B = 1 |
34 | If A = 1 And B = 1 Then Led2 = 1 |
35 | If A = 1 And B = 1 And Taster3 = 1 Then B = 0 |
36 | If A = 1 And Taster1 = 1 Then A = 0 |
37 | If A = 0 Then B = 0 |
38 | Loop |
39 | |
40 | End |
41 | |
42 | Taster_1: |
43 | If Led1 = 0 Then |
44 | Led1 = 1 |
45 | Else |
46 | Led1 = 0 |
47 | |
48 | End If |
49 | Return |
50 | |
51 | Taster_2: |
52 | If Led2 = 0 Then |
53 | Led2 = 1 |
54 | |
55 | End If |
56 | Return |
57 | |
58 | Taster_3: |
59 | If Led2 = 1 Then |
60 | Led2 = 0 |
61 | |
62 | End If |
63 | Return |
:
Bearbeitet durch User
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.
Ui...danke :-) das habe ich voll übersehen...ich änder es dann mal eben ;-) Was meinst du denn mit logikgeplänkel?
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
1 | $regfile = "2313def.dat" |
2 | $crystal = 4000000 |
3 | $hwstack = 40 |
4 | $swstack = 16 |
5 | $framesize = 32 |
6 | |
7 | Taster1 Alias Pind.2 |
8 | Config Taster1 = Input |
9 | |
10 | Taster2 Alias Pind.3 |
11 | Config Taster2 = Input |
12 | |
13 | Taster3 Alias Pind.4 |
14 | Config Taster3 = Input |
15 | |
16 | Led1 Alias Portd.5 |
17 | Config Led1 = Output |
18 | |
19 | Led2 Alias Portd.6 |
20 | Config Led2 = Output |
21 | |
22 | Dim A As Bit |
23 | Dim B As Bit |
24 | Do |
25 | |
26 | Debounce Taster1 , 1 , Taster_1 |
27 | Debounce Taster2 , 1 , Taster_2 |
28 | Debounce Taster3 , 1 , Taster_3 |
29 | |
30 | If A = 0 Then B = 0 |
31 | If A = 0 And Taster1 = 1 Then A = 1 |
32 | If A = 1 Then Led1 = 1 |
33 | If A = 1 And Taster2 = 1 Then B = 1 |
34 | If A = 1 And B = 1 Then Led2 = 1 |
35 | If A = 1 And B = 1 And Taster3 = 1 Then B = 0 |
36 | If A = 1 And Taster1 = 1 Then A = 0 |
37 | If A = 0 Then B = 0 |
38 | Loop |
39 | |
40 | End |
41 | |
42 | Taster_1: |
43 | If Led1 = 0 Then |
44 | Led1 = 1 |
45 | Else |
46 | Led1 = 0 |
47 | Led2 = 0 |
48 | |
49 | End If |
50 | Return |
51 | |
52 | Taster_2: |
53 | If Led1 = 1 And Led2 = 0 Then |
54 | Led2 = 1 |
55 | |
56 | End If |
57 | Return |
58 | |
59 | Taster_3: |
60 | If Led2 = 1 Then |
61 | Led2 = 0 |
62 | |
63 | End If |
64 | Return |
:
Bearbeitet durch User
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.