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

[atmega162] Jak wyłączyć CKDIV8 w Atmega162 i poprawnie skonfigurować UART?

pioadam 28 Maj 2012 19:48 2403 17
  • #1 10943017
    pioadam
    Poziom 10  
    Witam szanownych Kolegów.
    Po dłuższej przerwie od uC wracam do tematu.
    Składam odbiornik GPS na atmega162, kwarc 14,745, zasilanie uC 5V, wyświetlacz graficzny (zasilanie 5V) oraz gps FGPMMOPA4 zasilanie 3,3V

    Wyświetlacz graficzny wstał bez problemów, kłopoty zaczęły się przy podpięciu zewnętrznego kwarcu i uruchomieniu uart.
    Nie mogę sobie poradzić z wyłączeniem CKDIV8, reszta fusebitów ustawiona zgodnie z DS.
    Gdy mam włączone dzielenie przez 8 a w AVRStudio ustawię częstotliwość na 1843125 program działa prawidłowo (do czasu odbioru danych z gps ale o tym za chwilę)
    Po wyłączeniu CKDIV8 w ponyprogu atmega wyświetla ostatni obraz jaki był zapamiętany i na tym się zawiesza, tak samo dzieje się przy użyciu CLKPR= (1 << CLKPCE); CLKPR=0; w kodzie.
    Pomimo zwisu nadal mogę programować układ.
    Gdy usunę w/w linie (lub włączę CKDIV8) procek wstanie, jednak dane które odbiera to same śmieci (z tego co znalazłem na AVRFreaks prędkość UART również dzielona jest przez 8 i stąd błędne dane)
    Jeśli ktoś spotkał się z powyższym problemem będę wdzięczny za informację jak to obejść.
    Pozdrawiam, Piotrek
  • #3 10943675
    pioadam
    Poziom 10  
    Dzięki za zainteresowanie :)
    Dołączam kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod na ten moment jest paskudnym zlepkiem - optymalizacja będzie na koniec :)
    Przy takim ustawieniu kwarcu jaki jest w kodzie, delay trwa 4s więc widać działanie dzielnika przez 8. Po przestawieniu F_CPU na 1843125 delay trwa tyle ile powinien - 500ms.
    Pozdrawiam!

    EDIT:
    screen z ponyprog'a
    [atmega162] Jak wyłączyć CKDIV8 w Atmega162 i poprawnie skonfigurować UART?
  • #4 10944106
    mirekk36
    Poziom 42  
    A chcesz działać z 1 bitem stopu czy z dwoma ? bo w komentarzu masz 1 a w kodzie ustawiasz dwa:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    (1<<USBS1)

    poza tym babola robisz tutaj:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    powinno być

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    więc już na tym etapie sporo ci się pomieszało.

    Poza tym z tym delayem to też ci się może wszystko mieszać bo widzę że w kodzie definiujesz to nieszczęsne

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    ale pewnie używasz na swoje nieszczęście kociego AVR Studio 5/6. Najlepiej przesiądź się jak najszybciej na Eclipse i normalnie w opcjach projektu będziesz mógł ustawiać częstotliwość taktowania a wtedy i funkcje _delay i wiele innych rzeczy będzie ci dobrze działać.

    poczytaj sobie może to przy jakiejś okazji:

    http://mirekk36.blogspot.com/2011/11/dlaczego-eclipse-zamiast-avr-studio.html

    A tak jeszcze na marginesie to polecam do twojego procka do ustawiania fusów program MkAvrCalculator, który będzie działał ci z nim za free zamiast tego ponyproga.
  • #5 10944188
    dondu
    Moderator na urlopie...
    Nie ma potrzeby zmiany na Eclipse jak sugeruje Mirekk36:

    mirekk36 napisał:
    ... ale pewnie używasz na swoje nieszczęście kociego AVR Studio 5/6. Najlepiej przesiądź się jak najszybciej na Eclipse i normalnie w opcjach projektu będziesz mógł ustawiać częstotliwość taktowania a wtedy i funkcje _delay i wiele innych rzeczy będzie ci dobrze działać.

    Ponieważ używasz AVR Studio, to ustaw F_CPU w opcjach: http://mikrokontrolery.blogspot.com/2011/03/fcpu-gcc-gdzie-definiowac.html
    o czym kol. Mirekk36 dokładnie wie, a jeśli nie to już teraz będzie świadomy - nie taki on "koci" jak go kolega maluje. :)
  • #6 10944224
    pioadam
    Poziom 10  
    Ma być 1 bit stopu, jeśli dobrze rozumiem ma to wyglądać tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    ?

    co do
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    był dopisany teraz, normalnie ustawiam w opcjach AVRStudio a nie definiuję :)

    Posłucham się porady i zaraz zainstaluję eclipse, w avrstudio straszne jest gubienie bibliotek, co chwila coś się nie dołączy ;/

    EDIT:
    Widzę, że kolega mnie uprzedził ;) Jak pisałem, F_CPU definiuję w opcjach :)
  • #7 10944235
    dondu
    Moderator na urlopie...
    pioadam napisał:
    ... w avrstudio straszne jest gubienie bibliotek, co chwila coś się nie dołączy ;/

    Choć Eclipse ma inne zalety (sam go używam), to błąd o którym piszesz zapewne leży po Twojej stronie - drzewo projektu itp :)
  • #8 10944246
    pioadam
    Poziom 10  
    Bardzo możliwe ;) Eclipse używałem dawno temu jak zabierałem się za Jave i dobrze go wspominam, co do AVRStudio- przy poprzednim podejściu do AVRów właśnie jego miałem opisanego w książce wiec starałem się tego trzymać.
  • #9 10944300
    mirekk36
    Poziom 42  
    pioadam napisał:
    Ma być 1 bit stopu, jeśli dobrze rozumiem ma to wyglądać tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    ?


    No nie tak ;) zobacz - robisz przesuniecie liczby 3 na pozycję pierwszego bitu a nie zerowego - musi być - jeszcze raz podpowiadam:

    Cytat:

    /* Set frame format: 8data, 1stop bit */
    UCSR1C = (1<<URSEL1)|(3<<UCSZ00);


    pioadam napisał:
    co do
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    był dopisany teraz, normalnie ustawiam w opcjach AVRStudio a nie definiuję :)

    A! czyli korzystasz jeszcze ze starszej może ale w miarę normalnej wersji AVR Studio 4.xx .... tam jeszcze można było wygodnie to zrobić bez włażenia i przedzierania się przez gąszcz opcji do środka ustawień toolchaina GCC ;)

    pioadam napisał:
    Posłucham się porady i zaraz zainstaluję eclipse, w avrstudio straszne jest gubienie bibliotek, co chwila coś się nie dołączy ;/


    Dokładnie, polecam ci przejść jak najszybciej na Eclipse - dużo zyskasz ;) a i sto razy wygodniej się pracuje. Może kiedyś Atmel poprawi swoje kocie środowisko w tym zakresie.

    Dodano po 2 [minuty]:

    pioadam napisał:
    Bardzo możliwe ;) Eclipse używałem dawno temu jak zabierałem się za Jave i dobrze go wspominam,


    No widzisz - to tego się trzymaj , a przy okazji będzie ci dużo dużo łatwiej - aha zobacz jak można szybko doinstalować sobie najnowszego pluginaAVR do eclipsa, ale pewnie sam sobie z tym świetnie poradzisz ;)

    http://mirekk36.blogspot.com/2012/04/eclipse-instalacja-avr-plugin.html
  • #10 10944356
    pioadam
    Poziom 10  
    Dziękuję za podpowiedź, jednak dalej jest problem, przedtem wyświetlacz był zasypywany liczbami/cyframi, teraz na ekranie mam 15 (czyli pełny bufor) "krzaków", nic więcej się nie wyświetla.
    Eclipse właśnie się instaluje ;) mkAVR też przypadł do gustu, jednak co do dzielnika /8 ta sama sytuacja.

    EDIT:
    AVRStudio 4.15 ;]
  • #11 10944374
    mirekk36
    Poziom 42  
    Ok - myślę że najlepiej będzie najpierw zrobić sobie test wysyłania/komunikacji z terminalem na PC po RS232. Wtedy szybciej błędu dojdziesz. Bo teraz może się okazać że walczysz z wieloma naraz. Ja bym na twoim miejscu właśnie zrobił jakąś najprostszą procedurę do wysyłania np czegoś do terminala na początek. Jak już będzie to dobrze szło - to już masz JEDEN punk zaliczony, potem sprawdzasz ew komunikację w drugą stronę czyli z terminala do procka (jeśli potrzebna) i masz DRUGI punkt zaliczony.

    Pokaż kod po poprawkach - ale tylko to co istotne w/s komunikacji RS232 - czyli twoją inicjalizację i ew funkcje nadawczo odbiorcze - popatrzymy czy coś tam jeszcze jest "nie halo" ;)
  • #12 10944392
    pioadam
    Poziom 10  
    Poprawiony kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    GPS podłączony jest do portu PB - RXD1, TXD1
    Co do podłączenia do PC - muszę wybrać się do sklepu po maxa ;] chyba, że jeśli uC jest na 5v to mogę wpiąć się bezpośrednio pod port COM?

    EDIT:
    Problem z niewyświetlaniem znaków nie miał nic wspólnego z poprawionym kodem - brak styku na zasilaniu GPS, teraz znowu dużo "gada" niestety losowymi znakami, czasem wywali jakiegoś krzaka. Wydaje mi się, że problemem jest CKDIV8 - w zależności od prędkości jaką ustawię otrzymuję inną grupę danych tj. przy 4800 przeważnie duże litery, przy 9600 mieszanina dużych i małych liter oraz cyfry. Co charakterystyczne bardzo dużo "L". Przy wyższych prędkościach bardzo dużo "@" oraz krzaków.
    Moim zdaniem, ustawienie prawidłowej prędkości zegara oraz transmisji powinno rozwiązać problem, jednak zmiana CKDIV zawiesza uC
  • Pomocny post
    #13 10944711
    mirekk36
    Poziom 42  
    Posłuchaj ;) ... ja ci proponuję - odpuść sobie to myślenie o CKDIV8. Tzn wyłącz ten Fusebit i przestań o nim myśleć za to staraj się doprowadzić do prawidłowej transmisji wg PDF'a procka.

    Ty masz wciąż podstawowe problemy z inicjalizacją i przez to masz krzaczki/ptaszki - a to że raz widać jakieś literki a innym razem nie - nie ma nic wspólnego że raz jest lepiej bo jak sobie myślisz włączasz CKDIV8 a raz nie - bo go wyłączasz......

    Ten procek ma dwa moduły USART a ty mieszasz nazwy bitów, o proszę np tutaj:

    masz np tak:

    Cytat:
    UCSR1C = (1<<URSEL1)|(3<<UCSZ00);


    a przecież ustawiasz bity ramki dla UCSZ0x czyli USART0 ..... a jeśli korzystasz z USART1 to powinieneś mieć tak:

    Cytat:
    UCSR1C = (1<<URSEL1)|(3<<UCSZ10);


    Sam widzisz że bez jakiegoś narzędzia i możliwości sprawdzania na szybko komunikacji z terminalem w Windows będziesz zawsze tracił mnóstwo czasu na takie głupotki. A jakbyś miał terminal to kilka własnych prób i już wiesz o co chodzi. Ja sobie nie wyobrażam uruchamiania jakiegokolwiek swojego projektu bez dostępu do terminala.

    Dodano po 4 [minuty]:

    pioadam napisał:

    GPS podłączony jest do portu PB - RXD1, TXD1
    Co do podłączenia do PC - muszę wybrać się do sklepu po maxa ;] chyba, że jeśli uC jest na 5v to mogę wpiąć się bezpośrednio pod port COM?


    Hmm a może zajrzyj na byle jaką stronę na temat standardu RS232 to zaraz zobaczysz że zwykły port COM pracuje na napięciach +12V i -12V więc jak to się ma do +5V o których piszesz ??? Po to są konwertery

    MAX232 - który podłączasz pomiędzy portem COM komputera i prockiem zasilanym +5V

    MAX3232 - który podłączasz pomiędzy portem COM komputera i prockiem zasilanym +3,3V

    inaczej w 5 sekund uszkodzisz procka.

    Ale zamiast bawić się w podłączanie do starych portów COM kup sobie lepiej albo sam zrób przejściówkę USB/RS232 - wtedy będziesz miał od razu wyjścia RS232 standardzie TTL czyli od razu podłączysz sobie linie RS232 z tego scalaka do procka.
  • #14 10952912
    pioadam
    Poziom 10  
    Witam, zaopatrzyłem się w interface pod usb i podłączyłem uC pod komputer, tak jak kolega mówił - nie miało to prawa działać ;]
    Aktualnie dobrze działa echo przez terminal oraz podłączenie odbiornika GPS pod komputer - wszystkie ramki dobrze odbieram.
    Niestety nie rozwiązałem problemu z dzielnikiem - muszę łączyć się z układem przy baud 1200, a po dodaniu
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    układ przestaje reagować.
    Będę wdzięczny za sprawdzenie poniższego kodu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Pozdrawiam!
    P.S. Przesiadłem się na eclipse i faktycznie - różnica jest ogromna ;)
  • #16 10953673
    pioadam
    Poziom 10  
    Dzięki za wskazówkę ;)
    Jeśli dobrze rozumiem w kodzie:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    ?
  • #17 10953731
    LordBlick
    VIP Zasłużony dla elektroda
    1. Nie zapominaj o nawiasach przy operacjach bitowych.
    2. Stan PB3 nie rzutuje, jest wymuszane wyjście włączeniem TX - ta sama strona datasheet.
    3. Dla ATmega162 w MCUCR nie ma bitu PUD, jest w SFIOR.
    4. Zamiast "=" używaj odpowiedniej operacji bitowej("|=" przy ustawianiu lub "&=" przy gaszeniu).
  • #18 10980439
    pioadam
    Poziom 10  
    Dzięki za wskazówki :)
    Co do układu - na ten moment wszystko działa idealnie. Odbieram pozycję z GPS i wyświetlam ją na lcd.
    Problem z CKDIV8 powodował kwarc - po zmianie wszystko działa na pełnej prędkości.
    Mam teraz kolejne pytanie - moduł ma się komunikować z drugą atmegą bezprzewodowo, robiąc zakupy wziąłem cc1000 nie czytając specjalnie o nim.
    Po 3 dniach walki widzę, że konkretnie się z nim wpakowałem :/
    Niestety nie ogarniam uC na tle, żeby jakoś to uruchomić. Może komuś udało się to zagonić do pracy i byłby w stanie podzielić się kodem? wieczorem postaram się wrzucić to co mam :)
    Ew. moglibyście polecić jakieś inne moduły radiowe? czytałem trochę o rfm22b jednak widzę, że on też do najprostszych nie należy.
    Pozdrawiam!
REKLAMA