Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 30 mar 2026, o 19:41


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 12 ] 
Autor Wiadomość
PostNapisane: 26 maja 2017, o 19:49 
Offline
Użytkownik

Dołączył(a): 18 sty 2015
Posty: 170
Pomógł: 0

Dotychczas AVR-y programowałem w czymś innym niż C (ale nie będę pisał w czym, bo wstyd ;-).

Teraz chwyciłem za serię poradników do RS232 pana Mirka i napisałem sobie kod dla Atmegi32, który ma słać znak "A" w pętli, przy prędkości 4800 8,n,1, przy okazji co sekundę zmienić stan LED-a.

Led niby miga poprawnie, ale oczywiście (na szczęście? ;-)) coś nie do końca działa z transmisją po UART i pewnie zaraz dojdę w czym problem. Aż jestem ciekaw co i jak bardzo spaprałem ;-)

Natomiast piszę tutaj na forum, na żywca, żeby pokazać, jak fajnie mieć do dyspozycji wygodne narzędzia (na przykład analizator stanów logicznych, w moim przypadku klon Salea-e prosto z Chin za 10 zł ;-)

Najpierw "mój" kod:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Ustawienia projektu:
Obrazek

Fusebity Atmegi32:
Obrazek

Dobra, czyli nie docierają do mojego putty znaki "A" wysyłane w pętli przez Atmegę32. Wpinam się więc analizatorem Saleae do TX-a Atmegi i sprrawdzam co się dzieje. Więc tak, jakaś transmisja jest:

Obrazek

ale widać, że analizator kodu sygnalizuje błędne ramki. Analizator skonfigurowany jak widać poniżej:

Obrazek

Ramki wyglądają tak:

Obrazek

Obrazek

I teraz czas na rewelacyjną funkcję Saleae :-)

Obrazek

Pewnie spaprałem coś z timingami / baudrate-m. Może źle załadowałem jakieś rejestry UART-a.

Po zaznaczeniu autobaud Saleae twierdzi, że baudrate jest w rzeczywistości 304 (zamiast 4800) ;-)

Obrazek

I przy takim właśnie baudrate zaczyna rozpoznawać znaki "A" :-)

Obrazek

A teraz czas namierzyć problem... Hmm... 4800 / 304 = 15,789473684210526315789473684211
Hmm, czyli transmisja jest około 16 razy wolniejsza niż planowałem. Chyba muszę trochę pomyśleć ;-) Znikam, i mam nadzieję, wracam niebawem ;-)







Ostatnio edytowano 26 maja 2017, o 20:55 przez mes mariusz, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 maja 2017, o 20:40 
Offline
Moderator zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 18 lip 2012
Posty: 3230
Lokalizacja: Kraków - obok FAB5 ATMEL'a
Pomógł: 91

topic7402.html

_________________
http://www.jaglarz.info



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 maja 2017, o 20:55 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 maja 2013
Posty: 432
Lokalizacja: Gostyń / Poznań
Pomógł: 25

Zerkam do przykładów bibliotek Mirka i widzę że tam makro do liczenia __UBRR wygląda inaczej. Może to w tym problem?!

_________________
Podpis...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 maja 2017, o 21:01 
Offline
Użytkownik

Dołączył(a): 18 sty 2015
Posty: 170
Pomógł: 0

eMCe2 napisał(a):
Zerkam do przykładów bibliotek Mirka i widzę że tam makro do liczenia __UBRR wygląda inaczej. Może to w tym problem?!


Hmm... Muszę się temu przyjrzeć. Niemnniej kod do UBRR wziąłem stąd:

Obrazek

A, zaraz, gdzieś czytałem, bodajże na blogu pana Mirka że ten wzór ponoć ma nie działać dla kwarców innych niż przyjazne dla UART. No nic, muszę przyjrzeć się tematowi. Ale, czyżby efektem mogło być spowolnienie baudrate'a 16 razy?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 maja 2017, o 21:17 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

witam,
Chyba brak ustawionego bitu URSEL w UCSRC. ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 maja 2017, o 21:32 
Offline
Użytkownik

Dołączył(a): 18 sty 2015
Posty: 170
Pomógł: 0

Daro69 napisał(a):
witam,
Chyba brak ustawionego bitu URSEL w UCSRC. ?


Hmm...

Z noty wynika, że ten bit jest domyślnie ustawiony po resecie na "1".

Obrazek

Jak rozumiem, URSEL przełącza dostęp między rejestrami UCSRC oraz UBRRH. Musi być jedynką podczas pisania do UCSRC.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 maja 2017, o 21:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

Niby tak, ale w kodzie jest : UCSRC =...
A nie UCSRC |=.. ?

------------------------ [ Dodano po: 2 minutach ]

Czyli zerujemy pozostałe bity.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 maja 2017, o 21:47 
Offline
Użytkownik

Dołączył(a): 18 sty 2015
Posty: 170
Pomógł: 0

Hmm. Nie wiem, dlaczego, ale ustawienie (1<<URSEL) rzeczywiście rozwiązuje problem.
Ja tego nie rozumiem nazbyt, ale jeśli ktoś potrafi to jakoś wytłumaczyć chętnie prześledzę.

Poprawny kod:

Składnia: [ Pobierz ] [ Ukryj ]
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 maja 2017, o 21:56 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

mes mariusz napisał(a):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Obrazek

------------------------ [ Dodano po: 4 minutach ]

zauważ że wpisem '=' wpisujesz w rejestr dokładnie to co jest z prawej. UCSRC=3<<1 /(UCSZ0)
w tym wypadku nie korzystamy z zapisu |=...dlatego pozostałe bity kasuje. ;)

------------------------ [ Dodano po: 10 minutach ]

gdybyśmy tego rejestru nie ustawiali to domyślnie byłoby tak jak piszesz.
pozostałby ustawiony pierwszy i siódmy bit w rejestrze.
ale my to zmieniamy na: 1,2,7.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 maja 2017, o 22:09 
Offline
Użytkownik

Dołączył(a): 18 sty 2015
Posty: 170
Pomógł: 0

OK. Czyli po resecie URSEL teoretycznie ustawione na 1 ale ja i tak to zmieniałem, ustawiając (3 << UCSZ0).
Dobra, wygląda na to, że wszystko jasne. Dzięki.

PS. Wcześniej chyba za bardzo zaabsorbowałem się tym momentem:

Obrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 maja 2017, o 22:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

no można się machnąć, :) tam jest ustawienie dla Atmegi328 . jest trochę inaczej.

------------------------ [ Dodano po: 8 minutach ]

zerknij do BB bo widzę że masz. rozdział 5,8 Komunikacja RS232/RS485. :) jest przykład.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 maja 2017, o 23:38 
Offline
Użytkownik

Dołączył(a): 18 sty 2015
Posty: 170
Pomógł: 0

Generalnie już wszystko działa (tak jak pisałem post wyżej) i wiem, gdzie robiłem błąd. Ale i tak zajrzę :-)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 12 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO