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.

[ATxmega64A1][C]Atmel Studio 6 - Błedy kompilacji prostego kodu

Noisy_daddy 22 Sie 2012 16:27 1890 14
  • #1 22 Sie 2012 16:27
    Noisy_daddy
    Poziom 14  

    Jestem początkujący w mikrokontrolerach, napisałem swój pierwszy program na avr i (oczywiście) nie działa. Programuję przy użyciu atmel studio 6, na razie nie wgrywam programu na uC, chcę najpierw popracować nad składnią. Kompilator zdaje się nie odczytywać w ogóle rejestrów - dostaję errory typu "DDRA was not declared in this scope" , to samo tyczy się rejestru PIN, oraz poszczególnych pinów, co ciekawe w kwestii rejestru PORT wszystko jest w porządku. Domyślam się, że pytanie jest głupie i popełniam jakiś elementarny błąd, ale tak jak mówię jestem absolutnie początkujący. Wiecie o co może chodzić?

    0 14
  • #2 22 Sie 2012 20:51
    Pawel.B
    Poziom 10  

    Przydałoby się wrzucić kawałek kodu... może nie zdefiniowałeś dobrze, albo zdefiniowałeś ale w złym miejscu np. wewnątrz funkcji a próbujesz dostać się globalnie...

    0
  • #4 22 Sie 2012 23:21
    Noisy_daddy
    Poziom 14  

    Cytat:

    void reset(void)
    {
    DDRA=0xFF;
    PORTA=0x00;
    DDRB=0xFF;
    PORTB=0x00;
    DDRC=0xF0;
    PORTC=0x00;
    }

    Tak, piszę w C i ten nagłówek dołączyłem. Wybrałem odpowiedni typ. To jest funkcja, którą później wywołuję w mainie ("reset();"). I tu jest też mój pierwszy error - 'DDRA was not declared in this scope' , cała reszta błędów jest b. podobna.

    0
  • #6 23 Sie 2012 00:03
    Noisy_daddy
    Poziom 14  

    Kod: C
    Zaloguj się, aby zobaczyć kod


    Ciężko mi wkleić errory, ale wszystkie są typu "DDRx was not declared in this scope" (to samo dla PINx i Px, gdzie x to odpowiedni numer) i odnośnie linijek "PORTx = 0x00" jest error : "no match for 'operator=' in '*1536u = 0' ". Program ma docelowo sterować matrycami diodowymi, i po wysterowaniu odpowiedniego wejścia gasić kolejne kolumny (1,2 lub 3 w zależności od wejścia) i zapalać trzy niezależne diody po kolei po wygaszeniu wszystkich (20) kolumn.

    0
  • #8 23 Sie 2012 14:44
    LordBlick
    VIP Zasłużony dla elektroda

    Noisy_daddy napisał:
    Domyślam się, że pytanie jest głupie i popełniam jakiś elementarny błąd
    Bład jest taki, że uważasz, że czytamy w myślach. Nie padła nazwa mikrokontrolera, a pewnie dotyczy kostki, która nie ma PORTA...

    0
  • #9 23 Sie 2012 16:45
    Noisy_daddy
    Poziom 14  

    Cytat:
    a pewnie dotyczy kostki, która nie ma PORTA...

    Z datasheeta wynika, że ma...PORTx, PINx i Px na pewno, co do DDRx nie jestem pewny, ale dla pozostałych (poza PORT) też są te same błędy

    0
  • Pomocny post
    #10 23 Sie 2012 17:22
    LordBlick
    VIP Zasłużony dla elektroda

    Noisy_daddy napisał:
    DDRx nie jestem pewn
    I tu tkwi sęk - ATxmega ma inną filozofię GPIO - są rejestry DIR, DIRCLR, DIRSET, DIRTGL, OUT, OUTSET, OUTCLR, OUTTGL, IN. Czyli nie ma ani PORTA, ani PORTB itd... ;)
    Radzę na poczatek poczytać manuala do XMEGA-A i notę katalogową...
    http://www.atmel.com/devices/ATXMEGA64A1.aspx?tab=documents (pierwsze od góry dwa pdf-y)
    No chyba, ze jednak chcesz się najpierw zapoznać ze standardowymi AVR...

    0
  • #11 23 Sie 2012 18:55
    Noisy_daddy
    Poziom 14  

    Cytat:
    I tu tkwi sęk - ATxmega ma inną filozofię GPIO - są rejestry DIR, DIRCLR, DIRSET, DIRTGL, OUT, OUTSET, OUTCLR, OUTTGL, IN. Czyli nie ma ani PORTA, ani PORTB itd...

    Jest to jakieś wytłumaczenie ;p Już wszystko jest ok poza Px - więc jaki rejestr zapewni mi odwołanie się do konkretnego pinu np. za pomocą tej funkcji _BV()? Bo znalazłem w jakimś opracowaniu taki właśnie sposób użycia funkcji bit_is_set, jak wstawiłem w tych if-ach, widocznie dla ATxmega jest inaczej - więc jak?

    0
  • #12 23 Sie 2012 20:37
    LordBlick
    VIP Zasłużony dla elektroda

    A nazwy rejestrów nic ci nie mówią ?(DIR-SET/ DIR-CLeaR/DIR-ToGgLe i tak samo z OUT-SET/CLR/TGL) Po staremu to OUTx=PORTx; DDRx=DIRx; PINx=INx Dodatkowe rejestry są tylko do zapisu w celu szybkiego ustawienia jakiejś wartości.
    Przeczytałeś w końcu manuala, czy mam po kolei go tu wklejać ? ;)

    0
  • #13 23 Sie 2012 20:55
    Noisy_daddy
    Poziom 14  

    Aa zapomniałem o tym OUTSET/CLR. Chyba już powinno być ok. Zaraz sprawdzę

    0
  • Pomocny post
    #14 24 Sie 2012 07:33
    kchpl
    Poziom 14  

    Witam.
    Co do sprawdzania pinu jako wejścia to spróbuj:
    bit_is_set(PORTx.IN,y) gdzie x to interesujący Cię port a y to interesujący Cię pin.
    Ustawianie wyjść to albo przez rejestr OUT (tzn PORTx.OUT) albo przez konkretny PORTx.OUTSET, PORTx.OUTCLR lubPORTx.OUTTGL

    0
  • #15 25 Sie 2012 12:15
    Noisy_daddy
    Poziom 14  

    I właśnie tak zrobiłem, dzięki. Teraz pora zmontować układ i zobaczyć jak to działa, jbc będę jeszcze pytał

    0