Michael N. schrieb:
> Wo liegt mein Fehler?
Das du nie gelernt hast, was Gültigkeitsbereiche sind (C-Grundlagen).
Die Sichtbarkeit bzw. Gültigkeit einer Variablen ist begrenzt! Nicht
jede Variable ist überall sichtbar.
Im wesentlichen kann man sagen, dass ein umschliessender {-} Block die
Sichtbarkeit und Gültigkeit einer Variablen begrenzt. In
if( i == 5 )
{
int j;
j = 8;
}
kommt die Variable j mit Beginn des { - Blockes zum Leben, existiert
dann in diesem Block und verschwindet beim } wieder. Genauso ist die
Sichtbarkeit geregelt: Diese Variable ist nur innerhalb dieses { }
Blocks sichtbar. Von ausserhalb dieses Blocks existiert diese Variable
nicht und sie ist auch von ausserhalb nicht sichtbar.
Und das gilt auf allen Ebenen!
In
1 | void foo()
|
2 | {
|
3 | int a, b;
|
4 |
|
5 | ...
|
6 | }
|
existieren die Variablen a und b nur innerhalb der Funktion und sie sind
auch nur innerhalb dieser Funktion sichtbar. Denn selbstverständlich ist
auch dieses { } ein Block von Anweisungen mit genau den gleichen
Eigenschaften wie jeder andere { } Block.
Hast du also
1 | int main(void)
|
2 | {
|
3 | volatile unsigned char actual_row=0;
|
4 |
|
5 | ...
|
6 | }
|
7 |
|
8 | ISR (TIMER1_COMPA_vect)
|
9 | {
|
10 | ...
|
11 |
|
12 | ... actual_row ...
|
13 |
|
14 | }
|
dann existiert actual_row aus Sicht der ISR-Funktion schlicht und
ergreifend nicht. Die Sichtbarkeit dieser Variablen ist durch den Block
in main() begrenzt. Ausserhalb dieser Funktion ist die Variable nicht
sichtbar.
Du musst also die Variable aus diesem Funktionsblock 'herausheben',
damit sie sowohl in main() als auch innerhalb der ISR Funktion sichtbar
ist
1 | volatile unsigned char actual_row=0;
|
2 |
|
3 | int main(void)
|
4 | {
|
5 |
|
6 | ...
|
7 | }
|
8 |
|
9 | ISR (TIMER1_COMPA_vect)
|
10 | {
|
11 | ...
|
12 |
|
13 | ... actual_row ...
|
14 |
|
15 | }
|
und nein: volatile hat damit erst mal nichts zu tun. volatile löst ein
ganz anderes Problem.