loewe.xy
27.01.2013, 18:41
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.
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;
}
Die zugehörigen Includes
//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
und die Main:
#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;
}
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.
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;
}
Die zugehörigen Includes
//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
und die Main:
#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;
}