Tastenmatrix 3x4 an Amtega16

  • Hi,


    ich habe eine Tastenmatrix (3x4) welche ich mit einem Amtega16 (16MHz Quarz) abfragen will.
    Hier die Schaltung:

    Pull-Ups von PA0 - PA3 sind immer ein. Bei der Abrage ist der Pull-Up der Spalte die abgefragt wird aus. (Wenn ich z.B. Spalte 1 abfrage: PB1 = 0, PB3 = 1, PB4 = 1)
    Hier noch ein bisschen Bascom:


    Nun mein Problem: Wenn ich eine Taste drücke, kommt irgendetwas raus. Manachmal stimmt es manchmal nicht. Kann mir wer helfen? Hoffe das ich alle benötigten Angaben gemacht habe ;)


    Gruß Michi26206


    PS: Mir ist klar das ich nichts entprellt habe und das es einen Hardwareschaden geben kann wenn man mehrer Tasten drück. Allerdings will ich jetzt mal nur das die Abfrage funktioniert.


    edit: also LCD und rest funktioneirt nur eben nicht die Tastatur. Wenn ich z.B. die 4 drücke kommt auf dem LCD: "Taste *"

  • Ich weiß nicht, ob es Dir weiter hilft, aber im Mikrocontroller-Forum gibt es einen Artikel, allerdings für C (oder ASM): http://www.mikrocontroller.net…orial#Tasten_und_Schalter


    Und dann habe ich für eine Matrix noch einen sehr einfachen Quellcode: http://winavr.scienceprog.com/…g-avr-gcc-c-language.html

  • Bei der Abrage ist der Pull-Up der Spalte die abgefragt wird aus. (Wenn ich z.B. Spalte 1 abfrage: PB1 = 0, PB3 = 1, PB4 = 1)

    Wenn ich das richtig verstehe, liegt hier das Problem: Du hast die auch als Eingänge definiert und schaltest dann den Pullup um...? - das geht dann so nicht, weil die Spalte, in der der Pullup aus ist "in der Luft hängt", also keinen definierten Pegel hat.


    Du musst also immer die Spalte, die abgefragt werden soll, auf Ausgang und 0 schalten, dann zieht ein Tastendruck den entsprechenden Zeilen-Eingang auf Low. Die anderen Spalten auf Eingang ohne Pullup, sind dann hochohmig - da kann also auch nix kaputt gehen.


    alle Spalten immer auf Ausgang und nur die abgefragte auf Low geht nicht, weil dann hättest Du, wenn Du 2 Tasten gleichzeitg drückst, eben einen Ausgang mit 5 Volt auf einen mit 0 Volt geschaltet, *dann* würde der µC beschädigt...

    It's only light - but we like it!


    Da es sich in letzter Zeit häuft: Ich beantworte keine PNs mit Fragen, die sich auch im Forum beantworten lassen!
    Insbesondere solche von Mitgliedern mit 0 Beiträgen, die dann meist auch noch Sachen fragen, die bereits im entsprechenden Thread beantwortet wurden.
    Ich bin keine private Bastler-Hotline, technische Tipps etc. sollen möglichst vielen Lesern im Forum helfen!

  • Wenn ich das richtig verstehe, liegt hier das Problem: Du hast die auch als Eingänge definiert und schaltest dann den Pullup um...? - das geht dann so nicht, weil die Spalte, in der der Pullup aus ist "in der Luft hängt", also keinen definierten Pegel hat.

    nein das sind nur Ausgänge.


    alle Spalten immer auf Ausgang und nur die abgefragte auf Low geht nicht, weil dann hättest Du, wenn Du 2 Tasten gleichzeitg drückst, eben einen Ausgang mit 5 Volt auf einen mit 0 Volt geschaltet, *dann* würde der µC beschädigt...

    und was hab ich oebn geschireben^^ das ich es weiß. Habe mittlerweile 10k dazwischen. Werde die aber evtl. noch gegen ne Diode tauschen


    Hier der ganze Cod:



    will es nicht mit dem CONFIG KBD machen da ich bei diesem Projekt auf C umsteigen möchte. Habe nur testweiße das in Bascom schon mal gemacht.


    PS: Im Mikrocontroller-Forum hab ich shcon geschaut.


    turi. Ja den C Code versteh ich schon kann auch etwas C ;) Hab es eigentlich genau so gemacht.

  • nein das sind nur Ausgänge.

    Das hat sich aber anders angehört! - bei einem Ausgang gibt es keinen "Pullup"


    und was hab ich oebn geschireben^^ das ich es weiß

    Und ich hab' Dir beschrieben, wie Du das Problem per SW umgehen kannst, ohne noch Widerstände oder Dioden einlöten zu müssen...


    k.A. warum Du nen Frage-Thread aufmachst, wenn Du Dir dann keine Tipps anhören willst ?( - aber ist schon recht, ich halt schon mein vorlautes Maul...

    It's only light - but we like it!


    Da es sich in letzter Zeit häuft: Ich beantworte keine PNs mit Fragen, die sich auch im Forum beantworten lassen!
    Insbesondere solche von Mitgliedern mit 0 Beiträgen, die dann meist auch noch Sachen fragen, die bereits im entsprechenden Thread beantwortet wurden.
    Ich bin keine private Bastler-Hotline, technische Tipps etc. sollen möglichst vielen Lesern im Forum helfen!

  • war doch net so gemeint. entschuldigung ;(


    und ich wunder mich warum die "Pullups" bei Ausgang nicht gehen^^


    Werde mir dein Tipp anschaun. Bin nur etwas gestresst. Sry nochmal.


    So mal zur aktuellen Lage. Müsste es funktionieren wie oben beschaltet und der Software? Ode rhabe ich "Murks" gemacht.


    Hab es jetzt mit Config KBD ausprobiert geht ohne Probleme.


    Gruß


    PS: Schreib bitte wieder Tipps wenn dir was einfällt.


    edit:


    @ Pesi:


    Stimmt es jetzt so oder habe ich das falsch verstanden:


  • Ja, sorry, habe ich wohl in den falschen Hals bekommen, ebenfalls Entschuldigung!


    ich denke, Du meinst mit "Pullup", dass Du den Ausgang auf "High" bzw. 5 Volt schaltest - da sagt man dann aber nicht "Pullup" dazu, sondern damit meint man die Pullup-Widerstände, die man am Eingang dazu schalten kann...


    wenn das mit diessem Config KBD geht, dann stimmt zumindest HW-mäßig schon mal alles...


    zu Deinem Code: ich bin jetzt nicht so der Bascom-Spezialist, aber das sollte *im Prinzip* schon funktionieren, Du schaltest ja ganz oben mit DDRB = &B11111111 den ganzen PortB auf Ausgang - unten dann mit PortB = &B0001100 (da fehlt doch was...?!?) eine Leitung auf low und die anderen beiden auf High - da hast Du dann aber das Problem mit dem Kurzschluß, Wenn Du 2 Tasten in unterschiedlichen Spalten drückst... unten schaltest Du dann die Leitungen um - aber zwischen Low und High, nicht zwischen Low und Hochohmig


    Du müsstest das also einfach so schreiben (ich nehme an, der PB0 und 2 muss ein Ausgang sein für's LCD...?):


    ganz oben:


    DDRA = &B11110000 ' PA0 - PA3 auf Eingang
    DDRB = &B00000101 ' PB1, 3 und 4 erst mal komplett auf Eingang (hochohmig), PB0 und PB2 auf Ausgang (LCD)
    PortA = &B00001111 ' Pullups an Port A (reicht einmal oben, muss nicht vor jeder Abfrage)


    Vor der jeweiligen Abfrage schaltest Du dann nicht den PortB um, sondern DDRB - damit wechselst Du zwischen "low" und hochohmig:


    vor Abfrage Spalte 1:
    DDRB = &B00000111 ' PB1 auf Ausgang, wird low, also erste Spalte abgefragt - andere Spalten sind auf Eingang, also hochohmig (PB0 und 2 Ausgang für LCD)


    vor Abfrage Spalte 2:
    DDRB = &B00001101 ' PB3 auf Ausgang, wird low, also zweite Spalte abgefragt - andere Spalten sind auf Eingang, also hochohmig (PB0 und 2 Ausgang für LCD)


    vor Abfrage Spalte 3:
    DDRB = &B00010101 ' PB4 auf Ausgang, wird low, also dritte Spalte abgefragt - andere Spalten sind auf Eingang, also hochohmig (PB0 und 2 Ausgang für LCD)


    da sind ja noch ein Haufen Zeilen auskommentiert..? - und was das ganz unten soll, verstehe ich nicht ganz, Du fragst die Spalten ab, aber die musst Du ja nicht abfragen, die setzt Du ja! - abgefragt werden nur die Reihen, immer von 1 - 4 - welche Taste das dann ist, gibst Du ja vor, indem Du die entsprechende Spalte auf Low ziehst...

    It's only light - but we like it!


    Da es sich in letzter Zeit häuft: Ich beantworte keine PNs mit Fragen, die sich auch im Forum beantworten lassen!
    Insbesondere solche von Mitgliedern mit 0 Beiträgen, die dann meist auch noch Sachen fragen, die bereits im entsprechenden Thread beantwortet wurden.
    Ich bin keine private Bastler-Hotline, technische Tipps etc. sollen möglichst vielen Lesern im Forum helfen!

  • exakt PB0 und 2 sind fürs LCD


    funktioniert jetzt. danke

    hab ich das Problem nciht.da sind ja noch ein Haufen Zeilen auskommentiert..? - und was das ganz unten soll, verstehe ich nicht ganz, Du fragst die Spalten ab, aber die musst Du ja nicht abfragen, die setzt Du ja! - abgefragt werden nur die Reihen, immer von 1 - 4 - welche Taste das dann ist, gibst Du ja vor, indem Du die entsprechende Spalte auf Low ziehst...

    ja^^ das ist noch altes zeug. hab ich mitlwerweile gelöscht :)