Forum: Mikrocontroller und Digitale Elektronik 3x4 Tastenmatrix


von Nino K. (lnino)


Angehängte Dateien:

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.

von hp-freund (Gast)


Lesenswert?

Hast Du mal versucht direkt am Atmega PB2 und PB3 zu tauschen?

von Nino K. (lnino)


Lesenswert?

Wenn ich PB2 und PB3 vertausche, dann geht *,0,# nicht mehr. Bei 1,2,3 
sehe ich dann die Werte welche bei *,0,# hinterlegt sind.

Ich habe auch schon versucht anstelle von PB2 den Port PC4 zu nehmen. 
Aber da passiert leider auch nichts.

Noch jemand eine Idee?

von hp-freund (Gast)


Lesenswert?

Dann stimmt aber mit deiner Zuordnungstabell etwas nicht.
Es hätte Reihe 123 gegen 456 getauscht werden sollen.

von Karl H. (kbuchegg)


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.

von hp-freund (Gast)


Lesenswert?

Bist Du sicher das Du PB2 bis PB5 richtig gesteckt hast?
Auf den Foto kommt es mir vor als steckt der 4. gelbe in AVCC.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

hp-freund schrieb:
> Auf den Foto kommt es mir vor als steckt der 4. gelbe in AVCC.

Jo, sehe ich auch so. PB2 ist normalerweise Pin 16, dann geht es weiter 
mit 17,18 und 19, resp. PB3 bis PB5.

von Nino K. (lnino)


Angehängte Dateien:

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.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Angehängte Dateien:

Lesenswert?

Is aber ganz schön viel Code, dann noch in der main und mit delays, aua

guckma hier, läuft nebenbei im Interrupt:

von hp-freund (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Mach da mal zwischen dem Setzen auf Port C und dem Abfragen auf PINB
> irgendwas rein.

das oder im Code die Abfrage PB2 und PB3 tauschen um einen defekten PB2 
auszuschliessen wäre mein nächster Schritt...

...oder eben den anderen Interrupt Code.

von Nino K. (lnino)


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.

von Peter D. (peda)


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.

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
Noch kein Account? Hier anmelden.