Hallo zusammen,
ich versuche gerade einen Bootloader auf dem ATMega88 zu implementieren.
Ich benutze die Version 4.13 + Service Pack des AVR Studios, WINAVR
sowie ein STK500 und einen JTAGICEmkII.
Nun habe ich folgenden Code der Daten zum Test ins Flash schreiben soll:
1 | #include <avr/io.h>
|
2 | #include <avr/boot.h>
|
3 | #include <avr/pgmspace.h>+
|
4 | #include <avr/interrupt.h>
|
5 |
|
6 | unsigned char buffer[64];
|
7 |
|
8 | int main(void)
|
9 | {
|
10 | unsigned char c, *p;
|
11 | unsigned int i;
|
12 | unsigned long address = 0x1800;
|
13 |
|
14 | DDRB |= (1 << PB2);
|
15 | PORTB |= (1 << PB2);
|
16 |
|
17 | p = buffer;
|
18 |
|
19 | for(c=0;c<64;c++)
|
20 | *p++ = c;
|
21 | cli();
|
22 | eeprom_busy_wait();
|
23 |
|
24 | boot_page_erase( address );
|
25 | boot_spm_busy_wait();
|
26 |
|
27 | for( c=0, p=buffer; c<SPM_PAGESIZE; c+=2 )
|
28 | {
|
29 | i = (unsigned int)*p++;
|
30 | i += (unsigned int)(*p++ << 8);
|
31 | boot_page_fill( address+c, i );
|
32 | }
|
33 |
|
34 | boot_page_write( address );
|
35 | boot_spm_busy_wait();
|
36 |
|
37 | for(;;)
|
38 | {
|
39 | PORTB &= ~(1 << PB2);
|
40 | }
|
41 |
|
42 | return(0);
|
43 | }
|
Nun hängt das Program sich bei "unsigned long address = 0x1800;" auf und
der Controller kann danach nicht mehr gedebuggt werden. Erst ein High
Voltage Programming holt den Controller zurück.
Wenn ich es mit dem Simulator kompiliere und aufspiele, funktioniert das
Programm zwar auch nicht aber wenigstens ist dann der Controller nicht
hin.
Was ist das Problem? Warum verträgt sich das Programm mit dem Debugger
nicht?
Gruß