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 8 Usart Serwo. Nic nie jest odbierane przez UART.

davidpi 01 Mar 2011 11:05 1619 2
REKLAMA
  • #1 9219821
    davidpi
    Poziom 10  
    Witam.
    Napisałem sterownik do serwa modelarskiego na Atmega 8. Teraz próbuje skomunikować ten sterownik z druga Atmegą 8, aby przesyłać pozycje zerwa z drugiej Atmegi do sterownika. Jednak napotkałem pewne kłopoty.
    Oto program do drugiej Atmegi:
    
    #include<avr/io.h>
    #include<util/delay.h>
    #include<uart.c>
    
    unsigned char dana=100;
    int i=0;
    
    void USART_Init()     
    {
       UBRRH = 0x00;   
       UBRRL = 6;                          //REJESTRY USTAWIAJĄCE PRĘDKOŚĆ TRANSMISJI (9600)
       UCSRB = _BV(TXEN);                              //WL MODULU NADAWCZEGO     
       UCSRC = _BV(URSEL) | _BV(UCSZ0) | _BV(UCSZ1);   //Słowo 8 bitów, jeden bit stopu
    } 
    
    void Zwieksz()
    {
        if((bit_is_clear(PINC,0)) && (dana < 240)) dana++;
    }
    
    void Zmniejsz()
    {
        if((bit_is_clear(PINC,1)) && (dana > 60)) dana--;
    }
    
    int main()
    {
        USART_Init();
        DDRC=0x00;
    	PORTC=0xFF;
        _delay_ms(3000);
    
        
    
    	while(1)
    	{
    	    Zwieksz();
    		Zmniejsz();
    		UART_Wyslij(dana);
    		_delay_ms(100);
    
    	}
    }
    


    Ten program działa dobrze, jak i sam Uart. Sprawdzałem i dana jest wysyłąna.
    Oto program sterownika:
    
    #include<avr/io.h>
    #include<avr/interrupt.h>
    #include<uart.c>
    #include<HD44780.c>
    #include<stdlib.h>
    
    //-------- Sterownik 1 serw ---------
    
    int Pwm=1500;
    char buf[5];
    int Skok = 10;
    
    void USART_Init()     
    {
       UBRRH = 0;   
       UBRRL = 6;                                      //REJESTRY USTAWIAJĄCE PRĘDKOŚĆ TRANSMISJI (9600)
       UCSRB = _BV(RXEN);                              //WL MODULU ODBIORCZEGO 
       UCSRC = _BV(URSEL) | _BV(UCSZ0) | _BV(UCSZ1);   //Słowo 8 bitów, jeden bit stopu   
    }
    
    void Port_Init()
    {
    	DDRB = 0xFF;                                   //LCD
    	DDRC = 0xFF;                                   //Serwo
    }
    
    void Timer1_Init()
    {
        TCCR1B |= ((1<<WGM12) | (1<<CS10));             //Timer 1 w trybie CTC bez preskalera
    }
    
    void Timer2_Init()
    {
        TCCR2 |= ((1<<WGM21) | (1<<CS20) | (1<<CS22));  //Timer 2 w trybie CTC z preskalerem przez 64
        TIMSK |= (1<<OCIE2);                            //Zezwolenie na przerwanie od Timer 2
        OCR2 = 156;                                      //odliczanie 20 ms
    }
    
    void Timer1()
    {
    	TCNT1 = 0x00;
    	TIFR |= (0<<OCF1A);
    	OCR1A = Pwm;
    	PORTC = 0xFF;
        while (bit_is_clear (TIFR, OCF1A))
        {
        }
        PORTC = 0x00;
    }
    
    int main()
    {
        LCD_Initalize();
    	LCD_Clear();
        Port_Init();
    	Timer1_Init();
    	Timer2_Init();
    
    	sei();
        
        while (1)
    	{
    	    while(bit_is_clear(UCSRA, RXC))
    		{}
    	    Pwm=UART_Odbierz()*10;
    	    itoa(Pwm,buf,10);
    	    LCD_Clear();
    		LCD_WriteText(buf);
    		_delay_ms(2);
    	}
    }
    
    ISR (TIMER2_COMP_vect)
    {
        Timer1();
    } 
    


    Sam sterownik działa dobrze, tzn. sygnał do serwa jest dobrze generowany, serwo ustawia się w pozycji środkowej i trzyma. jednak nic nie jest odbierane przez Uart.
    Czy ktoś z Was mógłby rzucić okiem na ten program. Może uda Wam się zauważyc błąd.
    Pozdrawiam i z góry dziękuje za pomoc
  • REKLAMA
  • #2 9219877
    mgyz
    Poziom 14  
    To pokaż jeszcze jak połączyłeś te mikrokontrolery. Masz połączenie skrosowane tj: RxD --> TxD oraz TxD --> RxD.
    Pokaz funkcje UART_Wyslij i UART_Odbierz.
  • #3 9219900
    davidpi
    Poziom 10  
    Tak. Połączenie ma skrosowane. Dodam tylko że funkcje wyslij i odbierz działaja dobrze. Testowałem to programem który tylko odbierał daną, wpisywał ją do Pwm i wyświetlał i wszystko dobrze chodziło. A po połączeniu ze sterownikiem serwa już nic nie odbiera.
    Oto funkcje:
    
    void UART_Wyslij(unsigned char dana)
    {
    	while (!(UCSRA&(1<<UDRE)))	{};           // czekaj az sie zwolni bufor
    	UDR=dana;                                 // i wysyłaj
    }
    
    //-------------------   Odbieranie danych   ---------------------------------------------------------------
    
    unsigned char UART_Odbierz(void)
    {
    	unsigned char d;
    	while ((UCSRA & (1 << RXC)) == 0) {};  // czekaj tak długo, aż pojawi się coś w buforze
    	d = UDR;                               // odbierz to
    	return(d);                             // zwroć wychodząc z funkcji
    }
    


    Dodano po 31 [minuty]:

    Witam ponownie.
    Znalazłem błąd. Aż wstyd się przyznać ale zapomniałem wywołać w main()funkcji USART_Init().
    Więc nie miało prawa odbierać nic przez Uart.
REKLAMA