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

AVR [C][atmega32] - Konfiguracja USART, problem z prędkością 19200 baud

pawel260 25 Lip 2012 18:05 1422 12
REKLAMA
  • #1 11142801
    pawel260
    Poziom 10  
    Mam problem z konfiguracją USARTu w atmedze32, a mianowicie nie mogę ustawić szybkości jakiej chcę. Kod pochodzi właściwie z elementów złożonych z datasheet, ale jednak wynikiem jego działania jest prędkość transmisji na poziomie 650, a nie 19200 jak staram się ustawić. Co może być problemem ?


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 11142828
    mirekk36
    Poziom 42  
    Popełniłeś w tym krótkim kodzie tak dużą ilość błędów, że nie dziwne iż nie działa.

    Po pierwsze nie ustawia się F_CPU w kodzie programu - to typowy błąd początkujących a szczególnie tych którzy korzystają z kociego AVR Studio 5/6 :(

    Jeśli uprzesz się korzystać z AVRS 5/6 to musisz ustawić to we właściwościach toolchaina

    druga rzecz - po co ci ten parametr unsigned int F_CPU1 przekazywany do funkcji init

    po trzecie gdzie masz ustawienie bitu URSEL

    po czwarte w końcu - zajrzyj do noty PDF procka ATmega32 - przecież tam masz jak na dłoni pokazaną także w C funkcję do inicjalizacji - po co wymyślać ją od nowa gdy się startuje ??? spójrz jak to wygląda w PDF

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


    i porównaj z tym co ty napisałeś OK?

    a najlepiej to jak najszybciej sięgnij po jakieś środowisko porządne np Eclipse, i zobacz dlaczego warto :

    http://mirekk36.blogspot.com/2011/11/dlaczego-eclipse-zamiast-avr-studio.html
  • #3 11142849
    pawel260
    Poziom 10  
    Tam popełniłem błąd wstawiając ten post, funkcja init bierze oczywiście jeden argument. Kod obecnie wygląda tak wraz z ustawionym F_CPU w avr studio, ale jego wynikiem działania są tylko krótkie stany niskie trwające 0.5ms pojawiające się zgodnie z delay'em 50ms. Nie przypomina to w żaden sposób 0x55.


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #5 11143146
    Krauser
    Poziom 26  
    A taktowanie masz przestawione na zewnętrzny kwarc?
  • REKLAMA
  • #6 11143845
    pawel260
    Poziom 10  
    Nie używałem nawet terminala żeby to podejrzeć, tylko oscyloskopu. Normalnie jak próbuję wysłać 0x55 to powinno pojawić się 8 naprzemiennych bitów i dopiero potem bity stopu (zwykle używałem tego do sprawdzenia). Jednak przy tej modyfikacji kodu pojawia się już tylko jeden bit o stanie niskim i to wszystko. Fuse bity są ustawione poprawnie od samego początku.
  • REKLAMA
  • #7 11143949
    LordBlick
    VIP Zasłużony dla elektroda
    mirekk36 napisał:
    Po pierwsze nie ustawia się F_CPU w kodzie programu - to typowy błąd początkujących a szczególnie tych którzy korzystają z kociego AVR Studio 5/6
    1. Z tym "ustawianiem" F_CPU to nie jest taka uniwersalna rada do końca, zwłaszcza, że nic w nie wiadomo, z jakiego autor tematu środowiska.korzysta.
    2. Ani AVR Studio 5, Ani Atmel Studio 6 nie zostały stworzone dla kotów, tylko dla mikrokontrolerów. Ponieważ nie zostało to podkreślone, więc nadmienię, że to jest tylko prywatna opinia, powtarzana przy byle okazji z maniakalnym/obsesyjnym uporem, co czyni ją dość niemerytoryczną ;)
    pawel260 napisał:
    Jednak przy tej modyfikacji kodu pojawia się już tylko jeden bit o stanie niskim i to wszystko.
    A przypadkiem nie masz włączonego w fusebitach watchdoga albo problemów z zasilaniem ?
  • #8 11144017
    mirekk36
    Poziom 42  
    LordBlick napisał:

    2. Ani AVR Studio 5, Ani Atmel Studio 6 nie zostały stworzone dla kotów,

    A kto mówił, że dla kotów? Kolega ma jakieś problemy ? Już kilku wcześniej doniosło na mnie do moderatorów że jestem wrogiem zwierząt, że szerzę nienawiść do zwierząt, a teraz ty - że to niby dla kotów tak ??? no fajne interpretacje takiego przyjemnego przymiotnika. Przeszkadza to komuś? A mnie przeszkadzają te wszystkie "IMHO himho, BTW i tym podobne skróty i na nikogo nie skarżę"

    LordBlick napisał:
    Ponieważ nie zostało to podkreślone, więc nadmienię, że to jest tylko prywatna opinia,

    Pewnie, że prywatna a co? Mam tu przedstawiać cudze opinie i cudze wypowiedzi?

    LordBlick napisał:
    powtarzana przy byle okazji z maniakalnym/obsesyjnym uporem, co czyni ją dość niemerytoryczną ;)

    Tak jak ty masz prawo wyrażać tu swoją prywatną opinię o mnie że jestem maniakalny i obsesyjny (choć tego nie dotyczy temat wątku) tak samo ja mam prawo wyrażać swoje prywatne opinie i nic tobie do tego. Chcesz się czepiać to rób to gdzie indziej ok? taka mała uwaga z mojej strony ok ;)

    ----------

    wracając do tematu - proszę bardzo przetestowałem twój kod na swoim procku i terminalu ... jedyna zmiana to nie ustawiałem bitu SBS bo chciałem mieć 1 bit stopu ... ale to nie ma akurat znaczenia że u ciebie nie działa niby. Zobacz na okno mojego terminala ;)

    AVR [C][atmega32] - Konfiguracja USART, problem z prędkością 19200 baud

    jeszcze jedną rzecz niepotrzebnie robisz w kodzie - chociaż to też nie ma wpływu na to że u ciebie działa czy nie ale warto o tym wiedzieć

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


    tego nie musisz pisać bo załączenie nadajnika i odbiornika UART całkowicie przejmuje kontrolę nad tymi pinami
  • #9 11144023
    LordBlick
    VIP Zasłużony dla elektroda
    mirekk36 napisał:
    tego nie musisz pisać bo załączenie nadajnika i odbiornika UART całkowicie przejmuje kontrolę nad tymi pinami
    Podciągnięciem można nadal sterować dla wejścia RxD.
  • #10 11144026
    mirekk36
    Poziom 42  
    LordBlick napisał:
    mirekk36 napisał:
    tego nie musisz pisać bo załączenie nadajnika i odbiornika UART całkowicie przejmuje kontrolę nad tymi pinami
    Podciągnięciem można nadal sterować dla wejścia RxD.


    Ale jeśli się korzysta w typowy sposób ze sprzętowego modułu to po prostu nie trzeba ręcznie ustawiać kierunków.
  • #12 11144142
    mirekk36
    Poziom 42  
    LordBlick napisał:
    Moim zdaniem problem nie dotyczy kodu.


    Dokładnie, przecież napisałem wyżej i pokazałem że ten kod działa poprawnie przecież ;) w terminalu widać.

    1. albo fusebity - chociaż autor twierdzi że są dobrze ustawione (ale najczęściej w takich przypadkach na końcu i tak się okazuje że nie są) :(

    2. albo jakiś inny/dziwny kwarc

    3. albo jakieś zwarcie linii Tx do czegoś może po drodze

    4. albo zasilanie

    no ale to wszystko w zasadzie było podpowiedziane wyżej
  • #13 11148731
    pawel260
    Poziom 10  
    Ostatecznie udało się komunikację uruchomić, ale ciężko powiedzieć co było przyczyną. Stworzyłem nowy projekt w avr studio, skopiowałem kawałki kodu jeszcze raz z datasheet, ustawiłem F_CPU w symbolach w IDE i działa. Temat zamknięty.
REKLAMA