Forum: Mikrocontroller und Digitale Elektronik Mega 128: Wieviel Cycles notwendig, bis Port umgeschaltet (MATRIX TASTATUR)


von John S. (student)


Lesenswert?

Hallo zusammen,

ich will an meinem Mega128 eine 3x4 Matrix Tastatur auf Tastendruck 
abfragen.

Dazu muss man bekannterweise 3 Ports als  Ausgang (4 auf Eingang) 
schalten und prüft dann durch wechselseitiges Ein / Ausschalten dieser 3 
Ports durch, wann der Eingangs Port der zugehörigen Tastenreihe 
durchschaltet. Die logische Kreuzung ergibt dann die Taste ...!

Soweit so gut. Ich hatte vor, die Ports in einer 8 Bit Timer Interrupt 
Routine zu tun, habe dann aber festgestellt (so meine ich ...!) dass die 
Ausgangsports einige Zeit brauchen, bis sie von 0 auf 1 oder umgekeht 
schalten. Jedenfalls sieht es so aus, als ob man dies in der Timer 
Interrupt Routine besser nicht macht, um danach noch die Abfrage for 
(I=1 ..3) zu tätigen ???!

Kann mir jemand hierzu etwas sagen, z.B. wieviel Zyklen (üs) man warten 
muss, bevor der Ausgangsport seinen Zusatnd gewechselt hat ???

Meinen Mega betreibe ich mit 14, ... Mhz!

Vielen Dank und Grüsse

von Michael U. (amiga)


Lesenswert?

Hallo,

Datenblatt, der Zustand wird mit dem nächsten Takt nach dem Befehl 
übernommen.

Gruß aus Berlin
Michael

von John S. (student)


Angehängte Dateien:

Lesenswert?

Michael U. wrote:
> Hallo,
>
> Datenblatt, der Zustand wird mit dem nächsten Takt nach dem Befehl
> übernommen.
>
> Gruß aus Berlin
> Michael

Hallo,

Vielen Dank für die schnelle Antwort !

Aber ich habe folgendes Problem (siehe ScreenShot)

Man erkennt, dass der Port offensichtlich verzögert geschaltet wird.

Im "for -loop" sieht man, dass auf dem Display die erste Zeile noch den 
alten Wert 255 anzeigt, obwohl der Finger die Taste definitiv gedrückt 
hält.
Erst nach einigen weiteren Cyclen erfolgt ein UpDate.

Woran kann das wohl liegen ???

Vielen Dank im voraus!

von John S. (student)


Lesenswert?

Problem erkannt - Gefahr gebannt ...

Hier habe ich die Lösung gepostet:

Beitrag "Neuer Port Wert wird erst verzögert angezeigt."

Danke für Eure Aufmerksamkeit - sorry für das Trivialproblem!

Man lernt nie aus!

Grüsse

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Wenn du schnelle Hardware hast, immer dran denken: das Sampeln der
Eingänge für den nächsten Befehl erfolgt noch vor dem Setzen der
Ausgänge des aktuellen Befehls.  Also was nicht geht ist:
1
    PORTC |= (1 << 0);  // Abfrage Spalte 0
2
    colvalue = PINB;    // Wert von PINB hängt von PORTC ab

Wenn du nichts anderes zwischenzeitlich erledigen kannst, dann brauchst
du wenigstens einen NOP dazwischen.

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.