Atmega644 Bootreset und Interrupt Handling

OP #2299950
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
#2300003
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.
OP #2300036
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren