Bascom-avr Programmierungs problem

#3332758
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...
Angehängte Dateien:
#3332767
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
Gast #3332799
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ß
#3332814
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...
#3332828
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?
Gast #3332846
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.
#3332862
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...
Gast #3332879
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.
#3332922
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
#3332928
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...
#3333594
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
#3333613
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.
Gast #3333629
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.
#3333651
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.
#3333678
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren