• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Problem mit Tastaturabfrage

Hucky3000

Geocacher
Hallo !
Ich steh mal wieder im Regen, irgendwie blicke ich es nicht was mit der Variable "Wert" passiert.
Es soll eine "Tastaturmatrix" mit gemeinsamer Masse ausgelesen werden.
Wenn ich keine Taste drücke sollte die Variable den Wert "0" haben. Hat sie aber nicht. Nur wenn ich DIREKT vor der Abfrage "Wert = 0" schreibe. Wenn ich irgendwo hänge kontrolliere ich Programmpunkte indem ich einfach ne LED ansteuere, damit ich überhaupt sehe WAS passiert, bzw. wann was passiert.
Die LED leuchtet nur wenn ich direkt vor der Abfrage "if wert = 0 then goto Abfrage" den Wert wirklich auf 0 setzte. WARUM ?!

Hucky

Code:
'***********************************************
'Blechkasten - Nachtcache
'Compiler : BASCOM-AVR
'Hardware : Tastencode,LEDs,Servo
'Version 0.1
'Hucky3000
'***********************************************

$regfile = "attiny2313.dat"
$crystal = 4000000
$framesize = 32
$swstack = 10
$hwstack = 40

Config Portb = &B00000000                                   'PortB komplett auf Eingang
Config Portd = &B01111000                                   'PortD 0-2 auf Eingang - Rest auf Ausgang - PD7 nicht vorhanden
Portb = &B11111111                                          'PortB komplett Pull Up ein
Portd = &B00000111                                          'PortD 0-2 Pull Up ein


Dim Sperre As Byte
Dim Zaehler As Byte
Dim Wert As Byte
Dim Daten As Byte
Dim Ok As Byte



Anfang:

Portd.3 = 0
Portd.4 = 0

Sperre = 0
Zaehler = 0
Ok = 0
Wert = 0


Restore Dta1

Abfrage:

If Sperre = 1 Then Goto Weiter1

If Pinb.0 = 0 Then Wert = 10
If Pinb.1 = 0 Then Wert = 1
If Pinb.2 = 0 Then Wert = 2
If Pinb.3 = 0 Then Wert = 3
If Pinb.4 = 0 Then Wert = 4
If Pinb.5 = 0 Then Wert = 5
If Pinb.6 = 0 Then Wert = 6
If Pinb.7 = 0 Then Wert = 7
If Pind.0 = 0 Then Wert = 8
If Pind.1 = 0 Then Wert = 9

If Wert = 0 Then Goto Abfrage


Lesen:

Sperre = 1

Read Daten

If Wert = Daten Then Ok = Ok + 1
Zaehler = Zaehler + 1
Portd.4 = 1
Waitms 300
Portd.4 = 0
If Ok = 6 Then Goto Tuerauf
If Zaehler = 6 Then Goto Falsch

Goto Abfrage


Weiter1:
If Portb = 255 Then Goto Weiter2
Goto Abfrage
Weiter2:
If Pind.0 = 1 Then Goto Weiter3
Goto Abfrage
Weiter3:
If Pind.1 = 1 Then Goto Weiter4
Goto Abfrage
Weiter4:
Sperre = 0
Goto Abfrage



Tuerauf:
Portd.4 = 1
Wait 5
Goto Anfang

Falsch:
Portd.3 = 1
Wait 5
Goto Anfang

Dta1:
Data 1 , 2 , 3 , 4 , 5 , 6
 

Lanfair

Geocacher
Goto?!? :schockiert: :schockiert: :schockiert: :schockiert: :schockiert:

Goto ist böse, nimm Gosub.

Und rück die Zeilen ein wenig ein, die innerhalb einer Schleife sind. Das erhöht die Lesbarkeit enorm.

Sorry, habe keine HIlfe für Dein Problem, da ich mir den Source mit den Goto-Sprüngen nicht antun wollte.
 

qByter

Geocacher
Poste mal den Schaltplan...

Du sagst Du fragst eine Matrix ab, in Deinem Code aber einfach 10 Pins ohne irgendeine erkennbare Matrix und auch ohne Entprellung (schau Dir mal die Hilfe zum Befehl DEBOUNCE an!).

Eine "normale" Nummern-Matrix hat eigentlich 3x4 oder 4x4 Pins, und da würde Deine Abfrage nicht passen, da für eine Eingabe immer zwei Pins nötig wären.
Zum Abfragen einer Matrix bietet sich der Bascom-Befehl "getkbd" an, der entprellt auch gleich vernünftig...

Aus der Hilfe zu getkbd noch dazu:
Sometimes it can happen that it looks like a key is pressed while you do not press a key. This is caused by the scanning of the pins which happens at a very high frequency.

It will depend on the used keyboard. You can add series resistors with a value of 470-1K
Das dürfte auch bei Dir zutreffen, Du scannst ja ebenfalls rapide in Schleife. Also ruhig mal ein paar Widerstände davor hängen und entprellen, dann sollte das schon anders aussehen...
 
OP
Hucky3000

Hucky3000

Geocacher
Schaltplan habe ich nicht.
Da ich vorher nicht wusste, dass es mit einer 3x4 Matrix so einfach ist habe ich mir so nen Ding von Conrad geholt, dass eine gemeinsame Masse hat und jede Taste einzeln rausgeführt ist. Ist praktisch so als hätte ich 10 einzelne Taste, die ich über Masse auf die Eingänge vom AVR gebe. Daher Matrix in Anführungszeichen :p
Den Befehl zum Entprellenhabe ich auch schon irgendwo gefunden - kommt später.
Im Prinzip MUSS es so funktionieren. Zumindest was ich mir an Basic auf anderen Systemen angeeignet habe.
Vorhin habe ich mir erstmal ein Buch bei Amazon bestellt. Alles wird (hoffentlich) gut :roll:

Die Tasten werden ja korrekt abgefragt. Habe z.B bei Pinb.0 ne LED eingeschaltet, bei Pinb.4 wieder aus.
Aber ich muss doch mit der If Then - Anweisung einer Variablen einen Wert zuordnen können ?!
Wenn keine Taste gedrückt ist müsste es ja bei "0" bleiben. So. Damit kann ich zum Anfang springen und so lange abfragen bis irgendetwas gedrückt wird. Mit der Variablen "Sperre" umgehe ich die Tastaturabfrage solange noch ne Taste betätigt ist.
Wieso wird die Variable "Wert" nicht korrekt beschrieben ?
Würde mich mal interessieren was da drin steht. Dafür müsste ich wohl ein LCD-Display anschliessen :(
Soooo weit bin ich noch nicht...

Hucky
 
OP
Hucky3000

Hucky3000

Geocacher
Ich habs !
Hab durch probieren rausbekommen welchen Wert die Variable "Wert" hat. Es ist die 7.
Das heißt PinB.7 ist "betätigt".
USCK ? Programmierkabel ?!? :kopfwand: :kopfwand: :kopfwand:

Wieder was gelernt....

War schon am verzweifeln :irre:

Hucky
 
Oben