messier
14.04.2009, 15:40
Hallo,
jetzt probier ich schon seit einigen Stunden Daten mittels dem
USART0_RX_vect Interrupt zu empfangen, aber aus irgendeinen Grund wird
die ISR anscheinend nie aufgerufen.
Daten Senden mittels USART0_UDRE_vect funktioniert ohne Probleme. Daten
empfangen mittel Polling ebenfalls.
Hier mal der vereinfachte Code der nur überprüft ob die ISR aufgerufen
wird.
Wenn ja, dann sollten sich 4 LEDs die am PortC hängen einschalten. Nach
spätestens 4 sek sollen sich die LEDs aber auf jedenfall einschalten.
Und da passiert jetzt was seltsames: Wenn ich im Hyperterminal nichts
eingebe werden die LEDs nach 4 sekunden eingeschalten, aber wenn ich
Daten sende, dann scheint das Programm abzustürzen, weil dann garnichts
mehr passiert.
...
void uart_init()
{
uint8_t sreg = SREG;
UBRR0H = UBRR_VAL >> 8;
UBRR0L = UBRR_VAL & 0xFF;
// Interrupts kurz deaktivieren
cli();
// UART Receiver und Transmitter anschalten, Receive Interrupt setzen
// Data mode 8N1, asynchron
UCSR0B = (1<<RXEN0) | (1<<TXEN0) | (1<<RXCIE0);
UCSR0C = (1<<UCSZ1) | (1<<UCSZ0);
// Flush Receive-Buffer (entfernen evtl. vorhandener ungültiger Werte)
do
{
// UDR auslesen (Wert wird nicht verwendet)
UDR0;
}
while (UCSR0A & (1 << RXC0));
// Rücksetzen von Receive und Transmit Complete-Flags
UCSR0A = (1 << RXC0) | (1 << TXC0);
// Global Interrupt-Flag wieder herstellen
SREG = sreg;
}
ISR(USART0_RX_vect)
{
uint8_t sreg = SREG;
cli();
// LEDS einschalten
DDRC = 0xFF;
PORTC = 0b11110000;
UDR0;
SREG = sreg;
}
int main (void)
{
sei();
uart_init();
// Nach 4 Sekunden sollen die LEDs auf jedenfall eingeschalten werden
for(int i = 0; i< 4000; i++)
_delay_ms(1);
DDRC = 0xFF;
PORTC = 0b11110000;
while(1);
return 0;
}
Sieht hier jemand einen Fehler? Kann das irgendwie mit dem AT103
Kompatibilitätsmodus zusammenhängen? Oder liegts vielleicht sogar am
Bootloader (es handelt sich dabei um den Conrad Bootloader der auf der C-Control Pro arbeitet)?.
Danke schon mal im vorraus,
Thomas
jetzt probier ich schon seit einigen Stunden Daten mittels dem
USART0_RX_vect Interrupt zu empfangen, aber aus irgendeinen Grund wird
die ISR anscheinend nie aufgerufen.
Daten Senden mittels USART0_UDRE_vect funktioniert ohne Probleme. Daten
empfangen mittel Polling ebenfalls.
Hier mal der vereinfachte Code der nur überprüft ob die ISR aufgerufen
wird.
Wenn ja, dann sollten sich 4 LEDs die am PortC hängen einschalten. Nach
spätestens 4 sek sollen sich die LEDs aber auf jedenfall einschalten.
Und da passiert jetzt was seltsames: Wenn ich im Hyperterminal nichts
eingebe werden die LEDs nach 4 sekunden eingeschalten, aber wenn ich
Daten sende, dann scheint das Programm abzustürzen, weil dann garnichts
mehr passiert.
...
void uart_init()
{
uint8_t sreg = SREG;
UBRR0H = UBRR_VAL >> 8;
UBRR0L = UBRR_VAL & 0xFF;
// Interrupts kurz deaktivieren
cli();
// UART Receiver und Transmitter anschalten, Receive Interrupt setzen
// Data mode 8N1, asynchron
UCSR0B = (1<<RXEN0) | (1<<TXEN0) | (1<<RXCIE0);
UCSR0C = (1<<UCSZ1) | (1<<UCSZ0);
// Flush Receive-Buffer (entfernen evtl. vorhandener ungültiger Werte)
do
{
// UDR auslesen (Wert wird nicht verwendet)
UDR0;
}
while (UCSR0A & (1 << RXC0));
// Rücksetzen von Receive und Transmit Complete-Flags
UCSR0A = (1 << RXC0) | (1 << TXC0);
// Global Interrupt-Flag wieder herstellen
SREG = sreg;
}
ISR(USART0_RX_vect)
{
uint8_t sreg = SREG;
cli();
// LEDS einschalten
DDRC = 0xFF;
PORTC = 0b11110000;
UDR0;
SREG = sreg;
}
int main (void)
{
sei();
uart_init();
// Nach 4 Sekunden sollen die LEDs auf jedenfall eingeschalten werden
for(int i = 0; i< 4000; i++)
_delay_ms(1);
DDRC = 0xFF;
PORTC = 0b11110000;
while(1);
return 0;
}
Sieht hier jemand einen Fehler? Kann das irgendwie mit dem AT103
Kompatibilitätsmodus zusammenhängen? Oder liegts vielleicht sogar am
Bootloader (es handelt sich dabei um den Conrad Bootloader der auf der C-Control Pro arbeitet)?.
Danke schon mal im vorraus,
Thomas