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.

błędy przy przesyłaniu danych po rs232 atmega8 - pc

wojtektorr 22 Gru 2012 12:07 1218 4
  • #1 22 Gru 2012 12:07
    wojtektorr
    Poziom 14  

    Mam problem z przesyłaniem danych między atemga a pc przez port rs232. Chce wysłać pakiet danych najczęściej składający się z 5 par liczb oddzielonych spacjami (np. 02 01 12 21 11). Próbowałem z różnymi prędkościami i nigdy nie uda się wysłać danych żeby nie zgubił przynajmniej jednego znaku. Wysyłanie danych robię w ten sposób:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Próbowałem także ładować funkcją uart_putc po jednym znaku do bufora cyklicznego który jest opróżniany w przerwaniu np.
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Ale efekt jest podobny do prostego wysyłania funkcją UART_Transmit();
    Jak uniknąć gubienia tych danych? Zapomniałęm dodać że w programie mam również przerwanie które obsługuje klawiature, wywoływane jest ono z częstotliwościa ok 40 razy na sekundę, czy to przerwanie może być powodem gubienia znaków?

    0 4
  • #2 22 Gru 2012 12:36
    tmf
    Moderator Mikrokontrolery Projektowanie
  • Pomocny post
    #3 22 Gru 2012 13:10
    bartosz.tarnowski
    Poziom 16  

    przerwania timerów mają wyższy priorytet niż przerwanie transmisji szeregowej. Jeśli wysłanie tych pięciu liczb trwa dłużej niz 25ms to na pewno w między czasie będzie przerwanie od obsługujące klawiaturę, jeśli ono Ci modyfikuje jakiś wskaźnik lub inną zmienną związaną z buforem wysyłania danych to tam bedzie powód gubienia znaków.

    Musisz tez przeanalizować mechanizm wyznaczania UART_TxBottom i wykorzystywania go do wysyłania. Dzieje się to w dwóch różnych miejscach w programie

    Moze dojśc do sytuacji że zostną wykonane poniższe linie programu

    void uart_putc(char data)
    {
    uint8_t tmp_indexTop;
    tmp_indexTop = (UART_TxTop +1) & UART_TX_BUF_MASK;


    A następnie przyjdzie przerwanie SIGNAL (SIG_UART_DATA) które zmodyfikuje UART_TxTop i po przerwaniu wróci znowu do funkcji void uart_putc(char data)
    Musisz sobie to rozrysować na kartce.

    No i właśnie jak wygląda UART_TRansmit

    0
  • #5 22 Gru 2012 15:46
    wojtektorr
    Poziom 14  

    W UART_Transmit nie ma nic takiego co mogłoby powodować gubienie tych znaków a wygląda tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    a i atmega jest taktowana 8MHz, przy prędkości 9600 bps nie powinno być błędów

    Dodano po 10 [minuty]:

    Właśnie zmniejszyłem częstotliwość przerwania do obsługi klawiatury do ok 30 razy na sekundę i zwiększyłem predkość transmisji do 19200 bps i jest dobrze cały string jest przesyłany w komplecie :) Dzięki bartosz.tarnowski

    0