Forum: Mikrocontroller und Digitale Elektronik Atmega644 Bootreset und Interrupt Handling


von Martin R. (martin_r49)


Lesenswert?

Ich versuche zur Zeit einen Bootloader für meinen Atmega644 zu 
schreiben.
Meine Fuses habe ich wie Folgt gesetzt:
Die Bootresetfuse auf 0
und die beiden Bootsize Fuses auch auf 0 also alle 3 Programmiert so das 
ich eine Bootsize von 4092 Words Benutze. Dem Entsprechend hab ich die 
Linkerflag -tText=0xE000 gesetzt.
Dabei bin ich aber auf ein Problem gestoßen irgendwie Funktioniert das 
Interrupthandling nicht so wie ich das gern Hätte. Gleich am Anfang 
meines Codes verschiebe ich die Interruptpointer mit:
1
cli();
2
MCUCR |= (1<<IVCE);
3
MCUCR |= (1<<IVSEL);
4
sei();
die Interrupts versuche ich dann wie folgt zu handeln
1
ISR (USART0_RX_vect)
2
{
3
  //RX data receive
4
  char c = UDR0;
5
  usart_write_byte(c);
6
}
Der Handler soll ein Char Empfangen und auch gleich zurück schicken.
Mein Problem besteht darin das der Handler anscheinend nicht ausgelöst 
wird. Wenn ich die Verschiebung der Pointer nicht mache und die 
Linker-Flag -tText=0xE000 nicht setze und auch die Bootreset Fuse nicht 
Programmiere. Also es wie ein normales Programm behandle funktioniert 
das auch alles, das heißt es liegt zumin nicht direkt an meinem Code der 
das ganze drum herum macht. Was könnte ich noch vergessen haben oder hab 
ich irgendwo einen totalen Denkfehler gemacht so das es so garnicht 
funktionieren kann.
Mit Freundlichen Grüßen Martin

von Thomas E. (thomase)


Lesenswert?

Martin Rolz schrieb:
> MCUCR |= (1<<IVCE);
> MCUCR |= (1<<IVSEL);

Das sind zwei Read-Modify-Write Operationen. Das dauert dem Controller 
zu lange, da das Ganze in 4 Takten abgehandelt werden muß.

So

char nTemp = MCUCR;
MCUCR = nTemp | (1 << IVCE);
MCUCR = nTemp | (1 << IVSEL);

funktioniert es.

Aber ein Bootloader macht nichts anderes, als Daten zu empfangen und 
diese auf die entsprechende Page zu brennen.
Interrupt-basierte Datenübertragung ist nur unnötiger Ballast.

Ist zwar cool, bringt aber keinen Vorteil.

Das Verbiegen der Interrupts kann man sich dann auch ersparen.


mfg.

von Martin R. (martin_r49)


Lesenswert?

Ah Danke für die Schnelle Antwort.
Ja das der Bootloader das Interrupthandling nicht unbedingt braucht hab 
ich schon bemerkt, der lief ja auch schon über die usart schnittstelle 
allerdings versuche ich ihn jetzt so zu erweitern das es möglich ist ihn 
über das Internet zu programmieren. Da brauch ich es das ich einmal das 
Programmieren machen kann aber auch wenn nötig über die usart 
Schmjittstelle IP usw einstellen kann.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.