Forum: Compiler & IDEs Neuer Port Wert wird erst verzögert angezeigt.


von John S. (student)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe das Problem zwar schon mal im uC Forum gepostet, aber ich 
glaube, ich habe da eher eher ein GCC und kein Hardware Problem:

Anbei sehr Ihr, wie ich eine 3x4 Matrix Tastatur am Mega 128 abfrage.Wie 
das grundsätzlich geht ist ja schon vielfach erklärt worden.

Das Bild und der Code sollte für mein Problem eigentlich selbsterklärend 
sein.

Merkwürdigerweise wird die PORT Änderung erst nach einigen Zyklen aktiv 
...!

Die erste ausgegebene Zeile im Display hat noch den alten (unrichtigen) 
Wert, erst die zweite Zeile zeigt den richtigen Wert an. Woran kann das 
liegen ??

Compiler Optimierungsproblem ? Kann doch nicht -oder ?

Vielen Dank im voraus!

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Sorry, PDF ist für mich unpassend gewählt, um über Code zu diskutieren.

Vielleicht stolperst du über dies:

http://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen#Stolperfalle_bei_Matrixtastaturen_etc.

Du könntest dir das Disassemblerlisting ansehen, ob zwischen OUT (PORTF) 
und INP (PINE) genügend Zeit vergeht. Was die Abfrage von PINF soll, 
verstehe ich nicht.

Eine weitere Fehlerquelle könnte die Hardware der Tastatur sein.

von John S. (student)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

das (Newbie-) Problem ist identifiziert:


In Bild 2 sieht man, was passiert, wenn ausreichend NOPs die Abfrage 
nach hinten schieben. 10 NOPs reichen ... 8 NOPs noch nicht.

Aber das Problem ist "natürlich" nicht der Compiler, sondern die 
Hardware, der OSKAR hat's entlarvt:

Da ich auf Nummer Sicher gehen wollte, habe ich ALLE Ports des MEGA mit 
Widerständen (2,5 / 1,0 Kohm) abgesichert .... (im Probier - und 
Bastelstadium ... habe schon einmal Ports durch Falschprogrammierung 
(Kurzschluss) zerstört - total ärgerlich).

Da offensichtlich hierdurch unerwünschte Kapazitäten am Eingang 
auftreten, fällt die Spannung am Eingang zu flach ab (Bild 3) und nähert 
sich "zu asymptotisch" an die Grenze, wo der Wechsel HIGH auf LOW vom 
Eingang erkannt wird.

In Bild 4 habe ich den Schutzwiderstand weggenommen, man sieht, die 
negative  Steigung ist parallel zum schaltenden Port ...

Im Code sind die NOPs nun obsolet, der Eingang ist "sofort" auf LOW.

Sorry für den Trouble ... Habe zuvor nur mit "langsamer" C-Control 
experimentiert ... da ist ein solcher Fehler nicht zeitkritisch ...

Danke für Eure Unterstützung.

Hoffentlich hilfts ein wenig anderen Newbies ...!

Grüsse

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.