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

RS-232: MEGA 8535 i PC - problem z komunikacją, krzaczki w BASCOM

Kazjo 12 Maj 2005 20:18 2031 16
REKLAMA
  • #1 1486874
    Kazjo
    Poziom 12  
    Posty: 42
    Ocena: 1
    Próbuję skomunikować MEGA 8535 z PC przy pomocy RS-232. Programuje w języku BASCOM. Zastosowałem układ MAX232N - podłączyłem, skonfigurowałem i kurde problem. Jeżeli wysyłam dane z procesora do komputera, komputer odbiera krzaczki, jak wysyłam dane z komputera do procesora - procesor nie odbiera nic. Terminal ktry
  • REKLAMA
  • #2 1486895
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    Baudrate się nie zgadza ? ;) Spróbuj tego wsadu - idealny do testowania połączenia na ATmega8535 (kwarc - 11059200, baudrate - 19200)
    Pozdr. Light'I
  • REKLAMA
  • #3 1486968
    McRancor
    VIP Zasłużony dla elektroda
    Posty: 5326
    Pomógł: 479
    Ocena: 123
    Pewnie ATmega lata na wewnętrznym rezonatorze zamiast kwarcu :)

    Zrób program który zapala i gasi diode co sekundę i sprawdź czy sekunda Twojej Megi ma coś wspólnego z tą na zegarku ;)
  • #4 1487584
    Kazjo
    Poziom 12  
    Posty: 42
    Ocena: 1
    ustawiam :

    $crystal = 7372800 - ponieważ mam zewnętrzny kwarc 7,3728 MHz
    $baud = 9600

    ustawiam w BASCOM:

    w "BASCOM-AVR Options" - zakładka "Chip" - "Communication" nastawiam: "Baudrate 0" - 9600; "Frequency" niestety muszę wybrać 8000000 Hz (nie ma opcji 7372800) - pojawia mi się wskaźnik error - 0,16%
    Przechodzę teraz do zakładki "Compiler" - "Communication" i wybieram:
    COM1; Baudrate - 9600; Parity - None; Databits - 8; Stopbit - 1; Handshake - 1; Emulation - BBS ANSI;

    A i w zakładce "Programmer" mam nastawione "COM port 1".

    A dane z RSa odbieram programem, też odpowiedni skonfigurowanym. Tak więc nie wiem gdzie błędy??
  • #5 1487614
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 240
    Kazjo napisał:
    A dane z RSa odbieram programem, też odpowiedni skonfigurowanym. Tak więc nie wiem gdzie błędy??
    Mazz napisaną wyżej procedure testową co masz po kolei zrobić. Czemu nie skorzystasz z tej podpowiedzi?
  • #6 1488097
    Kazjo
    Poziom 12  
    Posty: 42
    Ocena: 1
    Light'­I -nie moge sprawdzic tej procedury, ponieważ nie mam kompilatora C, jak napisalem wyzej programuje w BASCOM, a nie moge wgrac samego pliku hex - poniewaz mam kwarc 7,3728 :/, natomiast procesor taktuje mi z kwarca zewnęrznego - zmieniłem FUSEBIT na QUARZ SLOW RASING POWER.

    No juz nie wiem co moze być (maxa 232 chyba też poprawnie podłączyłem)
  • REKLAMA
  • #7 1488328
    Elektrooonik
    Poziom 29  
    Posty: 1212
    Pomógł: 127
    Ocena: 83
    Kazjo napisał:
    Light'­I -nie moge sprawdzic tej procedury, ponieważ nie mam kompilatora C, jak napisalem wyzej programuje w BASCOM, a nie moge wgrac samego pliku hex - poniewaz mam kwarc 7,3728 :/, natomiast procesor taktuje mi z kwarca zewnęrznego - zmieniłem FUSEBIT na QUARZ SLOW RASING POWER.

    No juz nie wiem co moze być (maxa 232 chyba też poprawnie podłączyłem)


    Jak chcesz sprawdzić czy max działa prawidłowo to połącz txd i rxd za maxem i zobacz czy odbierasz w terminalu to samo co wysyłasz :)
  • #8 1488708
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    Kazjo, to nie jest w C tylko w AVRAsm2, asemblerze od najnowszego AVRStudio. Dołączam hex na twój kwarc.
    Załączniki:
    • USART-TxTest.7.3728.hex.zip (548 Bajtów) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #9 1489355
    Kazjo
    Poziom 12  
    Posty: 42
    Ocena: 1
    Więc zrobiłem tak jak Elektrooonik mi powiedział połączyłem Txd z Rxd za MAXEM 232, napisałem taki program w BASCOMIE:

    $regfile = "m8535.dat"
    $crystal = 7372800
    $baud = 19200

    Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2 'konf. wysw.
    Config Lcd = 24 * 2


    Dim B As Byte , I As Integer


    Cls


    For I = 1 To 30 Step 1

    Cls
    Print I
    Lcd " Kanal: "
    Waitms 10
    Lcd I
    Lcd ", "
    Input B
    Lcd B
    Waitms 1000
    Next I

    End 'end program

    I program się zatrzymuje i na wyświetlaczu wyświetla mi:
    "Kanal 2, " i czeka na sygnał odbioru. Tak więc może to MAX?

    Dodano po 3 [minuty]:

    Ale teraz zwarłem ze sobą bezpośrednio nóżki na procesorze i też powyższy program zatrzymuje się na
    "Kanal 2, "

    Tylko dlaczego raz tą pętlę wykonuje ? teraz nierozumiem?
  • #10 1489372
    Elektrooonik
    Poziom 29  
    Posty: 1212
    Pomógł: 127
    Ocena: 83
    Kazjo napisał:
    Więc zrobiłem tak jak Elektrooonik mi powiedział połączyłem Txd z Rxd za MAXEM 232, napisałem taki program w BASCOMIE:

    Nie zrozumielismy sie, chodziło mi o to zeby sprawdzic czy masz sam max dobrze podłaczony, i wysyłanie z terminala i odbieranie tego samego :) bez posrednictwa procka
  • #12 1489503
    Kazjo
    Poziom 12  
    Posty: 42
    Ocena: 1
    Tak więc MAX 232 działa poprawnie - dostałem na komputerze to com wysłał. Zostaje tylko procesor. Podejżewam, że musi mieć w sobie walnięty układ UART, albo ja coś namieszałem

    Jeszcze jedno w FUSE mam ustawiony External Crystal slow rising power - czy to tez może mieć jakieś znaczenie??
  • #13 1489585
    Elektrooonik
    Poziom 29  
    Posty: 1212
    Pomógł: 127
    Ocena: 83
    Dziwnie ten program piszesz, nie lepiej skonfigurować przerwanie od UARTa i zrobic procedure obsługi tego przerwania gdy UART coś odbierze w i wtedy dalej coś robić ?

    bo tego "input" nigdy nie uzywałem i nie mam do niego zaufania

    On Urxc Odbierz
    Enable Urxc
    Enable Interrupts

    i pod etykietą "odbierz" piszesz dalej obsługe przerwania i return

    nie wiem czy tak samo sie nazywa to w medze w 8535 bo tak robiłem na 2313

    a ten baudrate musi byc az tak duzy? spróbuj na mniejszym np 9600 albo 4800

    I upewnij sie jaką czestotliwoscią jest taktowany procek czy zewnetrznym kwarcem czy wewnetrznym oscylatorem
  • #14 1489603
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    W fuse ustawia się CKOPT, CKSEL0, CKSEL1, CKSEL2 i CKSEL3, jeżeli chodzi o zegar... Nie mam pojęcia co w tym przypadku autor Bascoma miał na myśli... ;) Nie bawiles się innym programem do ładowania procesorka ?
    Np. http://www.amwaw.edu.pl/~adybkows/elka/ispprog.html
  • #15 1489769
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 51
    Elektrooonik napisał:
    ...
    bo tego "input" nigdy nie uzywałem i nie mam do niego zaufania

    A szkoda , bo działa tak jak powinno :wink:
    Elektrooonik napisał:

    On Urxc Odbierz
    Enable Urxc
    Enable Interrupts

    i pod etykietą "odbierz" piszesz dalej obsługe przerwania i return

    To samo uzyskasz odpowiednio konfigurując "SERIALIN".
    Notomiast jeśli chodzi o funkcję "INPUT", to kończy działanie po otrzymaniu znaku końca lini tzn. &H0D-Chr(13).Jeśli urządzenie nadające , takowego znaku nie wysyła , to "czekaj tatka latka".Wniosek:
    By prawidłowo odczytywać dane otrzymywane przez UART , musimy wiedzieć w jakim formacie będą wysyłane do naszego procka.

    Pozdrawiam
    Piotrek
  • #16 1492953
    marcinkwa
    Poziom 14  
    Posty: 164
    Pomógł: 5
    McRancor napisał:
    Pewnie ATmega lata na wewnętrznym rezonatorze zamiast kwarcu :)

    Zrób program który zapala i gasi diode co sekundę i sprawdź czy sekunda Twojej Megi ma coś wspólnego z tą na zegarku ;)


    Dobrze Ci radzi.
    Czy na pewno działasz na kwarcy , a nie na wewnętrznym RC.
    Przestaw $crystal na 1000000 i zobacz czy działa
  • #17 1499962
    Kazjo
    Poziom 12  
    Posty: 42
    Ocena: 1
    Dziękuję bardzo za wszelkie informacje jakie uzyskałem, bardzo pomogły. Natomiast problem był natury programowej, a dokładnie niedziała jedna komenda w języku BASCOM - "input" - nawet gdy wysyłam znak końca chr(13). Dopiero trzeba było uruchomić przerwania i napisać procedurkę na przerwanie.

    Natomiast chciałbym się podzielić z wami moimi przemyśleniami na temat UART:
    1. Jeżeli chce się sprawdzić poprawność działania interfejsu szeregowego na procesorze wystarczy połączyć ze sobą piny RxD i TxD - i niech procesor odbiera to co wysłał.

    2. Jeżeli chcemy sprawdzić czy mamy dobrze podłączonego MAXA 232 wystarczy za układem scalonym również zrobić podobnie i połączyć ze sobą TxD z RxD i wysyłać z komputera - jezeli komunikacja jest poprawna, to komuter odbierze to co wysłał.

    3. Nie ufać do końca gotowym procedurką BASCOMA, bo można się troszkę zrazić i szukać innych możliwości, jak na przykład przerwania.

    No i w sumie na tym można było by zakończyć. Liczę, że ktoś uchroni się przed tymi problemami, które ja miałem. Pozdrawiam :-)

Podsumowanie tematu

✨ Problem dotyczył komunikacji pomiędzy mikrokontrolerem ATmega8535 a komputerem PC przez interfejs RS-232 z użyciem układu MAX232N oraz programowania w BASCOM. Użytkownik miał trudności z odbiorem i wysyłaniem danych – komputer odbierał "krzaczki", a procesor nie odbierał danych z komputera. Dyskusja wskazała na kilka potencjalnych przyczyn: niezgodność prędkości transmisji (baudrate), błędna konfiguracja częstotliwości taktowania procesora (kwarc zewnętrzny 7,3728 MHz vs. ustawienia w BASCOM), oraz problemy z używaną komendą "input" w BASCOM, która oczekuje znaku końca linii (chr(13)) i może blokować program. Zalecano testowanie połączenia przez sprzętowe zwarcie linii TxD i RxD za układem MAX232, co potwierdziło poprawność działania układu. Ostatecznie rozwiązaniem było zastosowanie obsługi przerwań UART zamiast funkcji "input" do odbioru danych, co umożliwiło poprawną komunikację. Dodatkowo zwrócono uwagę na prawidłowe ustawienie fusebitów dla zewnętrznego kwarcu oraz na konieczność dokładnej konfiguracji parametrów komunikacji w BASCOM. Podsumowując, problem miał charakter programowy związany z obsługą UART w BASCOM i konfiguracją sprzętową mikrokontrolera oraz interfejsu RS-232.
Wygenerowane przez model językowy.
REKLAMA