Forum: Mikrocontroller und Digitale Elektronik Bit-Manipulationen


von Chris K. (stubenhocker)


Lesenswert?

Hallo zusammen,

ich muss auf einem µC ohne Hardware UART eine UART Verbindung 
Softwaremäßig emulieren. Der Einfachheit halber (soll für Studenten in 
kurzer zeit verständlich sein) soll es auch ohne Interrupts 
funktionieren. Mit festgelegten Datenworten funktioniert das ganze auch 
schon sehr gut. Da der µC aber mit 1 MHz recht langsam ist und die 
Verbindung 9600Baud haben soll, muss das setzen/löschen des Tx Signales 
immer in einer definierten Zeit passieren (möglichst nur 1-3 
Taktzyklen). Deshalb suche ich eine Möglichkeit die bits des P1OUT 
Registers in Abhängigkeit vom zu sendenden Datenwort zu setzen oder 
Löschen.


P1OUT (Logische operation)  -> Bit2 des Registers soll 1 sein wenn das 
Bit im Datenwort eins ist und 0 sein wenn das bit im Datenwort 0 ist.



gibt es da eine Möglichkeit?

Grüße

von Peter II (Gast)


Lesenswert?

wenn man so etwas optimieren soll, ist das wissen über die verwendete 
Hardware notwendig. Was für eine µC?

von Chris K. (stubenhocker)


Lesenswert?

ist ein MSP430G2231

von Chris K. (stubenhocker)


Lesenswert?

Vielleicht, um es noch mal auf den Punkt zu bringen.

Ich suche eine Logische Operation mit der ich ein Bit sowohl setzen als 
auch löschen kann durch Verknüfung mit einem anderen  Register

also   z.b. RegisterA (logische Verknüpfung mit) RegisterB -> nur  Bit 2 
gesetzt alle anderen unverändert


RegisterA (selbe logische Verknüpfung mit) RegisterC ->nur Bit 2 
gelöscht

alle anderem Bits in register a sollen unverändert bleiben

von Falk B. (falk)


Lesenswert?

@Chris Keppler (stubenhocker)

>Ich suche eine Logische Operation mit der ich ein Bit sowohl setzen als
>auch löschen kann durch Verknüfung mit einem anderen  Register

Siehe Bitmanipulation

>also   z.b. RegisterA (logische Verknüpfung mit) RegisterB -> nur  Bit 2
>gesetzt alle anderen unverändert

>RegisterA (selbe logische Verknüpfung mit) RegisterC ->nur Bit 2
>gelöscht

Geht mal rein logisch nicht, du MUSST zwischen löschen und setzen 
unterscheiden. Klassisch macht man das so.

1
if (data & 1) 
2
  port |= 0x01;
3
else
4
  port &= ~0x01

Nun kann man schauen, wie groß der Unterschied der beiden Pfade ist, 
ggf. muss man mit NOPs an der richtigen Stelle ausgleichen.

von (prx) A. K. (prx)


Lesenswert?

Falk Brunner schrieb:
> Geht mal rein logisch nicht, du MUSST zwischen löschen und setzen
> unterscheiden.

Türlich geht das. Beispiel für Pin 0:

temp = port & ~1;
loop
  port = temp | bits & 1;
  bits >>= 1;

von Falk B. (falk)


Lesenswert?

Hmm, stimmt ;-)

von Chris K. (stubenhocker)


Lesenswert?

was es mit dem loop auf sich hat hab ich nicht verstanden. Ich 
programmier das im CCS ( also in c)

von (prx) A. K. (prx)


Lesenswert?

Abstrakte Schreibweise. Bisschen was von der Hausaufgabe solltest du 
schon selber schaffen.

von Peter D. (peda)


Lesenswert?

1
void sputchar( uint8_t c )
2
{
3
  c = ~c;
4
  STX_PORT &= ~(1<<STX_BIT);            // start bit
5
  for( uint8_t i = 10; i; i-- ){        // 10 bits
6
    _delay_us( 1e6 / BAUD );            // bit duration
7
    if( c & 1 )
8
      STX_PORT &= ~(1<<STX_BIT);        // data bit 0
9
    else
10
      STX_PORT |= 1<<STX_BIT;           // data bit 1 or stop bit
11
    c >>= 1;
12
  }
13
}

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.