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][ASM] Pętla w procedurze przerwania.

Rico77 13 Cze 2008 20:33 2144 5
REKLAMA
  • #1 5243296
    Rico77
    Poziom 11  
    Witam Wszystkich

    Mam taki oto problem.
    Piszę w asemblerze program obsługujący interfejs UART (mk:atmega32) oraz wysyłający odebrane dane na wyświetlacz złożony z 10 matryc (5x8) LED. Napisałem program który mi odbiera dane (w procedurze przerwania) i umieszcza odebrany znak w buforze UART. Następnie w innym przerwaniu pochodzącym od licznika2 wykonuję przekodowanie na podstawie odebranego znaku z bufora oraz biblioteki znaków i wysyłam kolumnę na wyświetlacz. i tak 50 razy.
    Problem jest następujący...potrzebuję dodać pętlę która do bufora UART będącego odzwierciedleniem wyświetlacza dopisze znaki spacji na pozostałych niewykorzystanych miejscach. Czyli jeśli dla przykładu mamy napis KOT, to w buforze będą znaki K.O.T a resztę 7 pozycji będą stanowić spacje. Jest mi to potrzebne ponieważ gdyby tego nie było to na wyświetlaczu pojawiły by się tzw. "śmieci" czyli przypadkowe znaki znajdujące sie na dalszych pozycjach.
    Dla przykładu jeśli najpierw wpiszemy słowo PASIKONIK i wyświetlimy to na wyświetlaczu a po jakimś czasie wyślemy do procka poprzez UART napis KOT, to bez uzupełnienia spacjami w buforze będą znaki:
    KOTIKONIK..Chciałbym tego uniknąć, ale tu mój problem, bo ta pętla najlepiej by było gdyby znajdowała się w procedurze obsługi przerwania. Wtedy po odebraniu znaku końca napisu...w przypadku łańcucha <10 wypełniała by pozostałe miejsca spacjami. I stąd moje pytanie pętla może występować w procedurze przerwania? Jeśli nie to byłbym wdzięczny na wszelkie możliwe pomysły.
    Program piszę w asemblerze.


    Poprawiłem tytuł:
    https://www.elektroda.pl/rtvforum/topic1015361.html
    [c_p]
  • REKLAMA
  • #2 5243376
    ZbeeGin
    Poziom 39  
    Jeśli nie jest to zbyt długa pętla to w przerwaniu może ona występować. Zauważ, że masz w pamięci zapisać maksymalnie 10 spacji, zatem czas przeładowania tych 10 bajtów będzie na tyle krótki, że nie spowoduje ujemnych skutków.
    Oczywiście w przerwaniu z UART musisz liczyć odebrane znaki. Potem odejmujesz ich ilość od 10 i masz tyle znaków spacji jakie musisz wpisać.

    Zakładam, że tekst na matrycy się nie przewija...
  • REKLAMA
  • #3 5243656
    Rico77
    Poziom 11  
    Dzięki za radę ZbeeGin.
    Samo przerwanie nie jest długie.. ok 30 wierszy. Ten wariant dotyczy opcji bez przesuwania, ale cały program będzie zabieram drugi wariant właśnie z przesuwaniem. Ta opcja jednak będzie opierała się na drugim buforze...25 znaków bo tyle znaków przewiduję do wyświetlenia.
    pozdrawiam
  • REKLAMA
  • #4 5248147
    Nawigator
    Poziom 33  
    Może byłoby prościej przed odbiorem wypełnić bufor spacjami i nadpisać go odebranymi znakami?
    Pzdr. N.
  • REKLAMA
  • #5 5248242
    ZbeeGin
    Poziom 39  
    Problem kol. Nawigator polega na tym, że znaki są odczytywane poprzez przerwania i do końca nie będzie wiadomo kiedy ten pierwszy znak się pojawi. Zatem jakby nie było - kasowanie bufora odbędzie się w przerwaniu.
    Dlatego prościej jest wykryć, że ciąg się zakończył (CR, LF) i wypełnić już po odebraniu ciągu. Zwłaszcza, że ilość spacji będzie w takich przypadkach raczej mniejsza niż 10.
  • #6 5250597
    Fyszo
    Poziom 37  
    Przy odbieraniu każdej nowej transmisji można można wyczyścić bufor i lcd. Do wykrywania początku/końca ramki proponuję użyć metody Xon/Xoff.
REKLAMA