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.
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?
Dann stimmt aber mit deiner Zuordnungstabell etwas nicht. Es hätte Reihe 123 gegen 456 getauscht werden sollen.
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.
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.
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.
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.
Is aber ganz schön viel Code, dann noch in der main und mit delays, aua guckma hier, läuft nebenbei im Interrupt:
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.