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

AVR Studio 4.18 + USART - zatrzymuje sie w pętli

Kubbaz 03 Lut 2011 12:23 879 0
REKLAMA
  • #1 9096513
    Kubbaz
    Poziom 26  
    Cześć!

    Napisałem fragment kodu C wysyłający w kółko "A". Odpalam go w AVR Studio i podglądam wyniki w Terminalu HAPSIM 2.17. Problem polega na tym, że po dwóch wykonaniach pętli głównej program utyka w funkcji wysyłającej dane po USARTcie.

    Co jest nie tak?

    #include <avr/io.h> 
    #include <avr/iom8.h>
    
    // definicje zmiennych
    
    unsigned char delay   = 0;
    unsigned char cycle   = 0;
    unsigned char counter = 0;
    
    // prototypy funkcji
    
    void wait (unsigned char x);
    void USART_Init (unsigned int ubrr);
    void USART_Transmit(unsigned char data);
    
    // pętla główna programu
    
    int main(void)
    {
    
    	USART_Init (0x19); // UBRR=25 => 9600 kbps
    
    	for (;;)
    	{
    		wait (100);
    		USART_Transmit ('A');
    	}
    
    return (0);
    }
    
    // funkcje 
    
    //********************************************************
    void wait (unsigned char cycle)
    {
    	for (counter = 0; counter > delay; counter++)
    	{
    		asm("nop");
    		asm("nop");
    		asm("nop");
    		asm("nop");
    		asm("nop");
    		asm("nop");
    		asm("nop");
    		asm("nop");
    		asm("nop");
    		asm("nop");
    	}
    
    }
    
    //********************************************************
    void USART_Init(unsigned int ubrr)
    {
    	UBRRH = (unsigned char)(ubrr>>8);
    	UBRRL = (unsigned char)ubrr;
    
    	UCSRB = (1<<RXEN)|(1<<TXEN);
    	UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0); // 8 bits frame, 2 stop bit 
    }
    
    //********************************************************
    void USART_Transmit(unsigned char data)
    {
    	while (!(UCSRA & (1<<UDRE)));
    	UDR = data;
    }
  • REKLAMA
REKLAMA