Haburt schrieb:
> Der Delay ist da um das Aufleuchten der LED zu sehen.
Dann schalte halt ganz einfach die LED um, anstatt sie bei jedem
Gleichstand ein/aus zu schalten.
1 | ...
|
2 |
|
3 | if( count == 1600 )
|
4 | PORTA ^= ( 1 << PA0 );
|
5 | ...
|
dann siehst du deine LED im 1 Sekundentakt blinken.
> Der Plan ist später eine LED-Matrix anzusteuern
spätestens jetzt muss ich dir sagen:
Interrupts, Interrupts, Interrupts.
Alles andere ist Unsinn. Wer eine Matrix, bzw. generell Multiplexing,
ohne Timer-Interrupt macht, hat etwas ganz wesentliches nicht begriffen.
> Jede LED leuchtet für 2 der 20 Zählschritte auf, mit Interrupts müsst
> ich ja den Timer bis bis 2 Zählen lassen und die Interrupts mindestenz 9
> mal zählen lassen.
Nö.
In einem Interrupt Aufruf wird eine komplette Zeile der Matrix
eingeschaltet. Die leuchtet dann so lange, bis der nächste Interrupt
kommt. Dann wird auf die nächste Zeile weiter geschaltet. D.h. bei einer
3*3 Matrix sieht die Interrupt Routine so aus
1 | ISR( ... )
|
2 | {
|
3 | aktuelle Zeile abschalten
|
4 |
|
5 | Zeilenummer++;
|
6 | if( Zeilennummer == 3 )
|
7 | Zeilennummer = 0;
|
8 |
|
9 | Led_Muster für die Zeile 'Zeilennummer' ausgeben
|
10 |
|
11 | Zeile 'Zeilennummer' aktivieren
|
12 | }
|
da wird nirgends gewartet.
So wird das gemacht und genau so funktioniert das auch zuverlässig.
Die Technik mit: Ich lasse je nach Bedarf eine LED nach der anderen
leuchten, ist nicht vernünftig. Das mag bei einer 3*3 Matrix gerade noch
so funktionieren, aber bei einer nur ein bischen größeren Matrix versagt
das kläglich. Also mach es gleich richtig und lern, wie man das richtig
macht.
> Mir ist bewusst dass es bessere Wege gibt, z.B. Iterrieren einer Seite,
> aber für Lernzwecke möchte ich es zunächst so betreiben.
Genau darum geht es. Deine Lernzwecke führen dich jetzt genau in die
Richtung, wie man eine Matrix-Ansteuerung NICHT macht.