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

USART Atmega8l 1MHz - brak komunikacji RS232 z modułem Bluetooth

Templarious 22 Maj 2016 16:49 1188 24
REKLAMA
  • #1 15691853
    Templarious
    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.
  • REKLAMA
  • #3 15693111
    Templarious
    Poziom 22  
    Czyli teorytycznie jeżeli wpisze do rejestru U2X to będzie działać ?
    :)
  • #4 15693293
    jnk0le
    Poziom 18  
    Jeszcze wzór na ubbr trzeba będzie zmienić.
  • #5 15693337
    Templarious
    Poziom 22  
    Wartość podmieniona i bit wpisany. Przetestuje dopiero poznym wieczorem. Dziękuję jak na razie za pomoc :)
  • REKLAMA
  • #6 15693379
    tmf
    VIP Zasłużony dla elektroda
    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.
  • #7 15693453
    dondu
    Moderator na urlopie...
    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.
  • #8 15693724
    kamyczek
    Poziom 38  
    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 ...
  • #9 15693759
    nolens_volens
    Poziom 15  
    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
  • #10 15694365
    Templarious
    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 / C++
    Zaloguj się, aby zobaczyć kod


    RX i TX jak wyjście, nie podciągniete do VCC a do masy.
  • #11 15694371
    tmf
    VIP Zasłużony dla elektroda
    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...
  • #12 15694471
    dondu
    Moderator na urlopie...
    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.
  • REKLAMA
  • #13 15694528
    Templarious
    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 / C++
    Zaloguj się, aby zobaczyć kod
  • #15 15694571
    Templarious
    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 / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #17 15694655
    Templarious
    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.
  • #18 15694677
    dondu
    Moderator na urlopie...
    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 / C++
    Zaloguj się, aby zobaczyć kod


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

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #19 15694714
    Templarious
    Poziom 22  
    Oj nie mam... Czyli muszę kupić jakiś układ? Kurcze, nie wiedziałem, że to tyle roboty z tym jest :P
  • #21 15694741
    Templarious
    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
  • #23 15694754
    Templarious
    Poziom 22  
    dondu napisał:
    Pokaż program po zmianach.


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #24 15694811
    dondu
    Moderator na urlopie...
    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.
  • #25 15694828
    Templarious
    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) :)
REKLAMA