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

AVR-GCC - błąd initializer element is not constant przy deklaracji zmiennej

scrobik 24 Sty 2014 23:03 1785 11
  • #1 13216447
    scrobik
    Poziom 11  
    W pliku *. h deklaruje

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


    po kompilacji w AVR studio 6 wyskakuje błąd:
    initializer element is not constant

    Czym może to być spowodowane
    Dziękuje za podpowiedz
    [/code]
  • #3 13216588
    scrobik
    Poziom 11  
    wszystko w pliku *.h

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

    dodanie nawiasów nic nie zmienia

    Jestem początkujący i czegoś nie wiem jeszcze

    Jak do tempa skopiować stan z portu PORTC ?

    chyba ze te deklarację temp trzeba dać w main() ???
  • Pomocny post
    #4 13216624
    dondu
    Moderator na urlopie...
    Zacznij od poznania języka C w CManiaku masz wiele przykładów, które można kompilować i modyfikować: http://mikrokontrolery.blogspot.com/2011/02/kurs-jezyka-c-spis-tresci.html

    Twój kod odpowiada następującemu:

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


    Wykonujesz zupełnie sprzeczne z sobą działania używając dwukrotnie przypisania. Co ma na celu ta linijka w Twoim zamyśle? Co chciałeś nią osiągnąć?


    scrobik napisał:
    Jak do tempa skopiować stan z portu PORTC ?

    o tak:

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

    ... tylko czy na pewno chcesz PORTC, a nie PINC - i tu wracam do pytań, które zadałem powyżej, bo coś mi się zdaje, że chcesz do temp załadować tylko stan bitu PC0, do którego podłączony jest na przykład przycisk.
  • Pomocny post
    #5 13217445
    BlueDraco
    Specjalista - Mikrokontrolery
    1. W pliku .h nie powinno być żadnych definicji zmiennych, a to właśnie zrobiłeś. Definicje umieszcza się w plikach .c.

    2. Zgaduję, że ma to być zmienna statyczna, więc w jej definicji możesz podać wartość początkową, która ma być jej nadana przed rozpoczęciem wykonania programu. Musi to być stała, bo przed rozpoczęciem wykonania programu nie można przypisać do zmiennej stanu innej zmiennej (w tym przypadku portu). Dokładnie to oznacza komunikat kompilatora.
  • #6 13219922
    scrobik
    Poziom 11  
    Chodzi mi o to, że mam układ hardware, gdzie segmenty wyświetlacza podłączone są część do portu D, część do Portu B. W necie Jest wiele opisów programów ale wszystkie pokazują jak działa program kiedy wszystkie segmenty wyświetlacza są podłączone do jednego portu. Zaprezentuje kawałki kodu i proszę o modyfikację aby to działało chodzi o idee dla dwóch segmentów.

    w pliku *.h :

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


    w pliku led.c

    Funkcja wywoływana na początku w main:

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


    w pliku main.c:

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



    Dziękuję za pomoc
    pozdrawiam
  • Pomocny post
    #7 13221158
    BlueDraco
    Specjalista - Mikrokontrolery
    const struct {
    uint8_t portd, portb;
    } znaki[2] PROGMEM = {
    {~_BV(Led_E), 0xff}
    {0xff, ~_BV(Led_F)}
    };

    A w przerwaniu coś podobnego do:

    PORTX = 0; // najpierw wyłącz cyfry
    // wystaw segmenty
    PORTB = pgm_read_byte( &(znaki[licznik].portb));
    PORTD = pgm_read_byte( &(znaki[licznik].portd));
    PORTX = 1 << licznik;// włącz nową cyfrę, np.


    przy założeniu, że "licznik" jest, zgodnie z nazwą, licznikiem, a nie maską wyboru cyfry.
  • #8 13223120
    scrobik
    Poziom 11  
    Dzięki za zainteresowanie. Daje to do myślenia. Ale jeszcze zapytam się bo widzę, że w przerwaniu następuje :
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    przypisanie do portu B.

    A co jeśli jeden znak składa się z segmentów E i F (obydwa mają się zapalić), które są przecież sterowane z oddzielnych portów. Jak to rozwiązać.

    pozdrawiam i dzieki
  • Pomocny post
    #9 13223347
    BlueDraco
    Specjalista - Mikrokontrolery
    Właśnie to jest zapisane w programie - czytaj uważnie - masz dwie kolejne instrukcje wyrzucające segmenty na odpowiednie porty.
  • #10 13223666
    scrobik
    Poziom 11  
    Chodziło mi jak to zrobić w jednej instrukcji - jako jeden znak składający się z dwóch lub docelowej wersi większej liczby segmentów. Ale nie będę wybrzydzał i tak kolega dużo pomógł

    Dzięki
    pozdrawiam
  • #11 13225935
    pimpuk
    Poziom 23  
    scrobik napisał:
    Chodziło mi jak to zrobić w jednej instrukcji

    No to musisz przygotować sobie funkcje w/g przykładu BlueDraco, coś na wzór tablicy znaków, jak to się robi dla LCD. A potem pojedyncze instrukcje będą wywoływać konkretne funkcje zapalające odpowiednie segmenty.
  • #12 13225959
    BlueDraco
    Specjalista - Mikrokontrolery
    Jedną instrukcją w C raczej nie da się nadać wartości dwóm różnym zmiennym, a to dokładnie chcesz zrobić - zapisać wartości do dwóch portów.
REKLAMA