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

[Atmega88] Jak skonfigurować USART w Atmega88 z Realterm przez RS232?

nariox 16 Wrz 2015 13:35 2313 27
REKLAMA
  • #1 14999425
    nariox
    Poziom 11  
    Posty: 111
    Pomógł: 1
    Ocena: 1
    Witam !
    Na znanym portalu aukcyjnym zakupiłem przejściówkę USB<-> rs 232 ttl
    Potrzebuję zmontować działający układ komunikacyjny z atmega88 ( interfejs USART) a następnie spokojnie przeanalizować kod, zasadę działania i wreszcię połączyć się z RFM12B.
    Ustawiłem częstotliwość taktowania qc za pomocą fusów na 8MHz.
    W ustawienia portu w komputerze wprwowadziłem BAUDRate 9600
    bit danych 8, bit parzystosci brak , bity stopu 2 podobnie w realterm


    Kod który przepisałem do ATMEL Studio jest następujący(kompluje się bez warningów )

    Kod: Text
    Zaloguj się, aby zobaczyć kod

    Do qc nie podłaczam zasilania , tylko postępuje tak samo jak na stronie z której przepisałem kod (schemat połączeń)
    Link

    Pytanie moje dotyczy również dataLen..wpisałem zamiast tego 8, czy dobrze?
    Zgodnie z moim kodem powiniem literke k w programie Realtem,
    Próbowałem również z programem Termite, ale również żadnej odpowiedzi .
    1. Jak sparwdzić poprawność połączeń (dysponuje prostym miernikiem cyfrowym/analogowym)
    2. Do czego służy echo? [Atmega88] Jak skonfigurować USART w Atmega88 z Realterm przez RS232?
  • REKLAMA
  • #2 14999436
    kindlar
    Poziom 42  
    Posty: 7820
    Pomógł: 912
    Ocena: 1603
    Zewrzyj tx z rx w przejściówce, wyślij cokolwiek i sprawdź czy odbierasz co wysłałeś.
  • #3 14999448
    Steryd3
    Poziom 33  
    Posty: 1641
    Pomógł: 241
    Ocena: 301
    nariox napisał:
    Jak sparwdzić poprawność połączeń


    Samą przejściówkę sprawdzisz łącząc (np. na chwilkę wkrętakiem) piny 2 i 3 z złączu DB09 przejściówki. Po wysłaniu czegokolwiek powinieneś to samo odebrać.

    Podobną operację można zrobić przy miktokontrolerze zwierając za układem MAX232 Tx z Rx (trzeba wcześniej wyczyścić pamięć mikrokontrolera by nie sterował żadnym wyjściem).
  • #4 14999529
    nariox
    Poziom 11  
    Posty: 111
    Pomógł: 1
    Ocena: 1
    Przepraszam, ale wprowadziłem kolegów w błąd mój cały zestaw wygląda tak:

    [Atmega88] Jak skonfigurować USART w Atmega88 z Realterm przez RS232? [Atmega88] Jak skonfigurować USART w Atmega88 z Realterm przez RS232?


    zwarłem na stałe tx i rx, wysyłam przy pomocy realterm cyfre 2, pali sie na zolto tx ale linia rx milczy
    adapter popodpieciu do usb swieci tylko czerwona dioda z lewej strony na dole, natomiast sterowniki zainstalowane i komputer widzi wszystko
    wzgledem masy zarowno tx jak i rx sa w stanie wysokim 5V zworka
    po zwarciu tx z masa wysyla dziwne szlaki w realterm, zapalasie break a po chwili error- wiec jakis kontakt jest


    EDIT: sprawdziłem przejściówke jak w tym wątku:
    Realterm nie odbiera danych

    i przejściówka działa,podobnie w programie Termite( o którym pisałem wyżej) zachowuje się tak samo jak na stronie, gdzie autor skonfigurował program, by wysyłał takie dane,jakie otrzymuje , pala się rownież diody nadawnia/odbierani.

    Problem zatem leży po stronie atmegi88
  • #5 15001131
    nariox
    Poziom 11  
    Posty: 111
    Pomógł: 1
    Ocena: 1
    Znalazłem jeden błąd w kodzie, jednak to nadal nie pomogło, mianowicie w funkcji

    usart_init(void)

    powinno być:
    UCSR0B=(1<<RXEN0)|(1<<TXEN0);

    hm...
  • #6 15001988
    miro340
    Poziom 13  
    Posty: 38
    Pomógł: 7
    Ocena: 18
    Witam.
    Tak się kończy bezmyślne przepisywanie programów nawet, gdy są przepisywane z dokumentacji procesora. Jeśli jesteś zupełnie początkujący, to powinieneś najpierw poczytać o USART i o przerwaniach. żeby stosować przerwania to jednak trzeba wiedzieć jak one działają i co je wywołuje. Tutaj mamy zlepek skopiowanego i wklejonego bez ładu i składu kodu. Zastanów się co to przerwanie robi i czy w tak napisanym kodzie ma ono jakiś sens. Pomijam już inne błędy. Najlepsze co można zrobić to napisać ten program na nowo ale w najprostszej formie próbując wysłać jeden lub serię znaków (np w pętli for) bez przerwań, z użyciem funkcji, którą już masz napisaną w swoim programie. Jeśli to zadziała to próbuj użyć przerwań o ile będą one konieczne.
    ...A te 2 bity stopu to musza być? standardowo daje się 1.
  • #7 15006375
    jnk0le
    Poziom 18  
    Posty: 172
    Pomógł: 33
    Ocena: 31
    nariox napisał:
    Witam !
    Na znanym portalu aukcyjnym zakupiłem przejściówkę USB<-> rs 232 ttl

    Czyli najprawdopodobniej podrobiony PL2303HX. Zgadłem ?

    1. Ustaw 1 bit stopu.
    2. Sprawdź w menadżerze urządzeń czy sterownik nie wywala kodu 5.
    3. Użyj jakiegoś bardziej normalnego terminala.
  • REKLAMA
  • #8 15007554
    nariox
    Poziom 11  
    Posty: 111
    Pomógł: 1
    Ocena: 1
    Witam!
    Idąc za radą użytkownika @miro340
    napisałem najprostszy program posługując się datasheet'em dla atmega88 i korzystając z porad zamieszczonych tutaj: avrfreaks

    Ostatecznie otrzymałem kod w najprostszej postac (który jak sądzę powinien wysyłać do komputera to co mu wyślę)

    Zmieniłem nazwy rejestrów, poczytałem trochę note katalogowa.
    I udało się uzyskać jakąś komunikację...
    niestety atmega jak i ja rozmawiamy ze soba za pomocą dziwnych znaczków [Atmega88] Jak skonfigurować USART w Atmega88 z Realterm przez RS232? [Atmega88] Jak skonfigurować USART w Atmega88 z Realterm przez RS232?

    Przejsciowka sprawna.Czy to kwestia zasilania/ szybkosci transmisji?
    zdefiniowalem w AS 6 w projekcie w zakladce symbols F_CPU=8000000 .
    Ustawilem fuse bity, wylaczylem dzielenie wewnetrzego oscylatora.
    
    
    #include <avr/io.h>
    #include <stdio.h>
    
    #include <util/delay.h>
    #include <avr/interrupt.h>
    #define USART_BAUDRATE 9600
    #define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
    
    int main (void)
    {
    	
    	_delay_ms(500);
    	DDRD |=(1<<1);
    	char ReceivedByte;
    
    	UCSR0B = (1 << RXEN0) | (1 << TXEN0);   // Turn on the transmission and reception circuitry
    	UCSR0C=(1<<USBS0) | (3<<UCSZ00) ;  // Use 8-bit character sizes
    
    	UBRR0H = (BAUD_PRESCALE >> 8); // Load upper 8-bits of the baud rate value into the high byte of the UBRR register
    	UBRR0L = BAUD_PRESCALE; // Load lower 8-bits of the baud rate value into the low byte of the UBRR register
    
    	for (;;) // Loop forever
    	{
    		while ((UCSR0A & (1 << RXC0)) == 0) {}; // Do nothing until data have been received and is ready to be read from UDR
    		ReceivedByte = UDR0; // Fetch the received byte value into the variable "ByteReceived"
    
    		while ((UCSR0A & (1 << UDRE0)) == 0) {}; // Do nothing until UDR is ready for more data to be written to it
    		UDR0 = ReceivedByte; // Echo back the received byte back to the computer
    	}
    	return 0;
    }	


    @jnk0le

    nie, to nie tania podróbka, przejściówka firmy FTDI -dałem 27 złotych za sztuke...
    zaraz zmienie ten bit stopu...
    sterownik nie wywala błedu, wszystko okej
  • #10 15007624
    nariox
    Poziom 11  
    Posty: 111
    Pomógł: 1
    Ocena: 1
    tronics napisał:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    3<<UCSZ00 ?



    To jest z kodu inicjalizującego z datasheet'u atmegi88
  • #11 15007676
    tronics
    Poziom 38  
    Posty: 5019
    Pomógł: 358
    Ocena: 838
    Tak, wiem,tylko trochę dziwna konstrukcja biorąc pod uwagę, że z jednej strony chce się poprawiać czytelność kodu, a z drugiej za jednym zamachem ustawia 2 różne bity, których pozycje są zdefiniowane w nagłówkach ;)
    Wszystkie parametry w realterm muszą być takie jak ustawione w module uart mikrokontrolera. Wiele błędów jest właśnie ze stopem lub rozmiarem wysyłanego znaku - wtedy najczęściej przestawianie opcji w realterm pozwala znaleźć gdzie tkwi błąd.
  • #12 15008157
    jnk0le
    Poziom 18  
    Posty: 172
    Pomógł: 33
    Ocena: 31
    Jeśli rzeczywiście masz 8MHz i po ustawieniu wszystkiego prawidłowo nadal będą krzaki to raczej powinieneś zainwestować 1,50 CBLN w kwarc, najlepiej usart-friendly (18,432).
  • #14 15008290
    nariox
    Poziom 11  
    Posty: 111
    Pomógł: 1
    Ocena: 1
    Mam zewnetrzny kwarc 8 mhz, wlutowqny do ppdstawki wiec wszystkie podlaczenia prawidlowe, zmienie ustawienia fuse bitow i dam znac wieczorem czy pojdzie, musze wtedy cos w programie dodawać jakas linijke?
  • REKLAMA
  • #15 15008495
    jnk0le
    Poziom 18  
    Posty: 172
    Pomógł: 33
    Ocena: 31
    Najlepiej to całkowicie odkomentuj UCSRC. Domyślnie jest 8n1.
  • #16 15009522
    miro340
    Poziom 13  
    Posty: 38
    Pomógł: 7
    Ocena: 18
    Proszę bardzo w załączniku najprostszy działający kod sprawdzony na atmega168 ale to bez znaczenia bo na atmega88 też zadziała. Program kompilowany był w AVRStudio4, kwarc 8MHz, wyłączony wewnętrzny podział przez 8, terminal Br@y, przejścówka wykonana na MAX232. Jak to nie zadziała to radzę dobrze się przyjrzeć układowi, posiadanej przejściówce no i równie dobrze może być problem ze sterownikami.
    Załączniki:
    • proba_kodu.c (571 Bajtów) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #17 15010152
    nariox
    Poziom 11  
    Posty: 111
    Pomógł: 1
    Ocena: 1
    udało się ;)) i przesyłanie literki działa
    teraz probuje wysłać po sobie ciąg literek używając kilkakrotnie
    USART_Transmit('p');
    USART_Transmit('a');
    USART_Transmit('c');
    USART_Transmit('k');
    USART_Transmit('a');
    w pętli for;
    niestety atmega pluje dziwnymi znakami, dopiero gdy na klawiaturze trzymam jakis klawisz z literka obojetnie jaka to wtedy dopiero otrzymuje poprawne dane czyli w kolko: PACKAPACKAPACKAPACKA itd...
    miro340 napisał:
    terminal Br@y

    Ten program wyświetla mi Frame error gdy nie trzymam klawisza zadnego -
    mogę prosić o wskazówkę co powinienem z tym zrobić?
    próbowałem dodać opóźnienie, ale coś zostaje nadal w rejestrze UDR0
  • #18 15010391
    miro340
    Poziom 13  
    Posty: 38
    Pomógł: 7
    Ocena: 18
    Dziwne zachowanie. Ja do pętli for wrzuciłem to:
    USART_Transmit('p');
    USART_Transmit('a');
    USART_Transmit('c');
    USART_Transmit('k');
    USART_Transmit('a');
    USART_Transmit(' ');
    i wszystko działa jak należy bez wciskania żadnych klawiszy.
    [Atmega88] Jak skonfigurować USART w Atmega88 z Realterm przez RS232?

    Jeśli Br@y tak dziwnie działa, to sprawdź w innym terminalu, a najlepiej w Putty
  • #19 15010492
    jnk0le
    Poziom 18  
    Posty: 172
    Pomógł: 33
    Ocena: 31
    Bity stopu, parzystość i kontrola przepływu ustawione tak jak być powinny?
    Sprawdź jak będzie działało z tą biblioteką.
  • #20 15010752
    nariox
    Poziom 11  
    Posty: 111
    Pomógł: 1
    Ocena: 1
    Coś na pewno jest nie tak ,gdyż pętla for pomimo ustawienia i<=10 wykonuje się cały czas nawet przy pojedynczej literce ( zła częstotliwość?) a z tego co widać gołym okiem powinna się wykonać 11 razy, spróbuje coś pokombinować jeszcze
    dodam że częstotliwość procka ustawiłem na 8MHZ wstawiając we właściwościach projektu w zakładce symbols->definied: F_CPU=8000000UL
  • #21 15010835
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Pokaż kod. Nie wysyłaj znaków bez przerwy - zrób jakąś przerwę po każdej serii znaków, czyli np. delay() w pętli.
  • #22 15010848
    nariox
    Poziom 11  
    Posty: 111
    Pomógł: 1
    Ocena: 1
    miro340 napisał:


    Jeśli Br@y tak dziwnie działa, to sprawdź w innym terminalu, a najlepiej w Putty


    wywala błedy jak program wali stek bzdur , gdy normalnie trzymam klawisz na klwaiaturze to wtedy jest Rx ok - więc program(Br@y) wporządku wg mnie- nie wiem tylko skąd te dziwne znaki się tam biorą ...

    @ BlueDraco kod programu to taki jak zamieścił miro340,dokładnie taki wklejam bez żadnych modyfikacji, fuse bity zaprogramowałem i układ dla pojedynczej literki działa ok ale śle ją w nieskończoność.
    przy probie wysłania wyrazu "packa" kilkukrotnie używając usart_transmit()
    program się krzaczy i dzieje się to o czym pisałem kilka postów wyżej
  • #23 15010944
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Prawdopodobnie mikrokontroler się resetuje - inaczej nie powtarzałby ciągle czegoś, co ma się wykonać określoną liczbę razy. Zamiast return 0 na końcu main napisz pętlę pustą for(;;); - tak na wszelki wypadek, gdyby się okazało że return (którego nie powinno być) powoduje restart.

    Podepnij linię reset przez rezystor np. 10k do plusa. Napisz pętlę, która wysyła kolejne znaki lub ciągi znaków, a potem czeka np. pół sekundy.
  • #24 15010995
    nariox
    Poziom 11  
    Posty: 111
    Pomógł: 1
    Ocena: 1
    Spróbuje jeszcze wstawić drugiego procka bo mam 2, może ten jest walnięty albo coś
    jeżelit o nie pomoże to wstawie atmege32 i napisze dla niej taki sam program, potem zobaczymy co z tego wyjdzie
    @BlueDraco - dzięki za podpowiedz ;)
  • Pomocny post
    #25 15011003
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    To nie jest wina egzemplarza mikrokontrolera.
  • Pomocny post
    #26 15011332
    miro340
    Poziom 13  
    Posty: 38
    Pomógł: 7
    Ocena: 18
    Prawdopodobnie BlueDraco ma rację i przyczyną jest ciągły reset procka. Najlepiej pokaż schemat swojego układu ale bez uproszczeń tylko dokładnie zgodny z fizycznym układem. Czy układ RESETu masz podciągnięty do zasilania?
  • #27 15011334
    nariox
    Poziom 11  
    Posty: 111
    Pomógł: 1
    Ocena: 1
    udało się!!!!!!!!!!
    dzięki blueDraco, brakowało zasilania na pinie Vcc z przejściówki,podpiałem i działa ;))
    teraz będę mógł eksperymentować dalej
    na dowód załączam screena

    [Atmega88] Jak skonfigurować USART w Atmega88 z Realterm przez RS232?
  • #28 15011427
    miro340
    Poziom 13  
    Posty: 38
    Pomógł: 7
    Ocena: 18
    No i potwierdziła się teoria, że najbzdurniejszy błąd potrafi sponiewierać bardziej niż te najpoważniejsze :)

Podsumowanie tematu

✨ W dyskusji poruszono problem konfiguracji interfejsu USART w mikrokontrolerze Atmega88 przy użyciu przejściówki USB-RS232 TTL oraz programu Realterm. Użytkownik miał trudności z nawiązaniem komunikacji, mimo poprawnych ustawień portu (BAUDRate 9600, 8 bitów danych, brak parzystości, 2 bity stopu). Po kilku próbach i sugestiach od innych uczestników, w tym sprawdzeniu połączeń TX i RX oraz poprawieniu kodu inicjalizującego USART, udało się nawiązać komunikację. Kluczowym rozwiązaniem okazało się zapewnienie zasilania na pinie Vcc przejściówki, co rozwiązało problem z resetowaniem mikrokontrolera. Użytkownik zdołał przesyłać dane, jednak napotkał problemy z nieprawidłowymi znakami, które zostały częściowo rozwiązane przez dodanie opóźnień w pętli transmisyjnej.
Wygenerowane przez model językowy.
REKLAMA