Hab' mir nochmal angesehen, warum Dein Code so langsam ist. Hier:
...dass aus 2 schnöden Takten, oft genug durchlaufen, schnell mal 1000 werden.
hatte ich bereits richtig geraten. Auch wenn ich die (mFlag<<M) Geschichte nicht gut finde, weil er da in einer Schleife schiebt, was völlig unnötig ist, da vermeidbar, so wird dieser Teil nicht oft durchlaufen.
Das Problem macht dies hier:
Code:
mov r25,r21
ldi r24,k00
subi r24,k00
sbci r25,kFF
Denn das wird 40 mal pro ISR eingebaut und ist das Resultat aus:
Code:
: "r" (&font[charRow][0]), "r" (tempChar) \
So etwas kannst Du vermeiden, indem Du zu Beginn der ISR die globale Variable in eine lokale kopierst und am Ende wieder zurück. Damit erlaubst Du dem Compiler zu optimieren, d.h. diese lokale Variable in einem Prozessorregister zu halten.
Code:
#define char_put() \
...
: "r" (&font[l_charRow][0]), "r" (tempChar) \
...
}
ISR(TIMER0_OVF_vect)
{
unsigned char l_charRow = charRow;
...
if(l_charRow==CHAR_HEIGTH)
...
l_charRow=0;
...
l_charRow++;
charRow = l_charRow;
}
Spart pro ISR-Lauf ca. 160 Takte, macht dann bei 12 x 20 x 75 = ~2900000 Takte
Lesezeichen