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

[avr][asm] "oczekujący" UART?

pawel200388 25 Cze 2009 11:38 2617 13
REKLAMA
  • #1 6700910
    pawel200388

    Poziom 17  
    Witam :)
    Napisałem program, mniej więcej o takiej strukturze:

    
    konfiguracja portów, UARTu itd.
    petla:
    USART_odbior:
    sbis UCSRA, RXC	;czekaj na informacje do odebrania
    in r16, UDR			;przepisz odebrane dane do r16
    
    porownywanie wartosci odebranych ze stalymi. W zaleznosci od idebranej info wykonuje pewna czesc programu
    ;lewo
    cpi r16,1			;porownaj r16 z liczba 1
    breq wlewo			;skocz do etykiety "wlewo"
    ;prawo
    cpi r16,2
    breq wprawo
    .
    .
    .
    
    3 oddzielne programowe PWMy o szerokosciach impulsu sterowanych na podsatwie odebranych info.
    


    Teraz pytanie moje brzmi: jak zapamiętywać odebraną daną wysłaną z kompa w dowolnej chwili czasu. Pętla musi być cały czas wykonywana, a zawartość UDR jest zapamiętywana tylko na czas trwania 1 rozkazu.
    Z góry dziękuję :)

    Proszę w temacie postu podawać nazwę architektury procesora!
    Przeniosłem z "Programowanie początkujący".
    [Dr.Vee]
  • REKLAMA
  • #2 6701536
    chudybyk
    Poziom 31  
    Czemu danej nie zapamiętasz gdzieś w ramie?
    Po instrukcji "in r16, UDR" umieść "sts zmienna,r16".
  • #3 6703766
    pawel200388

    Poziom 17  
    Ale pytanie btrzmi co to da? :) Sytuacja wygklada tak, ze odbieram dana, i wykonuje kod zalezny od tej danej + wykonuje dodanie/odjecie skoku dla sygnalow PWM. Nastepnie zaim uklad otrzyma nastepne informacje wraca do poczatu petli i zajmuje sie juz tylko sygnalem PWM, do czasu pojawienia sie kolejnego sygnalu. problem w tym ze jak uC jest w trakcie wykonywania samego srodka programu, to odebrane info zaraz po wykonaniu jakiegokolwiek rozkazu przepada. I z tym wlasnie nie moge sobie poradzić.
  • #4 6704839
    chudybyk
    Poziom 31  
    Tak do końca nie rozumiem. Procek dostaje tak dużo danych, że nie nadąża z resztą programu?
    Każdy odebrany bajt będzie stracony dopiero, gdy USART odbierze w całości następny (już nie wspomnę o sprzętowym buforze), a Ty nie zdążysz jeszcze pobrać poprzedniego. Masz w programie głównym jakieś czasożerne procedury?
    Odbieraj dane w przerwaniu i umieszczaj je w jakimś programowym buforze, np. typu fifo, a odbierać z tego bufora możesz w główym programie.
    Nie wiem co masz na myśli pisząć "odebrane info zaraz po wykonaniu jakiegokolwiek rozkazu przepada". Jak to przepada? Co właściwie przepada? UDR zawiera tylko ostatni bajt z USARTa, ale jak już pisałem, możesz go sobie przepisać do ramu po odebraniu. Nie rozumiem problemu.
  • REKLAMA
  • #5 6705163
    pawel200388

    Poziom 17  
    Dane są przechowywane w UDR przez okres wykonania 1 rozkazu. Więc jeśli jakiś rozkaz uC wykona i przejdzie do następnego to UDR jest czyszczony. Przynajmniej AVR Studio tak pokazuje w symulacji. Dlatego program nawet nie musi być czasochłonny.
    Nie pomyślałem jednak o przerwaniach. Z ich pomocą nie byłoby problemu, jednak jeszcze tych kwestii nie ogarnąłem :) Cóż, książka do ręki i będę się uczył :P Tymczasowo dzięki :) Tematu nie zamykam, może będę miał jeszcze pytania :)
  • REKLAMA
  • #6 6705518
    chudybyk
    Poziom 31  
    Dane są przechowywane w UDR od czasu pojawienia się danej (sygnalizowane flagą RXC) do czasu odczytu tej wartości - np. rozkazem in r16,UDR. Wtedy automatyczne kasowana jest flaga RXC i rejestr UDR jest gotowy do przechwycenia następnego bajtu - czyli jak wolisz "jest czyszczony". Zauważ jednak, że kiedy UDR jest wyczyszczony, to masz już odebrany bajt w rejestrze r16. Możesz dalej coś z nim zrobić.
  • #7 6708316
    pawel200388

    Poziom 17  
    Ooo.. Dlaczego symulator w takim razie twierdzi inaczej?? :) Skoro tak jest to mój program jest gotowy :D
    Oczywiście cały czas pisałem o ATMEGA8, zapomniałem w pierwszym poście ująć :)
  • #8 6709758
    chudybyk
    Poziom 31  
    Jak to inaczej? Niemożliwe! Czy możesz przepisać kawałek kodu, w którym to tajemnicze zniknięcie się pojawia? Zaznacz to miejsce, jeśli możesz.
    Pozdrawiam!
  • #9 6712671
    pawel200388

    Poziom 17  
    Niestety kodu upublicznić nie mogę, więc wrzucam tyle ile potrzeba :) Jak odpalam program, dochodzę do którejś z instrukcji w petli, ustawiam sobie RXC oraz jakąś wartość w UDR, klikam w AVR Studio "następny krok", wykona mi instrukcję przy jakiej aktualnie się zatrzymałem i wyczyszcza UDR oraz bit RXC.

    
    .include "m8def.inc"
    
    .org 0x0000
    
    sbi DDRB, 1	
    sbi DDRB, 2	
    sbi DDRC, 0
    sbi DDRC, 1
    sbi DDRC, 2
    sbi DDRC, 3
    
    petla:
    
    sbis UCSRA, RXC	;w sumie tą część kodu można raczej wyrzucić
    in r16, UDR		
    
    
    cpi r16,1		
    breq wlewo
    
    cpi r16,2
    breq wprawo
    
    rjmp petla
    
    wlewo:
    sbi PORTB,1
    sbi PORTB,2
    cbi PORTC,0
    cbi PORTC,1
    sbi PORTC,2
    cbi PORTC,3
    rjmp petla	
    
  • #10 6713501
    chudybyk
    Poziom 31  
    Znalazłem dwa problemy:
    1. Ten program nie ma prawa działać, bo instrukcją sbis UCSRA, RXC pomijasz odbieranie znaku z UDR, kiedy jest zapalona flaga RXC! Nigdy nie odbierzesz niczego. Zamień instrukcję sbis na sbic. Pomijam już, że nie inicjujesz rejestrów USART-a, nie ustawiasz szybkości transmisji, ani nie włączasz odbiornika.
    2. Symulator v1 nie pozwala na modyfikacje rejestru UDR. Prawdopodobnie dlatego dane ci się "gubiły". Tu jest wyjaśnienie wzięte z helpa AVRStudio:
    Cytat:
    The UART/USART UDR register can only be modified from the application. Input via stimuli files or by modifying the I/O view etc is not possible.

    Proponuję do celów debugowania przejść na procek obsługiwany przez symulator w wersji V2. Osobiście polecam pracę z JTAG-iem, który pozwala na sprzętowe debugowanie programu w samym procesorze. Niestety, JTAG obsługiwany jest dopiero przez Atmega16.
    Pozdrawiam!
  • #11 6715578
    pawel200388

    Poziom 17  
    Akurat co do inicjacji wszystko jest, tylko przeoczyłem to podczas kopiowania. Mogę ew. na pw udostępnić Ci program, o ile oczywiście masz czas i ochote sprawdzić. Różnicę pomiędzy sbis i sbic przestudiuję jutro, bądź pojutrze (mam sesje :/). Co do fragmentu kodu o którym piszesz, został on zapożyczony z noty katalogowej ATMEGI8, okrojony o 1 rozkaz zapętlający ten fragment do pojawienia się informacji na RS. Ale sprawdzę tą sugestię :)

    Niestety nie mam możliwości przesiadki na inny uC.
    Co do wersji symulatorów a AVRStudio nie miałem pojęcia ;o dzięki :D
  • REKLAMA
  • Pomocny post
    #12 6717137
    chudybyk
    Poziom 31  
    W nocie katalogowej jet dobrze. Wyciąłeś linię, która zapętlała procedurę do chwili otrzymania znaku. Rozkaz sbis przeskakuje następną instrukcję, gdy ustawiony jest bit argumentu, sbic działa dokładnie odwrotnie - przeskakuje następny rozkaz gdy bit argumentu jest zgaszony. Przyjrzyj się temu sam.
    Co prawda symulator nie pozwala na ręczną zmianę UDR, ale możesz do symulacji wykorzystać jakąś komórkę w Ramie, nazwać ją np. "UDRtest" i na niej sprawdzać działanie programu. Przy programowaniu musisz tylko zmienić z powrotem na UDR.
    Program możesz wysłać, ale nie gwarantuję, że znajdę czas na analizę.
    Pozdrawiam!
  • #13 6852214
    pawel200388

    Poziom 17  
    Przepraszam za to opóźnienie, ale miałem trochę problemów osobistych. Wracając do tematu. Próbuję zrobić to na przerwaniach, ale jeszcze nie za bardzo mi idzie sama ich obsługa. Tymczasem więc wysyłam na PW program. Od razu uprzedzam, że praktycznie cały działa poprawnie (i PWM i ustawianie stanów w zależności od odebranego bajtu, ,więc tego nie ma co sprawdzać) poza tym problemem z pobieraniem bajtu z kompa. Być może nie potrafię zwyczajnie ustawić parametrów portu COM w kompie :) nie wiem :) W każdym bądź razie działa cały program poza tym jednym problemem, więc na resztę nie zwracaj uwagi.
    Z góry będę naprawdę wdzięczny za pomoc i odpłacę się niezależnie od wyniku pomocy przyciskiem pomógł i punktami.
  • #14 6862572
    pawel200388

    Poziom 17  
    Przepraszam, że post pod postem, ale usparwiedliwiam się 3 dniami różnicy :) W razie uwag, połącze posty :):)
    Poradziłem sobie z odbieraniem danych, więc prośbę o sprawdzenie programu wycofuję :):) Zrobiłem to na bazie przerwań i wszystko wreszcie śmiga :) Tematu nie zamykam, dopóki nie ukończę programu na glanc :)

    Ukończony :D Dziękuję serdecznie :D Klikam pomógł :D
REKLAMA