Hallo Zusammen,
ich habe ein Problem mit dem UART von meinem ATmega32.
Sobald durch ein uart_putc() der Interrupt für UDR empty aktiviert wird hängt sich der gesammte AVR auf. Woran könnte das liegen? Im Terminal kommt nichts an und der Controller beginnt auch nicht zu blinken. Mein Code sieht momentan so aus.
Die zugehörigen IncludesCode:ISR(UART_TX_VECTOR) { if(uart_tx_read == uart_tx_write) { UART_STATUS_B &= ~(1 << 5); return; } UART_UDR = uart_tx_buffer[uart_tx_read]; uart_tx_read++; if(uart_tx_read >= UART_BUFFER_SIZE) { uart_tx_read = 0; } } void uart_init(long baud) { //Senden aktivieren UART_STATUS_B |= (1 << 3); //Empfang aktivieren UART_STATUS_B |= (1 << 4); //Baud setzen short UBRR = (F_CPU/(16*baud))-1; UART_BAUD_HIGH = UBRR >> 8; UART_BAUD_LOW = UBRR & 0xFF; UART_STATUS_C(); //Interrupts global aktivieren sei(); //Empfangsinterrupt aktivieren UART_STATUS_B |= (1 << 7); //Bufferzeiger setzen uart_tx_read = 0; uart_tx_write = 0; uart_rx_read = 0; uart_rx_write = 0; } unsigned char uart_putc(char c) { if(uart_tx_write + 1 == uart_tx_read || (uart_tx_read == 0 && uart_tx_write + 1 == UART_BUFFER_SIZE)) { return 1; } uart_tx_buffer[uart_tx_write] = c; uart_tx_write++; if(uart_tx_write >= UART_BUFFER_SIZE) { uart_tx_write = 0; } UART_STATUS_B |= 1 << 5; return 0; }
und die Main:Code://ATmega32 #if defined (__AVR_ATmega32__) #define UART_TX_VECTOR USART_UDRE_vect #define UART_RX_VECTOR USART_RXC_vect #define UART_UDR UDR #define UART_STATUS_B UCSRB #define UART_BAUD_HIGH UBRRH #define UART_BAUD_LOW UBRRL #define UART_STATUS_C() #endif
Code:#include <avr/io.h> #include <util/delay.h> #include "uart.h" int main(void) { uart_init(9600); uart_putc('a'); DDRC = 0x0F; while(1) { PORTC |= 0x0F; _delay_ms(500); PORTC &= ~(0x0F); _delay_ms(500); } return 0; }







Zitieren

Lesezeichen