mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 8051 Interne Pullups


Autor: schurli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: programinator (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: schurli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
c515 von Infenion/Siemens

Autor: Johnny (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: schurli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Johnny

DANKE!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johnny (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus 8051 (markus_8051)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.