3x4 Tastenmatrix

OP #3022185
Lesenswert?
• ▲
▼
Ich bin dabei eine Tastenmatrix von Conrad an meinen atmega168 
anzubinden.

Es funktioniert soweit fast alles. Nur die Reihe mit den Zahlen 1,2,3 
funktioniert nicht. All anderen 4,5,6 und 7,8,9 und *,0,# werden am 
Display korrekt angezeigt. Bei 1,2,3 passiert nichts.

Beim Code kann ich keinen Fehler finden. Könnt ihr hier etwas finden, 
oder gehe ich hier total falsch ran?

Anbei mein Code.

Danke für Eure Hilfe.
Angehängte Dateien:
#3022251
Lesenswert?
• ▲
▼
Mach da mal zwischen dem Setzen auf Port C und dem Abfragen auf PINB 
irgendwas rein.
Da war irgendwas (mein Gedächtnis):
Es dauert 1 Takt nach dem Befehl zum Setzen eines Portpins, bis dann 
tatsächlich der Ausgangstreiber den Pegel auch annimmt. D.h. in deinem 
Fall wäre die Abfrage am PINB ganz einfach ein kleines bischen zu früh.
ein asm( "nop" ); müsste eigentlich schon reichen.
OP #3023221
Lesenswert?
• ▲
▼
Hi,

danke für die vielen Antworten.

Bei der Verkabelung war wirklich ein Fehler.

Habe nun PB2-TastaturPin4 PB3-TastaturPin5 PB4-TastaturPin6 und 
PB5-TastaturPin7 verkabelt wie es gehört.

Leider hat es an dem Problem nichts verändert.

Die Ziffern 1,2,3 bleiben immer noch ohne Funktion.

Wenn ich nun die Kabel von PB2 und PB3 vertausche und ich drück dann 
1,2,3
Dann erscheinen die Zahlen welche ich bei 4,5,6 hinterlegt habe. Und 
dann wenn ich 4,5,6 drücke passiert nichts.

Also gleiches Phänomen wie vorher nur eben verdreht.

Hat noch jemand eine Idee, wo hier der Fehler liegen könnte?

Anbei noch ein Bild von der aktuellen Verkabelung.
Angehängte Dateien:
OP #3026653
Lesenswert?
• ▲
▼
Karl Heinz Buchegger schrieb:
> Mach da mal zwischen dem Setzen auf Port C und dem Abfragen auf PINB
> irgendwas rein.
> Da war irgendwas (mein Gedächtnis):
> Es dauert 1 Takt nach dem Befehl zum Setzen eines Portpins, bis dann
> tatsächlich der Ausgangstreiber den Pegel auch annimmt. D.h. in deinem
> Fall wäre die Abfrage am PINB ganz einfach ein kleines bischen zu früh.
> ein asm( "nop" ); müsste eigentlich schon reichen.

Hi Karl Heinz. Danke für deinen Hinweis. Dies war genau die richtige 
Lösung. Nun kann auch die erste Reihe mit 1,2,3 korrekt ausgegeben 
werden. Vielen Dank. Nun kann ich in meinem Projekt wieder weiter 
machen.
#3026934
Lesenswert?
• ▲
▼
Karl Heinz Buchegger schrieb:
> Es dauert 1 Takt nach dem Befehl zum Setzen eines Portpins

Nein, Ausgänge werden sofort gesetzt.

Eine CPU arbeitet immer taktsynchron, d.h. alle asynchronen Signale 
(Eingänge) müssen erst mit dem CPU-Takt synchronisiert werden, ehe sie 
verarbeitet werden können. Eingänge werden daher mit einem Takt gelatcht 
und erst mit dem nächsten verarbeitet.

Das gleiche Problem gibt es auch mit den asynchronen Timern, die mit 
Uhrenquarz oder PLL laufen können. Die werden auch mit Zwischenregistern 
synchronisiert.
Eine Folge davon ist z.B., daß beim ATtiny261 das Löschen eines 
Interruptflags des T1 erst 3 Takte später wirklich erfolgt ist.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.