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

Atmega32/Xmega128A3 - Przeniesienie kodu z Atmegi na Xmegę.

dawid.barracuda 16 Sie 2016 22:27 1665 12
REKLAMA
  • #1 15873010
    dawid.barracuda
    Poziom 13  
    Cześć wszystkim :)
    Pracuję nad przeniesieniem kodu pewnej biblioteki do nrf24l01 z atmegi na xmegę (atmega32 -> xmega 128a3). Czytając bibliotekę wybrałem fragmenty z elementami charakterystycznymi dla danego typu procesora, czyli pozmieniałem części kodu związane z rejestrami i przerwaniami.

    "Zakomentarzowałem" nietknięty oryginał.
    To, co wstawiłem się kompiluje bez błędów i warningów, ale jak wiadomo to może z 10% sukcesu. Bardzo proszę o sprawdzenie poprawności i pozdrawiam :)

    Zacząłem od pliku nrf24l01.h, oto co napisałem:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Dalszej części pliku nie wstawiałem, bo już nic nie było wg mnie do zmiany;

    zmieniony fragment pliku SPI.c
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Dalsza część pliku SPI.c dotycząca software'owego SPI jest niezmieniana, bo o ile widzę to nie ma tam już niż z rejestrami, są tylko operacje na makrach zmienionych wcześniej;

    część dotycząca przerwań w pliku nrf24l01.c:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Jako, że w Xmega 128A3 nie ma przerwania INT2 to dałem INT0;

    PS: Mam pytanie odnośnie pliku SPI.c biblioteki, oto fragment:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Ta funkcja inicjuje sprzętowy SPI. Czy nie powinien być również włączony bit SPIE? Nie jestem pewny czy sprzętowy SPI = wykorzystanie przerwań.
  • REKLAMA
  • Pomocny post
    #2 15873037
    excray
    Poziom 41  
    A masz gdzieś przerwanie od SPI w kodzie, że chcesz je włączać? Bo ja nie widzę. Ale widzę, że funkcja SPI_WriteByte() opiera się o zwyczajne sprawdzanie flagi końca transmisji, a nie o przerwania.
  • #3 15873053
    dawid.barracuda
    Poziom 13  
    Właśnie nie mam. Nie byłem pewny, czy mogę powiedzieć "używam sprzętowego SPI" nie korzystając z przerwań.
    A jak reszta kodu?
  • REKLAMA
  • Pomocny post
    #4 15873087
    excray
    Poziom 41  
    Sprzętowego SPI używasz, tyle, że nie używasz przerwań. Reszty kodu nie przeglądałem.
  • REKLAMA
  • Pomocny post
    #5 15873444
    tmf
    VIP Zasłużony dla elektroda
    A propos przerwań - widzę, że masz tam jakieś przerwanie od pinu (funkcja Initialize_INTERRUPT_For_nRF) - pamiętaj, że w XMEGA kontroler przerwań jest wielopoziomowy, tak więc, oprócz odblokowania danego przerwania musisz określić jego poziom (LO, MED, HI), a także odblokować przerwania danego poziomu w kontrolerze przerwań oraz globalną flagę zezwolenia na przerwania (sei).
  • Pomocny post
    #6 15873447
    landy13
    Poziom 31  
    Cytat:
    void init_SPI(void)
    {
    SPI_DDR_PORT |= ( (1<<MOSI) | (1<<CSN) | (1<<SCK) | (1<<CE) | (1<<SS) ); //SET pins MOSI, CSN(chip select),SCK, i CE(control RX, TX nRFA) as ouputs
    SPIC_CTRL |= (1<<SPI_ENABLE_bp) | //enable SPI module
    (0<<SPI_DORD_bp) | //set data order
    (1<<SPI_MASTER) | //enable SPI in master mode
    (1<<SPI_CLK2X_bp) | //SPI sck 2 times faster
    (1<<SPI_PRESCALER0_bp) | //SCK_speed (fosc/16)
    (0<<SPI_PRESCALER1_bp) | //
    (0<<SPI_MODE0_bp) | //SCK polarity, rising edge is active
    (0<<SPI_MODE1_bp); | //data polarity, read data on rising edge
    }

    Jakiego działania oczekujesz po wytłuszczonych liniach? W innych miejscach też podobne konstrukcje. Czy na Atmedze32 to działało?
    Lepiej porzuć te źródła i napisz od nowa.
    Po ludzku.
  • REKLAMA
  • #7 15873556
    dawid.barracuda
    Poziom 13  
    tmf napisał:
    A propos przerwań - widzę, że masz tam jakieś przerwanie od pinu (funkcja Initialize_INTERRUPT_For_nRF) - pamiętaj, że w XMEGA kontroler przerwań jest wielopoziomowy, tak więc, oprócz odblokowania danego przerwania musisz określić jego poziom (LO, MED, HI), a także odblokować przerwania danego poziomu w kontrolerze przerwań oraz globalną flagę zezwolenia na przerwania (sei).

    Przepisałem tę funkcję tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    sei () odblokowuję w main.c. Tutaj zapomnialem jeszcze o PMIC? Myślałem też, że jak nie ruszę priorytetów to domyślnie są na jakimś poziomie. Jeśli wszystkie przerwania, które ja piszę są tak samo ważne to wybieram MED?

    landy13 - osobiście napisałbym tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    itd. Wg mnie takie działanie Autor miał na myśli.
    Dziś będę odpalał oryginał i będę wiedział po sobie czy działa, ale z komentarzy wynikało, że ta biblioteka działała.
  • #8 15873802
    tmf
    VIP Zasłużony dla elektroda
    @landy13 To 0<< cośtam nie przeszkadza, nic to nie robi, ale pokazuje stan konkretnego bitu. Co prawda w XMEGA wygodniej jest korzystać z predefiniowanych konfiguracji, zamiast zmieniać poszczególne bity, ale to kwestia nawyków.
    @dawid.barracuda Nie, domyślnie przerwanie jest wyłączone (wartość rejestru INTCTRL jest równa zero), aby je odblokować musisz w tym rejestrze wybrać poziom przerwania i potem ten sam poziom odblokować w PMIC i na końcu zrobić sei.
  • Pomocny post
    #9 15874215
    landy13
    Poziom 31  
    tmf napisał:
    To 0<< cośtam nie przeszkadza, nic to nie robi
    Owszem, bo to funkcja inicjująca, która operuje na rejestrach wyzerowanych po resecie. Powziąłem jednak silne podejrzenie, iż autor może próbować w ten sposób zerować bity które są ustawione. A wówczas to nie zadziała.
    Jeśli jednak moje podejrzenia okazały się niesłuszne, to przepraszam. Już nie będę. :wink:
  • Pomocny post
    #10 15874380
    tmf
    VIP Zasłużony dla elektroda
    @landy13 Problem nie leży w 0 << cośtam, lecz w SPIC_CTRL |= - taka konstrukcja powoduje, że nie da się wyzerować bitu i w sumie jest kompletnie bez sensu.
  • #11 15874856
    dawid.barracuda
    Poziom 13  
    Poprawiłem funkcję dot. przerwań:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Czy teraz jest w porządku? Przypominam, że sei() włączam w main.

    A wcześniej się przejęzyczyłem, miałem na myśli to:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #12 15874872
    tmf
    VIP Zasłużony dla elektroda
    Tak, jest w porządku. Przy okazji - w XMEGA masz atomowe operacje na IO, zamiast więc robić &=, czy |=, można użyć rejestrów SET, CLR i TGL.
  • #13 15880819
    dawid.barracuda
    Poziom 13  
    Kod działa, przetestowałem na xmedze 128a3 i atmedze 32a. Nrfy miały dolutowane na pinach, pomiędzy Vcc i GND po dwa kondensatory, tantal 10u i ceramik 100n.
    Xmega taktowana zegarem wewnętrznym 2MHz, atmega taktowana kwarcem 16MHz.

    Używałem starych nawyków z atmeg a nie struktur ze względu na to, żeby nie popełnić trudnych do wykrycia błędów przy portowaniu biblioteki. Wszystkie nowe programy jakie sobie piszę na xmegi wykorzystują struktury, zgodnie za radą tmf :)

    Dziękuję za wszystkie pomocne sugestie dotyczące kodu :)

    Temat zamykam i pozdrawiam wszystkich serdecznie.
REKLAMA