Hi,
ich habe genau 2048 AVR CPU Takte(16Mhz) Zeit um 864 Bits per USART
(SPI-Mode) zu schreiben. Die Daten liegen in 3 Array's (hier a,b,c).
Die SPI Schnittstelle läuft mit 8MHz.
Aktuell arbeitet mein Code so:
[0xCE bzw. 206 ist das USART Puffer-Register]
1 |
|
2 | asm volatile ( "lds r24,a" "\n\t" //206 = r[0][0]; 2Tick
|
3 | "sts 0xCE,r24" "\n\t" // 2Tick
|
4 | "nop" "\n\t"
|
5 | "nop" "\n\t");
|
6 |
|
7 | asm volatile ( "lds r24,a+1" "\n\t" //206 = r[0][1]; 2Tick
|
8 | "sts 206,r24" "\n\t" // 2Tick
|
9 | "nop" "\n\t" // 1Tick
|
10 | "nop" "\n\t" // 1Tick
|
11 | "nop" "\n\t" // 1Tick
|
12 | "nop" "\n\t" // 1Tick
|
13 | "nop" "\n\t" // 1Tick
|
14 | "nop" "\n\t" // 1Tick
|
15 | "nop" "\n\t" // 1Tick
|
16 | "nop" "\n\t" // 1Tick
|
17 | "nop" "\n\t" // 1Tick
|
18 | "nop" "\n\t" // 1Tick
|
19 | "nop" "\n\t" // 1Tick
|
20 | "nop" "\n\t" // 1Tick
|
21 | "nop" "\n\t" // 1Tick
|
22 | "nop" "\n\t"); // 1Tick
|
23 | asm volatile ( "lds r24,a+2" "\n\t" //206 = r[0][2]; 2Tick
|
24 | "sts 206,r24" "\n\t" // 2Tick
|
25 | "nop" "\n\t" // 1Tick
|
26 | "nop" "\n\t" // 1Tick
|
27 | "nop" "\n\t" // 1Tick
|
28 | "nop" "\n\t" // 1Tick
|
29 | "nop" "\n\t" // 1Tick
|
30 | "nop" "\n\t" // 1Tick
|
31 | "nop" "\n\t" // 1Tick
|
32 | "nop" "\n\t" // 1Tick
|
33 | "nop" "\n\t" // 1Tick
|
34 | "nop" "\n\t" // 1Tick
|
35 | "nop" "\n\t" // 1Tick
|
36 | "nop" "\n\t" // 1Tick
|
37 | "nop" "\n\t" // 1Tick
|
38 | "nop" "\n\t"); // 1Tick
|
39 | ...
|
40 | //Array b und c analog
|
Leider bin ich mir unsicher ob er funktioniert, daher ob nach 16 Ticks
das Puffer-Register wieder frei ist.
Zudem verbrauche ich so 18 Ticks pro Byte, was mit Overhead grob
2000Ticks in Summe macht. Könnte ziemlich knapp werden...
Kennt jemand eine bessere Methode/Verbesserungen?
Ps. Später reiner ASM, das ganze soll in eine Interrupt Funktion