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

STM32F207xx, RS485, MAX3483 - Błędne dane w tablicy przy odbiorze USART RXNE

bazinga30rock 10 Wrz 2014 09:02 1308 2
REKLAMA
  • #1 13948402
    bazinga30rock
    Poziom 7  
    Posty: 25
    Ocena: 2
    Cześć chcę napisać program obsługujący transmisję pomiędzy komputerem a mikrokontrolerem poprzez RS485. Wykorzystuje do tego celu układ max3483. Czytałem dokumentację ST w której proponowane są dwa rozwiązania co do zarządzania linią sterującą kierunkiem transmisji:
    1. Wykorzystanie przerwania od USARTA-TC oraz przerwania od DMA TC.
    2. Wykorzystanie dwóch przerwań od USARTA TC, TXE.

    Mimo to chciałem wykorzystać przerwanie RXNE ponieważ, uC docelowo będzie ustawiony w tryb nasłuchu i będzie tylko odpowiadał na otrzymane komendy.
    Na wstępie bez sterowania linią kierunkową chciałem wysłać coś z komputera i zapisać to w tablicy. Ewidentnie coś robię źle bo wysyłam jakiś ciąg znaków a w tablicy zapisuje się coś zupełnie innego (zazwyczaj rozszerzony znak ASCII).

    Wysyłanie z kompa i odsyłanie tego z uC po rs232 działa. Myślałem, że to samo odbiorę po rs485 jednak mam z tym problem. Proszę o pomoc.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Obsługa przerwania:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Pytanie podstawowe brzmi dlaczego jak wyślę z komputera "cos<CR>" to otrzymuję praktycznie zawsze rozszerzone znaki ascii oczywiście bez <CR> czyli ten warunek w obsłudze przerwania nigdy nie zachodzi, chyba że przez przypadek.
  • REKLAMA
  • Pomocny post
    #2 13948659
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Wygląda na problem z ustawieniem szybkości transmisji - częstotliwość zegara UART jest inna, niż Ci się wydaje.
    Podejrzewam, że to nie jedyny problem, ale na wszelki wypadek nie pokazałeś więCej kodu, w tym deklaracji zmiennych.
  • #3 13948720
    bazinga30rock
    Poziom 7  
    Posty: 25
    Ocena: 2
    Właśnie nad tym się skupiłem, nad prędkością. Przy czym zmieniłem kierunek transmisji i sobie wysyłam z procka znak 'G' do komputera.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


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


    Przy prędkości 57600 odbieram poprawnie znak gdy w terminalu jest ustawiona prędkość 3 razy mniejsza =19 200. Gdy w terminalu jest 57600 dostaje trzy znaki FC FC 00 - nie wiem dlaczego tak się dzieje.
    W rejestrze BRR zapisana jest wartość 521 przy częstotliwości APB1=30MHz prędkość wynosi:
    30 000 000/ 521 ≈ 57 600

    Wydaje się być dobrze a nie jest.

    Dodano po 39 [minuty]:

    Ok znalazłem gdzie tkwi problem. HSE domyślnie ustawiony jest na 25MHz a ja mam w układzie 8Mhz. Teraz działa w obie strony tak jak należy na pierwszy rzut oka.
    Tematu jeszcze nie zamykam może pojawią się nowe problemy.
    Dzięki
REKLAMA