logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

ATMEGA8535 - Wskaźnik uint32_t *napiecie nie aktualizuje się w pętli głównej

laki_17 31 Gru 2013 14:42 981 4
REKLAMA
  • #1 13119840
    laki_17
    Poziom 17  
    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
    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.
  • REKLAMA
  • Pomocny post
    #2 13119855
    excray
    Poziom 41  
    Nie bardzo rozumiem Twój tok postępowania. Dlaczego nie zadeklarujesz zmiennej globalnej typu volatile?
  • REKLAMA
  • REKLAMA
  • Pomocny post
    #4 13120549
    pbuhne
    Poziom 15  
    uint32_t *napiecie; jest WSKAŹNIKIEM na zmienną typu uint32_t. Nie jest zmienną!
    Żeby wszystko grało, trzeba ten wskaźnik ustawić na jakiś adres, np.:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Pozdrawiam
  • #5 13126189
    laki_17
    Poziom 17  
    Witam.
    Jeśli chodzi o zmienna typu volatile to często używam tego oznacznika. Moje pytanie dotyczyło bezpośrednio utworzenia wskaźnika w pliku nagłówkowym gdyż było dla mnie to nie jasne dlaczego odwołując się do niego nie otrzymujemy poprawnej odpowiedzi w programie.
    Koledzy macie w 100% racje z tym, że stworzyłem tylko wskaźnik, a nie zmienna. Problem rozwiązany.
    Dziękuję za odpowiedzi i pozdrawiam gorąco.
REKLAMA