Heute mal eine Frage an jene, welche sich eher in ASM auskennen.
Ich habe folgende Tatsache.
Geschrieben habe ich mir mit Hilfe von einigen Mitgliedern folgende Funktion.
Code: Alles auswählen
procedure RgbShiftOut_L03;
var
p : ^byte;
byteCount : uint16;
bitCount, RGBdata : uint8;
begin
p := @Rgb_Line[3];
asm CLI end;
for byteCount := 0 to sizeof(Rgb_Line[3]) - 1 do begin
RGBdata := p^;
inc(p);
for bitCount := 0 to 7 do
if RGBdata and $80 > 0 then begin
asm
sbi 08, LED_03
nop
nop
nop
cbi 08, LED_03
end;
RGBdata := RGBdata shl 1;
end else begin
asm
sbi 08, LED_03
nop
cbi 08, LED_03
end;
RGBdata := RGBdata shl 1;
end;
end;
asm SEI end;
end;
Wie kann ich in einer Zeitkritischen Situation die Befehle sbi/cbi umgehen, und dennoch og Funktion bis zu 12 mal und ggf mehr zu nutzen, ohne diese entsprechend Kopieren zu müßen.
Unter Normalen Umständen würde ich eine Case verwenden, aber diese würde mein Timing bei 8MHz total in die Tonne drücken.
Da ich diese Funktion an einem ATMega328P betreibe, wo auch noch eine UART (rs232/485 - Protkoll) mitlaufen muß komme ich schon mal sehr schnell an die 4K im Flash und ich brauche noch ca 200-600 Byte für die Auswertung der empfangenen Daten.
Zusätzlich brauch ich aber noch 100 Byte für meine Terminal Debug-Ausgabe, welche ich zur Fehlersuche nutze.
Grüße und angenehmen Montag
Maik