Hier probiere ich es mal mit einem Empfangspuffer.
Nur kommt leider kommt im Schnitt jedes 20igste Zeichen fehlerhaft an.
Es spielt keine Rolle, ob ich es 9600 oder 115200 Baud mache.
Code: Alles auswählen
const
PB5 = 5;
UCSZ01 = 2; // Gibt es nicht in der Unit Atmega328p.
CPU_Clock = 16000000; // Taktfrequenz Arduino, default 16MHz.
Baud = 115200; // Baudrate
// Baud = 9600; // Baudrate
teiler = CPU_Clock div (2 * Baud) - 1;
var
zeiger: integer;
buf: array[0..255] of byte;
procedure UART_RX_Empfang; public Name 'USART__RX_ISR'; interrupt;
begin
buf[zeiger] := UDR0;
Inc(zeiger);
end;
procedure UARTInit;
begin
UBRR0 := teiler;
UCSR0A := UCSR0A or (0 shl U2X0);
UCSR0B := UCSR0B or (1 shl TXEN0) or (1 shl RXEN0) or (1 shl RXCIE0);
UCSR0C := UCSR0C or (1 shl UMSEL0) or (1 shl UCSZ01) or (1 shl UCSZ0);
DDRD := DDRD or (1 shl 4);
end;
procedure UARTSendChar(c: char);
begin
while UCSR0A and (1 shl UDRE0) = 0 do begin
end;
UDR0 := byte(c);
end;
function UARTReadChar: char;
begin
while UCSR0A and (1 shl RXC0) = 0 do begin
end;
Result := char(UDR0);
end;
procedure UARTSendString(s: ShortString);
var
i: integer;
begin
for i := 1 to length(s) do begin
UARTSendChar(s[i]);
end;
end;
var
i: integer;
begin
DDRB := DDRB or (1 shl UMSEL0); // Pin 13 Output
zeiger := 0;
cli;
UARTInit;
sei;
repeat
if zeiger > 3 then begin
for i := 0 to 3 do begin
UARTSendChar(char(buf[i]));
end;
UARTSendString(' Hello World !'#13#10);
zeiger := 0;
end;
until 1 = 2;
end.
Wen ich konstant die 'x' drücke, bekomme ich folgende Ausgabe.
Ich kann auch ein anderes Zeichen drücken, dies spielt keine Rolle.
Was habe ich übersehen ?
Code: Alles auswählen
xxxx Hello World !
xxxx Hello World !
x�xx Hello World !
xxxx Hello World !
xxx� Hello World !
xxxx Hello World !
xxxx Hello World !
xxxx Hello World !
xx�x Hello World !
xxx� Hello World !
xxxx Hello World !
�xxx Hello World !
x�xx Hello World !
xxxx Hello World !
xxxx Hello World !
xxxx Hello World !
xxxx Hello World !
xxxx Hello World !
xxxx Hello World !
xxxx Hello World !
�xxx Hello World !
Ein zweiter Versuch, ich gebe aus was gerade rein kommt.
Hier kommt jedes Zeichen falsch raus.
Wen ich zB. die 'x' drücke, dann kommen fast alles 'y'. Zwischen durch kommt mal ein 'x' raus.
Weiter Ausgaben:
e --> u
a --> e
i --> m
Code: Alles auswählen
procedure UART_RX_Empfang; public Name 'USART__RX_ISR'; interrupt;
begin
UARTSendChar(char( UDR0));
end;
Könnte dies einen Zusammenhang mit UDR0 haben ?
Da ich fast gleichzeitig lese und schreibe ?