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!
Moin, erzähl doch erst mal, welchen Controller du da liegen hast. Typ und Hersteller sind wichtig ! Vielleicht kann man dann deine Frage beantworten.
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
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
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.
Ach so. Gibts denn bei den 8051er keine separaten Ein- und Ausgaberegister für die I/O's?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.