mikrocontroller.net

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


Autor: S. H. (fat32)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habs jetzt geschafft, ne LED blinken zu lassen, wenn keine taste 
gedrückt ist.
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 1000000

Config Kbd = Portb
Config Portc.0 = Output

'dimension a variable that receives the value of the pressed key

Dim B As Byte


'loop for ever

Do

  B = Getkbd()
  
  if B = "16" THEN 
    Portc.0 = 1
  elseif B = 16 THEN
    Portc.0 = 1
    waitms 200
    Portc.0 = 0
    waitms 200
  end if 

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:
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 1000000

Config Kbd = Portb
Config Portc.0 = Output

'dimension a variable that receives the value of the pressed key

Dim B As Byte


'loop for ever

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


Die Frage: Was muss da dann statt XXXXXX stehen?

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: S. H. (fat32)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: S. H. (fat32)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: S. H. (fat32)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
WAs hab ich jetzt schon wieder flasch gemacht? Jetzt blinkts auch ohne 
nen Tastendruck.
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 1000000

Config Kbd = Portb
Config Portc.0 = Output

'dimension a variable that receives the value of the pressed key

Dim Keyval As Byte


'loop for ever

Do

  Keyval = Getkbd()
  
  Keyval = Lookup(keyval , Keypad)
  Select Case Keyval
         Case 1
           gosub blink1
         Case 4
            gosub blink1
         Case 7
           gosub blink1
         Case 10
           gosub blink1
         Case 2
           gosub blink1
         Case 5
           gosub blink1
         Case 8
           gosub blink1
         Case 0
           gosub blink1
         Case 3
           gosub blink1
         Case 6
           gosub blink1
         Case 9
           gosub blink1
         Case 11
           gosub blink1
         Case 12
           gosub blink1
         Case 13
           gosub blink1
         Case 14
           gosub blink1
         Case 15
           gosub blink1 
         Case 255 'nix machen
       end select        
Loop



End

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


  
blink1:
  Portc.0 = 1
  waitms 400
  Portc.0 = 0
  waitms 200
  return
  

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: S. H. (fat32)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Keine Ahnung aber muss nach den Case-Labels kein Doppelpunkt oder sowas?

der compiler sagt mal nix dazu

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: S. H. (fat32)
Datum:

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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: S. H. (fat32)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die hab ich auch schon ausprobiert.
hat auch nicht funktioniert

Autor: S. H. (fat32)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 1000000

Config Portb = Input

Do

set portb.0 
if pinb.4=1 then 
  Portc.0 = 1
elseif pinb.5 = 1 then
  Portc.0 = 1
elseif pinb.6 = 1 then
  Portc.0 = 1
elseif pinb.7 = 1 then
  Portc.0 = 1
end if
reset portb.0

set portb.1
if pinb.4=1 then 
  Portc.0 = 1
elseif pinb.5 = 1 then
  Portc.0 = 1
elseif pinb.6 = 1 then
  Portc.0 = 1
elseif pinb.7 = 1 then
  Portc.0 = 1
end if
reset portb.1

set portb.2
if pinb.4=1 then 
  Portc.0 = 1
elseif pinb.5 = 1 then
  Portc.0 = 1
elseif pinb.6 = 1 then
  Portc.0 = 1
elseif pinb.7 = 1 then
  Portc.0 = 1
end if
reset portb.2

set portb.3
if pinb.4=1 then 
  Portc.0 = 1
elseif pinb.5 = 1 then
  Portc.0 = 1
elseif pinb.6 = 1 then
  Portc.0 = 1
elseif pinb.7 = 1 then
  Portc.0 = 1
end if
reset portb.3
      
Loop

End


  


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

Autor: ich (Gast)
Datum:

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

Autor: S. H. (fat32)
Datum:

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

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja die im grauen kasten

Autor: S. H. (fat32)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nee du blickst da nicht durch..sorry ist aber so

Autor: S. H. (fat32)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich blick da auch nicht durch
geb ich schon zu

Autor: S. H. (fat32)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mein Code sieht jetzt so aus:
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 1000000

Config Portb = Input
Portb = &HFF 
Config Portc.0 = Output

Do

set portb.0 
if Pinb.4=1 then 
  Portc.0 = 1
elseif pinb.5 = 1 then
  Portc.0 = 1
elseif pinb.6 = 1 then
  Portc.0 = 1
elseif pinb.7 = 1 then
  Portc.0 = 1
end if
reset portb.0 

set portb.1  
if pinb.4=1 then 
  Portc.0 = 1
elseif pinb.5 = 1 then
  Portc.0 = 1
elseif pinb.6 = 1 then
  Portc.0 = 1
elseif pinb.7 = 1 then
  Portc.0 = 1
end if
reset portb.1 

set portb.2  
if pinb.4=1 then 
  Portc.0 = 1
elseif pinb.5 = 1 then
  Portc.0 = 1
elseif pinb.6 = 1 then
  Portc.0 = 1
elseif pinb.7 = 1 then
  Portc.0 = 1
end if
reset portb.2 

set portb.3
if pinb.4=1 then 
  Portc.0 = 1
elseif pinb.5 = 1 then
  Portc.0 = 1
elseif pinb.6 = 1 then
  Portc.0 = 1
elseif pinb.7 = 1 then
  Portc.0 = 1
end if
reset portb.3 
      
Loop

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: S. H. (fat32)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Obelix (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: S. H. (fat32)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nächstes mal dann

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.