Bit-Manipulationen

OP #3213497
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
OP
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
@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.
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
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.