0

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?

jfpoilpret
9,1627 gold badges38 silver badges54 bronze badges
asked Jan 7, 2017 at 21:07
2

2 Answers 2

0

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).

answered Jan 8, 2017 at 2:52
0
0

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.

answered Jan 28, 2017 at 16:40

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.