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/AVRStudio5] Transmisja asynchroniczna USART

Sparrowhawk 21 Lis 2011 11:35 1246 8
REKLAMA
  • #1 10164493
    Sparrowhawk
    Poziom 22  
    Witam

    Wykonałem układ, który komunikuje się z PC przez moduł BTM-222. Komunikacja USART, asynchroniczna 38.400 kbps, 1 bit parzysztości, 1 bit stopu. Jeśli zadeklaruję na stałe, że wielkość bufora wynosi np. 30, i wysyłam z PC 30 znaków, to komunikacja działa bez zarzutu. Problem w tym, że chciałbym, aby program działał, przy różnej ilości odbieranych danych z PC. Przy takich ustawieniach USART, wychodzi mi na to, że przesłanie jednego znaku nie trwa dłużej niż 280 us. Dlatego, w przerwaniu od USART, zeruję flagę przerwania od TIMER0, wpisuję wartość początkową i włączam przerwanie od TIMER0. W obsłudze przerwania od TIMER0, zeruję wartość zmiennej licznika bufora, ustawiam flagę dane odebrane, oraz wyłączam przerwanie od TIMER0. Timer, ustawiony jest na 400 us. Niestety nie działa ta koncepcja.

    Poniżej kod programu:
    Kod: C#
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 10165259
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #3 10165318
    Sparrowhawk
    Poziom 22  
    A mogę prosić o wyjaśnienie? Bo nie potrafię się doszukać w tym kodzie błędu.
  • #4 10165364
    Konto nie istnieje
    Konto nie istnieje  
  • #5 10165392
    Sparrowhawk
    Poziom 22  
    Tak, timer zeruje w przerwaniu RXI, ale po 400us. Jeśli wysyłam 30B, to przerwanie od USART, powinno 30 razy wyłączyć przerwanie od Timer0, bo znaki powinny przychodzić szybciej niż co 400us. W momencie, kiedy nic nie będzie nadawane, powinno zadziałać przerwanie od TIMER0.
  • REKLAMA
  • #6 10165393
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #7 10165430
    Sparrowhawk
    Poziom 22  
    Tak przerwanie od Timer0 jest co 400 us.

    Wg mnie co 260 us przychodzi kolejny znak na USART, więc przerwanie od Timer0 nie powinno być wykonane dopóki przychodzą kolejne znaki.
  • Pomocny post
    #8 10165541
    Konto nie istnieje
    Konto nie istnieje  
  • #9 10167308
    Sparrowhawk
    Poziom 22  
    Zmodyfikowałem kod w ten sposób:

    Kod: text
    Zaloguj się, aby zobaczyć kod
REKLAMA