Hallo, ich habe scheinbar falsch angefangen zu fragen und da ich den von mir erstellten thread nicht löschen kann hier nochmal ein neuanfang mit dem gleichen Problem nur nen andren (einfacheren Code), um vielleicht mal eine Lösung zu finden. Das Projekt habe ich als .rar vor AVR-Studio 5 angehängt um es selbst simulieren zu können. (Code ist von http://www.mikrocontroller.net/articles/AVR_Bootloader_in_C_-_eine_einfache_Anleitung#Schritt_1_-_Erstellen_des_Projektes) genutzt wird der Mega644A @ 16Mhz Folgendes Problem: Wenn ich den Code einfach so kompiliere und brenne gibt der µC über UART Text aus und nimmt auch Befehle an. Wenn ich nun aber versuche die Interrupts umzuleiten "-Ttext=7000" für maximale Größe Bootgröße und BOOTRST aktiviert, funktioniert nix mehr. Dies passiert auch, wenn ich nur die Optimierung auf "-O1" stelle, ohne das umleiten mit -Ttext. Woran mag das liegen?
1 | /*
|
2 | * Bootlader_644.c
|
3 | *
|
4 | * Created: 02.08.2011 11:36:54
|
5 | * Author: iwi
|
6 | */
|
7 | |
8 | #define F_CPU 16000000UL
|
9 | |
10 | |
11 | #include <avr/io.h> |
12 | #include <avr/interrupt.h> |
13 | #include <util/delay.h> |
14 | #include "uart.h" |
15 | #include <avr/boot.h> |
16 | |
17 | #define BOOT_UART_BAUD_RATE 9600 /* Baudrate */ |
18 | #define XON 17 /* XON Zeichen */ |
19 | #define XOFF 19 /* XOFF Zeichen */ |
20 | |
21 | |
22 | |
23 | int main() |
24 | {
|
25 | unsigned int c=0; /* Empfangenes Zeichen + Statuscode */ |
26 | unsigned char temp, /* Variable */ |
27 | flag=1, /* Flag zum steuern der Endlosschleife */ |
28 | p_mode=0; /* Flag zum steuern des Programmiermodus */ |
29 | |
30 | void (*start)( void ) = 0x0000; /* Funktionspointer auf 0x0000 */ |
31 | |
32 | /* Interrupt Vektoren verbiegen */
|
33 | char sregtemp = SREG; |
34 | cli(); |
35 | temp = MCUCR; |
36 | MCUCR = temp | (1<<IVCE); |
37 | MCUCR = temp | (1<<IVSEL); |
38 | SREG = sregtemp; |
39 | |
40 | /* Einstellen der Baudrate und aktivieren der Interrupts */
|
41 | uart_init( UART_BAUD_SELECT(BOOT_UART_BAUD_RATE,F_CPU) ); |
42 | sei(); |
43 | |
44 | uart_puts("Bootloader"); |
45 | _delay_ms(1000); |
46 | |
47 | do
|
48 | {
|
49 | c = uart_getc(); |
50 | if( !(c & UART_NO_DATA) ) |
51 | {
|
52 | switch((unsigned char)c) |
53 | {
|
54 | case 'q': |
55 | flag=0; |
56 | uart_puts("Verlasse den Bootloader!\n\r"); |
57 | break; |
58 | default:
|
59 | uart_puts("Du hast folgendes Zeichen gesendet: "); |
60 | uart_putc((unsigned char)c); |
61 | uart_puts("\n\r"); |
62 | break; |
63 | }
|
64 | }
|
65 | }
|
66 | while(flag); |
67 | |
68 | uart_puts("Springe zur Adresse 0x0000!\n\r"); |
69 | _delay_ms(1000); |
70 | |
71 | /* vor Rücksprung eventuell benutzte Hardware deaktivieren
|
72 | und Interrupts global deaktivieren, da kein "echter" Reset erfolgt */
|
73 | |
74 | /* Interrupt Vektoren wieder gerade biegen */
|
75 | cli(); |
76 | temp = MCUCR; |
77 | MCUCR = temp | (1<<IVCE); |
78 | MCUCR = temp & ~(1<<IVSEL); |
79 | |
80 | /* Rücksprung zur Adresse 0x0000 */
|
81 | start(); |
82 | return 0; |
83 | }
|