PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATmega32 UART Problem



loewe.xy
27.01.2013, 17: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;
}

Hubert.G
27.01.2013, 21:15
Hier sollte es doch anstelle von :

#define UART_TX_VECTOR USART_UDRE_vect
so heißen:
#define UART_TX_VECTOR USART_TXC_vect

loewe.xy
27.01.2013, 21:23
Ändert nichts an meinem Problem. Aber eigentlich soll auch das UDR nachgefüllt werden sobald es leer ist und nicht erst wenn er fertig gesendet hat. Der name für das Define ist da etwas unglücklich gewählt.

Gruß Lukas

Hubert.G
27.01.2013, 21:56
Es ist etwas spät und mühsam herauszusuchen wie das Bit heist (1<<5). Es ist sicher nicht mehr Aufwand den Namen hinzuschreiben.
Geh deinen Ablauf durch und lass schrittweise eine Led aufleuchten dann weisst du wo du zum Stehen kommst.