Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

USART Atmega8l 1Mhz nie działa

22 Maj 2016 16:49 939 24
  • Poziom 22  
    Witajcie,

    Jak w temacie. Mam uC Atmega8l, 1Mhz wew. i chciałbym wysyłać wiadomości za pomocą RS232 do bluetootha i na telefonie je czytać... lecz coś nie działa. Straciłem już kilka dni życia na to i nadal nie wiem co. Oczywiście tx rx są zamienione tzn rx do tx bluetootha itd. Masa i zasilanie z tego samego akumulatorka.

    Moje pliczki w AVRStudio.
  • Poziom 22  
    Czyli teorytycznie jeżeli wpisze do rejestru U2X to będzie działać ?
    :)
  • Poziom 18  
    Jeszcze wzór na ubbr trzeba będzie zmienić.
  • Poziom 22  
    Wartość podmieniona i bit wpisany. Przetestuje dopiero poznym wieczorem. Dziękuję jak na razie za pomoc :)
  • Moderator Mikrokontrolery Projektowanie
    Wielokrotnie była o tym mowa - w ATMega generator RC nie ma wystarczającej stabilności, aby bez dodatkowych procedur kalibracyjnych wykorzystać go do transmisji UART. Oczywiście może to działać, ale zapewne efekt będzie taki, że raz działać będzie, a raz nie.
  • Moderator Mikrokontrolery Projektowanie
    Jeżeli ten moduł to HC-05, to wymaga jednego bitu stopu, a nie dwóch.

    Poza tym, stosuj takie rozwiązanie ustawiania parametrów baud: http://mikrokontrolery.blogspot.com/2011/03/B...C-05-ATmega8-Test-komunikacji-koprocesor.html
    gdyż od razu otrzymasz warning, że baud jest spoza bezpiecznego zakresu błędu, a dodatkowo U2X jest automatycznie ustawiany, gdy jest niezbędny.

    Przeanalizuj funkcję usart_inicjuj() w powyższym artykule.
  • Poziom 35  
    tmf napisał:
    Wielokrotnie była o tym mowa - w ATMega generator RC nie ma wystarczającej stabilności, aby bez dodatkowych procedur kalibracyjnych wykorzystać go do transmisji UART. Oczywiście może to działać, ale zapewne efekt będzie taki, że raz działać będzie, a raz nie.


    Gdzie się takich bzdur naczytałeś Tomku po wpisaniu w odpowiedni rejestr wartości kalibracji nie ma większego problemu by uart działał prawidłowo przy prędkości typu 9600 o ile uart działa poprawnie przy błędzie typy 1,6% a błąd oscylatora jest zbliżony układ będzie działał poprawnie i stabilnie poza tym jest jeszcze wiele mechanizmów ,które mogą wpłynąć na eliminację błędów od crc przez rozwiązanie synchronizowane sygnałem sck . Działa nawet w attiny 10 i uartem programowym jak się potrafi to napisać poprawnie ...
  • Poziom 14  
    Przecież Kolega Tomek dokładnie to samo napisał ;)
    Cytat:
    nie ma wystarczającej stabilności, aby bez dodatkowych procedur kalibracyjnych wykorzystać go do transmisji UART
  • Poziom 22  
    Podmieniłem i wciąż nie działa. Dodam, że działam na 3.6V jesli to ma znaczenie.
    Układ bluetooth to HC-06.

    obecnie kod:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    RX i TX jak wyjście, nie podciągniete do VCC a do masy.
  • Moderator Mikrokontrolery Projektowanie
    kamyczek napisał:
    tmf napisał:
    Wielokrotnie była o tym mowa - w ATMega generator RC nie ma wystarczającej stabilności, aby bez dodatkowych procedur kalibracyjnych wykorzystać go do transmisji UART. Oczywiście może to działać, ale zapewne efekt będzie taki, że raz działać będzie, a raz nie.


    Gdzie się takich bzdur naczytałeś Tomku po wpisaniu w odpowiedni rejestr wartości kalibracji nie ma większego problemu by uart działał prawidłowo przy prędkości typu 9600 o ile uart działa poprawnie przy błędzie typy 1,6% a błąd oscylatora jest zbliżony układ będzie działał poprawnie i stabilnie poza tym jest jeszcze wiele mechanizmów ,które mogą wpłynąć na eliminację błędów od crc przez rozwiązanie synchronizowane sygnałem sck . Działa nawet w attiny 10 i uartem programowym jak się potrafi to napisać poprawnie ...


    No popatrz, takie bzdury wypisuje Atmel...
    No ale chwila, może mają jednak rację? Wystarczy popatrzeć na wykresy 0-45 i 0-44 z noty, lub 170 - zmiany czestotliwości RC w funkcji temperatury i zmian napięcia zasilającego. Niestety zmiany te grubo przekraczają zmiany tolerowane przez UART. Stąd też wydali noty AVR053 i AVR054 dotyczące rozwiązania tego problemu. Poza tym prosiłbym cie o dokładne czytanie postów - UART o którym pisałem to nie USART i SCK nie występuje. Żeby skorzystać z transmisji synchronicznej to musi ona być przez obie strony wspierana, a to mamy dosyć konkretny układ wykorzystujący UART. Także nie wystarczy wczytać OSCCAL, swoją drogą to kalibracja jest tylko do jednego napięcia zasilającego i jeśli zasilamy MCU innym to trzeba sobie go samemu skalibrować. Trzeba pamiętać, że wystarczy zmiana temperatury i całość leży. Chyba jednak prościej dodać kwarc...
  • Moderator Mikrokontrolery Projektowanie
    dondu napisał:
    Jeżeli ten moduł to HC-05, to wymaga jednego bitu stopu, a nie dwóch.

    ... HC-06 tak samo, a w Twoim kodzie:

    Cytat:
    UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);

    Zastosuj funkcję, którą Ci wskazałem i nie będzie problemu.


    @kamyczek
    Problem nie polega na tym, czy coś działa, tylko na tym, by prawidłowo zaprojektować urządzenie. Jeśli więc ma działać w wąskim zakresie temperatur, to można kalibrować. Jeśli ma działać na wewnętrznym RC w szerokim zakresie temperatur, to można kalibrować "w locie" (jeśli dany mikrokontroler to umożliwia), ale należy znać aktualną temperaturę.

    Jeśli więc to projekt stricte hobbystyczny, to kompromis jest możliwy kosztem ewentualnej zawodności. Jeśli natomiast chcemy projektować urządzenie odporne, a w szczególności kierowane do produkcji i sprzedaży, to kompromis będzie zupełnie inny lub go nie będzie wcale.

    I tego staramy się tutaj uczyć - szerokiego spojrzenia i właściwych kompromisów, czyli poprawnego projektowania. Twój post natomiast nie wyjaśnia całości problemu, tylko pozostaje w pamięci (w szczególności początkujących), którzy później będą się w głowę drapali, dlaczego to nie działa, bo przecież kamyczek napisał, że musi.
  • Poziom 22  
    dondu napisał:
    dondu napisał:
    Jeżeli ten moduł to HC-05, to wymaga jednego bitu stopu, a nie dwóch.

    ... HC-06 tak samo, a w Twoim kodzie:

    Cytat:
    UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);

    Zastosuj funkcję, którą Ci wskazałem i nie będzie problemu.



    Dodałem i nadal lipa...

    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Moderator Mikrokontrolery Projektowanie
    Próbowałeś terminalem dogadać się z HC-05 na tych ustawieniach parametrów transmisji?

    ... nie podmieniłeś funkcji na moją.
  • Poziom 22  
    dondu napisał:
    Próbowałeś terminalem dogadać się z HC-05 na tych ustawieniach parametrów transmisji?

    ... nie podmieniłeś funkcji na moją.


    Teraz to musi już działać a nadal jest coś nie tak :(

    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Moderator Mikrokontrolery Projektowanie
    Nie odpowiedziałeś na pytanie:

    dondu napisał:
    Próbowałeś terminalem dogadać się z HC-05 na tych ustawieniach parametrów transmisji?
  • Poziom 22  
    dondu napisał:
    Nie odpowiedziałeś na pytanie:

    dondu napisał:
    Próbowałeś terminalem dogadać się z HC-05 na tych ustawieniach parametrów transmisji?


    Oj nie, to są dopiero moje pierwsze kroki z UART/USART.. Jestem zielony, ksiązki mam T. Francuza i czytam ale jak widać niestety nic mi nie działa.
  • Moderator Mikrokontrolery Projektowanie
    Hmm. Czyli ten HC-06 jest nowym układem i nie przestawiałeś w nim parametrów transmisji komendami AT.
    Masz konwerter RS232-USB lub komputer z takim interfejsem na poziomach napięć TTL?


    Edit:

    włączasz przerwania odbioru RXCIE:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    a funkcja obsługi przerwania dotyczy gotowości do przyjęcia danych do nadawania:

    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 22  
    Oj nie mam... Czyli muszę kupić jakiś układ? Kurcze, nie wiedziałem, że to tyle roboty z tym jest :P
  • Moderator Mikrokontrolery Projektowanie
    Nie, nie musisz, ale konwerter za 0,6$ - 0,8$ z dostawą do Polski warto mieć :)

    USART Atmega8l 1Mhz nie działa

    Zmieniłeś co napisałem w poprzednim poście?
  • Poziom 22  
    dondu napisał:
    Nie, nie musisz, ale konwerter za 0,76$ z dostawą do Polski warto mieć :)

    Zmieniłeś co napisałem w poprzednim poście?


    Nic noweg nie wklepałem, bo juz "UCSRB = (1<<TXEN) | (1<<RXEN) | (1<<RXCIE);" taka wartość miałem, a przerwania również obsługuję tym wektorem :) - nadal nic się nie dzieje niestety
  • Moderator Mikrokontrolery Projektowanie
    Pokaż program po zmianach.
  • Poziom 22  
    dondu napisał:
    Pokaż program po zmianach.


    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Moderator Mikrokontrolery Projektowanie
    Dodaj funkcję przerwania USART_RXC_vect lub wykasuj ustawianie bitu RXCIE, bo jeśli coś USART odbierze, to program pójdzie w maliny.

    Zmienna data w przerwaniu USART_UDRE_vect powinna: http://mikrokontrolery.blogspot.com/2011/04/problemy-c-volatile.html


    ... a w ogóle, to odłóż na chwilę swój projekt zrób test na bazie tego artykułu do Atmega8 (nic nie zmieniaj): http://mikrokontrolery.blogspot.com/2011/03/android-bluetooth-LED-MASTER.html

    Znajdziesz tam gotową aplikację na Androida.
  • Poziom 22  
    dondu napisał:
    Dodaj funkcję przerwania USART_RXC_vect lub wykasuj ustawianie bitu RXCIE, bo jeśli coś USART odbierze, to program pójdzie w maliny.

    Zmienna data w przerwaniu USART_UDRE_vect powinna: http://mikrokontrolery.blogspot.com/2011/04/problemy-c-volatile.html


    ... a w ogóle, to odłóż na chwilę swój projekt zrób test na bazie tego artykułu do Atmega8 (nic nie zmieniaj): http://mikrokontrolery.blogspot.com/2011/03/android-bluetooth-LED-MASTER.html

    Znajdziesz tam gotową aplikację na Androida.


    Jutro przetestuje oba rozwiazania i wyedytuję tą wiadomość - dam znać jak poszło. Tymczasem dobrej nocy (jutro praca) :)