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

[ATmega32][c][MMusb232RL][JTAG ICE] Uart nie działa,komunikacja uC-PC po RS

macieqs 01 Lis 2011 12:25 2142 4
  • #1 10088743
    macieqs
    Poziom 10  
    Witam,
    Od 2 dni męczę ATmegę32, żeby tylko poprawnie komunikowała się z PC, zależy mi na transmisji szeregowej. Używam do tego modułu MMusb232RL. Do tego mam uC programowanego i debugowanego przez odpowiednika JTAG ICE mkI, i diody, bo nie mam wyświetlacza. Kod na końcu postu.

    1. sprawa- nie wiem jak sprawdzić czy ten moduł MMusb232RL działa poprawnie (wbudowane diodki SMD się nie świecą)

    2. nie jestem pewien czy dobrze połączyłem te dwa układy, w jednym z tematów przeczytałem, że wystarczy połączyć RxD, TxD i GND i będzie działało.
    Ja połączyłem RxD po stronie ATmegi z TxD po stronie RS,
    TxD po stronie ATM z RxD po stronie RS
    połączyłem resety z przyciskiem zwierającym do masy
    połączyłem wszystkie GND z GND w moim układzie

    nie wiem co z XCK po stronie ATmegi - może pozostać niepołączone?

    3. do sprawdzenia efektów komunikacji używałem SerialPort Teminal i tak: cokolwiek wysłałem, po przejściu przez ATmegę dostawałem '?' i cokolwiek wysyłałem z uC to też dostawałem '?' - dlatego zakładam, że komunikacja jest niepoprawna, aczkolwiek BAUD rate po obu stronach jest poprawne - inaczej nie dostane nawet tego '?' zwrotnego

    4. Inicjalizację UART'a, otrzymywanie i wysyłanie danych, wziąłem wprost z dokumentacji Atmela, zresztą widziałem, że innym to działa: Link

    i tu CHYBA znalazłem problem - podczas debugowania w AVRStudio 4.19 nie ustawia się bit URSEL w rejestrze UCSRC, po prostu jakby pomijał tą linijkę kodu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    a próbowałem na różne sposoby:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

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

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

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

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

    no chyba że każdy z nich jest zły - to proszę, powiedzcie mi to.

    5. przypomniał mi się jeszcze jeden problem - w AVRStudio muszę używać zewnętrznego pliku Makefile, który wcześniej sobie zrobiłem programując ten sam procek przez samego WinAVR, w innym wypadku wyskakuje mi błąd:
    Cytat:
    cc1.exe: error: unrecognized command line option "-mmcu=atmega32"


    podejrzewam, że chodzi o tę część pliku makefile:
    ## General Flags
    PROJECT = serial
    MCU = atmega32
    TARGET = serial.elf
    CC = avr32-gcc
    
    CPP = avr-g++
    
    ## Options common to compile, link and assembly rules
    COMMON = -mmcu=$(MCU)


    a że dopiero niedawno zaczęła się moja historia z uC i wiem, że niewiadomych jest tyle, że można się pochlastać proszę o pomoc.

    oto mój listing:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #2 10090297
    daniel6662
    Poziom 21  
    1.
    "DDRD |= (1<<PD6);"
    Na początku ustawiasz PD6 jako wyjście a później próbujesz korzystać jak z wejścia:
    "while(PIND & (1<<PD6))"
    2.
    "unsigned char USART_Receive( void )"
    Ta funkcja zwraca typ unsigned char który może przyjąć wartości od 0 do 255 więc ten warunek:
    "if (a>1000)" nigdy nie zostanie spełniony.

    To tak na szybko, później przejrzę kod dokładniej.
    Pozdrawiam
  • #3 10123651
    macieqs
    Poziom 10  
    Po wielu próbach natknąłem się na temat, w którym kolega opisał, że odkrył dziwną zależność, ze stosunek baud rate na avr do pc powinna być taka jaki sie ma uprocek - czyli dla mnie 8. Faktycznie, ustawiając na pc baud rate na 1200 komunikacja przebiegała poprawnie.
    Teraz nasuwa mi się pytanie, czy to aby na pewno o to chodzi - przecież wewnętrzny oscylator mam ustawiony na 1MHz, mimo, że procek jest 8MHz i jest ustawiane:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    to też może faktycznie baud rate na procku przez to jest 1200 a nie 9600?

    punkty 1-4 rozwiązane
    mimo to dalej nie wiem co z pkt 5., ale jakoś daje radę na innym makefile'u
  • Pomocny post
    #4 10124584
    kriss68
    Poziom 20  
    macieqs napisał:
    przecież wewnętrzny oscylator mam ustawiony na 1MHz, mimo, że procek jest 8MHz i jest ustawiane:


    #define F_CPU 8000000UL


    Przeczytaj ze zrozumieniem swój ostatni post. Sam piszesz, że masz wewnętrzny oscylator 1MHz a kompilatorowi ściemniasz, że jednak 8MHz (to że wpiszesz F_CPU 8000000 nie oznacza, że procek sam Ci się na te 8MHz przestawi) Wiec kompilator ustawia Ci baudrate na 9600 dla kwarcu 8MHz. Pomyśl co się wtedy stanie gdy oscylator masz jednak 1MHz... Tak UART będzie chodził 8x wolniej a, że przypadkiem istnieje prędkość 1200 to Ci to działa. Co do makefile to powinno być: --mcu=atmega32
  • #5 10125410
    macieqs
    Poziom 10  
    kriss68 napisał:
    Wiec kompilator ustawia Ci baudrate na 9600 dla kwarcu 8MHz. Pomyśl co się wtedy stanie gdy oscylator masz jednak 1MHz... Tak UART będzie chodził 8x wolniej a, że przypadkiem istnieje prędkość 1200 to Ci to działa. Co do makefile to powinno być: --mcu=atmega32


    To mi wiele tłumaczy :)

    Myślałem, że procek jest fabrycznie ustawiany na 8MHz, dopiero ostatnio doczytałem, że:
    1. Fabrycznie jest na Int. RC Osc. 1MHz Start-up time: 6CK+64ms
    2. Wpisanie częstotliwości w kompilatorze nic nie zmieni

    a ta wiedza wiele zmienia i tłumaczy.
    Przepraszam, za te błędy... Ale z drugiej: "jak się nie przewrócisz, to się nie nauczysz"
REKLAMA