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
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.)
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
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/doc1232.pdf - 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
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
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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.