-
uart tx führt zu reset
Hi,
ich habe ein seltsames Problem:
Ich habe einen mega32 mit angeschlossenem max232. Sende ich ein Zeichen, oder eine Zeichenkette, started das Programm des µC neu. (glaube ich zumindest).
Ablauf:
void main(void):
- Setzte LED als an
- Warte (while(1); )
uart_rxc interrupt:
- wenn empfangenes Zeichen = a => Setze LED als aus
- wenn empfangenes Zeichen = b => Sende '-' zurück.
Ergebnis:
Starten (LED ist an), 'a' senden (LED ist aus), 'b' senden (LED geht wieder an)
Mein Code (relevante teile, led() schaltet nur die LED an/aus):
Code:
int main(void)
{
led_init();
uart_init();
sei();
led(led2, 1);
while(1)
{
}
}
ISR(USART_RXC_vect)
{
uint8_t c;
c = uart_receive();
if (c == 'a') led(led2, 0);
if (c == 's') uart_putc('-');
}
void uart_putc(uint8_t data)
{
while (!(UCSRA & (1<<UDRE)));
UDR = data;
}
void uart_puts(uint8_t *data)
{
while (*data)
{
while (!(UCSRA & (1<<UDRE)));
UDR = *data;
data++;
}
}
Interessanter weise schickt er den gesamten string bei uart_puts. Die LED geht trotzdem an. Ich weiß nicht mehr weiter und hoffe, ihr könnt mir helfen.
Gruß, CowZ
-
Einen beträchtlicher Teil deines Codes versteckst du woanders...
Ein RESET wird zB dann ausgelöst, wenn eine nicht-implementierte IRQ getriggert wird.
-
vom code fehlt einiges ja, aber ich dachte, das wäre das wichtigste..
muss ich alle aktivierten interrupts auch als IRQ-Routine haben?
Wenn ja, kann es daran liegen, dass ich keine TXC routine habe. Werde ich heut nachmittag mal testen.
Gruß, CowZ
-
Wenn eine IRQ getriggert wird, für die keine ISR implementiert ist, dann wird von avr-gcc Code erzeugt, der dann zum RESET-Punkt springt. Das Programm läuft dann also von vorne los, allerdings ohne die Hardware neu zu initialisieren wie bei einem richtigen RESET.
-
Hi,
ok, danke für die Erklärung, hoffe das Problem löst sich so.
Wenn nicht, melde ich mich nochmal. Vielen Dank schonmal :)
edit: grad getestet, läuft wunderbar :D vielen dank :)
Gruß, CowZ