Witam.
Deklaruję zmienna "napiecie" w pliku nagłówkowym main.h gdy ją odczytuję w pliku main.c w pętli głównej po zmianie jej wartości w funkcji przerwania jest wszystko ok, czyli zmienia swoja wartość.
Zmieniając deklaracje tej zmiennej na zmienna tablicową z
na
też jest wszystko ok. (oczywiście w funkcji programu przy każdej próbie jest ustawiany odpowiedni typ zmiennej.)
Gdy zmienna "napiecie" jest utworzona jako zmienna tablicowa to w programie w funkcji głównej odczytuje ją poprawnie jako wskaźnik (dokładnie to jego wartość) i po zmianie jej wartości używając jej wskaźnika w funkcji przerwania też działa wszystko ok.
Problem pojawia się gdy w pliku nagłówkowym zmienię deklarację tej zmiennej na zmienna wskaźnikową za pomocą:
Wtedy zmieniając jej wartość w przerwaniu, w pętli głównej programu nie odczytuje tej zmienionej wartości. Wygląda to tak jakby przerwanie operowało na innej zmiennej wskaźnikowej *napiecie niż funkcja main() mimo jej deklaracji w pliku nagłówkowym.
Funkcja przerwania od ADC:
Program, a dokładnie jego części wstawiłem poglądowo. Wiem czym są wskaźniki i używałem ich dużo razy. Mimo to nie potrafię zrozumieć dlaczego tak się dzieje jak tekście powyżej.
Deklaruję zmienna "napiecie" w pliku nagłówkowym main.h gdy ją odczytuję w pliku main.c w pętli głównej po zmianie jej wartości w funkcji przerwania jest wszystko ok, czyli zmienia swoja wartość.
Zmieniając deklaracje tej zmiennej na zmienna tablicową z
uint32_t napiecie;na
uint32_t napiecie[1];też jest wszystko ok. (oczywiście w funkcji programu przy każdej próbie jest ustawiany odpowiedni typ zmiennej.)
Gdy zmienna "napiecie" jest utworzona jako zmienna tablicowa to w programie w funkcji głównej odczytuje ją poprawnie jako wskaźnik (dokładnie to jego wartość) i po zmianie jej wartości używając jej wskaźnika w funkcji przerwania też działa wszystko ok.
Problem pojawia się gdy w pliku nagłówkowym zmienię deklarację tej zmiennej na zmienna wskaźnikową za pomocą:
uint32_t *napiecie;Wtedy zmieniając jej wartość w przerwaniu, w pętli głównej programu nie odczytuje tej zmienionej wartości. Wygląda to tak jakby przerwanie operowało na innej zmiennej wskaźnikowej *napiecie niż funkcja main() mimo jej deklaracji w pliku nagłówkowym.
Funkcja przerwania od ADC:
ISR(ADC_vect)
{
*napiecie= ADCW; // Przeladowanie wartosci z ADC
}
int main(void)
{
/********
tutaj zawarta jest konfiguracja ADC oraz zalaczenie LCD*/
while(1)
{
wyslij_Liczbe_LCD(*napiecie);
}
}
Program, a dokładnie jego części wstawiłem poglądowo. Wiem czym są wskaźniki i używałem ich dużo razy. Mimo to nie potrafię zrozumieć dlaczego tak się dzieje jak tekście powyżej.