MezData-Logo

Grundlagen Mikrocontroller Ports

Anschlüsse des Mikrocontrollers ATtiny2313

AnschlussbildEin Mikrocontroller (µC) ist ein Computer mit ROM, RAM und Ein- und Ausgabeschnittstellen (I/O) auf einem Chip.

Die Anschlüsse (Pins) am Chip können für mehrere Funktionen verwendet werden, die Grundfunktion ist die Ein-, Ausgabe von Digitalwerten. Dazu werden die Pins zu Ports zusammengefasst, maximal 8 Port-Pins gehören zu einem Port z.B. PD0..PD6 gehören zu PortD, PB0..PB7 zu PortB. Ein Pin ist ein Bit in einem Port. Jedem Port sind 3 Adressen zugeordnet:

  1. Eine Adresse zum Lesen aller Digitalwerte der Port-Pins
  2. Eine Adresse für ein Register, das sich merkt, welcher Pin auch ein Ausgang sein soll
  3. Eine Adresse für ein Register, das sich merkt, was ausgegeben werden soll

Ein Register ist eine Zusammenfassung mehrerer Flip-Flops zu einer Einheit.

In den Klammern sind die weiteren alternativen Funktionen der Pins angegeben, z.B. Programmiereingänge, Timer-Pins oder serielle Schnittstellen (werden später noch behandelt). Durchklickbare Präsentation

Pinzustände einlesen: Beispiel PIND

PortpinsZur Auffrischung: Bussystem - Grundlagen

Der logische Zustand eines Pins kann zu jeder Zeit gelesen werden. Beim Lesen werden die Port-Pins durch einen TriState-Baustein auf den Datenbus geschaltet und in der CPU weiter verarbeitet, beispielsweise in einer Variable gespeichert:

byte ein = PIND; // Einlesen von PD0..PD6

Um die TriState-Bausteine durch zu schalten wird die Adresse zum Lesen der PortD-Pins (0x10) auf den Adressbus gelegt und ein Decoder spricht genau auf diese Adresse an. Der Hersteller hat die Adressen festgelegt und zur einfachen Verwendung auch Namen dafür vergeben: Unter PIND (Port-IN D, Port D einlesen) ist in einer Definitionsdatei iotn2313.h unter vielen weiteren die Adresse 0x10 für PIND definiert.

Aufmerksame Leser werden sich bestimmt schon wundern, warum PD7 fehlt: Im ursprünglichen 2313 gab es keinen PortA. Reset, XTAL2, XTAL1 hatten keine Portfunktion, es fehlte schlicht ein Anschluß-Pin für PD7.

iotn2313.h anzeigen..

Nicht alle Pins beachten: Maskieren (Scheuklappen)

PIND x x x x x x y x
& 0 0 0 0 0 0 1 0
Ergebnis 0 0 0 0 0 0 y 0

Angenommen, es soll nur der Wert von PD1 im Programm verarbeitet werden. Alle anderen Pins interessieren nicht, sollen ausgeblendet (maskiert) werden:

if (PIND & 0b10)...

Info: In C ist 0 = false, alle anderen Werte werden als true interpretiert.

Mit dem bitweisen Und & können einfach alle anderen Bits auf 0 gesetzt werden. Alle Pins mit PIND einlesen und dann die uninteressanten Bits weg maskieren. Bei dem Ausdruck können im Ergebnis nur 2 Werte vorkommen : 0 oder 2.

Die Register für die Ausgaben: Beispiel DDRD und PORTD

Portpin

Nach dem Einschalten oder Reset haben alle Pins die Grundfunktion I/O-Pin und sind keine Ausgänge.

Um z.B. das Pin PD0 als Ausgang zu schalten muss in dem zugehörigen DataDirectionRegisterD (DDRD) das Bit 0 (DDD0) als 1 gesetzt werden. Dadurch wird an PD0 der Wert des PORTD-Register-Bits 0 ausgegeben.

DDRD bestimmt, welche Pins PDn Ausgänge sind,
PORTD enthält die Ausgabewerte der Pins

Interne PullUp-Widerstände einschalten

Ist ein Pin kein Ausgang wäre sein PORTD-Bit arbeitslos. Ein zuschaltbarer interner PullUp-Widerstand gibt ihm eine sinnvolle Aufgabe, ein externer Widerstand kann gespart werden...

Nicht immer ist ein PullUp-Widerstand erwünscht oder der interne Widerstand (20..50 kΩ) hat nicht den richtigen Wert.

PORTD bestimmt für Eingangs-Pins ob die internen PullUp-Widerstände zugeschaltet werden.

PullUp-Widerstände?

Der Wert eines unbeschalteten µC-Eingangs (CMOS-Technologie) ist unbestimmt. Kann 0 sein, kann 1 sein oder sich zwischen beiden Werten hin und her bewegen. Ein PullUp-Widerstand sorgt dafür, dass der Wert des Eingangs in diesem Fall 1 ist. Falls z.B. ein Taster gegen GND (0) am Eingang angeschlossen wird und betätigt ist zieht er den Wert auf 0. Ist er offen, zieht der PullUp den Wert wieder auf 1.

Zusatz-Info: Die Eingänge sind als Schmitt-Trigger ausgeführt. Bei VCC=5V nach Datenblatt: Low 2,2V; High 2,6V