Ein Pin des Microcontrollers hat grundsätzlich zwei Funktionen
zu erfüllen: Zum einen die Aufnahme des anliegenden Wertes als Input, zum anderen die
Ausgabe des darauf geschriebenen Wertes als Output.
Beide Funktionalitäten sind vollständig unabhängig voneinander. Es ist mit ein wenig
Unvorsichtigkeit leicht möglich, aus Versehen einen Pin kurzzuschließen und damit den
Ausgangstreiber zu zerstören, ohne damit auch dessen Funktion als Input zu beeinträchtigen.
Ein so beschädigter Chip kann sogar noch programmiert und beschrieben werden, nur das
Vergleichen ist natürlich nicht mehr korrekt möglich.
Um einen Pin als Input zu verwenden, ist er unbedingt auf 1 zu setzen. In dieser
Stellung wird der Pin nur von einem schwachen Pullup auf Vcc gezogen und kann von einer
externen Beschaltung leicht auf 0 gebracht werden.
Die Input-Funktion wird übrigends keinesfalls intern zwischengepuffert. Wenn man den Ausgang
auf Masse zieht, und eine 1 herausschreibt, wird beim Zurücklesen eine 0 gelesen. Es ist also
|
leicht einzusehen, niemals mit einem Port direkt zu rechnen, es sei denn, er wird
als Input genutzt.
Schleife:
inc P1
jmp Schleife
Dieses Beispiel zählt also durchaus nicht immer P1 hoch - wenn auch nur ein
Pin auf GND gezogen wurde, bleibt das Incrementieren an dieser Stelle stehen.
Besser ist es also, folgendermaßen zu verfahren:
Schleife:
inc a
mov P1,a
jmp Schleife
|
Die Outputkonfiguration eines 8051-kompatiblen ist recht eigentümlich.
Wird eine 0 auf einen I/O-Port geschrieben, so öffnet ein Transistor, der den dafür
zuständigen Pin direkt auf GND zieht. Dieser Transistor ist für 20mA spezifiziert, aber
nicht durch einen Widerstand abgesichert. Schaltet man den Pin also mit einem
Verbraucher, der mehr als 20mA benötigt, gegen Vcc, so brennt dieser Transistor durch:
der Controller ist beschädigt.
Als Richtlinie kann also gelten, einen Pin niemals mit weniger als 330 Ohm direkt
gegen Vcc zu schalten. Möchte man eine Leuchtdiode direkt am Chip betreiben, ist natürlich
der Spannungsabfall durch die Diode vorher abzuziehen. Der Vorwiderstand für eine
Standard-LED bei 5V beträgt demnach rund 180 Ohm.
Es ist noch ein anderer Grenzwert zu beachten: für den AT89C2051 garantiert der Hersteller
nur eine Gesamtbelastung von 80mA für alle Pins insgesamt. Eine 7 Segment-Anzeige mit 7x20mA würde
also mit 140mA den Maximalwert schon deutlich überschreiten. Allerdings darf man diesen
Grenzwert nach meinen Erfahrungen nicht so eng auffassen, im Gegensatz zu den 20mA pro Pin.
Die 80mA gelten für eine maximale Arbeitstemperatur von 125°C. Baut man den Chip nicht
grade in seiner Heizung oder im Auto ein, so kann man bei normaler Zimmertemperatur auch gefahrlos
einiges mehr an Leistung abverlangen. Eine 7 Segment-Anzeige mit Dezimalpunkt ist also
durchaus auch ohne zusätzliche Leistungstreiber zu realisieren.
Schreibt man eine 1 auf einen I/O-Port, so wird über einen Transistor (bzw. FET) ein
schwacher Pullup, im abgebildeten Schema Depletion Mode FET genannt,
gegen Vcc geschaltet. Dieser kann leicht von einer Beschaltung auf GND gezogen werden,
|
und realisiert dadurch auch die Input-Funktion. Belastet man diesen Pullup mit
80µA, so sinkt die Ausgangsspannung schon von 5V auf 2,4V. Weil dieser eine Pullup
zu schwach ist, um schnelle und flankensteile Signale zu realisieren, so
gibt es noch einen zweiten, als Enhancement Mode FET bezeichneten Transistor.
Dieser ist bei jeder low-to-high Transition des Outputs nur für zwei
Oszillatorzyklen, bei 24MHz für 83ns, aktiviert und deutlich stärker ausgelegt.
Daraus folgt vor allem eines: Für Anwendungen jenseits der Digitaltechnik ist
der High-Zustand des Pins recht ungeeignet, da er sehr schwach und mit
weiten Toleranzen ausgelegt ist, und sich zudem kurz nach dem
Aktivieren auch noch verändert. Wenn man nicht grade mit FET-Schaltungen,
die einen sehr hohen Eingangswiderstand aufweisen, operiert,
so sollte man zum Schalten den Low-Zustand verwenden, dessen
20mA auch für leistungshungrigere Schaltungen ausreichend sind. Davon abgesehen
gibt es auch noch einen weiteren Punkt, der für das Schalten mit der 0 statt mit
der 1 spricht:
Der Reset-Zustand für alle Pins ist die logische 1. Wenn
mit der 1 geschaltet würde, dann würden Motoren, Pumpen oder Lampen, die
damit gesteuert werden, für den Moment des Resets jedesmal kurz anlaufen,
bis das Programm die Kontrolle übernimmt und sie wieder abschaltet. Wenn zur
Stütze in der +5V-Versorgung ein großer Kondensator eingebaut ist, der durch dieses
kurze Anlaufen der Verbraucher belastet wird, so kann unter ungünstigen Umständen
sofort nach dem Reset die Eingangsspannung durch den noch nicht voll geladenen
Kondensator zusammenbrechen, sodass der Chip gleich wieder abstürzt bzw. im Reset hängenbleibt.
|