I am experimenting with an ATmega328P bootloader, and I created an Intel HEX (.hex) file with a program with an infinite loop in the beginning and with Optiboot code at the end of the hex file. (Code loaded into the chip is here: http://relliks.php5.cz/stackexchange/DUMP.bin.)
Then I disabled the BOOTRST
fuse and pressed the restart button on Arduino Uno R3, but the bootloader still blinks with the LED on digital port 13.
How is it possible, that the bootloader is executed after chip restart and BOOTRST
is disabled? My fuse settings are: Only SPIEN
and BODLEVEL0
are set.
I found that when I disable the BODLEVEL0
fuse, the bootloader turns off.
BODLEVEL0
is used to set the brown-out voltage and shouldn't affect bootloader start. Where is the issue?
-
1Please post the hex values for all your fuses. One way of doing that is to run my chip detector sketch.Nick Gammon– Nick Gammon ♦2017年01月07日 21:52:59 +00:00Commented Jan 7, 2017 at 21:52
-
1Please do not cross-post the same question on different Stack Exchange sites. See Is cross-posting a question on multiple Stack Exchange sites permitted if the question is on-topic for each site?. I refer to your post on Stack Overflow.Nick Gammon– Nick Gammon ♦2017年01月08日 02:45:26 +00:00Commented Jan 8, 2017 at 2:45
2 Answers 2
You don't seem to have filled in all the interrupt vectors. I get this from your .bin file:
00000000 <.sec1>:
0: 00 c0 rjmp .+0 ; 0x2
2: 00 00 nop
4: 00 00 nop
6: 00 00 nop
8: fc cf rjmp .-8 ; 0x2
a: fb cf rjmp .-10 ; 0x2
c: fa cf rjmp .-12 ; 0x2
e: f9 cf rjmp .-14 ; 0x2
10: f8 cf rjmp .-16 ; 0x2
12: f7 cf rjmp .-18 ; 0x2
14: f6 cf rjmp .-20 ; 0x2
16: f5 cf rjmp .-22 ; 0x2
18: ff ff .word 0xffff ; ????
1a: ff ff .word 0xffff ; ????
1c: ff ff .word 0xffff ; ????
1e: ff ff .word 0xffff ; ????
20: ff ff .word 0xffff ; ????
22: ff ff .word 0xffff ; ????
24: ff ff .word 0xffff ; ????
...
7dfc: ff ff .word 0xffff ; ????
7dfe: ff ff .word 0xffff ; ????
7e00: 11 24 eor r1, r1 <--- bootloader
7e02: 94 b7 in r25, 0x34 ; 52
7e04: 14 be out 0x34, r1 ; 52
7e06: 89 2f mov r24, r25
7e08: 8d 70 andi r24, 0x0D ; 13
7e0a: 11 f0 breq .+4 ; 0x7e10
7e0c: 89 2f mov r24, r25
7e0e: de d0 rcall .+444 ; 0x7fcc
7e10: 85 e0 ldi r24, 0x05 ; 5
Now I can't quite see the relationship between the brown-out and those higher interrupts, but if one of them happened to fire I think it would waddle its way past all those 0xFF instructions and hit the bootloader.
The Atmega328P has 26 interrupt vectors (including Reset).
Thank you very much!
I found that when I set fuses using program PONYPROG2000 and native RS232 programmer (http://3.bp.blogspot.com/-2D_0B7...) then I read fuses again using another program (eXtreme Burner) and another programmer(USBASP 2.0), there was difference. The PONYPROG2000 probably sets the fuses incorrectly. Now the Atmega328P works correctly yet.