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

ATmega odbiór transmisji szeregowej (USART)

Crasher96 22 Lip 2010 15:23 4228 9
REKLAMA
  • #1 8318800
    Crasher96
    Poziom 11  
    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

    
    #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 ;)
  • REKLAMA
  • #2 8318872
    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ą :)
  • REKLAMA
  • #3 8319090
    Crasher96
    Poziom 11  
    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
  • #4 8319315
    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.
  • REKLAMA
  • #5 8319376
    Crasher96
    Poziom 11  
    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
  • REKLAMA
  • #6 8319396
    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.
  • #7 8319453
    Crasher96
    Poziom 11  
    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 ;)
  • #8 8319465
    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 ?
  • #9 8320874
    _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ć.
  • #10 8321251
    tajwoj
    Poziom 25  
    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
    if(bajt_odebrany == 0)

    na
    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
    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.
REKLAMA