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

[AT90PWM3B][C]Komunikacja z PC przez RS232

futshak401 18 Sie 2011 16:40 4095 20
  • #1 9837493
    futshak401
    Poziom 10  
    Witam

    Mam problem z komunikacją AT90PWM3B przez RS232 z PC. Problem polega na tym, procesor powinien wysyłać do PC 1 bajt do komputera (w kodzie jest to 0xFF) i nie ważne jaki będzie to bajt zawsze do komputera dotrze 0x3F

    MAX232 jest podłączony tak jak na tym schemacie z tą różnicą że zamiast kondensatora 10uF jest 1uF.
    [AT90PWM3B][C]Komunikacja z PC przez RS232

    Programuje w AVR Studio.
    Do komunikacji z używam programu Docklight V1.9
    Adapter RS232 to RS232 CardBus na PCIMCIA

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #2 9837744
    xamrex
    Poziom 28  
    Program wygląda OK,
    daj tylko w pętli while opóźnienie np. 1sek
    Jaki zastosowałeś kwarc?
  • #3 9837786
    futshak401
    Poziom 10  
    Mam ustawiony wewnętrzny oscylator 8MHz.
    Teraz przejrzałem dokładniej opcje Docklight i ta wartość 0x3F to sygnał błędu. Czyli widocznie coś się nie dochodzi dobrze do komputera.
  • #4 9837893
    piotrva
    VIP Zasłużony dla elektroda
    Hmm:
    1. spróbuj jakiegoś innego programu do obsługi terminala po stronie PC
    2. sprawdź działanie samego MAX232 - odłącz uC i zewrzyj jego wyprowadzenia Rx i Tx po stronie TTL i wysyłaj z komputera jakieś znaki - powinno dotrzeć do Ciebie to samo co wysyłasz.
    Te 2 punkty wyeliminują problemy ze sprzętem PC i konwerterem
  • #5 9838038
    futshak401
    Poziom 10  
    Sprawdzone oba przypadki i problem ze PC i konwerterem wyeliminowane, ale przy tym jak korzystałem z programu Realterm został zgłoszony błąd że linia RXD jest uszkodzona i zgłasza błąd ramki. A tego błędu nie było jak testowałem punkt 2.
  • #6 9844498
    futshak401
    Poziom 10  
    Po kilkunastu godzinach zaczynam nabierać podejrzeń że coś jest nie tak z uC. Podłączyłem zewnętrzny kwarc (16 MHz). Próbowałem zamieniać połączenia wychodzące z procesora do MAXa. I dalej dzieje się to samo.

    Od nowa napisałem program tym razem na ma otrzymywać sygnał z PC gasić diodę i wysyłać to co dostał do PC

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


    Prosiłbym o jakieś sugestie bo mi się już pomysły kończą :cry:

    //

    Przetestowałem ten programik na różnych ustawieniach baud i o dziwo działała wysyłanie ale na baud= 300 8-O a na 19200 dalej sieje błędami.
  • #7 9844656
    gaskoin
    Poziom 38  
    A spróbuj w Twoim programie zamienić obsługę przerwania na taką:

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


    Powinieneś ustawić bit w DDRC który ma być wyjściowy a stan na wyjściu ustawiać przez PORTC
    --------------------------

    A jaką masz długość kabla ?
  • #8 9844731
    futshak401
    Poziom 10  
    @U.P.
    DDRC dlatego że działa to w takiej formie jak jest ;) (dioda jest podłączona przez rezystor do +5V i bezpośrednio do PC2).

    Zmieniłem obsługę przerwania na taką podałeś i niestety nic się nie dzieje jeśli jest w takiej formie program. Jak dodam w pętli while ciągłą transmisje to po wysłaniu sygnału z komputera procek przestaje nadawać.

    Kabel ma około 1,8 m, z tym że mam też możliwość podłączenia bezpośrednio gniazda na płytce do portu(testowane i dzieje się to samo).
  • Pomocny post
    #9 9845124
    LordBlick
    VIP Zasłużony dla elektroda
    Może taki kodzik - odebranie znaku sygnalizowane mignięciem a nie zapaleniem LED + echo (UART_BAUD do ustawienia na własny):
    Kod: text
    Zaloguj się, aby zobaczyć kod
    Co do błędów transmisji - polecam rezonator kwarcowy 11,0592MHz...
  • #10 9845201
    maqister
    Poziom 10  
    Hej, ostatnio rozwiązywałem ten sam problem, więc może Ci pomogę.

    Układ max232 podłączyłem tak jak w tym pdf'ie:
    http://www.btc.pl/pdf/zl3avr.pdf

    Jako sygnał zegarowy użyłem wewnętrznego rezonatora RC (ustawionego na częstotliwość pracy 1MHz).

    Jako terminalu użyłem programu putty, którego konfigurację zamieszczam na dwóch screenach:
    [AT90PWM3B][C]Komunikacja z PC przez RS232 [AT90PWM3B][C]Komunikacja z PC przez RS232

    Ponieważ nie mam w komputerze gniazd rs232 użyłem tej przejściówki:

    http://allegro.pl/prolific-2303-usb-rs232-pelny-com-najlepszy-model-i1761952266.html

    Wszystko działa doskonale, może Ci to pomoże, jakbyś miał pytania do tego co wrzuciłem to pytaj : ). Sprawdzałem transmisję tym sposobem i na prędkości 4800 i 9600 działało mi świetnie.

    Mikrokontroler którego użyłem to ATmega32, ale to chyba nie ma znaczenia :P ważne są tylko linie Tx i Rx w zasadzie.

    
    .nolist
    .include "m32def.inc"
    .list
    
    .cseg
    .org 0
    rjmp START
    
    
    START:
    	; inicjalizacja wskaznika stosu
    	ldi R16, HIGH(RAMEND)
    	out SPH, R16
    	ldi R16, LOW(RAMEND)
    	out SPL, R16
    
    	; inicjalizacja UART
    	ldi R16, 0
    	ldi R17, 12
    	out UBRRH, R16
    	out UBRRL, R17
    
    	;ldi R16, (1<<U2X)
    	;out UCSRA, R16
    
    	ldi R16, (1<<TXEN)
    	out UCSRB, R16
    
    	ldi R16, (1<<URSEL)|(1<<USBS)|(3<<UCSZ0)
    	out UCSRC, R16
    	
    	; wczytywanie adresu poczatku tablicy do wskaznika Z
    	ldi ZH, HIGH(TABLICA*2)
    	ldi ZL, LOW(TABLICA*2)
    	rcall WYSLIJ_LANCUCH
    
    MAIN:
    	rjmp MAIN
    
    WYSLIJ_BAJT:
    	sbis UCSRA, UDRE
    	rjmp WYSLIJ_BAJT
    	lpm R16, Z+
    	out UDR, R16
    	ret
    
    WYSLIJ_LANCUCH:
    	lpm R16, Z
    	cpi R16, 0xFF
    	breq KONIEC_LANCUCHA
    	rcall WYSLIJ_BAJT
    	rjmp WYSLIJ_LANCUCH	
    KONIEC_LANCUCHA:
    	ret
    
    TABLICA:
    	.db "napis", 0xFF
    
  • #11 9845243
    futshak401
    Poziom 10  
    @LordBlick
    Wielkie dzięki bo działa:D
    Z tym że zauważyłem przekłamania bo z tego co zrozumiałem z kodu ma wysyłać to samo co dostaje (o dziwo zrozumiałem :D), a nie zawsze się tak dzieje np po wysłaniu 0x50 zwraca 0xE8. I właśnie nie rozumiem dlaczego;/

    Poza tym jeśli są ustawione różne prędkości tj. na procku 230400 a w kompie 115200 to te błędy pojawiają się do 0x61.
    Czy te błędy mogą być spowodowane przez kwarc ?

    @magister
    Dzięki pobawię się tym może coś z tego wyjdzie
  • #12 9845262
    gaskoin
    Poziom 38  
    futshak401 napisał:
    Poza tym jeśli są ustawione różne prędkości tj. na procku 230400 a w kompie 115200 to te błędy pojawiają się do 0x61.
    Czy te błędy mogą być spowodowane przez kwarc ?


    :D Nie - te błędy są spowodowane przez różne prędkości :) RS nijak jej nie sprawdza - musisz zadbać sam o to żeby nadajnik i odbiornik miały taką samą.
  • #13 9845288
    futshak401
    Poziom 10  
    @ gaskoin

    Nie o to mi chodziło.
    Procek 115400 i PC 115200 - wszystko źle.
    Procek 230400 i PC 115200- źle do 0x61 później wszystko ok .
  • #14 9845332
    LordBlick
    VIP Zasłużony dla elektroda
    futshak401 napisał:
    zauważyłem przekłamania bo z tego co zrozumiałem z kodu ma wysyłać to samo co dostaje (o dziwo zrozumiałem :D), a nie zawsze się tak dzieje np po wysłaniu 0x50 zwraca 0xE8. I właśnie nie rozumiem dlaczego;/
    Przy 8MHz wewnętrznego zegara RC przydatna jest kalibracja. Polecam do zabawy rejestry CLKPR
    i OSCCAL. Szczegóły - jak zwykle u producenta... ;) No chyba, że zegar pociągniemy z zewnątrz...
  • #15 9845344
    futshak401
    Poziom 10  
    @ LordBlick
    Zegar jest z zewnątrz - kwarc 16MHz ale coś czuje że niedługo zostanie zmieniony na 11,0592MHz ;)
  • #16 9845385
    piotrva
    VIP Zasłużony dla elektroda
    Hmm, ja jakoś mam nie jedno urzadzenie na 16 MHz i nigdy mi się komunikacja nie sypala nawet...
  • #17 9845438
    LordBlick
    VIP Zasłużony dla elektroda
    futshak401 napisał:
    @ LordBlick
    Zegar jest z zewnątrz - kwarc 16MHz
    Rozumiem, że jest to sprawdzone oscyloskopem lub częstotliwościomierzem ? Przypomniał mi się właśnie mój kiedyś zrealizowany projekt na ATmega8 i wewnętrznym RC na 8MHz, w którym bez problemu leciało nawet i po 300 bajtów na 8N1 19200 bps.
  • #19 9847830
    piotrva
    VIP Zasłużony dla elektroda
    A sprawdź program migający diodą co 1s - może masz źle ustawione FB?
  • #20 9848568
    LordBlick
    VIP Zasłużony dla elektroda
    revcorey napisał:
    Jeśli masz jakieś przekłamania to oznacza że w UBRR zła wartość jest miałem tak.
    Jeśli chodzi o mój kod, to nie jest on z powietrza, został sprawdzony i przy okazji pokazuje, że nie trzeba żadnych wspomagaczy do obliczania UBBR, wystarczy preprocesor.
  • #21 9850912
    futshak401
    Poziom 10  
    Jak na razie działa wszystko bez problemów - wystarczyło zmienić prędkość na niższą (z 115200 na 14400;) ). Docelowo ten procesor ma sterować silnikiem BLDC a PC ma być używany jako terminal do zadawania prędkości i zmiany kierunku wirowania silnika.
REKLAMA