3x4 Tastenmatrix

#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.
#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:
#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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren