www.mikrocontroller.net

Forum: Compiler & IDEs PINA auslesen für 4x3 Tastaturmatrix


Autor: Marc Vollmer (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe mir eine 4x3 Tastaturmatrix vom Conrad besorgt. Nun habe ich
das Teil folgendermaßen angeschlossen:

Die ersten drei Anschlüsse über 10 k an die Pin 0 bis 2. Pin 3 bis Pin
6 sind direkt angeschlossen.

Da die Tasten prellen, werden die Ausgänge Pin0..2 über Timer (sehr
langsam alle 3 Sekunden)  gesetzt und im nächsten Zeittakt werden die
Pins3..6 ausgelesen. Wenn ich die Schaltung mit dem Multimeter
überprüfe funktioniert es tadellos.

Ich habe das Programm mit AVR-Studio simuliert und es funktioniert
einwandfrei.

Setze ich das Programm auf meinen ATMega16 bekomme ich beim Einlesen
vom PINA nur Mist angezeigt. Die Zahlenwerte ändern sich nicht wie  sie
sollen, statt 1 (für gesetzten Ausgang) kommt irgendetwas größer 200
raus.

Kann der Atmel keine Kombination von Eingängen und Ausgängen auf einem
Port? Muss ich noch die Fuses ändern? Oder lese ich PINA falsch ein?
Ist irgendwo eine Invertierung erforderlich?

Ich bekomme es nicht hin, könnte somit ein bißchen Hilfe gebrauchen.

Gruss
Marc

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Doch, der AVR kann natürlich eine Kombination von Ein- und Ausgängen
auf einem Port.

Falls Du direkt nach der Ausgabe des Spaltenwertes die Zeilenabfrage
machst, da habe ich mich schonmal totgesucht (obwohl ich's zuvor im
Datenblatt gelesen hatte): das Sampling der Input-Daten des nächsten
Befehls erfolgt vor dem tatsächlichen Ausgeben der Output-Daten des
laufenden Befehls.  Du mußt in diesem Falle einen NOP einbauen.

(Sorry, ZIP-Files sind mir zu umständlich anzugucken.)

Autor: Marc Vollmer (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jörg,

dies hatte ich schon festgestellt, somit hatte ich vor dem Einlesen von
PINA auch den Befehl "asm volatile ("nop"::);" eingefügt. Wobei auch
der Ausgang im Timer gesetzt wird, und im nächsten Timerinterrupt erst
die Eingänge gelesen werden.

Mit den Zips hast Du natürlich auch Recht, es ist nur der Grundgedanke
die Datenmenge klein zu halten, aber bei einem kleinen Textfile ist
dies etwas übertrieben. Des wegen der Code nochmal im Anhang.

Gruss
Marc

Autor: Marcus M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Marco,

leider hat sich meine alte Festplatte verabschiedet, sonst hätte ich
Dir einen funktionierenden Code zuschicken können.

Du mußt bei der Ansteuerung der Conrad Tastatur folgendes beachten:

- das Gehäuse ist statisch leitend - sowohl die Folie als auch die
  Kunstoff version -, abhilfe schafft hier ein Kerko dessen PINs an
  GND und am Gehäuse anliegen

- beschalte das Ganze, wie im APP Note von Atmel beschrieben:
  http://www.atmel.com/dyn/resources/prod_documents/...

- gestallte die neue Abfrage per Timer_Overflow, und schalte die
  Ausgänge während des Timerlaufes als Ausgänge mit GND-Pegel.

Danach funktioniert dieses Ding einwandfrei. Ich verstehe nur nicht,
warum man der Tastatur keinen GND - PIN gesponsored hat. Ob ich nun 8
Anschlüsse oder 7 Anschlüsse habe, ist doch kein enormer Kostenfaktor.

Gruß Marcus

Autor: Stefan Kleinwort (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Marc,

so wie ich das sehe, hast Du eine high-aktive Logik. Bei Taste gedrückt
willst Du High am Eingang messen, ansonsten low. Damit das klappt, musst
Du noch Pulldowns an den Eingängen vorsehen, sonst haben die einen
zufälligen Eingangspegel. Ausserdem stimmt in keypadread() wohl noch
was nicht. Besser, Du maskierst die Eingänge aus, die Du testen
willst:
  if (keypress & 0x08){
    ... Eingang Bit 3 high ...
  }
  if (keypress & 0x10){
    ... Eingang Bit 4 high ...
  }
  usw.


Besser ist es aber, eine low-aktive Logik zu verwenden. Dann kannst Du
die internen Pullups des mega16 benutzen. Dazu die Ausgänge zum
Spalten-Selektieren auf Low, alle "passiven" Ausgänge high. An den
Eingängen die internen Pullups einschalten. Sobald ein Eingang low ist
-> Taste gedrückt.

Du kannst (später) auch die 10k-WIderstände an den Ausgängen weglassen,
wenn Du das Programm etwas modifizierst. Aber probier erstmal, es so zum
Laufen zu bekommen.

Stefan

Autor: Marc Vollmer (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

erst mal Danke an alle für die guten Tips -- das Teil läuft nun. Ich
habe die low-achtive Variante verwendet, da ich dafür keine Änderung
löten mußte.

Kurze Zusammenfassung:

Die Schaltung ist sinngemäß hier nachzulesen. Ich hatte nur eine
4x3Matrix und habe einen AVR, aber mit ein bißchen Nachdenken kommt man
schon dahinter:

http://www.sprut.de/electronic/pic/grund/tasten/tasten.htm

Das Programm habe ich angehängt, sicher es mag noch optimiert werden
können, aber die  Grundfunktionen sind hoffentlich klar. Die Ausgabe
auf den Usart macht wahrscheinlich wenig Sinn, und diente eher als
Debugger.

Vorsicht:

Wenn Ihr das Teil im Avr-Studio simuliert, wird die count Variable beim
Einsprung in die Interruptfunktion zurückgesetzt, wenn sie vorher in
keypadread inkrementiert wurde, dies wäre nicht korrekt, aber auf der
Hardware läuft es richtig.

Gruss
Marc

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.