Erstmal vorbeugen: ATmega103 compatibility mode ist ausgeschaltet!
Mein Problem:
Über einen 40106 Schmitt-Trigger habe ich 5 Tasten entprellt und die
ST-Ausgänge an Port G4..0 angeschlossen.
Pull-Ups gesetzt:
PG1 und PG4 funktionieren normal. Erkennung funktioniert.
Taster losgelassen: 5V
Taster gedrückt: 0V
PG0, PG2 und PG3 verhalten sich komisch.
Taster losgelassen: 5V
Taster gedrückt: 4,85V
Wenn ich die Pins PG0, PG2 und PG3 direkt auf Masse lege, fliessen 90mA
Strom aus dem Controller heraus (pro Pin!).
DDRG = 0x00; PORTG = 0xff;
Kennt jemand dieses Phänomen und hat es lösen können? Habe inzwischen 2
Chips ausprobiert, beide das gleiche Verhalten. Wenn ich die Tasten an
PORTC anschliesse, ist alles in Ordnung.
Gruß,
Schnulli
Hast du denn die Ports auch als Ports konfiguriert, oder haben sie
Sonderfunktionen? In den Sonderfunktionen sind das alles Ausgänge...
(TOSC2, ALE, /WR). Seltsam allerdings, dass PG1 (/RD) davon nicht
betroffen ist, denn der müsste bei aktiviertem XMEM-Interface
ebenfalls im Ruhezustand auf high liegen.
JTAG ist glaube ich PORTF. Ist aber per Fuse abgeschaltet. PORTF
funktioniert bei mir normal. Dort benutze ich zwei Pins für ADC und vier
für Display-Daten.
Nach Datenblatt könnten eigentlich nur die Bits AS0 in ASSRn und SRE in
MCURC stören. Diese werden aber mit 0 standardmäßig initialisiert. Auch
daran kann es demnach nicht liegen.
Wenn ich die Pull-Ups für PORTG abschalte, messe ich 150mV, nach
Tastendruck wieder 0V. Die Differenz zum Tastendruck beträgt also immer
150mV. Und auch dann sind es die gleichen Tasten, die funktionieren und
die gleichen drei, die nicht funktionieren.
Der Schmitt-Trigger hat einen symmetrischen Ausgang, der sollte also
stark genug sein. Wenn man die Ausgänge des Schmitt-Triggers
zusammenschaltet, kann man einen schönen Kurzschluß provozieren. Das
Problem liegt damit wohl eindeutig beim µC. 90mA Ausgangsstrom ist
eindeutig zu viel.
Was gar nicht passt, ist PORTG3. Der kann als Sonderfunktion höchstens
Input werden, Output nur durch DDR (Table 46 und Fig. 33 im DS). Womit
entweder Hardware oder Messergebnis verdächtig werden.
Einen kleinen Schritt bin ich weiter gekommen.
Es reicht scheinbar nicht, nach dem Reset einmal PORTG und DDRG zu
setzen. Wenn ich vor jeder Tastenabfrage im Timer (25Hz) explizit
PORTG=0xff und DDRG=0x00 setze, dann kann ich die Tasten alle lesen.
Wenn ich allerdings mit einem Voltmeter die Spannung an den Pins
kontrollieren möchte, löse ich beim Berühren mit der Meßspitze schon
einen Tastendruck aus und die Spannung schwankt extrem, ist quasi nicht
meßbar.
Ich werde nochmal versuchen, das mit einem Oszilloskop zu messen.
Hallo Clemens,
bau doch zum testen mal ein kurzes Testprogramm, das ∗nichts∗ anderes
macht, als DDR und PORT passend zu setzen. Wenn das funktioniert (also
die Pins keine Stromquelle mehr sind), dann lass z.B. eine LED blinken
wenn einer der Pins händisch(!) auf high/low gezogen wurde. Ohne timer,
ohne Interrupt, einfach nur busy-waiting.
Ich vermute, dass Du irgendwo einen wildgewordenen Zeiger oder etwas
ähnliches drin hast, der dir den Speicher von PORTG/DDRG regelmäßig mit
Müll überschreibt.
HTH
Ja, so was scheint es zu sein.
Ich habe ein kleines Testprogramm geschrieben, bei dem ich einfach alle
anderen Sourcen rausgeschmissen habe. Jetzt funktioniert erstmal alles.
Es handelt also tatsächlich um ein Software-Problem.
Danke für Eure Hilfe.
Gruß,
Clemens
Eine eigene Frage?
Dieser Thread ist über 16 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.