Frage

Ich bin mit einem IC, DS1620 1 Bit seriellen Daten auf einer einzigen Zeile kommen zu lesen. Ich brauche diese Daten zu lesen, mit einem der Ports von ARM Mikrocontroller (LPC2378). ARM-Ports sind 32 Bit. Wie kann ich diesen Wert in ein 1-Bit-Variable erhalten?

Edit: Mit anderen Worten muss ich einen direkten Verweis auf einen Port-Pin

.
War es hilfreich?

Lösung

gibt es keine 1-Bit-Variablen, aber Sie könnten ein bestimmtes Bit zum Beispiel isolieren:

uint32_t original_value = whatever();
uint32_t bit15 = (original_value >> 15) & 1; /*bit15 now contains either a 1 or a 0 representing the 15th bit */

Hinweis: Ich weiß nicht, ob Sie Bit-Zahlen bei 0 oder 1, beginnend gezählt wurden, so dass die >> 15 aus um eine sein kann, aber Sie bekommen die Idee

.

Die andere Option ist Bitfelder zu verwenden, aber das wird chaotisch und IMO ist es nicht wert, solange nicht jedes Bit in dem Wert in irgendeiner Weise nützlich ist. Wenn Sie wollen einfach nur ein oder zwei Bits, Verschieben und Maskierung ist der Weg zu gehen.

Insgesamt ist dieses Artikel für Sie von Nutzen sein kann.

Andere Tipps

Für Ihre CPU die Antwort von Evan Teran verwendet werden. Ich wollte nur die Bit-Band-Funktion einiger anderer ARM-CPUs wie dem Cortex-M3 erwähnen. Aus irgendeinem Bereich des RAM / Peripherie sind alle Bits an eine separate Adresse für den einfachen Zugriff zugeordnet.

Siehe http: / für weitere Informationen /infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0337e/Behcjiic.html.

Es ist ganz einfach, wenn Sie direkt der Hafen registrieren zugreifen können (ich habe keine Erfahrung mit ARM), nur bitweise UND es mit der binären Maske, die den Bit entspricht, das Sie wollen:

var = (PORT_REGISTER & 0x00008000);

var enthält entweder 0, wenn das 15. Bit '0' oder 0x00008000 wenn das 15. Bit '1' ist.

Auch können Sie es verschieben, wenn Sie wollen entweder ‚0‘ oder ‚1‘:

var = ((PORT_REGISTER & 0x00008000) >> 15);

Die Header-Datei (en), die mit dem Compiler kommen enthält Erklärungen für alle Register des Mikrocontrollers, und die Bits in diesen Registern.

In diesem speziellen Artikel, lassen Sie uns so tun, dass der Port Eingangsregister wird PORTA genannt, und das Bit Sie hat definiert eine Maske wollen es PORTA15 genannt.

Dann den Zustand dieses Stift zu lesen:

PinIsSet = (PORTA & PORTA15) == PORTA15;

oder äquivalent mit dem ternärem Operator :

PinIsSet = (PORTA & PORTA15) ? 1 : 0;

Als allgemeine Punkt finden Sie im Referenzhandbuch für das, was alle Register und Bits zu tun. Außerdem sehen Sie einige Beispiele. ( Diese Seite auf der Keil Website beide enthält, und es gibt viele andere Beispiele im Web.)

In LPC2378 (wie die anderen LPC2xxxx Mikrocontroller-Familie), I / O-Ports im Systemspeicher sind, so dass Sie einige Variablen wie folgt erklären müssen:

#define  DALLAS_PIN (*(volatile unsigned long int *)(0xE0028000)) /* Port 0 data register */
#define  DALLAS_DDR (*(volatile unsigned long int *)(0xE0028008)) /* Port 0 data direction reg */
#define  DALLAS_PIN (1<<15)

Bitte beachten Sie, dass 0xE0028000 die Adresse für das Datenregister von port0 ist, und 0xE0028008 ist die Datenrichtungsregister-Adresse für port0. Sie müssen dies nach dem Hafen und Bit in Ihrer Anwendung verwendet ändern. Danach wird in der Code-Funktion, schreiben Sie den Code oder Makros für Schreib 1, 0 und lesen so etwas wie dieses:

#define  set_dqout()    (DALLAS_DDR&=~DALLAS_PIN)   /* Let the pull-up force one, putting I/O pin in input mode */
#define  reset_dqout()  (DALLAS_DDR|=DALLAS_PIN,DALLAS_PORT&=~DALLAS_PIN) /* force zero putting the I/O in output mode and writing zero on it */
#define  read_dqin()    (DALLAS_DDR&=~DALLAS_PIN,((DALLAS_PORT & DALLAS_PIN)!= 0)) /* put i/o in input mode and test the state of the i/o pin */

Ich hoffe, das helfen kann.

Viele Grüße!

Wenn der Test für Bits, ist es gut im Auge zu behalten die Betreiber Auswertung Reihenfolge C, z.B.

if( port & 0x80 && whatever() )

kann zu unerwartetem Verhalten führen, wie Sie gerade geschrieben

if( port & (0x80 && whatever()) )

aber wahrscheinlich ment

if( (port & 0x80) && whatever() )
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top