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

ATmega162 - USART - Brak sygnału na TXD0 przy przekazywaniu z RXD1

Adrian_sekowski 22 Gru 2014 10:12 1218 10
  • #1 14245063
    Adrian_sekowski
    Warunkowo odblokowany
    Witam

    Posiadam Atmega162. Piszę w AVR studio 4 - ASM. Programator to USBasp, programowanie za pomocą mkAVR

    Programuję oba usarty tak samo aby przekazywał z RXD0 na TXD1 natomiast RXD1 na TXD0. Tak wiem że to bez sensu ale taki chcę omówić z wami przykład. Pytanie brzmi dlaczego dane przechodzą z RXD0 na TXD1 natomiast z RXD1 na RXD0 nie.

    Jest to wykonane w przerwaniach - USART0 odebrał daną RXD0 więc wysyłam ją do TXD1 - to działa natomiast odwrotnie już nie.

    Zastanawia mnie samo wyjście Portu PD1 które jest w stanie niskim mimo programowego ustawienia go jako wyjście w stanie wysokim oraz włączonym TXEN0. Po dwudniowym przestudiowaniu noty katalogowej jedyny trop jaki znalazłem to tabela nr 40 jednak nie rozumiem za bardzo czy to ma coś wspólnego i w którym miejscu blokuje sobie wyjście TXD0.

    Dodam że mam dwa procki i oba reagują tak samo. Przy programowaniu fusebitów miałem znaczne problemy - zawieszał się mkAVR (może to coś znaczy).

    Proszę o odpowiedz w tym prostym, ale jakże dziwnym problemie, ponieważ sam nie mogę sobie poradzić :)

    Dodano po 2 [godziny] 48 [minuty]:

    66 wyświetleń i nikt nie ma pomysłu?

    Nie interesuje mnie czy w kodzie jest błąd i nie proszę o jego analizowanie.

    Interesuje mnie informacja czy procesor fizycznie ma wewnątrz jaką blokadę, że np używam nie wiem INT0 czy Timera jakiegoś i czy jeżeli tam ustawie jakiś bit w rejestrach to automatycznie procesor blokuje mi funkcjonalność wyjścia PD1 (TXD0).

    Np kruczek o którym dowiedziałem się na początku zabawy z ATmega8 że: Zapisanie UCSR0C muszę ustawić bit 7 ponieważ jak nie ustawisz to zapisze tą wartość do UBRR0H a nie UCSR0C. Akurat to jest opisane w nocie katalogowej ale o TXD0 nie działa i nie wiem dlaczego. Czy jest jakaś wewnętrzna zależność?

    ATmega162 - USART - Brak sygnału na TXD0 przy przekazywaniu z RXD1
  • Pomocny post
    #2 14245620
    excray
    Poziom 41  
    Jedyny wymóg dla Tx to taki że pin musi być skonfigurowany jako wyjście. Jeśli w dalszej części programu nie zmieniasz go przypadkiem na wejście to musi działać. Tak się składa że mam Atmegę 162 i nie zauważyłem żadnych problemów z poprawnym działaniem obu USARTów.
    Adrian_sekowski napisał:
    Zastanawia mnie samo wyjście Portu PD1 które jest w stanie niskim mimo programowego ustawienia go jako wyjście w stanie wysokim

    To jest normalne jeśli USART przejmuję kontrole nad wyjściem. To on ustawia stan na takim pinie a nie zawartość rejestru PORTD.1
  • #3 14245643
    Adrian_sekowski
    Warunkowo odblokowany
    Dziękuję za odp. W takim razie mam pytanie dlaczego drugi USART (RXD1 oraz TXD1) mają stany wysokie gdy procesor nic nie robi (w tej chwili nie wysyła nic ani nie odbiera Pętla "Main: rjmp Main" - ten USART działa poprawnie odbiera i wysyła? RXD0 jest też w stanie wysokim i odbiera dane natomiast TXD0 ma stan niski (nie mogę podciągnąć rezystorem 1k do 5V) i nie wychodzi z niego sygnał mimo iż program wchodzi w pętle wysyłania danych i niby to robi... (sprawdzam diodą LED zapalając PC3 "cbi portc, 3" gdy wykona instrukcje "OUT UDR0, r16"

    W programie używam odpowiednio UDR0 oraz UDR1 Ponieważ tak wyczytałem w m162asm.def - nie pamiętam dokładnie jak się ten plik nazywa.
  • #4 14245655
    excray
    Poziom 41  
    Musisz szukać błędu albo w podłączeniu albo w kodzie. Jak wspomniałem mam ten sam procesor i bez problemu ustawiłem na nim komunikacje na obu USARTach. Czy procesor masz w jakimś układzie czy jest to pająk bądź płytka stykowa? Coś jeszcze jest do TX0 podpięte? Czy sterowanie tym pinem przed włączeniem USART jest możliwe?
  • #5 14245668
    Adrian_sekowski
    Warunkowo odblokowany
    Do USART0 podpięta przejściówka USB-RS232 do kompa gdzie wysyłam dane.
    Do USART1 podpięta bezpośrednio ATmega8 do RX i TX.

    Wszystko działa poza tym że z UART0 nie wychodzą dane do PC. Przejściówka ok. I tak nie bardzo wiem jak na to patrzeć :D

    Wszystko połączone na płytce stykowej (przejściówka zlutowana PCB)
  • #6 14245688
    excray
    Poziom 41  
    Odepnij wszystko od USART0 i zacznij od podstaw. Podłącz tylko diodę LED albo miernik. Powinno być tak że po ustawieniu PD1 jako wyjścia powinien być na nim stan niski. Po ustawieniu PD1 poleceniem sbi stan wysoki. Ten banalny test powie Ci czy wyjście nie jest uszkodzone. Możesz też sprawdzić czy na wejściu przejściówki USB-RS232 nie ma przypadkiem zwarcia.
  • #7 14245700
    Adrian_sekowski
    Warunkowo odblokowany
    Wrócę do domu to tak zrobię jednak wczoraj sprawdzałem już to i nic mi nie dało.
    Przejściówka jest dobra ponieważ przepnę do drugie UART1 i dane przychodzą do PC.

    Wczoraj wyłączyłem nadajnik TXEN0 i ustawiłem stan wysoki na PD1 - był stan niski na obu procesorach. Dziś Zaprogramuje tylko DDRx i PORTx i wtedy będę wiedział czy to działa czy nie.

    Rozumiem że nic nie wiesz o wewnętrznej jakiejś blokadzie - raczej uszkodzony pin w obu procesorach? Sprawdzę
  • #8 14245731
    piotrva
    VIP Zasłużony dla elektroda
    Sam robiłem takie forwardery - ne ma żadnych przeciwwskazań, o ile prawidłowo wszystko wykonujesz w programie - tu bym szukał błędów w pierwszej kolejności.
  • #9 14245739
    excray
    Poziom 41  
    Nic nie wiem o żadnej blokadzie. Mało tego, sprawdziłem że nawet grzebanie przy DDRD i PORTD przed inicjalizacją, w trakcie i po tego nie zmienia. W momencie gdy włączysz komunikację USART niepodzielnie przejmuje władzę nad PD1 i dopiero wyłączenie USARTa zwalnia linię PD1.
  • #10 14245753
    Adrian_sekowski
    Warunkowo odblokowany
    Dziękuje jeszcze raz za cenne uwagi które mnie utwierdziły w przekonaniu o uszkodzeniu pinów. Ale dziwne, że nowe układy ledwo co przylutowane do płytki (SMD) i nie działają... Rozumiem jeden ale dwa? Mam nadzieję że gdzieś mam błąd w kodzie bo szkoda by było czasu na lutowanie i kasy na te SMD :)

    Sprawdzę i wieczorem dam znać o wnioskach ale raczej będą uszkodzone wyjścia bo ciężko to inaczej racjonalnie wytłumaczyć - chciałem się upewnić czy nie ma jakiegoś haczyka wewnątrz Atmega162 - na chwile obecną dziękuje raz jeszcze.

    Dodano po 5 [godziny] 5 [minuty]:

    Masakra - co za wstyd :D

    Zrobiłem sobie przejściówki SMD na DIP do tych Atmega162 - aby ułatwić sobie życie zrobiłem mostki pomiędzy Plusami i masami jak widać na poniższym obrazku...

    ATmega162 - USART - Brak sygnału na TXD0 przy przekazywaniu z RXD1

    Wszystko byłoby super gdybym zrobił odbicie lustrzane ponieważ jest to płytka powierzchniowa a nie przewlekana ...... Stan niski na TX0 był ponieważ było zwarcie do GND.

    Pójdę chyba dam na tackę w niedzielę bo całe szczęście po rozcięciu mostków cały procek działa poprawnie i przesyła w obie strony. Chociaż wam powiem że Atmega się grzała to założyłem na nią radiator ponieważ stwierdziłem że 16MHz to ma prawo się grzać a tu zwarcie :)

    Jeszcze raz przepraszam wszystkich za zamieszanie ale przynajmniej wiemy że nie ma żadnych blokad na pewno :P Temat można zamknąć lub usunąć jeżeli moderator stwierdzi że nie ma on sensu. Wesołych świąt i dziękuje jeszcze raz :)
  • #11 14246685
    piotrva
    VIP Zasłużony dla elektroda
    AVRy wytrzymują sporo - czasem tylko zmieniają im się standardy napięciowe na wyjściach po takich akcjach :D Ja raz zrobiłem sobie dzięki temu wersję z wyjściami na 2,7V przy zasilaniu z 5V ;)
REKLAMA