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

Konfiguracja przerwań USART na ATmega 328PB - zmiana wektorów ISR

pejdz 16 Mar 2020 11:44 1224 8
  • #1 18534722
    pejdz
    Poziom 4  
    Witam,
    udało mi się zaaktualizować bibliotekę freemodbus pod nowy kompilator na procesorze ATMEGA 328P, jednak nie mogę nigdzie znaleźć jak zamienić poniższe wyrażenia w kontekscie ATMEGI 328PB:
    ISR( USART_RX_vect)
    ISR(USART_UDRE_vect )
    ISR( USART_TX_vect)

    Konfiguracja przerwań USART na ATmega 328PB - zmiana wektorów ISR

    Czy może ktoś by wiedział jak to zamienić?
    Z góry dziękuje za pomoc.
  • #3 18534871
    pejdz
    Poziom 4  
    Cytat:
    Kawałek biblioteki UART dotyczący tego uC:

    Kod: c [rozwiń][zaznacz wszystko]

    #elif defined(__AVR_ATmega328PB__)


    /* ATmega with two USART */
    #define ATMEGA_USART1
    #define UART0_RECEIVE_INTERRUPT USART0_RX_vect
    #define UART0_TRANSMIT_INTERRUPT USART0_UDRE_vect
    #define UART0_STATUS UCSR0A
    #define UART0_CONTROL UCSR0B
    #define UART0_CONTROLC UCSR0C
    #define UART0_DATA UDR0
    #define UART0_UDRIE UDRIE0
    #define UART0_UBRRL UBRR0L
    #define UART0_UBRRH UBRR0H
    #define UART0_BIT_U2X U2X0
    #define UART0_BIT_RXCIE RXCIE0
    #define UART0_BIT_RXEN RXEN0
    #define UART0_BIT_TXEN TXEN0
    #define UART0_BIT_UCSZ0 UCSZ00
    #define UART0_BIT_UCSZ1 UCSZ01

    #define UART1_RECEIVE_INTERRUPT USART1_RX_vect
    #define UART1_TRANSMIT_INTERRUPT USART1_UDRE_vect
    #define UART1_STATUS UCSR1A
    #define UART1_CONTROL UCSR1B
    #define UART1_CONTROLC UCSR1C
    #define UART1_DATA UDR1
    #define UART1_UDRIE UDRIE1
    #define UART1_UBRRL UBRR1L
    #define UART1_UBRRH UBRR1H
    #define UART1_BIT_U2X U2X1
    #define UART1_BIT_RXCIE RXCIE1
    #define UART1_BIT_RXEN RXEN1
    #define UART1_BIT_TXEN TXEN1
    #define UART1_BIT_UCSZ0 UCSZ10
    #define UART1_BIT_UCSZ1 UCSZ11


    Chyba moje możliwości są ograniczone żeby zamienić to tak aby to co mi wysłałeś działało tak jak ten fragment:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Może jakbyś miał chwile to byś zobaczył tą bibliotekę udostępniam działajacy kod pod AVR328P

    a te najważniejsze funkcjie do przerobienia to w pliku porth.h to co pokazałem wcześniej:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    I w pliku portserial.c te ostatnie funkcje:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    [/code]
  • #4 18534992
    kaczakat
    Poziom 34  
    Wszędzie gdzie masz wywołanie USART_RX_vect wstawiasz USART0_RX_vect gdy chcesz używać UART0 lub USART1_RX_vect gdy używasz UART1. Analogicznie wszystkie inne przerwania i rejestry, nazwy mogą nie być tylko takie że cośtam0 lub cośtam1 bo czasami jest cośtam0cośtam, więc wrzuciłem Ci tu wszystkie. No nie ma chyba wielkiej filozofii dopisać 0 lub 1?
    A tam gdzie jeszcze masz SIG ma być zamiana na vect, np.:
    #define SIG_UART_TRANS USART0_TX
    #define SIG_USART_DATA USART0_UDRE_vect
    #define SIG_USART_RECV USART0_RX_vect
    Oczywiście nie zmieniasz tego po lewej, bo tego używa biblioteka i trzeba by zmieniać wszędzie, ale od tej pory zawsze gdy wywołany jest SIG_UART_TRANS zostanie użyty zapis USART0_TX. Lub oczywiście to samo z 1 gdy chcesz używać UART1.
    Pomogłem? Kup mi kawę.
  • #5 18534996
    StaryVirus_e_Wiarus
    Poziom 21  
    Cześć
    Zwróć uwagę na ten fakt, że Atmega328PB obsługuje 2 porty UART0 i UART1. Musisz się zdecydować, który port wybrać do Twoich połączeń.
    Pobierz z neta datasheet do tej Atmegi. Tam jest to ładnie opisane.
  • #6 18535003
    pejdz
    Poziom 4  
    Tak też uczyniłem ale nie wiem jak zmienić to które działa mi na 328p, gdzieś wyczytałem ze te dwa mikrokontorlery mają taka samą budowę:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    na odpowiednik 328pb:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Nie potrafie dopasować symboli z tego pierwszego do tego drugiego i cała biblioteka się sypie
  • #7 18536387
    kaczakat
    Poziom 34  
    Na początku pliku port.h masz #define __AVR_ATmega168__ i to determinuje jaka zawartość pliku jest dostępna. A tak nie powinno być. Robisz projekt, w opcjach projektu (ATMEL STUDIO lub ECLIPSE) wskazujesz docelowy uC np. Atmega16 i po tym wyborze jest dostępna zawartość dla wybranego uC. Wybierzesz inny uC to wszystko zmienia się pod ten inny. A Ty sobie to ustawiasz takim wpisem na sztywno tylko Atmega168 (jej rejestry akurat są w tym zakresie takie same jak atmegi 328). Skasuj ten wpis, dodaj kolejny dla USART0 Atmegi 328PB, wybierz taki uC, skompiluj i powinno działać:
    Konfiguracja przerwań USART na ATmega 328PB - zmiana wektorów ISR
    A jeśli jest grupa uC o tych samych rejestrach to można je wymienić w tej samej grupie:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Tak że dla wykorzystania tylko UART0 można tę atmegę328PB dopisać jak wyżej.
    Pomogłem? Kup mi kawę.
  • #8 18536748
    pejdz
    Poziom 4  
    Zastosowałem się do twoich rad stworzyłem klasy uC tak, żeby nie definiować na początku biblioteki port.h tylko w ustawieniach projektu musi być wybrany mikrokontorler:
    Konfiguracja przerwań USART na ATmega 328PB - zmiana wektorów ISR

    cały plik port.h wygląda następująco pogrubiłem te zmiany które wprowadziłem:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    a tak wygląda plik portserial.c (pogrubione zmiany):
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    mam ustawiony Baudrate na 19200, slave ID na 3, port szeregowy na 12 i na mikrokontrolerze 328P działa bezproblemu a na 328PB nie moze sie zsynchronizować i jest time out. Jeszcze dodam ze na 328P oscylator jest ustawiony na 8000000UL a na 328PB 1000000UL, na takich parametrach delay odmierze równo 1 s jak mu zadam _delay_ms(1000). Już nie wiem co mogę jeszcze zrobić
  • #9 18537023
    kaczakat
    Poziom 34  
    Jak usunąłeś to #define __AVR_ATmega168__ to zdeaktywowałeś w drugim pliku tą część:
    #if defined (__AVR_ATmega168__)
    UCSRC |= ucUCSRC;
    Tu też doklej wszystkie uC tej "rodziny", no i jak używasz UART0 to w tym samym miejscu możesz dodać 328PB lub jako kolejny #elif.
    Niestety biblioteka jest tak napisana, że jak użyjesz uC nie ujętego w tym miejscu to nic nie ustawia i nie ma komunikatu o użyciu nieobsługiwanego uC, mógłby być dodatkowy #elif z komunikatem błędu.
    Pomogłem? Kup mi kawę.
REKLAMA