Forum: Mikrocontroller und Digitale Elektronik 8051 Interne Pullups


von schurli (Gast)


Lesenswert?

Hi

Weiß jemand wie man bei einem 8051 die Internen Pullups in C aktivieren
kann?

In main() kann man P1=0xFF schreiben um alle Pullups für Port1 zu
aktivieren.

Wie aktiviert man einen einzelnen Pin von Port1 in C?

Danke für die Antworten!

von programinator (Gast)


Lesenswert?

Moin,

erzähl doch erst mal, welchen Controller du da liegen hast. Typ und
Hersteller sind wichtig ! Vielleicht kann man dann deine Frage
beantworten.

von schurli (Gast)


Lesenswert?

c515 von Infenion/Siemens

von Johnny (Gast)


Lesenswert?

Hallo

Wenn Du die 0xff Hexzahl in eine binäre Zahl umwandelst, dann
entspricht jedes Bit einem Port-Pin.

Also P1=0x01 würde nur den ersten Pin ansteuern, P1=0x02 den zweiten,
P1=0x03 den ersten und zeiten.....

Wenn Du nicht alle Pins gleichzeitig setzen willst, dann kannst Du
einzelne setzen/löschen, indem Du dies mit binären UND oder ODER
Verknüpfungen realisierst.

Also sagen wir, Bit 0 und Bit 1 sind gesetzt, also P1 = 0x03 und Du
willst nur Bit 0 wieder auf 0 setzen, dann machst Du das so:

P1 = P1 & ~0x01;

Man nimmt also den aktuellen Zustand von P1 und macht eine UND
Verknüpfung mit b11111110 (die Wellenlinie invertiert den Wert), somit
wird das Bit 0 gelöscht.

Um es wieder zu setzen, einfach eine ODER verknüpfung machen:

P1 = P1 | 0x01;

..und das Bit 0 ist wieder gesetzt.

Das geht so mit allen Bits bzw. Pins.

Gruss
Johnny

von schurli (Gast)


Lesenswert?

@Johnny

DANKE!

von Peter D. (peda)


Lesenswert?

Achtung !

An P0 lassen sich keine Pullups aktivieren, weil da sind keine drin.

Bertrifft aber nur moderne Typen mit internem Flash.
Die alten ROM-less Dinger verschwenden ja P0 und P2 für den externen
Flash.


Peter

von Mike (Gast)


Lesenswert?

Seid ihr sicher, das das so klappt?

Ich bin der Meinung, der 8051iger hat Open-Collector Ausgänge. und
keine Ausgangsregister. Dadurch läßt sich der aktuelle Zustand eines
Pins nicht unbedingt wieder einlesen.

Wenn du also einzelnen Pin setzen oder löschen willst, mußt du entweder
ein eigenes Pinregister führen, oder es gibt compiler, die die Pins
einzeln ansprechen können. µVision konnte das allerdings mußten die Pin
da vorher definiert werden und ich weiß gerade nicht mehr, wie das ging.

von Johnny (Gast)


Lesenswert?

Ach so. Gibts denn bei den 8051er keine separaten Ein- und
Ausgaberegister für die I/O's?

von Peter D. (peda)


Lesenswert?

Der 8051 hat Read-Modify-Write-Instruktionen, die das Ausgangsregister
lesen und ändern.

Es ist also gefahrlos möglich, mit SETB, CLR, XRL, ANL, ORL nur
bestimmte Pins zu ändern, ohne Pins zu beeinflussen, die extern low
gezogen werden.


In C:
Willst Du einen Pin auf Low, nen andern auf High ziehen, mußt Du das
hintereinander machen:

P2 |= 0x01;
P2 &= ~0x02;

Falsch (wenn Pins des gleichen Ports extern low gezogen werden) wäre:

P2 = P2 & ~0x02 | 0x01;

da dann das Eingangsregister gelesen wird. Damit würden alle extern low
gezogenen Pins nun zu low aktiven Ausgängen.


Peter

von Markus 8. (markus_8051)


Lesenswert?

Die meisten C-Compiler verstehen hier auch ein:

P1.3 = 0
P1.4 = 1
P1_3 = 1

das wird dann auf jedenfall mit setb bzw clr übersetzt.

Markus_8051

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.