Witam Wszystkich
Mam taki o to problem ..napisałem program w asemblerze do obsługi interfejsu UART (atmega32) i wszystko byłoby ok, gdyby nie problem, który udało mi się wychwycić podczas symulacji w AVR STUDIO 4.13. Problem polega na tym że po sygnalizacji że w rej. UDR pojawił się znak..rozpoczyna się procedura przerwania odbierająca ten znak ale zanim zdążę ten znak odebrać zostanie on wyzerowany tzn. przed odebraniem realizowanym instrukcją: IN ACC,UDR rejestr UDR zostaje wyzerowany..nie wiem dlaczego tak się dzieje. Proszę o pomoc.
Program zamieściłem w załączniku.
Więcej informacji znajduje się też pod linkiem->
https://forum.elportal.pl/viewtopic.php ... ff88b95c2c
`
Problem z obsługa UART [asembler]
Problem z obsługa UART [asembler]
- Załączniki
-
- uart2oki.rar
- (3.36 KiB) Pobrany 548 razy
-
ZbeeGin
Takie są niestety uroki programowej symulacji. Da się to obejść modyfikując ręcznie rejestr do którego trafia zawartość UDR. Wystarczy ustawić pułapkę po instrukcji IN i wklepywać wartości.
Może Ci pomóc sprytny programik HAPSIM ( http://www.helmix.at/hapsim/ ), który podobno potrafi podsyłać dane do symulatora z mini terminala. Nie testowałem jednak tego rozwiązania.
Z ostatniej chwili. Tak, działa. Tylko strasznie wolno a reakcja jest dość opóźniona.
Może Ci pomóc sprytny programik HAPSIM ( http://www.helmix.at/hapsim/ ), który podobno potrafi podsyłać dane do symulatora z mini terminala. Nie testowałem jednak tego rozwiązania.
Z ostatniej chwili. Tak, działa. Tylko strasznie wolno a reakcja jest dość opóźniona.
No i właśnie tak zrobiłem..uruchomiłem debuggera i wybrałem krokowe uruchamianie,gdy program przeszedł opcje określenia stosu, wpisałem ręcznie jakaś daną (znak pisarski) do rejestru UDR w USART oraz ustawiłem znacznik RXC w rejestrze sterującym UCSRA.
Program w następnym kroku przechodzi do obsługi przerwania USARTRXDInterrupt czyli odbiornika USART. Co ciekawe co zauważyłem i znalazło to również potwierdzenie w praktyce (bo dioda do sygnalizacji odbioru danych mi świeci w układzie), zaraz po przejściu do procedury przerwania USART dane wpisane ręcznie do UDR się kasują, po prostu zerują i to zaraz po wykonywaniu makroinstrukcji pushf oraz pushz. Musze wpisywać je jeszcze raz do UDR i dokładnie przed odczytem z tego rejestru (IN ACC,UDR). Czy to jest normalne? Bo według mnie tak nie powinno być. Dane powinno się zachowac do momentu odczytu, czy mam racje? A może coś schrzaniłem podczas inicjacji interfejsu USART? Może niewłaściwe wartości wpisałem do rej. sterujących UCSRA-C albo coś zgubiłem? Sprawdzałem to kilka razy i nie znalazłem błędu.
Program w następnym kroku przechodzi do obsługi przerwania USARTRXDInterrupt czyli odbiornika USART. Co ciekawe co zauważyłem i znalazło to również potwierdzenie w praktyce (bo dioda do sygnalizacji odbioru danych mi świeci w układzie), zaraz po przejściu do procedury przerwania USART dane wpisane ręcznie do UDR się kasują, po prostu zerują i to zaraz po wykonywaniu makroinstrukcji pushf oraz pushz. Musze wpisywać je jeszcze raz do UDR i dokładnie przed odczytem z tego rejestru (IN ACC,UDR). Czy to jest normalne? Bo według mnie tak nie powinno być. Dane powinno się zachowac do momentu odczytu, czy mam racje? A może coś schrzaniłem podczas inicjacji interfejsu USART? Może niewłaściwe wartości wpisałem do rej. sterujących UCSRA-C albo coś zgubiłem? Sprawdzałem to kilka razy i nie znalazłem błędu.
-
ZbeeGin
Widzisz. Nie przeczytałeś dokładnie mojego poprzedniego posta. Zostało to tam wyjaśnione.
Nie tylko Ty masz taki problem - na forum AVR Freaks także był poruszony ten problem. Dlatego padła propozycja skorzystanie z HAPSIM.
Uruchomiłem HAPSIMA, połączył się z AVR Studio, wpisuje on do UDR dane, które się NIE KASUJĄ podczas symulacji. I odczyt jest poprawny.
Nie tylko Ty masz taki problem - na forum AVR Freaks także był poruszony ten problem. Dlatego padła propozycja skorzystanie z HAPSIM.
Uruchomiłem HAPSIMA, połączył się z AVR Studio, wpisuje on do UDR dane, które się NIE KASUJĄ podczas symulacji. I odczyt jest poprawny.
Przepraszam Cie Kolego ZbeeGin, ale chyba nie bardzo się rozumiemy.
Chce rozwiązać problem w którym na wyświetlaczu nic mi się nie wyświetla pomimo tego że wysyłam do procka łańcuch do wyświetlenia. Sądziłem że przyczyna tkwi właśnie w tym że dane w UDR mi się kasują. Dzięki za odpowiedż...ale czy mam rozumiec że to jest wina AVR Studio? A nie mojego programu?
[ Dodano: 2008-06-24, 22:58 ]
"...Odczyt był poprawny..." aha czyli muszę szukać problemu gdzie indziej..
Chce rozwiązać problem w którym na wyświetlaczu nic mi się nie wyświetla pomimo tego że wysyłam do procka łańcuch do wyświetlenia. Sądziłem że przyczyna tkwi właśnie w tym że dane w UDR mi się kasują. Dzięki za odpowiedż...ale czy mam rozumiec że to jest wina AVR Studio? A nie mojego programu?
[ Dodano: 2008-06-24, 22:58 ]
"...Odczyt był poprawny..." aha czyli muszę szukać problemu gdzie indziej..
-
ZbeeGin
Pokazałeś fragment programu - w dodatku zaczerpnięty z książki kol. Gawła. Zatem część napisana przez niego działa na 100%. Przedstaw całość prgramu to wtedy można będzie coś sensownego powiedzieć. Oczywiście nie zbuduję sobie urządzenia by mieć pewność, że działa.Matrix86 pisze:Chce rozwiązać problem w którym na wyświetlaczu nic mi się nie wyświetla pomimo tego że wysyłam do procka łańcuch do wyświetlenia.
Witam ponownie
Pisze tutaj bo mam pewien kolejny problem...
Chce zrobić coś takiego w swoim systemie.
Chciałbym zrobić tak że gdy przycisnę przycisk to wyświetlacz będzie mi wyświetlał napis >10 znaków max do 25 znaków (czyli realizował tzw. scrolling) na 10 pozycjach. A gdy ponownie przycisnę przycisk to program będzie realizował wyświetlanie statyczne czyli do 10 znaków na 10 pozycjach. Czy takie rozwiązanie jest w ogóle możliwe..? Będę wdzięczny jakby ktoś mi wyjaśnił na czym to polega i jak wygląda.
pozdrawiam
Pisze tutaj bo mam pewien kolejny problem...
Chce zrobić coś takiego w swoim systemie.
Chciałbym zrobić tak że gdy przycisnę przycisk to wyświetlacz będzie mi wyświetlał napis >10 znaków max do 25 znaków (czyli realizował tzw. scrolling) na 10 pozycjach. A gdy ponownie przycisnę przycisk to program będzie realizował wyświetlanie statyczne czyli do 10 znaków na 10 pozycjach. Czy takie rozwiązanie jest w ogóle możliwe..? Będę wdzięczny jakby ktoś mi wyjaśnił na czym to polega i jak wygląda.
pozdrawiam