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
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?
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?
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.
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
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.
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.
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 ;)
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
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.
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
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!