Forum: Mikrocontroller und Digitale Elektronik Bascom-avr Programmierungs problem


von Wilfried B. (hilflosueberfordert)


Angehängte Dateien:

Lesenswert?

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...

von holger (Gast)


Lesenswert?

>Für jede Hilfe wäre ich dankbar...

Ok, Quelltext wird nicht als Bild gepostet.

von Wilfried B. (hilflosueberfordert)


Lesenswert?

Ä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
von MWS (Gast)


Lesenswert?

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.

von Wilfried B. (hilflosueberfordert)


Lesenswert?

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...

von Bascom (Gast)


Lesenswert?

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ß

von MWS (Gast)


Lesenswert?

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? ;-)

von Wilfried B. (hilflosueberfordert)


Lesenswert?

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?

von Rolf M. (Gast)


Lesenswert?

Bascom schrieb:
> mit PIN werden die Eingänge abgefragt
> mit PORT Ausgänge
gesetzt. :-)

von MWS (Gast)


Lesenswert?

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

von Wilfried B. (hilflosueberfordert)


Lesenswert?

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
von Charly B. (charly)


Lesenswert?

led1 alias portd.6
ebenso mit led2
und mit den Tastern genauso

die dim Anweisungen mueesen wech

vlG
Charly

von Wilfried B. (hilflosueberfordert)


Lesenswert?

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
von Charly B. (charly)


Lesenswert?

bau das prg mit 'alias' um unn poste es nochmal

hast du Skype?

: Bearbeitet durch User
von Wilfried B. (hilflosueberfordert)


Lesenswert?

Neee ich habe kein skype am pc...

Mit alias aufbauen?  Ich versuche es mal.

von MWS (Gast)


Lesenswert?

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.

von Wilfried B. (hilflosueberfordert)


Lesenswert?

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
von MWS (Gast)


Lesenswert?

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.

von Charly B. (charly)


Lesenswert?

$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

von Wilfried B. (hilflosueberfordert)


Lesenswert?

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
von Charly B. (charly)


Lesenswert?

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
von Wilfried B. (hilflosueberfordert)


Lesenswert?

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
von Karl H. (kbuchegg)


Lesenswert?

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.

von Wilfried B. (hilflosueberfordert)


Lesenswert?

Ui...danke :-) das habe ich voll übersehen...ich änder es dann mal eben 
;-)

Was meinst du denn mit logikgeplänkel?

von MWS (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Wilfried B. (hilflosueberfordert)


Lesenswert?

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
Noch kein Account? Hier anmelden.