Forum: Mikrocontroller und Digitale Elektronik Tasterselbsthaltung mit Bascom


von Henri (Gast)


Lesenswert?

Hallo,
ich bin der Henri und beschäftige mich seid dieser Woche intensive mit 
Bascom AVR. Ich habe mit der Seite von Roland Walter angefangen, daher 
habe ich ach das Testboard mit den er auch arbeitet.
http://www.rowalt.de/mc/

Nun wollte ich mit programmieren eines LCD-Display 16 * 2 anzufangen. 
Gewissen Sachen konnte ich schon programieren, aber jetzt wollte ich 
gerne vor jedem "Main" Programm eine "Einführung".

Ich möchte also bevor das "Main" Programm beginnt eine Einführung - 
heißt:
Per Taster soll eine Led leuchten (das ganze programm über) und auf dem 
Display soll "LCD-Display ON" stehen.
Durch nochmaligen drücken des Tasters soll nun das "Main" Programm 
anfangen. Ich hatte mir da schon was zurechtprogrammiert, aber das funzt 
nich :D.
Ich hoffe ihr könnt mir dabei helfen

Listing:

$regfile = "attiny2313.dat"
$crystal = 3686400


'////Portx/Pinx konfigurieren////
Config Pinb.0 = Input
Pinb.0 = 1
Taster1 Alias Pinb.0                                        '"EIN" Taser
Config Portb.1 = Output
Led1 Alias Portb.1                                          'Led (grün), 
LCD "Ein"


Dim A As Byte
A = 0

'////LCD////
Config Lcd = 16 * 2
Config Lcdbus = 4


'LCD im 4Bit I/0 Modus
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , 
Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
'LCD löschen
Cls


'////Listing "Einführung"////

Do
  If Taster1 = 0 Then
  Incr A
  End If

  If A = 1 Then
  Led1 = 1
  Cls
  Waitms 100
  Locate 1 , 1
  Lcd "LCD Display ON"
  Else
  Led1 = 0
  End If

'////Listing "Main"////

  If A = 2 Then
  Led1 = 1

  .....
  .....
Loop
End


Ich schätze da muss viel geändert werden. Wenn ich nur die Einführung 
laufen lass spielt die LED verrückt (blinkt, bleibt an geht aus, jedes 
mal was anderes).
Ich habe die Vermutung, dass das was mit der PORT belegung zu tun hat - 
sprich: PORTD oder PORTB

Das datasheet meines ATTINY2313:
http://www.reichelt.de/?;ACTION=6;LA=3;ARTICLE=54568;GROUPID=2958;GROUP=A362;SID=270qO3E6wQARsAABLlH0cdbccc0d51d4e4b1c2bb3bd83c3526b16

Ich bitte euch, wenn ihr mir helft auch kurz zu beschreiben, was ihr 
ändert im Program und wie es dann funzt.
Schonmal danke

Gruß,
Henri

von Karl H. (kbuchegg)


Lesenswert?

Ich kenne jetzt dein Board nicht, aber wahrscheinlich wirst du einfach 
nur den Pullup Widerstand am Taster einschalten müssen.

> Per Taster soll eine Led leuchten (das ganze programm über) und auf dem
> Display soll "LCD-Display ON" stehen.
> Durch nochmaligen drücken des Tasters soll nun das "Main" Programm
> anfangen.

Warum dann so kompliziert?

Mach es doch genau so wie du es beschrieben hast. Ein Programm kann 
durchaus auch aus einer Abfolge von mehreren Schleifen bestehen, solange 
die zuerst ausgeführten Schleifen auch tatsächlich irgendwann 
abgebrochen werden

In Pseudocode
1
  ... Konfiguration
2
3
  Schleife: solange Taste nicht gedrückt
4
    mach nichts
5
6
  schalte Led ein
7
  Schreibe "LCD-ON" aufs Display
8
9
  Schleife: solange Taste noch gedrückt    ' warte aufs Loslassen
10
    mach nichts
11
12
  Schleife: solange Taste nicht gedrückt   ' jetzt gilts, der Benutzer
13
                                           ' muss ein zweitesmal Drücken
14
    mach nichts
15
16
  und los gehts mit dem Hauptprogramm
17
  do
18
      ....
19
  loop

man muss nicht zwangsweise alles in eine einzige riesige Loop stecken 
:-)

von Tobi W. (todward)


Lesenswert?

Also laut datenblatt liegt auf portb noch die ISP-Schnittstelle. Hast du 
vll. noch den Programmer dran sodass der port belegt ist?
Versuch einfach mal nen anderen Port.

An deiner stelle würde ich mit einem select case block abrbeiten um a 
auszuwerten. Zudem musst du deinen taster noch entprellen, weill hier 
wird a wahrscheinlich mehr als nur einmal hoch gezählt weil die schleife 
mehrmals durchläuft. Guck mal in der Hilfe nach debounce! Ist zwar nicht 
die beste lösung da es so ähnlich wie wait arbeitet aber ich denke das 
kann man hier machen.

Mach am besten zwei do-loop schleifen raus, dann muss das prog nicht 
immer komplett durch laufen.


gruß
Tobi

von Henri (Gast)


Lesenswert?

Danke ich versuchs mal, wenn ich fertig bin poste ich das Listing 
nochmal.
Gruß,
Henri

von Henri (Gast)


Lesenswert?

Hi,
ich bins nochmal, aber ich bekomms nich hin. Were super wenn wer von 
euch ebend ein Programm schreiben könnte. An den PortB liegt nichts, 
also daran kann es auch nich liegen.

Gruß,
Henri

von Tobi W. (todward)


Lesenswert?

Hier mal meine programmidee:
1
' Konfiguration für den Compiler
2
$regfile = "attiny2313.dat"
3
$crystal = 3686400
4
$hwstack = 32
5
$swstack = 8
6
$framesize = 24
7
8
' Programm konfiguration (Ports, Variablen)
9
Declare Sub Incr_a                                          'Sub INcr_a festlegen
10
Dim A As Byte                                               ' A als byte deklarieren
11
Config Debounce = 30                                        'Zeitbasis für debounce auf 30ms legen, kann auch weg gelassen werden (default ist 25ms)
12
Config Portb.0 = Output                                     'Portb.0 als Output konfigurieren
13
Config Portb.1 = Input                                      'Portb.1 als Input konfigurieren
14
Config Lcd = 16 * 2                                         'LCD-Display festlegen
15
Config Lcdbus = 4                                           'LCD auf 4bit Modus einstellen
16
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4       ' LCD Leitungen festlegen
17
18
19
'LCD init
20
Cls
21
22
'Schleife bis der Taster das erstemal gedrückt wurde
23
Do                                                          ' Solange durchlaufen bis A=1
24
   If Pinb.1 = 0 Then
25
      Debounce Pinb.1 , 0 , Incr_a , Sub                    'Entprellen des Taster, wenn der Port auf 0 gezogen wird->debonce wird ausgelöst
26
   End If
27
Loop Until A = 1
28
29
Portb.0 = 1                                                 ' Led einschalten
30
Waitms 100
31
Lcd "LCD eingeschaltet"                                     'Text ausgeben
32
33
'Schleife bis Taster das zweitemal gedrückt wurde
34
Do
35
   Debounce Pinb.1 , 0 , Incr_a , Sub
36
Loop Until A = 2
37
38
'Ab hier kann das Hauptprogramm hin
39
40
41
42
43
44
45
46
Sub Incr_a
47
Incr A
48
End Sub

Musst du dir nach belieben anpassen
Habe noch ein paar kommentare eingefügt damit es etwas verständlicher 
ist.

An alle die jetzt meckern wollen, das man eigentlich keinen fertigen 
code postet:
Ich weiß, das man es nicht macht aber er hat ja schon mal was gebracht 
und sich dazu gedanken gemacht. Ok, der lern effekt ist jetzt nicht so 
hoch wie wenn man es selbst macht aber dennoch kann man davon lernen und 
profitieren.

gruß
Tobi

von Henri (Gast)


Lesenswert?

Hi,
sry, dass ich erst jetzt wieder schreibe, aber ich kanns halt nur im 
Betrieb machen :D. Ich danke dir, ich werde das Programm jetzt mal 
testen und anpassen und nacher sagen, ob es funktioniert hat.
Wer noch Lösungen hat, soll sie ruhig hier posten ... ich würde mich 
freuen.
Gruß,
Henri

von Henri (Gast)


Lesenswert?

So,
ich habe mir jetzt ein Programm geschrieben, was eigendlich klappen 
sollte, aber das tut es nicht :D. Ich hoffe Ihr könnt mir noch Fehler in 
meinem Programm zeigen. Schonmal danke

$regfile = "attiny2313.dat"
$crystal = 3686400


'////Portx/Pinx/Variablen konfigurieren////
Config Pinb.0 = Input
Pinb.0 = 1
Taster1 Alias Pinb.0                                        '"EIN" Taser
Config Portd.1 = Output
Led1 Alias Portb.1                                          'Led (grün), 
LCD "Ein"
Config Debounce = 30                                        'Zeitbasis 
für debounce auf 30ms legen
Dim A As Byte                                               ' A als byte 
deklarieren
A = 0
Declare Sub Incr_a                                          'Sub Incr_a 
festlegen


'////LCD////
Config Lcd = 16 * 2
Config Lcdbus = 4


'LCD im 4Bit I/0 Modus
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , 
Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
'LCD löschen
Cls


'////Listing "Einführung"////

Do
   Cursor Off                                               'Cursor aus

   Cls                                                      'LCD wird 
gelöscht
   Waitms 100

   Locate 1 , 1 
'Einführungsanzeige 1
   Lcd "LCD Display ON"
   Locate 2 , 1
   Lcd "Bascom AVR"
   Waitms 1000

   Cls                                                      'LCD wird 
gelöscht
   Waitms 100

   Locate 1 , 1 
'Einführungsanzeige 2
   Lcd "Press T1 to"
   Locate 2 , 1
   Lcd "start Mainproga."
   Waitms 2000
   Loop Until A = 1

Do
   If Taster1 = 0 Then                                      'Startet 
Hauptprogramm
   Debounce Taster1 , 0 , Incr_a , Sub                      'Entprellen 
des Taster, wenn der Port auf 0 gezogen wird
   Loop
   End If


   Sub Incr_a
   Incr A
   Goto Hauptprogramm                                       'Gehe über 
zu Hauptprogramm
   End Sub

End


'////Listing "Hauptprogramm"////

Hauptprogramm:

Cls
Waitms 100

Do
  Cursor Off

  Locate 1 , 1
  Lcd "hauptprogramm"

  Cls
  Waitms 100

Loop
End

Ich möchte gerne, dass ich erst eine Scheile von den 2 Displayanzeigen 
habe und dann mit einem Taster weiter zum Hauptprogramm gehen kann. Ich 
hoffe Ihr könnt mir helfen, weil ich nich mehr weiter komme.

Gruß,
Henri

von Karl H. (kbuchegg)


Lesenswert?

Henri schrieb:
> So,
> ich habe mir jetzt ein Programm geschrieben, was eigendlich klappen
> sollte, aber das tut es nicht :D.

'Funktioniert nicht' ist die denkbar schlechteste Fehlermeldung, die man 
sich vorstellen kann. Die erzählt einem Helfenden nämlich .... gar 
nichts.


>    Lcd "start Mainproga."
>    Waitms 2000
>    Loop Until A = 1

A wird am Anfang auf 0 gesetzt und ich sehe bis hierher keine 
Möglichkeit, wie A jemals seinen Wert ändern können sollte.
Wie also stellst du dir vor, dass A hier jemals 1 werden könnte, damit 
diese Loop-Until Schleife jemals verlassen werden kann?


Dein Hauptfehler: Du schreibst zuviel Code auf einmal ohne ihn zu 
testen. Drum stehst du dann am Ende mit viel Code da, der nicht 
funktioniert und bei dem du keine Ahnung hast, wo du mit Fehlersuche 
anfangen sollst.

Und nochwas: Gewöhn dir die GOTO wieder ab. Die sind kontraproduktiv, 
weil sie deine Denkweise in die falsche Richtung leiten. Deine Mittel um 
ein Programm aufzubauen sind die strukturierten Mittel
1
   if       then
2
   else
3
   end if
4
5
6
   do
7
   loop
8
9
10
   loop
11
   until
12
13
   for
14
   next

Das sind deine Bausteine, aus denen du deine Logik zusammensetzt. Diese 
Bausteine sind unteilbar und können auch ineinander geschachtelt werden. 
Aber jeder Baustein wirkt wie eine Klammer, die die Einzelteile 
zusammenhält
1
  +- if   then
2
  |
3
  |  +-- do
4
  |  |     
5
  |  +-- loop
6
  |
7
  +- else
8
  |
9
  |  +- for
10
  |  |
11
  |  |  +- if     then
12
  |  |  |
13
  |  |  +- endif
14
  |  |
15
  |  +- next
16
  |
17
  +- end if

Diese Klammern dürfen sich nie überkreuzen, können aber ohne weiteres 
ineinander geschachtelt sein.

So etwas
1
Do
2
   If Taster1 = 0 Then                                      'Startet Hauptprogramm
3
   Debounce Taster1 , 0 , Incr_a , Sub                      'Entprellen des Taster, wenn der Port auf 0 gezogen wird
4
   Loop
5
   End If
kann daher überhaupt nicht sein. Deine Struktur wäre
1
+- Do
2
|   +- If Taster1 = 0 Then
3
|   |  Debounce Taster1 , 0 , Incr_a , Sub
4
+----- Loop
5
    +- End If
und das wiederspricht dem Gedanken, dass die Bausteine ineinander 
geschachtelt sind. Auch durch Einrücken des Codes sieht man solche Dinge 
sehr deutlich, darum solltest du es auf jeden Fall machen!
1
Do
2
   If Taster1 = 0 Then
3
     Debounce Taster1 , 0 , Incr_a , Sub
4
Loop
5
   End If

Das Loop steht unter dem öffnenden Do. Das End If unter dem öffnenden 
If. Aber die Einrückungstiefen kreuzen sich.
1
Do
2
   If Taster1 = 0 Then
3
     Debounce Taster1 , 0 , Incr_a , Sub
4
   End If
5
Loop

So wäre es richtig. Wieder steht das schliessende Loop unter dem 
öffnenden Do und das schliessende End If unter dem öffnenden If. Aber 
mit jedem Öffnen geht es 2 Leerzeichen nach rechts und mit jedem 
SChliessen geht es wieder 2 Leerzeichen nach Links und am Ende steht 
alles sauber untereinander ohne dass sich die Bereichsklammern irgendwo 
überkreuzen. Und das wunderbare daran: man sieht sofort wer von wem 
abhängt, wer wen steuert. Das Debounce wird nur dann gemacht, wenn 
Taster1 0 war. Und das ganze ist eingebettet in eine Schleife, die von 
nichts abhängt, also eine Endlosschleife ist. Zusammengenommen also: Für 
immer und Ewig wird gemacht: Wenn Taster1 jemals auf 0 geht, dann wird 
ein Debounce gemacht.

Programmieren ist mehr als nur ein paar magische Worte hinschreiben und 
darauf bauen, dass sich schon alles von alleine irgendwie zum guten 
wendet. Wenn du die Logik nicht hinkriegst, BASCOM machts auf keinen 
Fall. Das führt nur aus.

von Henri (Gast)


Lesenswert?

Entschuldigung das wollte ich nicht. Ich versuche mein Fehler diesmal 
besser zu schreiben. Ich habe mein listing erstmal gekürzt und auch 
versucht zu testen.

$regfile = "attiny2313.dat"
$crystal = 3686400


'////Portx/Pinx/Variablen konfigurieren////
Config Pind.6 = Input
Pind.6 = 1                                                  'Pullup 
aktivieren
Taster1 Alias Pind.6                                        'Taster zum 
ansteuern der Led1
Config Portb.0 = Output
Led1 Alias Portb.0                                          'Led1 (grün)

'////LCD////
Config Lcd = 16 * 2
Config Lcdbus = 4


'LCD im 4Bit I/0 Modus
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , 
Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
'LCD löschen
Cls


'////Listing "Einführung"////

   Cursor Off                                               'Cursor aus

   Cls                                                      'LCD wird 
gelöscht
   Waitms 100

   Locate 1 , 1 
'Einführungsanzeige 1
   Lcd "LCD Display ON"
   Locate 2 , 1
   Lcd "Bascom AVR"
   Waitms 2000

   Cls                                                      'LCD wird 
gelöscht
   Waitms 100

   Locate 1 , 1 
'Einführungsanzeige 2
   Lcd "Press T1 to"
   Locate 2 , 1
   Lcd "start Main"

Do
   If Taster1 = 0 Then                                      'Startet 
Hauptprogramm
   Led1 = 1
   Else
   Led1 = 0

   Cls
   Waitms 100

   Loop
   End If

End


So, mein Problem ist, dass das der Taster irgendwie immer gedrückt ist. 
Die erste Displayanzeige bleibt 2000ms im Display so wie es auch soll, 
aber danach sollte die zweite Displayanzeige eigendlich so lange 
angezeigt werden, bis ich den Taster drücke.
Aber die zweiter Anzeige sehe ich nur ganz kurz und das Display zeigt 
wieder die erste Anzeige.
Die led leuchtet nach dem ersten druchlauf auch, so muss es ja auch, 
aber mein Taster ist irgendwie immer gedrückt und ich weiß nich warum.
Meine Vermutungen sind, dass es vill. an dem PortB liegt(Habe vorher mit 
dem PortD einfache taster schaltungen gemacht und da klappte alles, aber 
den portd brauche ich ja für das display), oder das ich Ihn falsch 
konfiguriert habe.

Ich hoffe das reicht als Fehlerbeschreibung.

Gruß,
Henri

von Henri (Gast)


Lesenswert?

Sry, habe deinen erweiterten Betrag erst nacher gelesen. Danke, der hat 
mir jetzt schon geholfen. Ich habe mein Programm dem schon angepasst.

Gruß,
Henri

von Tobi W. (todward)


Lesenswert?

Hallo Henri,

was hast du denn sonst noch alles an portb? Bekanntlicherweise liegt 
dort ja die ISP-Schnittstelle des Controllers.

Wie ist denn dein Taster verschaltet? Ist der gegen GND ode gegen Vcc?

Lass mal die "Alias" anwesungen weg und probier es dann mal! Hatte ich 
schon aft genug, dass das deswegen nicht funktionieren wollte. Außerdem 
hast du deinen Taster nicht entprellt oder ist der mit Hardware 
entprellt?

Karl Heinz:
Wenn du dir den Code nochmal anschaust, gibt es den Sub Incr_a da wird A 
bei jedem aufruf um 1 hoch gezählt. Der aufruf erfolgt über debounce.

Grüße
Tobi

von Hannes L. (hannes)


Lesenswert?

> ... Außerdem hast du deinen Taster nicht entprellt oder ist der mit
> Hardware entprellt?

> ... (ein paar Zeilen weiter:)

> Der aufruf erfolgt über debounce.

Was nun, nicht entprellt oder Debounce ??

Was ist debounce denn sonst, wenn es nicht Entprellung ist?

Lösung in ASM: Dannegger-Entprellung im Hintergrund (Timer-Int.), in der 
Mainloop in Abhängigkeit vom Tastenflankenflag (Bit in Key_press) Bit im 
Merker (oder I/O) kippen/toggeln. In Bascom etwas umständlicher, aber 
nicht unmöglich. Mal im Roboternetz nach der Bascom-Umsetzung der 
Dannegger-Entprellung suchen, da gibt es neben einer cleveren Routine 
allerhand Hintergrundwissen zu diesem Thema.

...

von Karl H. (kbuchegg)


Lesenswert?

To W. schrieb:

> Wenn du dir den Code nochmal anschaust, gibt es den Sub Incr_a da wird A
> bei jedem aufruf um 1 hoch gezählt. Der aufruf erfolgt über debounce.

Ach.
Dann schau dir noch einmal genau an, wo die loop - until Endlosschleife 
ist und wo debounce zum ersten mal ins Spiel kommt.

So wie ich das sehe, sieht es ja wohl so aus, wenn wir mal den Code 
etwas Einrücken
1
'////Listing "Einführung"////
2
3
Do
4
   Cursor Off                                       'Cursor aus
5
6
   Cls                                              'LCD wird gelöscht
7
   Waitms 100
8
9
   Locate 1 , 1
10
                                                     'Einführungsanzeige 1
11
   Lcd "LCD Display ON"
12
   Locate 2 , 1
13
   Lcd "Bascom AVR"
14
   Waitms 1000
15
16
   Cls                                               'LCD wird gelöscht
17
   Waitms 100
18
19
   Locate 1 , 1
20
                                                     'Einführungsanzeige 2
21
   Lcd "Press T1 to"
22
   Locate 2 , 1
23
   Lcd "start Mainproga."
24
   Waitms 2000
25
26
Loop Until A = 1

und in dieser Schleife sehe ich beim besten Willen nicht, wie A jemals 1 
werden könnte. Der debounce kommt erst in der nächsten Schleife :-)

Auch BASCOM ist nicht Excel, wo sich eine ausgeklügelte Logik darum 
kümmert herauszufinden, in welcher Reihenfolge die Einzelteile 
abgearbeitet werden müssen, damit sich ein Sinn ergibt.

von Tobi W. (todward)


Lesenswert?

Ahhhh, das war ein missverständnis! Ich dachte du beziehst dich auf 
meinen Code. In dem code schnippsel den du zu letzt gepostest hast, ist 
kein sub aufruf oder eine anweisung die a hochzählt.

Hannes:
auf welchen code beziehst du dich?


Ich tippe mal darauf das wir bzw. ich? an euch vorbei geredet habe. 
sry!!

Gruß
Tobi

von Hannes L. (hannes)


Lesenswert?

> Hannes:
> auf welchen code beziehst du dich?

Mit meinen Antworten (bzw. Gegenfrage) beziehe ich mich auf die Texte, 
die ich zitiert habe.

Betreffs Lösungsvorschlag beziehe ich mich auf keinen der hier 
veröffentlichten Bascom-Codes, da ich diesen Programmierstil *) nicht 
unterstütze.

Was meine ASM-Gedanken betrifft, beziehe ich mich auf Peter Danneggers 
Bulletproof-Tastenentprellung (in der Codesammlung mal nach Bulletproof 
suchen).

Die Umsetzung der Dannegger-Entprellung in Bascom ist aufgrund der 
idiotischen Interrupt-Verwaltung von Bascom nicht ganz so einfach wie in 
ASM oder C, daher beziehe ich mich auf den erwähnten Artikel im 
Roboternetz, da ist es so schön erklärt (auch mit Hintergrundwissen), da 
muss ich mir nicht für Dich persönlich die Finger wund schreiben. Er 
(der Artikel) dürfte per RN-Suche mit Begriffen wie Tastenentprellung 
und Dannegger zu finden sein.

*) Programmierstil:
Ich mag es nicht, wenn Programme Rechenleistung durch Zählen von Takten 
im mehrstelligen Millisekundenbereich vertrödeln (Debounce, Entprellung 
durch Warteschleifen), daher nutze ich grundsätzlich Tastenabfragen 
durch zyklisches Pollen des/der Tastenports, das von einem Timer 
synchronisiert wird. Diese Art der Tastenentprellung läuft quasi im 
Hintergrund und braucht weit weniger als 1% der verfügbaren 
Rechenleistung. Sie stellt dem Hauptprogramm (oder seinen Jobs) für jede 
Taste zwei Merker (Boolean-Variablen) zur Verfügung, von denen einer 
(der in Key_state) den entprellten Schaltzustand des Tasters anzeigt und 
der andere (in Key_press) eine neue Flanke (Taster wurde seit dem 
letzten Abarbeiten des Tastendrucks erneut gedrückt und evtl sogar 
wieder losgelassen). Die Mainloop reagiert auf die Merker, indem sie 
einen entsprechenden Job (Programmroutine) aufruft, der die zugehörige 
Aktion ausführt und den Merker in Key_press löscht, da der Job ja 
erledigt wurde.

...

von Picht (Gast)


Lesenswert?

Hi Henri,
cooler Code.

Jou das Display wird gleich wieder gelöscht.


Do
   If Taster1 = 0 Then                                      'Startet
Hauptprogramm
   Led1 = 1
   Else
   Led1 = 0

   Cls    ****** hier wird das Display gelöscht****
   Waitms 100

   Loop

ich hatte erstmal ein paar Fehler drin. Ich nehme mal an ,
vor Hauptprogramm ist ein '.
Häng mal in Zukunft den Bascode als Anhang an, lässt sich
schneller in der Sim nehmen.
Deine Portausgänge sind nicht geschickt gewählt, so ist bei den
Rowalt Board ein Max 232 drauf,der Port.D0 + Port D1 besetzt hält.
Auch wenn Du den Max. abgezogen hast, lass die Schnittstelle in
Ruhe, dann kannst Du für Fehlersuche mit den Befehl "Print" was
an den Computer senden.

liebe Profis:
der gute Mann hat sich doch ordentlich vorgestellt.
Vielleich ist das ein Schüler, waren ja Ferien.
Und immer SEIN Code verbessern, auch wenn der zu Anfang nicht gut
aus sieht.

Wigbert

von Peter D. (peda)


Lesenswert?

Die Frage ist, will man immer und immer wieder mit Grundlagen kämpfen 
müssen, sich bei jedem Projekt von neuem damit abplagen und viel Zeit 
vergeuden, um es endlich eher schlecht als recht zum Laufen zu bringen?

Oder will man sich einmal richtig reinknieen und es dann für alle Zeiten 
vom Tisch haben.

Fast alle Projekte benutzen Tasten zur Bedienung (Gehirne lassen sich 
noch nicht anzapfen). Daher ist es äußerst effektiv, sich damit mal zu 
beschäftigen und eine gute Lösung zu finden, die auch universell in 
jedes Projekt einbindbar ist.

Der Debounce-Befehl in Bascom ist eine Lösung, hat aber deutliche 
Seiteneffekte und kann daher den Programmablauf empfindlich stören. Ich 
würde ihn daher nur als Notlösung bezeichnen.


Ehe Du also anfängst, komplexe Programme zu erstellen, solltest Du 
erstmal Tastenabfragen verstehen.

Als erstes mach mal ne einfache Toggletaste, d.h. ein Tastendruck 
schaltet die LED an, der nächste wieder aus usw. Jeder Tastendruck muß 
den LED-Zustand wechseln, völlig egal, wie lange oder wie häufig 
gedrückt wird.

Wenn das zuverlässig funktioniert, mach das für ne LED, die im 
Sekundentakt blinkt (kein Druck darf verloren gehen).

Wenn das auch hinhaut, machs für 2 Tasten und 2 Blink-LEDs völlig 
unabhängig voneinander.

Das mit den 2 LEDs hat den Sinn, zu verstehen, daß eine Mainloop 
durchlaufen muß (sagt ja schon der Name: Loop), wenn eine Funktion grad 
nix tut, d.h. Du darfst nicht an einer Stelle stehen bleiben. Damit läßt 
sich die Mainloop bequem um viele weitere Funktionen erweitern, ohne die 
bisherigen zu stören.

Viele, die meine Entprellfunktion benutzen, dürften dafür etwa 10min 
brauchen.
Ich weiß, daß einige Probleme haben, meine Routine zu verstehen, ich bin 
mir aber ziemlich sicher, keiner hats bereut.
Und sie funktioniert sogar, wenn man sie nicht versteht.
Man muß nur verstehen, wie man sie aufruft.


Peter

von Hannes L. (hannes)


Lesenswert?

> Ich weiß, daß einige Probleme haben, meine Routine zu verstehen,

Ja, sie (zumindest die hocheffiziente ASM-Version) ist sooooo einfach, 
dass es schon etwas Zeit kostet, sie zu verstehen.

> ich bin mir aber ziemlich sicher, keiner hats bereut.

Das ist wohl wahr...

...

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.