chrisavr1981
12.01.2014, 12:34
Hallo zusammen,
ich stehe völlig auf dem Schlauch, ich sitze hier mit einem Atmega 8 und versuche nur die über UART übergebenen Zeichen wieder auszugeben.
Doch leider gelingt mir nur das Empfangen von Zeichen vom µC -> PC, aber nicht das Empfangen vom PC -> µC.
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define F_CPU 7372800UL
#define BAUD 9600
#define UBRR_VAL F_CPU/16/BAUD-1
volatile unsigned char receive_char;
ISR(USART_RXC_vect)
{
receive_char = UDR;
UDR = receive_char;
PORTB &=~ (1<<PB1);
_delay_ms(300);
}
void init_uart(unsigned int ubrr)
{
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)(ubrr);
UCSRA = (1 << RXC) | (1 << TXC);
UCSRB = (1 << RXEN) | (1 << TXEN) | (1<<RXCIE);
UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);
}
void send_char(unsigned char data)
{
while (!(UCSRA & (1<<UDRE)));
UDR = data;
}
void send_string(char *data)
{
while (*data)
{
send_char(*data);
data++;
}
}
int main(void)
{
DDRB |= (1<<PB1);
init_uart(UBRR_VAL);
send_string("TESTING");
sei();
PORTB |= (1<<PB1);
_delay_ms(500);
PORTB &=~ (1<<PB1);
while (1)
{
}
return 0;
}
Es sieht so aus, als würde die ISR RXC Interruptfunktion nie aufgerufen werden.
Ich weiß, dass man keine _delay Funktion in eine Interruptfunktion einbaut, aber ich suche schon sehr lange nach dem Fehler und bekomme diesen nicht raus.
Damit ich sehe, dass das Script auf diesem µC überhaupt bis zur while Schleife läuft, lasse ich schon einmal einen Text auf UART ausgeben, den sehe ich auch schon im Terminal, und auch die LED leuchtet einmal kurz vor sich hin.
Interessant ist auch, dass die LEDs am FTDI 232 auch bei der Eingabe auf der Tastatur kurz aufleuchten.
Der µC ist tatsächlich mit einem externen Quarz 7,3728 versehen und wie folgt habe ich die Fuse Bits gesetzt: -U lfuse:w:0xdf:m -U hfuse:w:0xd9:m.
Wie Ihr jetzt auch sehen könnt, nutze ich avrdude auf einem Linux und mein Terminalfenster ist Minicom.
Was mache ich falsch, ich denke mal ich sehe den Wald vor lauter Bäumen nicht.
Entschuldigt die Dumme Frage nach UART.
Vielen Dank!
ich stehe völlig auf dem Schlauch, ich sitze hier mit einem Atmega 8 und versuche nur die über UART übergebenen Zeichen wieder auszugeben.
Doch leider gelingt mir nur das Empfangen von Zeichen vom µC -> PC, aber nicht das Empfangen vom PC -> µC.
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define F_CPU 7372800UL
#define BAUD 9600
#define UBRR_VAL F_CPU/16/BAUD-1
volatile unsigned char receive_char;
ISR(USART_RXC_vect)
{
receive_char = UDR;
UDR = receive_char;
PORTB &=~ (1<<PB1);
_delay_ms(300);
}
void init_uart(unsigned int ubrr)
{
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)(ubrr);
UCSRA = (1 << RXC) | (1 << TXC);
UCSRB = (1 << RXEN) | (1 << TXEN) | (1<<RXCIE);
UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);
}
void send_char(unsigned char data)
{
while (!(UCSRA & (1<<UDRE)));
UDR = data;
}
void send_string(char *data)
{
while (*data)
{
send_char(*data);
data++;
}
}
int main(void)
{
DDRB |= (1<<PB1);
init_uart(UBRR_VAL);
send_string("TESTING");
sei();
PORTB |= (1<<PB1);
_delay_ms(500);
PORTB &=~ (1<<PB1);
while (1)
{
}
return 0;
}
Es sieht so aus, als würde die ISR RXC Interruptfunktion nie aufgerufen werden.
Ich weiß, dass man keine _delay Funktion in eine Interruptfunktion einbaut, aber ich suche schon sehr lange nach dem Fehler und bekomme diesen nicht raus.
Damit ich sehe, dass das Script auf diesem µC überhaupt bis zur while Schleife läuft, lasse ich schon einmal einen Text auf UART ausgeben, den sehe ich auch schon im Terminal, und auch die LED leuchtet einmal kurz vor sich hin.
Interessant ist auch, dass die LEDs am FTDI 232 auch bei der Eingabe auf der Tastatur kurz aufleuchten.
Der µC ist tatsächlich mit einem externen Quarz 7,3728 versehen und wie folgt habe ich die Fuse Bits gesetzt: -U lfuse:w:0xdf:m -U hfuse:w:0xd9:m.
Wie Ihr jetzt auch sehen könnt, nutze ich avrdude auf einem Linux und mein Terminalfenster ist Minicom.
Was mache ich falsch, ich denke mal ich sehe den Wald vor lauter Bäumen nicht.
Entschuldigt die Dumme Frage nach UART.
Vielen Dank!