Witam. Mecze sie juz jakis czas z oprogramowaniem UARTu w atmedze na przerwaniach. Napisalem takie cos:
______________________________________________________________ #define UART_TX_DATA_INT_ENABLE UCSRB = UCSRB | (1<<UDRIE) #define UART_TX_DATA_INT_DISABLE UCSRB = UCSRB & 223 #define UART_IN_BUFF_SIZE 10 #define UART_OUT_BUFF_SIZE 10 #define CRYSTAL 11059200 #define BAUDRATE 9600
void uartInit(unsigned long crystal, unsigned long baudrate) { unsigned char ubrr_value = 0; UCSRB = 0; cli(); ubrr_value = (((crystal/baudrate)/16)-1); UBRRH = (unsigned char) ((ubrr_value)>>8); UBRRL = (unsigned char) ubrr_value; UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0); UCSRB = (1<<RXEN)|(1<<TXEN); sei(); }
unsigned char uartSendCharacter(unsigned char character) { if(uart_out_filling != UART_OUT_BUFF_SIZE) { uart_out_buff[uart_out_wr_ptr] = character; uart_out_wr_ptr == (UART_OUT_BUFF_SIZE - 1) ? uart_out_wr_ptr = 0 : uart_out_wr_ptr++; uart_out_filling++; UART_TX_DATA_INT_ENABLE; return 0; } else return 1; }
SIGNAL(SIG_UART_DATA) { if(uart_out_filling) { UDR = uart_out_buff[uart_out_rd_ptr]; uart_out_rd_ptr == (UART_OUT_BUFF_SIZE - 1) ? uart_out_rd_ptr = 0 : uart_out_rd_ptr++; uart_out_filling--; } else { UART_TX_DATA_INT_DISABLE; } }
int main(void) //program główny { uartInit(CRYSTAL, BAUDRATE); uartSendCharacter(60); uartSendCharacter(61); uartSendCharacter(62); uartSendCharacter(63); uartSendCharacter(64); uartSendCharacter(65); while(1); } ______________________________________________________________
Ladnie sie kompiluje, ale nie dziala. W debugerze w AVRStudio widac ze w przerwaniach dwa kolejne znaki sa ladowane do UDR, potem jednak flaga UDRE przyjmuje wartosc 0 i koniec. Dalej nic juz nie wychodzi z bufora, a flaga nie zmienia stanu na 1 nie zglaszajac tym samym przerwania. Nie wiem co z ta flaga bo przeciez ona podobno jest ustawiana na 1 gdy sie oprozni bufor. Gdzie jest "byk" ? Na sprzecie rowniez nie dziala, nie pojawiaja sie nawet te dwa znaki ktore wedlug debugera sa ladowane do UDR.