Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[PIC16F1513][XC8/MPLAB X] - Kompilator nie widzi struktury/unii

Urgon 18 Paź 2015 13:45 1794 2
  • #1 18 Paź 2015 13:45
    Urgon
    Poziom 36  

    AVE...

    Od paru dni próbuję napisać pewien program dla PIC16F1513 w XC8, którego dopiero się uczę. To ogólnie rzecz biorąc mój pierwszy poważny kontakt z C w ogólności, więc nie do końca rozumiem ten język.
    Mam następującą deklarację struktury/unii:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Celowo tak stworzona, by była dostępna bezpośrednio z pamięci flash, dzięki czemu inna część programu może zmieniać wartości na żądanie.
    Dalej mam następującą funkcję, której zadaniem jest pobranie informacji z tej struktury i wpisanie do stosownych rejestrów:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Dotąd wszystko jest OK, ale gdy próbuję użyć tej funkcji w innej funkcji ze strukturą w następujący sposób:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    kompilator idzie płakać w kącie wywalając następujące błędy:
    Code:

    Main.c:234: error: (196) struct/union required
    Main.c:234: error: (182) illegal conversion between types
    const volatile union cap -> boolean
    Main.c:234: error: (181) non-scalar types can't be converted to other types
    Main.c:234: error: (196) struct/union required
    Main.c:234: error: (182) illegal conversion between types
    const volatile union cap -> unsigned char
    Main.c:234: error: (181) non-scalar types can't be converted to other types

    Może mi ktoś wyjaśnić, czemu kompilator nie widzi struktury, a jak ją widzi, to nie używa zgodnie z moim życzeniem? Co robię nie tak i jak to naprawić?

    0 2
  • Pomocny post
    #2 18 Paź 2015 15:14
    grko
    Poziom 33  

    Zmien:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Kolejna sprawa, wyrzuc const z deklaracji bo nie bedziesz mógł zmieniać wartości w strukturze. Poczytaj również o tym kiedy się używa volatile (w twoim wypadku najprawdopodobniej jest niepotrzebne).

    1
  • #3 18 Paź 2015 15:29
    Urgon
    Poziom 36  

    AVE...

    Zmiana podziałała, dziękuję serdecznie. Musiałem jeszcze zmienić typ w funkcji SetCVD z bit na char, bo bit musi być albo global albo static.
    Const musi zostać, bo nie mam EEPROMu wbudowanego, więc zmieniam te wartości zapisując bezpośrednio do pamięci flash programu, dzięki czemu po utracie zasilania lub resecie raz skalibrowany układ skalibrowanym pozostanie.

    EDIT:
    Nie chcę zakładać nowego tematu, a mam problem z tym samym projektem i tym samym programem, ale w innym miejscu. Układ działa jako I2C Slave. O ile program główny się wykonuje, o tyle komunikacja coś nie działa. Może ktoś uprzejmie rzucić okiem na poniższe fragmenty kodu?
    Zmienne związane z I2C:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Funkcja sprawdzająca, które polecenie trza wykonać:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Główna pętla i inicjalizacja:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Przerwanie:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0