matrix schrieb:
> Mhh eigentlich hast du recht. Aber müsste ich bei den Funktionen nicht
> auch mit einer variablen Bitzahl schieben? (Warum sollte man das
> überhaupt vermeiden?)
Weil dein AVR auf Assembler Ebene dafür keine Instruktion hat, sondern
der Compiler das mit einer Schleife umsetzen muss.
>
>
1 | void setPixel(uint8_t x, uint8_t y) {
|
2 | > spaltenmuster[y] = (1 << x); //wobei hier das Problem wäre das 0,0
|
3 | > nicht links oben ist?
|
4 | > }
|
* Das Problem lässt sich aber lösen.
Du bist der Programmierer, du kannst das zurechtbiegen
* Ja, du musst auch hier variabel schieben. Klar.
In der Programmierung gibt es aber eine schöne 'Faustregel', die da
"Time for Space" lautet.
Man meint damit: Durch den Einsatz von Speicherplatz kann man oft
Laufzeit sparen und umgekehrt.
1 | uint8_t Shift[] = ( 1 << 0, 1 << 1, 1 << 2, 1 << 3,
|
2 | 1 << 4, 1 << 5, 1 << 6, 1 << 7 };
|
das sind zb alle Bitmuster, die mit Verschiebungen on 0 bis 7 Bit
möglich sind.
Anstelle von
1 << x
kann man daher auch schreiben
Shift[x];
und kriegt dasselbe. Nur eben schneller.
Allerdings muss das in deiner ISR nicht so aufwändig gemacht werden. Du
weißt ja, dass active_zeile nicht wild hin und her springt, sondern
geordnet immer um 1 höher wird. WEnn du dir daher die Maske aufhebst und
die Maske immer nur um 1 Stelle nach links verschiebst, hast du dasselbe
Ergebnis, als wie wenn du 1 << active_zeile jedesmal neu berechnest.
1 | ISR( .... )
|
2 | {
|
3 |
|
4 | PORTC = 0xFF;
|
5 | PORTD = 0xFF;
|
6 |
|
7 | aktive_zeile++;
|
8 | maske <<= 1;
|
9 |
|
10 | if( aktive_zeile == 11 ) {
|
11 | aktive_zeile = 0;
|
12 | maske = 0x01;
|
13 | }
|
14 |
|
15 | PORTA = maske;
|
16 | PORTF = maske >> 8;
|
17 |
|
18 | PORTC = ~spaltenmuster[aktive_zeile];
|
19 | PORTD = ~spaltenmuster[aktive_zeile] >> 8;
|
20 | }
|