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
Hallo, Datenblatt, der Zustand wird mit dem nächsten Takt nach dem Befehl übernommen. Gruß aus Berlin Michael
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!
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.