ATNEL tech-forum
https://forum.atnel.pl/

UART nie do ruszenia - ATMega88pa-AU
https://forum.atnel.pl/topic22491.html
Strona 1 z 1

Autor:  Bartq [ 13 sie 2019, o 17:45 ]
Tytuł:  UART nie do ruszenia - ATMega88pa-AU

Cześć, dzień dobry wszystkim :)

Tworzę projekt małego "sterownika" do kamerki cofania w samochodzie.
Założenia są takie, że po włączeniu biegu wstecznego ATMegama zacząć wysyłać poprzez UART kilka komend aby wysunął się fabryczny wyświetlacz Volvo RTI oraz ustawiać tryb wysoki na jednej z nóżek aby zasilić kamerkę.
Dopóki układ był na płytce stykowej i ATMedze16 to wszystko działało w porządku. Zdecydowałem wtedy o przeniesieniu układu na PCB i mniejszą ATMegę 88, która akurat miałem w zapasach.
Większość kodu (nie najpiękniejszego zresztą) działa poprawnie poza tym nieszczęsnym UARTem. Jakiegoś zaćmienia dostałem lub jest jezcze jakaś konfiguracja, o której zapomniałem.
Poniżej także kawałek testowego kodu (również nie rusza) aby sprawdzić czy w ogóle USART w tej ATMedze jest sprawny.
Dodam na koniec, że oscyloskop po podłączeniu do nóżki TxD pokazuje cały czas stan wysoki/idle.
Poniżej także załączam schemat (układ już polutowany na PCB)

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



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


Obrazek

Autor:  Bartq [ 13 sie 2019, o 18:43 ]
Tytuł:  Re: UART nie do ruszenia - ATMega88pa-AU

Starałem się pisać kod właśnie w oparciu o datasheet.

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


Z tego fragmentu zrozumiałem, że istotny jest tu rejestr UBRR0, który składa sie z L oraz H, do którego wpisujemy nasz ubrr.
Ja UBRRu nie liczyłem, pobrałem go w formie dziesiętnej z tabelki na końcu rozdziału. Oraz dla predkości 8MHz oraz 2400 baud = 207
Stąd taką wartość wpisuję do niższego rejestru.
Kolejnym krokiem jest chyba ustawienie formatu ramki danych. Jeśli dobrze odczytałem z datasheet to domyslnie jest to 8 bitów danych , bit stopu i brak parzystości. Z takiego ustawienia korzystam, dlatego pominąłem tę część kodu.

Mam wrażenie, jakby ten UART miał ochotę ruszyć, ponieważ mimo wszystko stan na linii TxD się podnosi do 5V ale niestety brak tam więcej oznak życia. W przypadku błędnych ustawień miałbym pewnie dużo śmieci ale cokolwiek powinno się pojawić ?

Autor:  Bartq [ 13 sie 2019, o 18:50 ]
Tytuł:  Re: UART nie do ruszenia - ATMega88pa-AU

Z początku myslałem, że zegar źle ustawiłem, ale gdy zrobiłem testowy program, który w pętli głównej zmieniał mi tylko stan jednego pinu (500ms) to oscyloskop elegancko wskazał 1Hz. Częstotliwosc ustawiona na 8MHz i jest ok.
Poniżej fusebity.

ObrazekObrazek

Autor:  MirkoT [ 13 sie 2019, o 19:49 ]
Tytuł:  Re: UART nie do ruszenia - ATMega88pa-AU

Bartq napisał(a):
Starałem się pisać kod właśnie w oparciu o datasheet.

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



A jak masz ustawione taktowanie w projekcie?
I jak popędzasz tą swoją ATMegę?

Autor:  mirekk36 [ 13 sie 2019, o 20:09 ]
Tytuł:  Re: UART nie do ruszenia - ATMega88pa-AU

Patrząc na całość zdecydowanie polecałbym koledze Bartq zacząć od porządnej książki:

https://atnel.pl/mikrokontrolery-avr-jezyk-c.html

a jeśli chodzi o np takie "herezje" ;)

Bartq napisał(a):
#define FOSC 1843200 // Clock Speed
#define BAUD 9600
#define MYUBRR FOSC/16/BAUD-1


to chociaż jak nie ma książki to bloga poczytać np to:

https://mirekk36.blogspot.com/2013/01/r ... trick.html

Autor:  mirekk36 [ 13 sie 2019, o 20:28 ]
Tytuł:  Re: UART nie do ruszenia - ATMega88pa-AU

No i co z tego - jak na Blogu pokazuję jak się należy to robić ;) poprawnie dla KAŻDEJ prędkości

Autor:  Bartq [ 13 sie 2019, o 20:59 ]
Tytuł:  Re: UART nie do ruszenia - ATMega88pa-AU

Dziękuję wszystkim za podpowiedzi.
Te 'herezje' pochodzą z noty katalogowej uC i w moim kodzie nie są wykorzystywane. Uznałem swój program za tak mały i nie wymagający tak wielkiej dokładności i elastyczności że zdecydowałem się wykorzystać gotowy obliczony UBRR - stąd takie mniej eleganckie rozwiązanie.
Trick z makro Oraz bluebooka już znam, bardzo dobra skarbnica wiedzy.

Udało mi się natomiast namierzyć problem(y).
1. Omyłkowo jakimś magicznym sposobem w kodzie włączyłem tryb synchroniczny
2. UDR0 musi być ciągle uzupełniane. Myślę że po dokonaniu transmisji rejestr ten jest czyszczony. Czy ktoś jest w stanie to potwierdzić ?

Na ten moment program testowy działa, wiem już że sprzętowo wszystko jest w porządku.

Strona 1 z 1 Strefa czasowa: UTC + 1
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/