Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

UART w AVR -jak obsłużyć transmisje danych w asemblerze?

jaktojest
-
-
Posty:3
Rejestracja:19 lip 2005, o 21:47
Lokalizacja:bytom
UART w AVR -jak obsłużyć transmisje danych w asemblerze?

Postautor: jaktojest » 19 lip 2005, o 22:07

Czy moze mi ktoś powiedzieć jak odbierać i nadawać posługując się przerwaniami?
Jakie bity koniecznie sprawdzać, w którym momencie odczytać daną czy wysłać?

moim zadaniem jest zrealizowanie transmisji asynchronicznej między mikrokontrolerami:
Atmega162 i Atmega8 (w asemblerze). (dana 8bitowa)(1200b/s)

Każda próba napisania programu do do odbioru/nadawania danej kończyła się niepowodzeniem :(.
czasem zaledwie odbierane są zera lub 8(bin).

Więc może robię coś nie tak. HELP MI.

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty:2653
Rejestracja:24 sty 2005, o 00:39
Lokalizacja:Winny gród

Postautor: pajaczek » 20 lip 2005, o 00:49

Wszystko masz w pdf'ach (no przyznaje, w niektorych nie ma przykladow, wowczas zerknij do pdf'u innego uC, mozliwie podobnego, zeby mial taka sama liste rozkazow ASM - choc zawsze mozna przeciez troche przerobic kod ;) ).

Co do sprawdzania bitow. To przerwanie zglasza Ci kiedy sa dane do odczytania, zadnej flagi w tym celu sam nie sprawdzasz, chyba ze chcesz obslugiwac Rx bez przerwania. Dosc podobnie sprawa sie ma z nadawaniem.


A zeby stwierdzic czy robisz cos nie tak, to moze bys tak zamiescil kawalek kodu ??

jaktojest
-
-
Posty:3
Rejestracja:19 lip 2005, o 21:47
Lokalizacja:bytom

Postautor: jaktojest » 20 lip 2005, o 08:53

Już daje kawałek kodu. Narazie testuję bez przerwań:
INI_UART: ;inicjalizacja UARTa atmega8
ldi temp,0 ;ustawienie prędkości UARTa
out UBRRH,temp ;na 1200b/s, czyli UBBR=207
ldi temp,0xCF
out UBRRL,temp
ldi temp,0b00011000 ;wyłaczenie przerwań z UARTA
out UCSRB,temp ;i właczenie nad/odb
ldi temp,0b10100110 ;ustawienie ramki 8data,1stop bit,parzystośc
out UCSRC,temp
i tak samo skonfigurowana atmega162
;----------------procedury nadawania z mega162-----------------------------
nadajRS:
rcall nadajRS1
ldi temp4,0x36
out udr1,temp4
ret
nadajRS1:sbis UCSR1A,udre1
rjmp nadajRS1
ret
;---------------------------------
start2: rcall odbRS ; w petli głównej co chwile sprawdzam czycoś nie odebrano
;...
rjmp start2
;-------
odbRS: sbis UCSRA,RXC ;czekamy na odbiór danej
ret ; nie ma danej
in danaM,UDR ;jest dana
ret
================================
potem sprawdzam np: na porcie co mam

Czy dobrze rozumie, że jak zrobione to bedzie na przerwaniach, to po przerwaniu że jest dana wystarczy tylko odczytać daną komenda IN i nic więcej.(czy jest coś istotnego na co mam zwrócic uwage)
A przy nadawaniu po przerwaniu że bufor pusty nadac rozkazem out ?
Podsumuwując: nie trzeba już ustawic jakiegoś bitu? wszytsko zrobi sie automatycznie?
Co najlepiej sprawdzać ( czy zawsze trzeba sprawdzać fe, ov bity?)
wiem, że są pdf...ale dla niezbyt wprawnego programisty nie wszystko okazuje sie takie oczywiste ( tymbardziej że coś nie działa).
Dzięki za wszelkie uwagi..moze mnie na coś naprowadzicie. Idę walczyć dalej...dam oczywisice znac jak zadziała coś

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty:2653
Rejestracja:24 sty 2005, o 00:39
Lokalizacja:Winny gród

Postautor: pajaczek » 20 lip 2005, o 12:06

Już daje kawałek kodu. Narazie testuję bez przerwań:
Ujme to tak:

Kod: Zaznacz cały

INI_UART: ;inicjalizacja UARTa atmega8 ldi temp,0 ;ustawienie prędkości UARTa out UBRRH,temp ;na 1200b/s, czyli UBBR=207 ldi temp,0xCF out UBRRL,temp
To by sie zgadzalo, pod warunkiem ze Fosc=4MHz oraz nie stosujesz trybu x2. Przy okazji, jesli kozystasz z UARTU, stosuj kwarce, wewnetrzny osc jest malo dokladny, pozatym warto stosowac kwarce x*115200.

Kod: Zaznacz cały

ldi temp,0b00011000 ;wyłaczenie przerwań z UARTA out UCSRB,temp ;i właczenie nad/odb ldi temp,0b10100110 ;ustawienie ramki 8data,1stop bit,parzystośc out UCSRC,temp
UCSRB ok, UCSRC tez ok. Na przyszlosc sugeruje notacje taka:

Kod: Zaznacz cały

ldi temp, (1<<RXEN)|(1<<TXEN) out UCSRB, temp ldi temp, (1<<URSEL)|(3<<UCSZ0)|(2<<UPM0) out UCSRC, temp
Jest czytelniejszy.

Kod: Zaznacz cały

;----------------procedury nadawania z mega162----------------------------- nadajRS: rcall nadajRS1 ldi temp4,0x36 out udr1,temp4 ret nadajRS1:sbis UCSR1A,udre1 rjmp nadajRS1 ret
Troszke tracisz krokow na tym rcall (mozna to napisac bez wywolania, sprawdzac w nadajRS), pozatym wyglada ok.

Kod: Zaznacz cały

;--------------------------------- start2: rcall odbRS ; w petli głównej co chwile sprawdzam czycoś nie odebrano ;... rjmp start2 ;------- odbRS: sbis UCSRA,RXC ;czekamy na odbiór danej ret ; nie ma danej in danaM,UDR ;jest dana ret
Tez wyglada ok.
Czy dobrze rozumie, że jak zrobione to bedzie na przerwaniach, to po przerwaniu że jest dana wystarczy tylko odczytać daną komenda IN i nic więcej.(czy jest coś istotnego na co mam zwrócic uwage)
A przy nadawaniu po przerwaniu że bufor pusty nadac rozkazem out ?
Podsumuwując: nie trzeba już ustawic jakiegoś bitu? wszytsko zrobi sie automatycznie?
Wlasciwie tak. Moje skromne doswiadczenie nie wskazuje tu na mozliwosc jakis pulapek. Choc osobiscie nie przypominam sobie bym robil nadawanie na przerwaniu, ale odbior robie praktycznie zawsze.
Co najlepiej sprawdzać ( czy zawsze trzeba sprawdzać fe, ov bity?)
wiem, że są pdf...ale dla niezbyt wprawnego programisty nie wszystko okazuje sie takie oczywiste ( tymbardziej że coś nie działa).
fe, ov ??

A w pdf masz przewaznie przyklady kodu w C i ASM, wystarczy przewaznie przepisac i uruchomic w Studio w symulatorze, by zobaczyc jak to dziala.

jaktojest
-
-
Posty:3
Rejestracja:19 lip 2005, o 21:47
Lokalizacja:bytom

Postautor: jaktojest » 20 lip 2005, o 13:36

rzeczywiscie używam kwarca 4MHz (przełaczone atmegi na zewnętrzny kwarc)
..a gdzie zmienia sie tryb x2? ... bo może tam coś ma nie tak

Tylko odbieranie zrobiłam na przerwaniach, według zaleceń:)...
ale i tu klops...przerwanie odbioru wogóle nie wystepuje. :(
Obawiam sie że to coś sprzętowo nie działa:(..więc wracam do testowania i sprzętu..
choć tojuz trudniej wyczuć co nie tak (atmegi działają ogólnie, tylko problem z UArtem)

Więc program wygląda w sumie ok.
dzięki za przeglądniecie kodu i za uwagi.

Awatar użytkownika
gawel
-
-
Posty:683
Rejestracja:24 lis 2003, o 11:19
Lokalizacja:Białystok

Postautor: gawel » 20 lip 2005, o 15:12

rzeczywiscie używam kwarca 4MHz (przełaczone atmegi na zewnętrzny kwarc)
..a gdzie zmienia sie tryb x2? ... bo może tam coś ma nie tak

Tylko odbieranie zrobiłam na przerwaniach, według zaleceń:)...
ale i tu klops...przerwanie odbioru wogóle nie wystepuje. :(
Obawiam sie że to coś sprzętowo nie działa:(..więc wracam do testowania i sprzętu..
choć tojuz trudniej wyczuć co nie tak (atmegi działają ogólnie, tylko problem z UArtem)

Więc program wygląda w sumie ok.
dzięki za przeglądniecie kodu i za uwagi.
Napisz do mnie na e-mail: an177@poczta.fm
Z pewnością uda nam się rozwiązać twoje problemy.

Wróć do „AVR/AVR32”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 3 gości