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

ATmega odbiór transmisji szeregowej (USART)

Crasher96 22 Lip 2010 15:23 3913 9
  • #1 22 Lip 2010 15:23
    Crasher96
    Poziom 10  

    Witam,

    Moja przejściówka USB - RS232 okazała się być jakimś chińskim szajsem więc nie mogę chwilowo sprawdzić poprawności kodu. Czy ktoś mógłby rzucić okiem i stwierdzić czy poniższy kod ma szansę funkcjonować? ATmega jedynie odbiera jeden bajt po RS'sie i w zależności od tego czy jest to 1 czy 0, ustawia cały port C w stan aktywny bądź niski.

    Mikrokontroler: ATmega32
    Przejściówka: USB-RS232 TTL

    Code:

    #include <stdio.h>
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/signal.h>
    #include <util/delay.h>


    volatile unsigned char bajt_odebrany = 0;           //odebrany bajt danych

    //przerwanie od USART - zakończono odbiór
    // USART, Rx Complete - _Vector(13)
    SIGNAL(SIG_UART_RECV)
    {
       bajt_odebrany = UDR;
       PORTA ^= _BV(PA0);   //sygnalizuj diodą
    }

    // inicjalizacja USART dla podanego BAUD
    void USART_Init(unsigned long int baud)
    {
       UBRRH = (unsigned char)((F_CPU/16UL/baud-1)>>8);
       UBRRL = (unsigned char)(F_CPU/16UL/baud-1);

       UCSRB |= _BV(RXCIE); //włączenie przerwania od odbiornika
       UCSRB |= _BV(RXEN);  //aktywacja odbiornika
       UCSRC |= _BV(URSEL)|_BV(UCSZ1)|_BV(UCSZ0); //transmisja 8 bitów i 1 bit stopu
    }

    //konfiguracja portów, timerów i USART
    void konfig(void)
    {
       DDRA = 0xFF;     //wszystko jako wyjścia
       PORTA = 0x00;    //stan niski

       DDRC = 0xFF;     //wszystko jako wyjścia
       PORTC = 0x00;    //stan niski

       //USART
       USART_Init(9600); //ustawienie prędkości transmisji

       sei(); //włącz globalne zezwolenie na przerwania
    }

    /////////////// PROGRAM GŁÓWNY //////////////////
    void main(void)
    {
       konfig();

       while(1)
       {
          if(bajt_odebrany == 1)
          {
             PORTC = 0xFF;
          }
          else
          {
             PORTC = 0x00;
          }
       }
    }


    Pozdrawiam ;)

    0 9
  • #2 22 Lip 2010 15:43
    rpal
    Poziom 27  

    Kolega niech sobie sciągnie coś takiego "CodeVisionAVR Evaluation V2.04.6" masz tam kreatora który za ciebie wygeneruje obsługę RS-232 i tym sposobem się upewnisz co jest nie tak. Generowany kod w 100% pewny. Wydaje mi się że źle inicjujesz parametry transmisji. Poza tym nie piszesz co to za atmega kiedyś zauważyłem że z tymi przejściówkami jest pewien problem (jaka to przejściówka w ogóle ) USB-RS232 TTL czy USB-RS232 w logice 12V ) że o ile dobrze pamietam pin Txd musi mieć na starcie logiczne 1 bo inaczej cała transmisja się wali. A w ogóle to nie jest tak że na atmega dajesz sygnał o poziomie 12 V ? Bez względu na kraj pochodzenia to one zwykle działają a tak w ogóle to w zasadzie wszystko jest z Chin, niedługo zaczną z tamtąd sprowadzać wódkę Wyborową :)

    0
  • #3 22 Lip 2010 17:06
    Crasher96
    Poziom 10  

    Hmm...faktycznie zapomnialem o tych informacjach i już zauktualizowałem post. Co do tej wersji Evaluation, to z tego co tak na szybko zauważyłem, nie chce wygenerować kodu do przerwania i zachęca do zakupu komercyjnej wersji. Pozostała inicjalizacja USARTA jest taka sama. Więc sprawa rozchodzi się tylko o przerwanie od odbiornika i jedną linijkę kodu w tym przerwaniu :D

    0
  • #4 22 Lip 2010 18:19
    rpal
    Poziom 27  

    nie wiem skąd czerpiesz te informacje bo ja moge generować pełny kod a jedynym ograniczeniem jest jego wielkość. Podaj typ procka to zrobię to za ciebie. Bo nie chc mi się w avrstudio robić tego od początku, prędkość transmisji także jak i szybkość kwarca. POtem po drobnej korekcie wepchniesz to w avrstudio.

    0
  • #5 22 Lip 2010 18:37
    Crasher96
    Poziom 10  

    Będę wdzięczny :)

    procek: ATmega32
    kwarc: 16MHz
    prędkość: 9600

    +przerwanie od odbiornika


    hmm...być może coś przeoczyłem...rzucił mi się w oczy jakiś wizzard...i tam coś poklikałem....przyjrzę się dokładniej temu programowi

    0
  • #6 22 Lip 2010 18:44
    rpal
    Poziom 27  

    Słuchaj kolego istotnie miałeś rację bo codevision nie generuje kodu przy gdy używasz przerwań od UART-a, ale nie ma problemu. Wytrzymaj do jutra wieczora to wygeneruję tobie kod w pełnej wersji. Niestety nie mam jej na komputerzez z którego piszę. Jednak zawsze możesz kod wygenerować i zaprogramować procka bez użycia przerwań. Niestety musisz go zaprogramować albo z Codevision (STK200) albo uruchomić AVRStudio i w trybie debugowania używać Jtag-a. Obsługa RS232 bez przerwań się poprawnie kompiluje ale używa bibliotecznych funkcji Codevision. Sam sobie możesz w każdym razie pomóc.

    0
  • #7 22 Lip 2010 19:02
    Crasher96
    Poziom 10  

    z zaprogramowaniem procka nie ma problemu :D ...chcialem się upewnić czy taki system odbierania danych z RS'a jest poprawny bo w takim przypadku wina braku transmisji będzie leżeć albo po stronie programu wysyłającego albo przejściówki....i tak metodą eliminacji...po sznurku do kłębka :D W każdym bądź razie dzięki i czekam do jutra ;)

    0
  • #8 22 Lip 2010 19:06
    rpal
    Poziom 27  

    zewrzyj na swojej chińszczyźnie Rxd i Txd jak masz echo w terminalu znaczy że przejściówka jest dobra. Masz w ogóle poprawny poziom napięć między przejściówką i atmelem ? Nie jest to przypadkiem jakiś kabelek DKU-5 od noki ?

    0
  • #9 23 Lip 2010 07:49
    _Robak_
    Poziom 33  

    Zwarcie końcówek w tych przejściówkach i odebranie echa może być ostatnią oznaką życią tego produktu. Lepiej użyj rezystora z 1K, wtedy nie powinno się nic stać.

    0
  • #10 23 Lip 2010 10:26
    tajwoj
    Poziom 23  

    Zanim zaczniesz rozbierać przejściówkę zauważ, że kod znaku "1" w ASCII ma wartość 0x31 szesnastkowo lub 49 dziesiętnie.
    Wikipedia ASCII
    Po odebraniu jedynki zawartość UDR jest 0x31 (49).
    Jeśli zmienisz

    Code:
    if(bajt_odebrany == 0)

    na
    Code:
    if(bajt_odebrany == 49)

    powinno działać zgodnie z Twoimi oczekiwaniami.

    Do sprawdzenia wielu rzeczy bez budowania układu może być przydatny program VMLAB

    Pozdrawiam

    -- Dopisane --

    Powyższa uwaga dotyczy sytuacji jeśli do sprawdzenia wysyłasz znaki w kodzie ASCII.
    Ponadto w kodzie masz
    Code:
    USART_Init(4800); //ustawienie prędkości transmisji

    a piszesz, że chciałbyś 9600.
    Jesli potrzebujesz pobawić się "wizzardami" zobacz AtmanAVR, możesz próbowac bezpłatnie przez 30 dni.

    0