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

BASCOM Atmega64 – niezawodny odbiór 64 bajtów z UART0 i obsługa I2C, klawiatury

Roburr 19 Lip 2006 12:19 1811 6
REKLAMA
  • #1 2833416
    Roburr
    Poziom 21  
    Posty: 550
    Pomógł: 1
    Ocena: 15
    Chciałbym sie poradzić jak napisać w Bascomie, oprogramowanie do urzadzenia, które musi coś tam wyświetlać, musi obsługiwać klawiaturę, wysyłać coś tam po I2C oraz na bieżąco musi odbierać ramki z UARTA0. Chodzi o to że z komputera wysyłam 64bajty przez RS232 Atmega to odbiera i dokonuje odpowiednich nastaw w urządzeniu. Jednocześnie musi działać klawiatura i pozostały sprzęt podłączony do proca. Informacja docierająca z komputera ma najwyższy priorytet i nie może być zagubiony ani jeden bajt.
    Ja napisałem to tak że ładuje do 64 elementowej tablicy dane z Uarta(Inputbin tablica(1), 64) a obsługa tego znajduje sie w petli głównej. Resztę obsługuje na przewraniach timerów. Niestety takie rozwiązanie gubi bajty informacji wysyłane z komputera. Czy znacie jakies alternatywne roziązania takiego problemu. Chodzi o to by Uart pracował niezależnie i gromadził dane w buforze, niezależnie od sygnalów z pozostałych źródeł.
  • REKLAMA
  • #2 2833437
    crazy_phisic
    VIP Zasłużony dla elektroda
    Posty: 2244
    Pomógł: 278
    Ocena: 130
    Wpisuj dane odebrane z komputera wykorzystując przerwanie od Uarta - Urxc nie stracisz wtedy niczego ;) a przerwanie występuje po każdej poprawnie odebranej ramce danych... Szczegóły jak zwykle w noce katalogowej ;)
  • REKLAMA
  • #3 2833565
    Roburr
    Poziom 21  
    Posty: 550
    Pomógł: 1
    Ocena: 15
    Ok kumam :). Dzięki. Mam jeszcze jedno pytanie a co będzie gdy dane z Uarta bedą nadchodzić w chwili gdy będzie obsługiwane inne przerwanie. Z tego co pamiętam to w AVRach nie można ustawić priorytetów przerwań tak jak w '51.
  • REKLAMA
  • #4 2833591
    crazy_phisic
    VIP Zasłużony dla elektroda
    Posty: 2244
    Pomógł: 278
    Ocena: 130
    Napisałes że najwyższy priorytet mają informacje z PC więc do nich musisz podporządkować pozostałe kroki programu. Z drugiej strony obsługa w przerwaniu portu szeregowego i przepisanie danych do tablicy to raczej działanie "błyskawiczne" ;)...
  • #5 2833595
    max_gg
    Poziom 26  
    Posty: 631
    Pomógł: 83
    Ocena: 26
    Witam!

    Obsługa przerwania trwa z reguły krócej, niż odbiór pojedyńczego bitu przez USART.
    Drugim zabezpieczeniem jest bufor FIFO - odbierze kolejny znak, zanim odczytasz poprzedni.

    Pozdrawiam!
  • #6 2833677
    Roburr
    Poziom 21  
    Posty: 550
    Pomógł: 1
    Ocena: 15
    Niby odbiera. Niestety jak używam przerwania Urxc nie mogę używać bufora wejściowego(Serialin.....). No nic, napisze go samemu. Zobaczymy co z tego wyjdzie.
  • REKLAMA
  • #7 2833690
    max_gg
    Poziom 26  
    Posty: 631
    Pomógł: 83
    Ocena: 26
    Ale mi nie chodziło o bufor programowy - AVR-y serii mega mają wbudowany bufor sprzętowy.
    Opóźnienie odebrania jednego znaku o kilka ms (w przypadku bardzo rozbudowanych procedur) nie powinno więc spowodować problemów

Podsumowanie tematu

✨ Dyskusja dotyczy problemu niezawodnego odbioru 64 bajtów danych przez UART0 w mikrokontrolerze Atmega64 programowanym w Bascomie, przy jednoczesnej obsłudze klawiatury i komunikacji I2C. Autor próbuje implementować odbiór danych w pętli głównej, co powoduje gubienie bajtów. Zalecane jest wykorzystanie przerwania od odbioru UART (Urxc), które wywołuje się po odebraniu każdego bajtu, co pozwala na natychmiastowe zapisanie danych do bufora i zapobiega ich utracie. W AVR nie ma możliwości ustawiania priorytetów przerwań, dlatego program musi być tak zaprojektowany, aby obsługa UART miała najwyższy priorytet, a pozostałe zadania były podporządkowane. Obsługa przerwania UART jest bardzo szybka i trwa krócej niż czas odbioru pojedynczego bitu, a dodatkowo mikrokontrolery Atmega64 posiadają sprzętowy bufor FIFO, który pozwala na odbiór kolejnych znaków nawet jeśli program chwilowo nie odczyta poprzednich. Opóźnienia rzędu kilku milisekund w obsłudze przerwań nie powinny powodować utraty danych. Autor rozważa napisanie własnego bufora, gdyż standardowa funkcja Serialin nie współpracuje z przerwaniami Urxc.
Wygenerowane przez model językowy.
REKLAMA