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
wenn man so etwas optimieren soll, ist das wissen über die verwendete Hardware notwendig. Was für eine µC?
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.
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;
was es mit dem loop auf sich hat hab ich nicht verstanden. Ich programmier das im CCS ( also in c)
Abstrakte Schreibweise. Bisschen was von der Hausaufgabe solltest du schon selber schaffen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.