Elektroda.pl
Elektroda.pl
X
AM TechnologiesAM Technologies
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Atmega8, Rs232, pl2303 - UART nie działa dlaczego

28 Gru 2008 14:13 3533 6
  • Poziom 13  
    Witam

    Od pewnego czasu zacząłem się bawić mikrokontrolerami, teraz przyszedł czas na komunikacje PC <-> uC i spotkała mnie niemiła niespodzianka już parę godzin spędziłem nad tym tematem, próbowałem, testowałem i cudowałem :D ale bez większych rezultatów po wyczerpaniu moich pomysłów i przejrzeniu kilku stron n elektrodzie nie rozwiązałem niestety mojego kłopotu, dlatego postanowiłem sięgnąć rady kogoś kto zna się na rzeczy i być może mi pomoże.

    Przejdźmy do sedna sprawy, otóż chce nawiązać połączenie między Atmegą8 a PC poprzez interfejs Rs232, jako że nie posiadam w swoim komputerze portu com zakupiłem przejściówkę rs232-usb przejściówka oparta jest o chip pl2303 (podobno sprawuje się nieźle według użytkowników elektrody którzy mieli z nią odczynienia) przejściówkę sprawdziłem zwierając rezystorem 1R piy RxD i TxD wszystko ok a wiec przejściówka jest sprawna. Do procka wrzuciłem taki oto program

    Code:

    $crystal = 3000000                                       
    $regfile = "m8def.dat"                                   
    $baud = 1200                                           

    Config Portd = Output

    Do
    Print "123"
    Wait 10
    Loop

    End
       


    Linie TxD procka połączyłem z linią RxD przejściówki poprzez rezystor 1R (była też opcja bez rezystora ale bez efektów), odpaliłem program do odczytu danych z rs'a i ujrzałem krzaczki mnożące się w nieskończoność
    zamiast tekstu "123". Dodam jeszcze że sprawdzałem połączenia kilkakrotnie, wszystko jest polutowane, procek wsadzony jest w płytkę uruchomieniową ze stabilizatorem kondensatorami filtrującymi, cewką na zasilaniu AVCC i kondensatorem do AREF. Żeby wyeliminować błąd związany z oscylatorem postanowiłem oprzeć się na wewnętrznym kwarcu. Prędkość proca i prędkość portu RS w kompie mam ustawioną na tę sama wartość 1200 botów.
    Dodam jeszcze że po połączeniu masy z przejściówki z masą atmegi transmisja ustaje i program nie odbiera danych.
    Osobiście uważam ze to atmega powoduje ten błąd ale niestety sam sobie nie potrafię pomoc.

    Mam nadzieje że opisałem wszystko, jakby czegoś brakowało zaraz dopowiem i proszę o Wasze rady.
  • AM TechnologiesAM Technologies
  • Pomocny post
    Poziom 34  
    lukaszzk napisał:
    Dodam jeszcze że po połączeniu masy z przejściówki z masą atmegi transmisja ustaje i program nie odbiera danych.
    Widocznie transmisja nie zachodzi. Masy muszą być połączone. Prawdopodobnie nie konfigurujesz uartu (bascom nie jasnowidz, trzeba mu co nieco wskazać, no chyba że samo $baud= wystarcza)

    lukaszzk napisał:
    Żeby wyeliminować błąd związany z oscylatorem postanowiłem oprzeć się na wewnętrznym kwarcu.
    Dokumentacja nic nie mówi o tym, aby wewnętrzny oscylator RC mógł pracować przy częstotliwości 3MHz. Wewnątrz jest oscylator RC, czy chodziło Ci o zewnętrzny kwarc?

    Żeby sprawdzić, czy procesor w ogóle rusza, możesz zrobić programowy loopback pomiędzy rxd i txd - ta informacja na pewno będzie przydatna.
  • AM TechnologiesAM Technologies
  • Pomocny post
    Poziom 32  
    Cytat:
    Żeby wyeliminować błąd związany z oscylatorem postanowiłem oprzeć się na wewnętrznym kwarcu.
    I tu popełniłeś błąd. Masa musi być wspólna inaczej nici z gadania po RS-ie.
  • Poziom 39  
    lukaszzk napisał:
    ...Linie TxD procka połączyłem z linią RxD przejściówki...

    Czy jesteś pewien, że linie sygnałowe na przejściówce pracują w standardzie TTL :?:
  • Poziom 13  
    Dziękuje za błyskawiczną odpowiedz.

    BoskiDialer napisał:

    Widocznie transmisja nie zachodzi. Masy muszą być połączone.


    - Ok. Już robię masę na stałe miedzy uC :)

    BoskiDialer napisał:

    Prawdopodobnie nie konfigurujesz uartu (bascom nie jasnowidz, trzeba mu co nieco wskazać, no chyba że samo $baud= wystarcza)


    - No kolega ma rację, w przykładach nigdzie nie zalazłem nic o konfiguracji UARTU. Wiec trzeba go skonfigurować pytanie tylko jak ?
    Czy da sie to zrobić za pomocą bascoma czy trzeba sięgnąć może do fuse bitów ?

    BoskiDialer napisał:

    Dokumentacja nic nie mówi o tym, aby wewnętrzny oscylator RC mógł pracować przy częstotliwości 3MHz. Wewnątrz jest oscylator RC, czy chodziło Ci o zewnętrzny kwarc?


    - Gdzieś wyczytałem że atmega ma wewnętrzny oscylator 3MHz.
    Zerknąłem na szybko do dokumentacji i rzeczywiście jest tam rezonator RC jednak do konfiguracji zewnętrznego kwarcu trzeba poustawiać fusebity, jeśli była by taka możliwość to chciałbym zrealizować połączenie tylko na wewnętrznym rezonatorze bez używania zewnętrznego kwarcu, nie wiem tylko czy tak można.

    BoskiDialer napisał:

    Żeby sprawdzić, czy procesor w ogóle rusza, możesz zrobić programowy loopback pomiędzy rxd i txd - ta informacja na pewno będzie przydatna.


    - Procesor działa, zrobiłem sobie nawet parę migających diodek na święta :), loopback - ciekawie brzmi, może kolega ma coś takiego pod ręką. Ale oczywiście najpierw przydało by się skonfigurować ten UART.

    Jeszcze raz dzięki za zainteresowanie.

    Dodano po 17 [minuty]:

    zumek napisał:
    lukaszzk napisał:
    ...Linie TxD procka połączyłem z linią RxD przejściówki...

    Czy jesteś pewien, że linie sygnałowe na przejściówce pracują w standardzie TTL :?:


    100% pewności nie mam, przy zakupie kabla kierowałem się wypowiedziami kolegów.
    https://www.elektroda.pl/rtvforum/topic1045396.html
    Rozbierałem ja delikatnie tak żeby nie uszkodzić, wewnątrz nie znalazłem żadnego konwertera w stylu max232 a skoro jest zasilana z portu USB i atmega jest zasilania 4,5V to założyłem że oba człony pracują na poziomach TTL oczywiście mogę się mylić. A woltomierzem ciężko sprawdzić czy na przejściówce jest napięcie w standardzie TTL.
  • Poziom 42  
    lukaszzk napisał:

    - Gdzieś wyczytałem że atmega ma wewnętrzny oscylator 3MHz.
    Zerknąłem na szybko do dokumentacji i rzeczywiście jest tam rezonator RC jednak do konfiguracji zewnętrznego kwarcu trzeba poustawiać fusebity, jeśli była by taka możliwość to chciałbym zrealizować połączenie tylko na wewnętrznym rezonatorze bez używania zewnętrznego kwarcu, nie wiem tylko czy tak można.


    - pewnie że można na wewn oscylatorze (a nie na wewn rezonatorze)

    - podaj źródło - gdzie wyczytałeś takie kuriozum, że ATmega8 działa ci na wewn oscylatorze o częstotliwości taktowania 3MHz ????? (przecież już jeden z kolegów ci podpowiadał, że nie ma takiej opcji - a ty nadal się kurczowo trzymasz tych 3MHz ??? - z braku właśnie chęci do kilkukrotnego przeczytania dokumentacji PDF'a od procka itp wynikają właśnie twoje błędy i to że ci nie działa tak prosty układ. Proponuję ci wziąć na prawdę notę PDF dla ATmega8 a przy okazji zerknąć na ostatnią stronę rozdziału UART z której dowiesz się przy jakich częstototliwościach taktowania procka - obojętnie czy kwarcem czy wewn oscylatorem - możesz uzyskać interesujące cię prędkości transmisji RS232)
  • Poziom 13  
    mirekk36:
    No zgadzam się z kolegą. Co do tych 3MHz to nie jestem w stanie podać linka choć bym bardzo chciał być możne takie słowa napisał ktoś kto tez się za bardzo nie orientuje w temacie. Oczywiście zajrzałem kilkukrotnie do noty Atmegi 8, no ale początki czasami bywają trudne a w dodatku angielski techniczny też robi swoje.

    Odczytałem sobie Fusebity i wygląda na to że mam uC ustawionego na wewnętrzny oscylator o częstotliwości 4MHz.

    Teraz już wiem o wiele więcej, masy muszą być połączone, kwestie taktowania myślę że też mam w jakimś stopniu za sobą ale i tak poświecę tej kwestii kiedyś więcej czasu (temat troszkę zszedł na bok o rozmowach na temat taktowania uC ale wiele się dowiedziałem dzięki temu)

    Jednak wersja konfiguracji UARTU pozostaje nadal nie rozwiązana, jak wskazać bascomowi gdzie ma wysyłać dane (samo $baud niestety nie wystarcza :) ?

    Dodano po 4 [godziny] 46 [minuty]:

    Heh, po dziesiątkach prób nareszcie się udało :D

    Błędy jakie popełniłem to:
    1. Brak połączenia masy sygnałowej
    2. Brak konfiguracji UARTU

    Wszystko ładnie działa komunikacja działa w obie strony bez problemu, jutro przetestuje układ przy wyższych prędkościach transmisji oczywiście przedtem podwyższę częstotliwość rezonatora RC, i skorzystam z tabelki określającej parametry transmisji.

    Oto kod jaki testowałem, może kiedyś komuś się przyda:
    Code:

    $crystal = 4000000
    $regfile = "m8def.dat"
    $baud = 1200

    Config Portd.1 = Output
    Config Portd.0 = Input

    Dim A As Byte
    Dim B As Byte

    Config Com1 = Dummy , Parity = None , Stopbits = 1 , Databits = 8
    Enable Interrupts
    Echo Off

    Input A
    B = A * A
    Wait 5
    Print B

    End


    Wiem ze to nie temat o programowaniu w bascomie ale do pełni szczęścia brakuje mi jeszcze jak się nie mylę obsługa przerwania z rs'a.
    Program w obecnej wersji działa tylko raz, gdy chce wykonać procedurę od początku trzeba zresetować uC.
    Chciałbym to zrobić w następujący sposób, że gdy wyślę coś z rs'a do uC to mikrokontroler wychwyci tą daną i automatycznie jakby zaktualizuje daną w programie i powtórzy obliczenie.
    Bardzo proszę o pomoc jeszcze w rozwiązaniu tego problemu, potem obiecuje pisać już mądrzejsze rzeczy ;)