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

[ATmega128][C] Symulacja przerwań USART w AVR Studio

KonusiK 05 Wrz 2008 19:07 1518 0
  • #1 5509100
    KonusiK
    Poziom 12  
    Witam, zaczynam (najwyższy czas) bawić sie AVRami i postanowiłem napisać prosty program do wysyłania tekstu przez USARTa. Napisałem własne, krótkie obsługi przerwań bez używania obstukanego loop_until... który blokuje prace uC do czasu wysłania znaku.

    Jednak w czasie symulacji pojawił sie problem - tzn wrzuciłem breakpoint'a na obsługe przerwania ISR (UDRE_vector) ale przy załączenia symulatora nigdy nie zatrzymal sie w tym punkcie...nie wiem dlaczego.

    I druga sprawa, podczas kompilacji wyskakują mi warning'i, typu:
    "../Sending_LED.c:37: warning: passing argument 1 of 'vSetBit' discards qualifiers from pointer target type"
    zawsze gdy jest używana jedna z funkcji z dyrektywą inline, które napisałem. Czy jest możliwość to obskoczyć by nie kompilator sie nie pluł?


    Byłbym wdzięczny za pomoc.
    Oto kod:

    
    
    #include <avr/io.h>
    #include <avr\interrupt.h> 
    #define F_CPU 8000000
    #include <util/delay.h>
    
    #define BOUD 9600
    #define NULL 0x00
    
    /****************************************************/
    
    //Globals:
    unsigned char *PointerForString2BSent = 0;
    unsigned char acText2Send[] = "abcde";
    
    /****************************************************/
    // inline functions insted of DEFINES:
    void inline vSetBit (unsigned char *RegAdress,unsigned char Bit) {
    	*RegAdress |= (1<<Bit); 
    }
    
    void inline vToggleBit (unsigned char *RegAdress,unsigned char Bit) {
    	*RegAdress ^= (1<<Bit); 
    }
    
    void inline vClearBit (unsigned char *RegAdress,unsigned char Bit) {
    	*RegAdress &= ~(1<<Bit); 
    }
    
    
    /****************************************************/
    
    // initialisation functions:
    void vUSART_Init(unsigned int BoudRate){
    	UBRR0H = BoudRate >> 8;
    	UBRR0L = BoudRate;
    
    	vSetBit (&UCSR0B, RXEN);
    	vSetBit (&UCSR0B, TXEN);
    	UCSR0C |= (1<<UMSEL0)|(1<<USBS0)|(1<<UCSZ0);
    }
    
    void vPort_Init(){
    	DDRA = 0xFF;
    	vSetBit(&PORTA, PA0);
    }
    /***************************************************/
    
    //interrupt vectors:
    
    ISR (USART0_TX_vect){
    
    }
    
    ISR(USART0_UDRE_vect){
    	UDR0 = *(++PointerForString2BSent);
    }
    
    /***************************************************/
    
    //functions:
    void vSendString(unsigned char *PointerForString2BSent){
    	UDR0 = *PointerForString2BSent;
    	vSetBit (&UCSR0B, UDRIE);
    	vSetBit (&UCSR0B, TXCIE);
    }
    
    void delay_ms(unsigned int miliseconds){
    	unsigned char ucDelayCounter;
    	for (ucDelayCounter = 0; ucDelayCounter < miliseconds; ucDelayCounter++){
    		_delay_ms (999);
    	}
    }
    
    /**************************************************/
    
    int main() {
    	
    	vPort_Init();
    	vUSART_Init(9600);
    	sei();
    
    	//PointerForStringTab = &Text2Send[];
    	vSendString (&acText2Send);
    
    	while(1){
    	vToggleBit(&PORTA, PA0);
    	delay_ms(1000);
    	}
    }
    
REKLAMA