Forum: Mikrocontroller und Digitale Elektronik NOchmal ne Frage zur matrix-abfrage


von S. H. (fat32)


Lesenswert?

Hallo,

ich habs jetzt geschafft, ne LED blinken zu lassen, wenn keine taste 
gedrückt ist.
1
$regfile = "m32def.dat"
2
$framesize = 32
3
$swstack = 32
4
$hwstack = 32
5
$crystal = 1000000
6
7
Config Kbd = Portb
8
Config Portc.0 = Output
9
10
'dimension a variable that receives the value of the pressed key
11
12
Dim B As Byte
13
14
15
'loop for ever
16
17
Do
18
19
  B = Getkbd()
20
  
21
  if B = "16" THEN 
22
    Portc.0 = 1
23
  elseif B = 16 THEN
24
    Portc.0 = 1
25
    waitms 200
26
    Portc.0 = 0
27
    waitms 200
28
  end if 
29
30
Loop


Wenn ich dann ne Taste drücke, hört die Blinkerei auf und die LED bleibt 
an. Soweit passt das ja.

WIe mache ich es jetzt, dass die LED nur blinkt, wenn ich auf die 1. 
Taste der Matrix drücke?
Also Taste "a":

   PB4   PB5   PB6   PB7
        |     |     |     |
        |     |     |     |
 PB0----a-----b-----c-----d--10k--VCC
        |     |     |     |
 PB1----e-----f-----g-----h--10k--VCC
        |     |     |     |
 PB2----i-----j-----k-----l--10k--VCC
        |     |     |     |
 PB3----m-----n-----o-----p--10k--VCC

In dem Fall würde dann ja Strom fließen.

MEin Programm müsste ich dann natürlich ändern, so:
1
$regfile = "m32def.dat"
2
$framesize = 32
3
$swstack = 32
4
$hwstack = 32
5
$crystal = 1000000
6
7
Config Kbd = Portb
8
Config Portc.0 = Output
9
10
'dimension a variable that receives the value of the pressed key
11
12
Dim B As Byte
13
14
15
'loop for ever
16
17
Do
18
19
  B = Getkbd()
20
  
21
  if B = "16" THEN 
22
    Portc.0 = 1
23
  elseif B = XXXXXX THEN
24
    Portc.0 = 1
25
    waitms 200
26
    Portc.0 = 0
27
    waitms 200
28
  end if 
29
30
Loop


Die Frage: Was muss da dann statt XXXXXX stehen?

von Simon K. (simon) Benutzerseite


Lesenswert?

Du bist dir sicher, dass du die Matrix richtig angeschlossen hast? 
Nirgendwo nen kurzer oder sowas?

Du solltest mal in die Doku der Funktion GetKeybd() gucken, da steht wie 
der Return-Wert kodiert ist.


PS: Wieso machst du denn schon wieder einen neuen Thread offen?

von S. H. (fat32)


Lesenswert?

weil man im alten nichtmehr geantwortet hat und ich außerdem auch 
anderen leuten helfen will. wenn mal jemand nach matrix sucht, hat er 
mehrere threads mit infos drin ;-)

die Doku hab ich mir angeschaut. (falls du GetKbd() und nicht GetKeybd() 
meinst)
da steht nix von nem return wert...
Vllt. hast du ne andere Doku. Kannst du das hier mal posten?

von Simon K. (simon) Benutzerseite


Lesenswert?

Ja, sorry meinte GetKbd().
Wenn ich selber eine Doku von BASCOM hätte, hätte ich mich bereits 
erbarmt und dir die Info gegeben, aber ich benutze kein BASCOM.

Das da nix über die Daten steht, die die Funktion zurückliefert, kann 
ich mir kaum vorstellen.

von S. H. (fat32)


Lesenswert?

da steht aber nix...

nach langer googlerei hab ich jetzt was gefunden:

http://www.fakedomain.de/dmx.bas

in der datei steht:

' Keypad Daten
Keypad:
Data 1 , 4 , 7 , 10
Data 2 , 5 , 8 , 0
Data 3 , 6 , 9 , 11
Data 12 , 13 , 14 , 15
Data 255


gleich mal ausprobieren

von S. H. (fat32)


Lesenswert?

WAs hab ich jetzt schon wieder flasch gemacht? Jetzt blinkts auch ohne 
nen Tastendruck.
1
$regfile = "m32def.dat"
2
$framesize = 32
3
$swstack = 32
4
$hwstack = 32
5
$crystal = 1000000
6
7
Config Kbd = Portb
8
Config Portc.0 = Output
9
10
'dimension a variable that receives the value of the pressed key
11
12
Dim Keyval As Byte
13
14
15
'loop for ever
16
17
Do
18
19
  Keyval = Getkbd()
20
  
21
  Keyval = Lookup(keyval , Keypad)
22
  Select Case Keyval
23
         Case 1
24
           gosub blink1
25
         Case 4
26
            gosub blink1
27
         Case 7
28
           gosub blink1
29
         Case 10
30
           gosub blink1
31
         Case 2
32
           gosub blink1
33
         Case 5
34
           gosub blink1
35
         Case 8
36
           gosub blink1
37
         Case 0
38
           gosub blink1
39
         Case 3
40
           gosub blink1
41
         Case 6
42
           gosub blink1
43
         Case 9
44
           gosub blink1
45
         Case 11
46
           gosub blink1
47
         Case 12
48
           gosub blink1
49
         Case 13
50
           gosub blink1
51
         Case 14
52
           gosub blink1
53
         Case 15
54
           gosub blink1 
55
         Case 255 'nix machen
56
       end select        
57
Loop
58
59
60
61
End
62
63
Keypad:
64
Data 1 , 4 , 7 , 10
65
Data 2 , 5 , 8 , 0
66
Data 3 , 6 , 9 , 11
67
Data 12 , 13 , 14 , 15
68
Data 255
69
return
70
71
72
  
73
blink1:
74
  Portc.0 = 1
75
  waitms 400
76
  Portc.0 = 0
77
  waitms 200
78
  return

von Simon K. (simon) Benutzerseite


Lesenswert?

Keine Ahnung aber muss nach den Case-Labels kein Doppelpunkt oder sowas?

PS: Versuche doch mal zu "debuggen". Ein paar LEDs annen Port und dann 
gucken wo es hakt. So nervst du eher die Leute, anstatt sie auf deine 
Seite zu kriegen. Aber letzteres benötigst du, damit sie antworten ;)

PPS: Copy&Paste und dann wenn's nicht funktioniert einfach mal stumpf 
fragen warum. Tztztz.

von S. H. (fat32)


Lesenswert?

>Keine Ahnung aber muss nach den Case-Labels kein Doppelpunkt oder sowas?

der compiler sagt mal nix dazu

von Simon K. (simon) Benutzerseite


Lesenswert?

Simon Hat einen nick wrote:
>>Keine Ahnung aber muss nach den Case-Labels kein Doppelpunkt oder sowas?
>
> der compiler sagt mal nix dazu

Bloß nicht ausprobieren.

Ich weiß doch selber nicht wie BASCOM das handhabt. Wenn man BASCOM 
benutzt hat man solche Probleme wie du. Blackboxfunktionen benutzen, wo 
man nicht weiß was sie machen, die aber ZUDEM auch noch schlecht 
dokumentiert sind.. Super! Ganz toll. Und dafür verlangen wir nun noch 
Geld (auf http://www.mcselec.com). Mit sowas entwickelt man gerne.

PS: Also für mich ist die Sache hier gegessen, Sorry.

von S. H. (fat32)


Lesenswert?

ja gut, dann schreib ich die funktion halt selber. da würde ich 
wenigstens was dabei lernen.

von Simon K. (simon) Benutzerseite


Lesenswert?

Simon Hat einen nick wrote:
> ja gut, dann schreib ich die funktion halt selber. da würde ich
> wenigstens was dabei lernen.

Stimmt.

Btw, Selbst das brauchst du nicht mehr. In einem deiner alten Threads 
hat (ich glaube zumindest, dass er es war) "AVR" eine Seite verlinkt zu 
einem BASCOM Forum, mit einem (Zitat:) "grauen Kasten da"... So als 
heißer Tipp ;)

von S. H. (fat32)


Lesenswert?

die hab ich auch schon ausprobiert.
hat auch nicht funktioniert

von S. H. (fat32)


Lesenswert?

1
$regfile = "m32def.dat"
2
$framesize = 32
3
$swstack = 32
4
$hwstack = 32
5
$crystal = 1000000
6
7
Config Portb = Input
8
9
Do
10
11
set portb.0 
12
if pinb.4=1 then 
13
  Portc.0 = 1
14
elseif pinb.5 = 1 then
15
  Portc.0 = 1
16
elseif pinb.6 = 1 then
17
  Portc.0 = 1
18
elseif pinb.7 = 1 then
19
  Portc.0 = 1
20
end if
21
reset portb.0
22
23
set portb.1
24
if pinb.4=1 then 
25
  Portc.0 = 1
26
elseif pinb.5 = 1 then
27
  Portc.0 = 1
28
elseif pinb.6 = 1 then
29
  Portc.0 = 1
30
elseif pinb.7 = 1 then
31
  Portc.0 = 1
32
end if
33
reset portb.1
34
35
set portb.2
36
if pinb.4=1 then 
37
  Portc.0 = 1
38
elseif pinb.5 = 1 then
39
  Portc.0 = 1
40
elseif pinb.6 = 1 then
41
  Portc.0 = 1
42
elseif pinb.7 = 1 then
43
  Portc.0 = 1
44
end if
45
reset portb.2
46
47
set portb.3
48
if pinb.4=1 then 
49
  Portc.0 = 1
50
elseif pinb.5 = 1 then
51
  Portc.0 = 1
52
elseif pinb.6 = 1 then
53
  Portc.0 = 1
54
elseif pinb.7 = 1 then
55
  Portc.0 = 1
56
end if
57
reset portb.3
58
      
59
Loop
60
61
End


die funktion geht genausowenig :-( was mach ich nur falsch? 
angeschlossen ist alles. die LED ist auch nicht kaputt...

von ich (Gast)


Lesenswert?

die funktion ist 100 pro -habe die gerade getestet.
@Simon Hat einen nick  such dir ein andres hobby.

von S. H. (fat32)


Lesenswert?

>die funktion ist 100 pro -habe die gerade getestet.
welche? die von dem avr forum?

von ich (Gast)


Lesenswert?

ja die im grauen kasten

von S. H. (fat32)


Lesenswert?

ich weiß echt nicht, was ich da falsch mache.

die matrix funktioniert ja, wie man meinem ersten post entnehmen kann.
nur halt komplett falsch :-D

von ich (Gast)


Lesenswert?

nee du blickst da nicht durch..sorry ist aber so

von S. H. (fat32)


Lesenswert?

ich blick da auch nicht durch
geb ich schon zu

von S. H. (fat32)


Lesenswert?

Mein Code sieht jetzt so aus:
1
$regfile = "m32def.dat"
2
$framesize = 32
3
$swstack = 32
4
$hwstack = 32
5
$crystal = 1000000
6
7
Config Portb = Input
8
Portb = &HFF 
9
Config Portc.0 = Output
10
11
Do
12
13
set portb.0 
14
if Pinb.4=1 then 
15
  Portc.0 = 1
16
elseif pinb.5 = 1 then
17
  Portc.0 = 1
18
elseif pinb.6 = 1 then
19
  Portc.0 = 1
20
elseif pinb.7 = 1 then
21
  Portc.0 = 1
22
end if
23
reset portb.0 
24
25
set portb.1  
26
if pinb.4=1 then 
27
  Portc.0 = 1
28
elseif pinb.5 = 1 then
29
  Portc.0 = 1
30
elseif pinb.6 = 1 then
31
  Portc.0 = 1
32
elseif pinb.7 = 1 then
33
  Portc.0 = 1
34
end if
35
reset portb.1 
36
37
set portb.2  
38
if pinb.4=1 then 
39
  Portc.0 = 1
40
elseif pinb.5 = 1 then
41
  Portc.0 = 1
42
elseif pinb.6 = 1 then
43
  Portc.0 = 1
44
elseif pinb.7 = 1 then
45
  Portc.0 = 1
46
end if
47
reset portb.2 
48
49
set portb.3
50
if pinb.4=1 then 
51
  Portc.0 = 1
52
elseif pinb.5 = 1 then
53
  Portc.0 = 1
54
elseif pinb.6 = 1 then
55
  Portc.0 = 1
56
elseif pinb.7 = 1 then
57
  Portc.0 = 1
58
end if
59
reset portb.3 
60
      
61
Loop
62
63
End

Funktionieren tuts aber immer noch nicht! Kann da mal einer 
drüberschauen? Bitte! Wäre wirklich sehr froh drüber...

Vielleicht ist es nur ne Kleinigkeit

von Karl H. (kbuchegg)


Lesenswert?

Simon Hat einen nick wrote:

>
> Do
>
>   B = Getkbd()
>
>   if B = "16" THEN
>     Portc.0 = 1
>   elseif B = XXXXXX THEN
>     Portc.0 = 1
>     waitms 200
>     Portc.0 = 0
>     waitms 200
>   end if
>
> Loop[/pre]
>
>
> Die Frage: Was muss da dann statt XXXXXX stehen?

Oh Mann. Probiers doch einfach aus.
Was wirds denn sein? Wenn 'keine Taste' den Code 16
hat, und es ingesammt 16 Tasten sind, na dann werden
die anderen Codes 0 bis 15 sein.
Die BASCOM Leute sind doch auch keine Trottel. Die arbeiten
doch auch logisch. Und ich bin bereit darauf zu wetten, dass
die Codes nicht willkuerlich an die Tasten vergeben werden,
sondern, dass es da ein System gibt:
0 wird in irgendeiner Ecke sein. Entweder die Taste links/rechts
daneben oder über/unter der Taste hat den Code 1. Und so geht
es weiter: Entweder laufen die Codes aufsteigend durch die
Zeilen oder durch die Spalten. Aus dem Bauch heraus würde ich
mal sagen, die Codes sind in normaler Leserichtung (also von
links nach rechts) und von oben nach unten vergeben worden.
Das wäre naheliegend und ich denke mal von 100 Programmierern
würden das wohl 70 so machen. Von den restlichen 30 würden
mindestens 25 entweder links unten oder rechts unten anfangen
und wieder eine zeilenweise Zuordnung machen.

Probier doch einfach mal mit 0

   ....
   elseif B = 0 THEN
     Portc.0 = 1
     ...

und dann drück eine Taste nach der anderen bis du raus
hast ob der Code 0 irgendwo verwendet wird.

Dann probierst du den Code 1

    elseif B = 1 THEN
       ....

und probierst wieder alle Tasten durch, bis du die Taste
hast.

Ich wette mit dir, dass alle Codes für die Tasten kleiner
als 16 sind.

von S. H. (fat32)


Lesenswert?

hab ich schon!

und mir reichts jetzt. ich hab wirklich alles mögliche ausprobiert, nie 
einen Erfolg gehabt.

Ich schliesse jetzt alle 16 Schalter seperat an, da weiß ich wenigstens, 
welcher Pin welchen Wert hat

von Obelix (Gast)


Lesenswert?

Mit Ausprobieren jeder möglichkeit wird das auch nie was. Gibt es den 
kein Debugger für Bascom?

Wenn du C verwenden würdest könnten dir bestimmt auch viel mehr leute 
Helfen.

Zu dener selbstgeschriebenen "getkbd" : Hast du schon mal was von 
Schleifen gehört?

Was soll den "set portb.0" bewirken?
Was macht "if Pinb.4=1 then?
Und ist der unterschied zu "Portc.0 = 1"?

Weist du das die 10k Widerstände Pull-ups sind, und was sie bewirken? Im 
nichtgedrückten zustand hast du eine 1 an Port B!

von thomas (Gast)


Lesenswert?

Jetz hab ich mal noch ne frage.
Gibts eigentlich für jedes Miniproblem nen neuen Tread, oder kann man 
sowas auch zusammenfassen? Is ja nur so ne Idee.

von S. H. (fat32)


Lesenswert?

nächstes mal dann

wenn man 3 tage fast pausenlos wach war, nur um an dem ding 
weiterzumachen, dann passiert sowas halt

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.