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:
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);
}
}
