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][C] Jak usunąć zawartość bufora USART?

timtheenchanter 06 Lis 2011 22:20 1666 3
REKLAMA
  • #1 10111033
    timtheenchanter
    Poziom 10  
    Witam,
    programuję atmegę32 tak aby otrzymywała polecenia poprzez port RS-232 z komputera (na PC jest skrypt pythona z wykorzystaniem modułu pyserial).
    Mój problem polega na tym, że atmega ma otrzymać polecenie w trakcie wykonywania pętli, wysyłam więc 100 razy jedną liczbę w każdym cyklu pętli sprawdzając stan linii RX.
    Gdy program wychwyci zmiany na RX robi goto do funkcji odczytującej jedną ze 100 wysłanych identycznych liczb - ta liczba jest właśnie sygnałem który chce przesłać.
    Atmega pamięta niestety gdzieś jeszcze dwa egzemplarze tej liczby i jeśli chce przesłać inną to muszę zrobić to trzykrotnie - dwa razy aby nadpisać ten ukryty w czeluściach mikrokontrolera bufor i trzeci raz aby odczytać właściwą liczbę.
    Czy istnieje możliwość skasowania zawartości tego bufora? Trafiłem gdzieś w internecie na coś co zwie się UDR, ale nie wiem czy to o to chodzi. Będę wdzięczny za jakąkolwiek sugestię.
  • REKLAMA
  • #2 10111220
    tmf
    VIP Zasłużony dla elektroda
    Robisz transmisję USART i nie wiesz co to jest UDR? To do licha, jak udało ci się zrobić tą transmisję?
    Tak, w AVR odbiornik USART ma 2-stopniowy bufor. Ale skoro po transmisji zostają ci tam nieodebrane bajty, to znaczy, że czegoś nie odebrałeś. Skoro nadajesz 100 bajtów, to 100 musisz odebrać, najwyraźniej twój program odbiera tylko 98. Możesz je skasować odczytując UDR dopóki stosowna flaga jest ustawiona, lecz w ten sposób owe dwa bajty zgubisz.
  • REKLAMA
  • #3 10111604
    krru
    Poziom 33  
    timtheenchanter napisał:

    Mój problem polega na tym, że atmega ma otrzymać polecenie w trakcie wykonywania pętli, wysyłam więc 100 razy jedną liczbę w każdym cyklu pętli sprawdzając stan linii RX.


    Mógłbyś wyjaśnić w jakim celu wysyłasz 100 razy to samo.

    timtheenchanter napisał:

    Gdy program wychwyci zmiany na RX robi goto do funkcji odczytującej jedną ze 100 wysłanych identycznych liczb


    Nie bardzo rozumiem co znaczy "wychwyci zmiany na RX". Stosujesz jakiś programowy UART? Bo normalnie to sprawdza się czy w buforze odbiornika coś jest - testując odpowiedni bit w rejestrze UCSRA. Ina metodą jest wykorzystanie przerwań. W każdym razie wejscie RX interesuje się tylko sprzęt.
  • #4 10111635
    timtheenchanter
    Poziom 10  
    tmf napisał:
    Robisz transmisję USART i nie wiesz co to jest UDR? To do licha, jak udało ci się zrobić tą transmisję?

    Nie mam pojęcia, jestem inżynierem mechanikiem a nie elektronikiem/programistą. Udaje mi się tym sposobem przesyłać bezbłędnie całe kilobajty ale gdy próbuje jedna liczbę to jest problem.

    krru napisał:
    Nie bardzo rozumiem co znaczy "wychwyci zmiany na RX". Stosujesz jakiś programowy UART? Bo normalnie to sprawdza się czy w buforze odbiornika coś jest - testując odpowiedni bit w rejestrze UCSRA. Ina metodą jest wykorzystanie przerwań. W każdym razie wejscie RX interesuje się tylko sprzęt.

    Podejrzewałem, że to może tak działać (w programie pythonowym na PC tak jest) ale nie wiedziałem jak to zrobić, stąd te stukrotne wysyłanie danych.
    Wystarczy wysłać jeden bajt aby można go było wykryć w tym rejestrze?
REKLAMA