Hallo Zusammen,
Ich hab nach einiger Zeit wieder mal was Programiert und es funzt nicht
so wie ich mir das vorstelle und ich weiß nicht mehr weiter.
Folgendes Problem: Ich möchte ein LIN Protokoll nachbilden und um die
Aufmerksamkeit meiner LIN-Bus-Teilnehmer zu wecken muss ich mindestens
13 byte hintereinander eine logische "0" auf den Bus legen. Zweimal
hintereinander "uart_putc(0x00);" geht nicht, zwischen den beiden kommt
immer ein kurzes "high" ...wegen stoppbit??
Dann dachte ich ok, clever, mach ich ein "uart_putc(0x00);" mit 4800
baud und schalte dan auf 9600 baud um und mach den rest. Das Programm
sieht so aus:
1 | #define Bd4800 0x67 // 4800Bd @ 8 MHz
|
2 | #define Bd9600 0x33 // 9600Bd @ 8 MHz
|
3 |
|
4 |
|
5 | void f_LINReq(void)
|
6 | {
|
7 | UBRR= Bd4800;
|
8 | uart_putc(0x00);
|
9 | asm volatile("nop"); // einfach mal zum Versuch etwas Zeit zu vertödeln.
|
10 | asm volatile("nop"); // vieleicht braucht es etwas Zeit um sich "einzuschwingen" ??
|
11 | UBRR= Bd9600;
|
12 | asm volatile("nop");
|
13 | asm volatile("nop");
|
14 | uart_putc(0x55);
|
15 | }
|
Geht aber auch nicht, das Programm schikt beide Bytes mit 9600baud raus,
die logische 0x00 dauert somit 920uS. Kommentiere ich aber die Zeile
UBRR= Bd9600; aus dan sendet es beide Bytes mit 4800 baud. Ganz ehrlich
ich versteh das nicht. Sieht hier jemand einen logischen Grund??
Danke und Gruß!