NOchmal ne Frage zur matrix-abfrage

OP #592625
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?
OP #592628
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?
OP #592662
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
Persönliche Seite #592668
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.
Persönliche Seite #592675
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.
Persönliche Seite #592705
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 ;)
OP #592718
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...
OP #592745
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
#592749
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.
Gast #592810
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!

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