nachdem ich den Blindfisch mit meinem Array hinbekommen habe, und die Daten auf meinem ATTiny85 PB3 ausgeben will, komme ich leider nicht drumrum, festzustellen, das das Array falsch übermittelt wird.

Vorweg.
habe meine Funktion so geschrieben, das ich diese auf einem ATMega mit 16 MHz testen und alle Fehler suchen kann, sowohl auch diese auf meinem kleinen Tiny laufen lasse.
Anzeige meiner UART
Code: Alles auswählen
/1\/1\/1\/1\/1\/1\/1\/0\/0\/1\/0\/0\/0\/0\/0\/0\/1\/0\/1\/0\/0\/0\/0\/0\111111100100000010100000#|-
Code: Alles auswählen
procedure Set_LED(g, r, b: byte);
var a, Rest : byte;
begin
{$if defined (ATMega16)}UARTSendChar('-');{$endif}
for a := 0 to 7 do begin
Rest := g mod 2;
{$if defined (ATTiny85)}
PORTB := PORTB or (1 shl LED);
{$endif}{$if defined (ATMega16)}
PORTC := PORTC or (1 shl LED);
UARTSendChar('/');
{$endif}
if Rest = 0 then begin
Data[a] := '0';
T0H;
{$if defined (ATTiny85)}
PORTB := PORTB and not (1 shl LED);
{$endif}{$if defined (ATMega16)}
UARTSendChar('0');
PORTC := PORTC and not (1 shl LED);
UARTSendChar('\');
{$endif}
T0L;
end
else begin
Data[a] := '1';
T1H;
{$if defined (ATTiny85)}
PORTB := PORTB and not (1 shl LED);
{$endif}{$if defined (ATMega16)}
UARTSendChar('1');
PORTC := PORTC and not (1 shl LED);
UARTSendChar('\');
{$endif}
T1L;
end;
{$if defined (ATMega16)}UARTSendChar(Data[a]);{$endif}
g := g div 2;
end;
{$if defined (ATMega16)}UARTSendChar('-');{$endif}
for a := 8 to 15 do begin
Rest := r mod 2;
{$if defined (ATTiny85)}
PORTB := PORTB or (1 shl LED);
{$endif}{$if defined (ATMega16)}
PORTC := PORTC or (1 shl LED);
UARTSendChar('/');
{$endif}
if Rest = 0 then begin
Data[a] := '0';
T0H;
{$if defined (ATTiny85)}
PORTB := PORTB and not (1 shl LED);
{$endif}{$if defined (ATMega16)}
UARTSendChar('0');
PORTC := PORTC and not (1 shl LED);
UARTSendChar('\');
{$endif}
T0L;
end
else begin
Data[a] := '1';
T1H;
{$if defined (ATTiny85)}
PORTB := PORTB and not (1 shl LED);
{$endif}{$if defined (ATMega16)}
UARTSendChar('1');
PORTC := PORTC and not (1 shl LED);
UARTSendChar('\');
{$endif}
T1L;
end;
{$if defined (ATMega16)}UARTSendChar(Data[a]);{$endif}
r := r div 2;
end;
{$if defined (ATMega16)}UARTSendChar('-');{$endif}
for a := 16 to 23 do begin
Rest := b mod 2;
{$if defined (ATTiny85)}
PORTB := PORTB or (1 shl LED);
{$endif}{$if defined (ATMega16)}
PORTC := PORTC or (1 shl LED);
UARTSendChar('/');
{$endif}
if Rest = 0 then begin
Data[a] := '0';
T0H;
{$if defined (ATTiny85)}
PORTB := PORTB and not (1 shl LED);
{$endif}{$if defined (ATMega16)}
UARTSendChar('0');
PORTC := PORTC and not (1 shl LED);
UARTSendChar('\');
{$endif}
T0L;
end
else begin
Data[a] := '1';
T1H;
{$if defined (ATTiny85)}
PORTB := PORTB and not (1 shl LED);
{$endif}{$if defined (ATMega16)}
UARTSendChar('1');
PORTC := PORTC and not (1 shl LED);
UARTSendChar('\');
{$endif}
T1L;
end;
{$if defined (ATMega16)}UARTSendChar(Data[a]);{$endif}
b := b div 2
end;
{$if defined (ATMega16)}for a:= 0 to 23 do UARTSendChar(Data[a]);{$endif}
end;
Code: Alles auswählen
procedure Set_LED(g, r, b: byte);
var a, Rest : byte;
begin
for a := 0 to 23 do Data[a]:= '0';
for a := 0 to 7 do begin
Rest := g mod 2;
if Rest = 0 then Data[a] := '0'
else Data[a] := '1';
g := g div 2;
end;
for a := 8 to 15 do begin
Rest := r mod 2;
if Rest = 0 then Data[a] := '0'
else Data[a] := '1';
r := r div 2;
end;
for a := 16 to 23 do begin
Rest := r mod 2;
if Rest = 0 then Data[a] := '0'
else Data[a] := '1';
r := r div 2;
end;
for a := 23 downto 0 do begin
{$if defined (ATTiny85)}
PORTB := PORTB
{$endif}{$if defined (ATMega16)}
PORTC := PORTC
{$endif} or (1 shl LED);
if Data[a] = '0' then begin
T0H;
{$if defined (ATTiny85)}
PORTB := PORTB
{$endif}{$if defined (ATMega16)}
PORTC := PORTC
{$endif} and not (1 shl LED);
T0L;
end
else begin
T1H;
{$if defined (ATTiny85)}
PORTB := PORTB
{$endif}{$if defined (ATMega16)}
PORTC := PORTC
{$endif} and not (1 shl LED);
T1L;
end;
end;
end;
Code: Alles auswählen
var Data : array [0..23] of char;
Code: Alles auswählen
procedure T0H; //0,35µs +-150ns
label
loop;
begin
asm
{$if defined (ATTiny85)}ldi r16, 21{$endif}
{$if defined (ATMega16)}ldi r16, 42{$endif}
loop:
dec r16
brne loop
end['r16'];
end;
procedure T0L; //0,9µS +-150ns
label
loop;
begin
asm
{$if defined (ATTiny85)}ldi r16, 54{$endif}
{$if defined (ATMega16)}ldi r16, 108{$endif}
loop:
dec r16
brne loop
end['r16'];
end;
procedure T1H; //0,9µS +-150ns
label
loop;
begin
asm
{$if defined (ATTiny85)}ldi r16, 54{$endif}
{$if defined (ATMega16)}ldi r16, 108{$endif}
loop:
dec r16
brne loop
end['r16'];
end;
procedure T1L; //0,35µs +-150ns
label
loop;
begin
asm
{$if defined (ATTiny85)}ldi r16, 21{$endif}
{$if defined (ATMega16)}ldi r16, 42{$endif}
loop:
dec r16
brne loop
end['r16'];
end;
Sicher werdet Ihr fragen, warum ich die UART nicht auch auf dem Tiny laufen lassen.
Da geb ich gerne und offen zu, das ich diese da nicht nicht auf die Kette bekommen habe.
Will es wie bei dem ATMega angehen.
Erst die Basics dann erweitern.