Файлы Makefile и optiboot.c патченые (см. мой пост выше).
В optiboot.c мне пришлось вырезать все мигания LED и еще кое чего,
чтобы загрузчик уместился во флеш.
Теперь, думаю, можно было бы какие-то мигания и оставить (так сильно нужен был EEPROM, что вырезал лишнее беспощадно).
Ниже привожу сильно подрезаный код.
Оставил только то, что нужно мне для atmega328p 16Mhz 5V.
optiboot.c
#define OPTIBOOT_MAJVER 5
#define OPTIBOOT_MINVER 1
#define MAKESTR(a) #a
#define MAKEVER(a, b) MAKESTR(a*256+b)
asm(" .section .version\n"
"optiboot_version: .word " MAKEVER(OPTIBOOT_MAJVER, OPTIBOOT_MINVER) "\n"
" .section .text\n");
#include <inttypes.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
// <avr/boot.h> uses sts instructions, but this version uses out instructions
// This saves cycles and program memory.
#include "boot.h"
// We don't use <avr/wdt.h> as those routines have interrupt overhead we don't need.
#include "pin_defs.h"
#include "stk500.h"
#ifdef LUDICROUS_SPEED
#define BAUD_RATE 230400L
#endif
/* set the UART baud rate defaults */
#ifndef BAUD_RATE
#if F_CPU >= 8000000L
#define BAUD_RATE 115200L // Highest rate Avrdude win32 will support
#elsif F_CPU >= 1000000L
#define BAUD_RATE 9600L // 19200 also supported, but with significant error
#elsif F_CPU >= 128000L
#define BAUD_RATE 4800L // Good for 128kHz internal RC
#else
#define BAUD_RATE 1200L // Good even at 32768Hz
#endif
#endif
#ifndef UART
#define UART 0
#endif
#define BAUD_SETTING (( (F_CPU + BAUD_RATE * 4L) / ((BAUD_RATE * 8L))) - 1 )
#define BAUD_ACTUAL (F_CPU/(8 * ((BAUD_SETTING)+1)))
#define BAUD_ERROR (( 100*(BAUD_RATE - BAUD_ACTUAL) ) / BAUD_RATE)
#if BAUD_ERROR >= 5
#error BAUD_RATE error greater than 5%
#elif BAUD_ERROR <= -5
#error BAUD_RATE error greater than -5%
#elif BAUD_ERROR >= 2
#warning BAUD_RATE error greater than 2%
#elif BAUD_ERROR <= -2
#warning BAUD_RATE error greater than -2%
#endif
#if 0
/* Switch in soft UART for hard baud rates */
/*
* I don't understand what this was supposed to accomplish, where the
* constant "280" came from, or why automatically (and perhaps unexpectedly)
* switching to a soft uart is a good thing, so I'm undoing this in favor
* of a range check using the same calc used to config the BRG...
*/
#if (F_CPU/BAUD_RATE) > 280 // > 57600 for 16MHz
#ifndef SOFT_UART
#define SOFT_UART
#endif
#endif
#else // 0
#if (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 > 250
#error Unachievable baud rate (too slow) BAUD_RATE
#endif // baud rate slow check
#if (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 < 3
#error Unachievable baud rate (too fast) BAUD_RATE
#endif // baud rate fastn check
#endif
/* Watchdog settings */
#define watchdogConfig(x) WDTCSR = _BV(WDCE) | _BV(WDE); WDTCSR = x
#define WATCHDOG_OFF (0)
#define WATCHDOG_16MS (_BV(WDE))
#define WATCHDOG_32MS (_BV(WDP0) | _BV(WDE))
#define WATCHDOG_64MS (_BV(WDP1) | _BV(WDE))
#define WATCHDOG_125MS (_BV(WDP1) | _BV(WDP0) | _BV(WDE))
#define WATCHDOG_250MS (_BV(WDP2) | _BV(WDE))
#define WATCHDOG_500MS (_BV(WDP2) | _BV(WDP0) | _BV(WDE))
#define WATCHDOG_1S (_BV(WDP2) | _BV(WDP1) | _BV(WDE))
#define WATCHDOG_2S (_BV(WDP2) | _BV(WDP1) | _BV(WDP0) | _BV(WDE))
#ifndef __AVR_ATmega8__
#define WATCHDOG_4S (_BV(WDP3) | _BV(WDE))
#define WATCHDOG_8S (_BV(WDP3) | _BV(WDP0) | _BV(WDE))
#endif
/* Function Prototypes */
/* The main function is in init9, which removes the interrupt vector table */
/* we don't need. It is also 'naked', which means the compiler does not */
/* generate any entry or exit code itself. */
int main(void) __attribute__ ((OS_main)) __attribute__ ((section (".init9")));
void putch(char);
uint8_t getch(void);
void getNch(uint8_t); /* "static inline" is a compiler hint to reduce code size */
void verifySpace();
//AV: fix for 0 flashes
uint8_t getLen();
#ifdef SOFT_UART
void uartDelay() __attribute__ ((naked));
#endif
void appStart(uint8_t rstFlags) __attribute__ ((naked));
/*
* NRWW memory
* Addresses below NRWW (Non-Read-While-Write) can be programmed while
* continuing to run code from flash, slightly speeding up programming
* time. Beware that Atmel data sheets specify this as a WORD address,
* while optiboot will be comparing against a 16-bit byte address. This
* means that on a part with 128kB of memory, the upper part of the lower
* 64k will get NRWW processing as well, even though it doesn't need it.
* That's OK. In fact, you can disable the overlapping processing for
* a part entirely by setting NRWWSTART to zero. This reduces code
* space a bit, at the expense of being slightly slower, overall.
*
* RAMSTART should be self-explanatory. It's bigger on parts with a
* lot of peripheral registers.
*/
#if defined(__AVR_ATmega168__)
#define RAMSTART (0x100)
#define NRWWSTART (0x3800)
#elif defined(__AVR_ATmega328P__) || defined(__AVR_ATmega32__)
#define RAMSTART (0x100)
#define NRWWSTART (0x7000)
#elif defined (__AVR_ATmega644P__)
#define RAMSTART (0x100)
#define NRWWSTART (0xE000)
// correct for a bug in avr-libc
#undef SIGNATURE_2
#define SIGNATURE_2 0x0A
#elif defined (__AVR_ATmega1284P__)
#define RAMSTART (0x100)
#define NRWWSTART (0xE000)
#elif defined(__AVR_ATtiny84__)
#define RAMSTART (0x100)
#define NRWWSTART (0x0000)
#elif defined(__AVR_ATmega1280__)
#define RAMSTART (0x200)
#define NRWWSTART (0xE000)
#elif defined(__AVR_ATmega8__) || defined(__AVR_ATmega88__)
#define RAMSTART (0x100)
#define NRWWSTART (0x1800)
#endif
/* C zero initialises all global variables. However, that requires */
/* These definitions are NOT zero initialised, but that doesn't matter */
/* This allows us to drop the zero init code, saving us memory */
#define buff ((uint8_t*)(RAMSTART))
/*
* Handle devices with up to 4 uarts (eg m1280.) Rather inelegantly.
* Note that mega8/m32 still needs special handling, because ubrr is handled
* differently.
*/
#if UART == 0
# define UART_SRA UCSR0A
# define UART_SRB UCSR0B
# define UART_SRC UCSR0C
# define UART_SRL UBRR0L
# define UART_UDR UDR0
#elif UART == 1
#if !defined(UDR1)
#error UART == 1, but no UART1 on device
#endif
# define UART_SRA UCSR1A
# define UART_SRB UCSR1B
# define UART_SRC UCSR1C
# define UART_SRL UBRR1L
# define UART_UDR UDR1
#elif UART == 2
#if !defined(UDR2)
#error UART == 2, but no UART2 on device
#endif
# define UART_SRA UCSR2A
# define UART_SRB UCSR2B
# define UART_SRC UCSR2C
# define UART_SRL UBRR2L
# define UART_UDR UDR2
#elif UART == 3
#if !defined(UDR1)
#error UART == 3, but no UART3 on device
#endif
# define UART_SRA UCSR3A
# define UART_SRB UCSR3B
# define UART_SRC UCSR3C
# define UART_SRL UBRR3L
# define UART_UDR UDR3
#endif
/* main program starts here */
int main(void) {
uint8_t ch;
/*
* Making these local and in registers prevents the need for initializing
* them, and also saves space because code no longer stores to memory.
* (initializing address keeps the compiler happy, but isn't really
* necessary, and uses 4 bytes of flash.)
*/
register uint16_t address = 0;
register uint8_t length;
// After the zero init loop, this is the first code to run.
//
// This code makes the following assumptions:
// No interrupts will execute
// SP points to RAMEND
// r1 contains zero
//
// If not, uncomment the following instructions:
// cli();
asm volatile ("clr __zero_reg__");
#if defined(__AVR_ATmega8__) || defined (__AVR_ATmega32__)
SP=RAMEND; // This is done by hardware reset
#endif
// Adaboot no-wait mod
ch = MCUSR;
MCUSR = 0;
if (!(ch & _BV(EXTRF))) appStart(ch);
#ifndef SOFT_UART
#if defined(__AVR_ATmega8__) || defined (__AVR_ATmega32__)
UCSRA = _BV(U2X); //Double speed mode USART
UCSRB = _BV(RXEN) | _BV(TXEN); // enable Rx & Tx
UCSRC = _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0); // config USART; 8N1
UBRRL = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 );
#else
UART_SRA = _BV(U2X0); //Double speed mode USART0
UART_SRB = _BV(RXEN0) | _BV(TXEN0);
UART_SRC = _BV(UCSZ00) | _BV(UCSZ01);
UART_SRL = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 );
#endif
#endif
// Set up watchdog to trigger after 500ms
watchdogConfig(WATCHDOG_1S);
#ifdef SOFT_UART
/* Set TX pin as output */
UART_DDR |= _BV(UART_TX_BIT);
#endif
/* Forever loop */
for (;;) {
/* get character from UART */
ch = getch();
if(ch == STK_GET_PARAMETER) {
// unsigned char which = getch();
getch();
verifySpace();
putch(0x03);
/*
if (which == 0x82) {
// Send optiboot version as "minor SW version"
putch(OPTIBOOT_MINVER);
} else if (which == 0x81) {
putch(OPTIBOOT_MAJVER);
} else {
// GET PARAMETER returns a generic 0x03 reply for
// other parameters - enough to keep Avrdude happy
putch(0x03);
}
*/
}
else if(ch == STK_SET_DEVICE) {
// SET DEVICE is ignored
getNch(20);
}
else if(ch == STK_SET_DEVICE_EXT) {
// SET DEVICE EXT is ignored
getNch(5);
}
else if(ch == STK_LOAD_ADDRESS) {
// LOAD ADDRESS
uint16_t newAddress;
newAddress = getch();
newAddress = (newAddress & 0xff) | (getch() << 8);
newAddress += newAddress; // Convert from word address to byte address
address = newAddress;
verifySpace();
}
else if(ch == STK_UNIVERSAL) {
// UNIVERSAL command is ignored
getNch(4);
putch(0x00);
}
/* Write memory, length is big endian and is in bytes */
else if(ch == STK_PROG_PAGE) {
//AV: add eeprom support here
// PROGRAM PAGE - we support flash programming only, not EEPROM
uint8_t *bufPtr;
uint16_t addrPtr;
uint8_t memtype;
getch(); /* getlen() */
length = getch();
memtype = getch();
#ifdef SUPPORT_EEPROM
register uint8_t _cnt = length;
#endif
// If we are in RWW section, immediately start page erase
// While that is going on, read in page contents
bufPtr = buff;
do *bufPtr++ = getch();
while (--length);
// If we are in NRWW section, page erase has to be delayed until now.
// Todo: Take RAMPZ into account (not doing so just means that we will
// treat the top of both "pages" of flash as NRWW, for a slight speed
// decrease, so fixing this is not urgent.)
//AV: moved to 'F' if...
#ifdef SUPPORT_EEPROM
if (memtype=='E') {
// Read command terminator, start reply
verifySpace();
register uint8_t i=0;
while(i<_cnt) {
while(EECR & (1<<EEPE));
EEAR = address++;
EEDR = buff[i++];
EECR |= (1<<EEMPE);
EECR |= (1<<EEPE);
}
}
#endif
if (memtype=='F') {
//AV: moved:
if (address < NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address);
if (address >= NRWWSTART) __boot_page_erase_short((uint16_t)(void*)address);
// Read command terminator, start reply
verifySpace();
// If only a partial page is to be programmed, the erase might not be complete.
// So check that here
boot_spm_busy_wait();
// Copy buffer into programming buffer
bufPtr = buff;
addrPtr = (uint16_t)(void*)address;
ch = SPM_PAGESIZE / 2;
do {
uint16_t a;
a = *bufPtr++;
a |= (*bufPtr++) << 8;
__boot_page_fill_short((uint16_t)(void*)addrPtr,a);
addrPtr += 2;
} while (--ch);
// Write from programming buffer
__boot_page_write_short((uint16_t)(void*)address);
boot_spm_busy_wait();
#if defined(RWWSRE)
// Reenable read access to flash
boot_rww_enable();
#endif
}
} // STK_PROG_PAGE
/* Read memory block mode, length is big endian. */
else if(ch == STK_READ_PAGE) {
// READ PAGE - we only read flash
//AV: add EEPROM
uint8_t memtype;
getch(); /* getlen() */
length = getch();
memtype=getch();
verifySpace();
do {
if (memtype=='F') {
// read a Flash byte and increment the address
__asm__ ("lpm %0,Z+\n" : "=r" (ch), "=z" (address): "1" (address));
}
#if SUPPORT_EEPROM
if(memtype=='E') {
while(EECR & (1<<EEPE)) ;
EEAR = address++;
EECR |= (1<<EERE);
ch = EEDR;
}
#endif
putch(ch);
} while (--length);
}
/* Get device signature bytes */
else if(ch == STK_READ_SIGN) {
// READ SIGN - return what Avrdude wants to hear
verifySpace();
putch(SIGNATURE_0);
putch(SIGNATURE_1);
putch(SIGNATURE_2);
}
else {
// Adaboot no-wait mod
verifySpace();
}
/*
else if (ch == STK_LEAVE_PROGMODE) { // 'Q'
// Adaboot no-wait mod
watchdogConfig(WATCHDOG_16MS);
verifySpace();
}
else {
// This covers the response to commands like STK_ENTER_PROGMODE
verifySpace();
}
*/
putch(STK_OK);
}
}
void putch(char ch) {
#ifndef SOFT_UART
while (!(UART_SRA & _BV(UDRE0)));
UART_UDR = ch;
#else
__asm__ __volatile__ (
" com %[ch]\n" // ones complement, carry set
" sec\n"
"1: brcc 2f\n"
" cbi %[uartPort],%[uartBit]\n"
" rjmp 3f\n"
"2: sbi %[uartPort],%[uartBit]\n"
" nop\n"
"3: rcall uartDelay\n"
" rcall uartDelay\n"
" lsr %[ch]\n"
" dec %[bitcnt]\n"
" brne 1b\n"
:
:
[bitcnt] "d" (10),
[ch] "r" (ch),
[uartPort] "I" (_SFR_IO_ADDR(UART_PORT)),
[uartBit] "I" (UART_TX_BIT)
:
"r25"
);
#endif
}
uint8_t getch(void) {
uint8_t ch;
#ifdef SOFT_UART
__asm__ __volatile__ (
"1: sbic %[uartPin],%[uartBit]\n" // Wait for start edge
" rjmp 1b\n"
" rcall uartDelay\n" // Get to middle of start bit
"2: rcall uartDelay\n" // Wait 1 bit period
" rcall uartDelay\n" // Wait 1 bit period
" clc\n"
" sbic %[uartPin],%[uartBit]\n"
" sec\n"
" dec %[bitCnt]\n"
" breq 3f\n"
" ror %[ch]\n"
" rjmp 2b\n"
"3:\n"
:
[ch] "=r" (ch)
:
[bitCnt] "d" (9),
[uartPin] "I" (_SFR_IO_ADDR(UART_PIN)),
[uartBit] "I" (UART_RX_BIT)
:
"r25"
);
#else
while(!(UART_SRA & _BV(RXC0)))
;
if (!(UART_SRA & _BV(FE0))) {
/*
* A Framing Error indicates (probably) that something is talking
* to us at the wrong bit rate. Assume that this is because it
* expects to be talking to the application, and DON'T reset the
* watchdog. This should cause the bootloader to abort and run
* the application "soon", if it keeps happening. (Note that we
* don't care that an invalid char is returned...)
*/
__asm__ __volatile__ (
"wdr\n"
);
}
ch = UART_UDR;
#endif
return ch;
}
#ifdef SOFT_UART
// AVR305 equation: #define UART_B_VALUE (((F_CPU/BAUD_RATE)-23)/6)
// Adding 3 to numerator simulates nearest rounding for more accurate baud rates
#define UART_B_VALUE (((F_CPU/BAUD_RATE)-20)/6)
#if UART_B_VALUE > 255
#error Baud rate too slow for soft UART
#endif
void uartDelay() {
__asm__ __volatile__ (
"ldi r25,%[count]\n"
"1:dec r25\n"
"brne 1b\n"
"ret\n"
::[count] "M" (UART_B_VALUE)
);
}
#endif
void getNch(uint8_t count) {
do getch(); while (--count);
verifySpace();
}
void verifySpace() {
if (getch() != CRC_EOP) {
watchdogConfig(WATCHDOG_16MS); // shorten WD timeout
while (1) // and busy-loop so that WD causes
; // a reset and app start.
}
putch(STK_INSYNC);
}
void appStart(uint8_t rstFlags) {
// save the reset flags in the designated register
// This can be saved in a main program by putting code in .init0 (which
// executes before normal c init code) to save R2 to a global variable.
__asm__ __volatile__ ("mov r2, %0\n" :: "r" (rstFlags));
watchdogConfig(WATCHDOG_OFF);
__asm__ __volatile__ (
// Jump to RST vector
"clr r30\n"
"clr r31\n"
"ijmp\n"
);
}
Makefile
# Makefile for ATmegaBOOT
# E.Lins, 18.7.2005
# $Id$
#
# Instructions
#
# To make bootloader .hex file:
# make diecimila
# make lilypad
# make ng
# etc...
#
# To burn bootloader .hex file:
# make diecimila_isp
# make lilypad_isp
# make ng_isp
# etc...
#
# Edit History
# 201303xx: WestfW: Major Makefile restructuring.
# Allows options on Make command line "make xx LED=B3"
# (see also pin_defs.h)
# Divide into "chip" targets and "board" targets.
# Most boards are (recursive) board targets with options.
# Move isp target to separate makefile (fixes m8 EFUSE)
# Some (many) targets will now be rebuilt when not
# strictly necessary, so that options will be included.
# (any "make" with options will always compile.)
# Set many variables with ?= so they can be overridden
# Use arduinoISP settings as default for ISP targets
#
#----------------------------------------------------------------------
#
# program name should not be changed...
PROGRAM = optiboot
# The default behavior is to build using tools that are in the users
# current path variables, but we can also build using an installed
# Arduino user IDE setup, or the Arduino source tree.
# Uncomment this next lines to build within the arduino environment,
# using the arduino-included avrgcc toolset (mac and pc)
# ENV ?= arduino
# ENV ?= arduinodev
# OS ?= macosx
# OS ?= windows
# Build environments
# Start of some ugly makefile-isms to allow optiboot to be built
# in several different environments. See the README.TXT file for
# details.
# default
fixpath = $(1)
ifeq ($(ENV), arduino)
# For Arduino, we assume that we're connected to the optiboot directory
# included with the arduino distribution, which means that the full set
# of avr-tools are "right up there" in standard places.
TOOLROOT =
GCCROOT =
ifeq ($(OS), windows)
# On windows, SOME of the tool paths will need to have backslashes instead
# of forward slashes (because they use windows cmd.exe for execution instead
# of a unix/mingw shell?) We also have to ensure that a consistent shell
# is used even if a unix shell is installed (ie as part of WINAVR)
fixpath = $(subst /,\,$1)
SHELL = cmd.exe
endif
else ifeq ($(ENV), arduinodev)
# Arduino IDE source code environment. Use the unpacked compilers created
# by the build (you'll need to do "ant build" first.)
ifeq ($(OS), windows)
TOOLROOT =
endif
GCCROOT = $(TOOLROOT)
AVRDUDE_CONF = -C$(TOOLROOT)/avrdude.conf
else
GCCROOT =
AVRDUDE_CONF =
endif
STK500 = "C:\Program Files\Atmel\AVR Tools\STK500\Stk500.exe"
STK500-1 = $(STK500) -e -d$(MCU_TARGET) -pf -vf -if$(PROGRAM)_$(TARGET).hex \
-lFF -LFF -f$(HFUSE)$(LFUSE) -EF8 -ms -q -cUSB -I200kHz -s -wt
STK500-2 = $(STK500) -d$(MCU_TARGET) -ms -q -lCF -LCF -cUSB -I200kHz -s -wt
#
# End of build environment code.
OBJ = $(PROGRAM).o
OPTIMIZE = -Os -fno-inline-small-functions -fno-split-wide-types -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -fno-tree-scev-cprop -mrelax -maccumulate-args
DEFS =
LIBS =
CC = $(GCCROOT)avr-gcc
# Override is only needed by avr-lib build system.
override CFLAGS = -g -Wall $(OPTIMIZE) -mmcu=$(MCU_TARGET) -DF_CPU=$(AVR_FREQ) $(DEFS)
override LDFLAGS = $(LDSECTIONS) -Wl,--relax -nostartfiles -nostdlib
#-Wl,--gc-sections
OBJCOPY = $(GCCROOT)avr-objcopy
OBJDUMP = $(call fixpath,$(GCCROOT)avr-objdump)
SIZE = $(GCCROOT)avr-size
#
# Make command-line Options.
# Permit commands like "make atmega328 LED_START_FLASHES=10" to pass the
# appropriate parameters ("-DLED_START_FLASHES=10") to gcc
#
ifdef BAUD_RATE
BAUD_RATE_CMD = -DBAUD_RATE=$(BAUD_RATE)
dummy = FORCE
else
BAUD_RATE_CMD = -DBAUD_RATE=115200
endif
ifdef LED_START_FLASHES
LED_START_FLASHES_CMD = -DLED_START_FLASHES=$(LED_START_FLASHES)
dummy = FORCE
else
LED_START_FLASHES_CMD = -DLED_START_FLASHES=0
endif
# BIG_BOOT: Include extra features, up to 1K.
ifdef BIGBOOT
BIGBOOT_CMD = -DBIGBOOT=0
dummy = FORCE
else
BIGBOOT_CMD = -DBIGBOOT=0
endif
ifdef SOFT_UART
SOFT_UART_CMD = -DSOFT_UART=0
dummy = FORCE
endif
ifdef LED_DATA_FLASH
LED_DATA_FLASH_CMD = -DLED_DATA_FLASH=0
dummy = FORCE
endif
ifdef LED
LED_CMD = -DLED=$(LED)
dummy = FORCE
endif
ifdef SINGLESPEED
SSCMD = -DSINGLESPEED=1
endif
ifdef SUPPORT_EEPROM
SUPPORT_EEPROM_CMD = -DSUPPORT_EEPROM
dummy = FORCE
endif
COMMON_OPTIONS = $(BAUD_RATE_CMD) $(LED_START_FLASHES_CMD) $(BIGBOOT_CMD)
COMMON_OPTIONS += $(SUPPORT_EEPROM_CMD)
COMMON_OPTIONS += $(SOFT_UART_CMD) $(LED_DATA_FLASH_CMD) $(LED_CMD) $(SSCMD)
#UART is handled separately and only passed for devices with more than one.
ifdef UART
UARTCMD = -DUART=$(UART)
endif
# Not supported yet
# Not supported yet
# ifdef TIMEOUT_MS
# TIMEOUT_MS_CMD = -DTIMEOUT_MS=$(TIMEOUT_MS)
# dummy = FORCE
# endif
#
#---------------------------------------------------------------------------
# "Chip-level Platform" targets.
# A "Chip-level Platform" compiles for a particular chip, but probably does
# not have "standard" values for things like clock speed, LED pin, etc.
# Makes for chip-level platforms should usually explicitly define their
# options like: "make atmega1285 AVR_FREQ=16000000L LED=D0"
#---------------------------------------------------------------------------
#
# Note about fuses:
# the efuse should really be 0xf8; since, however, only the lower
# three bits of that byte are used on the atmega168, avrdude gets
# confused if you specify 1's for the higher bits, see:
# http://tinker.it/now/2007/02/24/the-tale-of-avrdude-atmega168-and-extended-bits-fuses/
#
# similarly, the lock bits should be 0xff instead of 0x3f (to
# unlock the bootloader section) and 0xcf instead of 0x2f (to
# lock it), but since the high two bits of the lock byte are
# unused, avrdude would get confused.
#---------------------------------------------------------------------------
#
atmega328: TARGET = atmega328
atmega328: MCU_TARGET = atmega328p
atmega328: CFLAGS += $(COMMON_OPTIONS)
atmega328: AVR_FREQ ?= 16000000L
atmega328: LDSECTIONS = -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe
atmega328: $(PROGRAM)_atmega328.hex
atmega328: $(PROGRAM)_atmega328.lst
atmega328_isp: atmega328
atmega328_isp: TARGET = atmega328
atmega328_isp: MCU_TARGET = atmega328p
# 512 byte boot, SPIEN
atmega328_isp: HFUSE ?= DE
# Low power xtal (16MHz) 16KCK/14CK+65ms
atmega328_isp: LFUSE ?= FF
# 2.7V brownout
atmega328_isp: EFUSE ?= FD
atmega328_isp: isp
#---------------------------------------------------------------------------
#
# Generic build instructions
#
FORCE:
baudcheck: FORCE
- @$(CC) $(CFLAGS) -E baudcheck.c -o baudcheck.tmp.sh
- @sh baudcheck.tmp.sh
isp: $(TARGET)
$(MAKE) -f Makefile.isp isp TARGET=$(TARGET)
isp-stk500: $(PROGRAM)_$(TARGET).hex
$(STK500-1)
$(STK500-2)
%.elf: $(OBJ) baudcheck $(dummy)
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS)
$(SIZE) $@
clean:
rm -rf *.o *.elf *.lst *.map *.sym *.lss *.eep *.srec *.bin *.hex *.tmp.sh
%.lst: %.elf
$(OBJDUMP) -h -S $< > $@
%.hex: %.elf
$(OBJCOPY) -j .text -j .data -j .version --set-section-flags .version=alloc,load -O ihex $< $@
%.srec: %.elf
$(OBJCOPY) -j .text -j .data -j .version --set-section-flags .version=alloc,load -O srec $< $@
%.bin: %.elf
$(OBJCOPY) -j .text -j .data -j .version --set-section-flags .version=alloc,load -O binary $< $@
мне нужен один бутлоадер: optiboot для меги8 для скорости uart 38400/ это все. пробовал. накидал файлов. запустил батник. он выдал ошибку что не знает комманду make
также пробовал в codevision скомпилировать, но тоже не получилось. не разобрался что сделать чтобы заработало
мне нужен один бутлоадер: optiboot для меги8 для скорости uart 38400/ это все. пробовал. накидал файлов. запустил батник. он выдал ошибку что не знает комманду make
Раз не знает, значит не все файлы скопировал в каталог optiboot.
Я же приложил листинг каталога, make легко найти в подкаталогах arduino и скопировать в optiboot.
На шару не прокатит. Надо внимательно и шаг за шагом.
нашел бутлоадер в инете на скорость 38400, правда не optiboot и занимает 1к памяти
как и предполагалось работает программирование через uart при 3.3в питания, и теперь не нужно гордить 2 питания: для микроконтроллера и nrf24l01 или дисплея
Почитал тему, захотелось попробовать поиграться с Atmega8L. С горем пополам спаял такую штуку
Захотелось запустить это на внутреннем генераторе на 1 мегагерц. Короче изломал всю голову, читал и тему и интернет до пара из ушей. В конструкторе бутлоадера сгенерил вставку в boards.txt, правда не очень понял в какой файл вставлять. В тот, который в мои документы/ардуино/.... или в тот который с/програм файл/ардуино.... Не понял как сделать hex файл. Скопировал из ИЕ в блокнот и сохранил, тоже сам не понял куда. Короче полный лес.
Результат:
avrdude: Yikes! Invalid device signature.
Double check connections and try again, or use -F to override
this check.
Прочитал это и тоже ни чего не понимаю. Что такое "use -F override" ?
Может кто-то напишет что-нибудь вроде ПРОШИВКА БУТЛОАДЕРА АТМЕГА8L ДЛЯ ЧАЙНИКА? Разобраться самому уже потерял надежду.
А вот с булоадерами стандартными, которые есть в Ардуино IDE нет ни каких проблем. А так хочется Атмегу8 на 1 мегагерц запустить!
Double check connections and try again, or use -F to override
Эта ошибка никак не связана с бутлоадером и уже много раз обсуждалась, надо было просто погуглить. В файле avrdude.conf для выбранного микроконтроллера неправильно указана сигнатура. Она не совпадает с той, которая считывается из МК. Ну или бывает вообще не считывается, вместо сигнатуры сплошные нули. Тогда это проблема с соединением.
Joiner пишет:
Прочитал это и тоже ни чего не понимаю. Что такое "use -F override" ?
Это ключ для командной строки вызова avrdude, чтобы игнорировать ошибку.
[quote=Jeka_M............Это ключ для командной строки вызова avrdude, чтобы игнорировать ошибку.[/quote]
Спасибо.
А как эту avrdude вызвать и куда вставлять ключ?
Проверил, может что с платой. Тестером в режиме проверки диодов прозвонил на землю все выводы, и цифровые и аналоговые. Все показвают 0.9в. Вроде ни чего не замкнуто и не оборвано
Вы не стого боку заходите, сначала надо с сигнатурой разобраться, не нужен пока этот ключ.
Avrdude - это консольная утилита для прошивки микроконтроллера, Arduino IDE после компиляции прошивки вызывает эту утилиту с параметрами. Находится она тут: <корень иде>\hardware\tools\avr\bin\avrdude.exe, конфигурационный файл: <корень иде>\hardware\tools\avr\etc\avrdude.conf
Сначала нужно посмотреть, какая сигнатура читается. Для этого в настройках IDE включите подробный вывод при загрузке.
Вы не стого боку заходите, сначала надо с сигнатурой разобраться, не нужен пока этот ключ.
Avrdude - это консольная утилита для прошивки микроконтроллера, Arduino IDE после компиляции прошивки вызывает эту утилиту с параметрами. Находится она тут: <корень иде>\hardware\tools\avr\bin\avrdude.exe, конфигурационный файл: <корень иде>\hardware\tools\avr\etc\avrdude.conf
Сначала нужно посмотреть, какая сигнатура читается. Для этого в настройках IDE включите подробный вывод при загрузке.
Не знаю что и делать....Так и пишет "инвалид сигнатура". Может кто знает куда копнуть, как узнать где проблемма?
Ну я же расписал всё выше... В настройках IDE включаете подробный вывод при загрузке. Собственно при попытке загрузки внизу на черном фоне возле сообщения об ошибке будет написана сигнатура, которая считалась. Она не должна состоять из нулей и должна совпадать с сигнатурой, которая записана в avrdude.conf для этого микроконтроллера. Что не понятно?
Попробовал зашить откалькулированный загрузчик на Atmega 328. Хотел на 1 ьегагерц, но калькулятор позволяет только 8 мегагерц от внутреннего генератора.
Первая попытка не увенчалась успехом, т.к. атмега была с загрузчиком и на кварц 16 мегагерц. Подсунул ей кварц, все получилось. Через ISP записал Blink, все нормальгно, моргет раз в секунду. Прошил загрузчик на 8 мегагерц снова и попробовал загрузить Blink через TX, RX. Подключил DTR...и хрен вам. Респ 0Х00.
Крик вопиющего в пустыне. Знатоки, подскажите... Я так понимаю, что загрузчик нужен для загрузки через UART.
Но получается, что загрузчик работает только на стандартных для Ардуино частотах. В других случаях придется заливать скетчи через ISP? Получается что калькулятор служит лишь для правильного выставления фьюзов.
Конструктор позволяет задать любую частоту, 1мгц на внутреннем генераторе достигается включением 8 мгц и включением делителя на 8.
Да с частотой примерно понятно... У меня получилось записать загрузчик на Atmegy 328 на частоту от внутреннего кварца 8 мегагерц. Но залить в нее скетч через UART не удалось.....только через ISP. Это на самом деле невозможно, или это мои кривые руки?
Потом переписав на загрузчик от UNO (Atmega 328 16m), проверил, льется через UART без проблем.
В любом случае присоединяюсь к людям, которые сказали спасибо за Ваш труд. Теперь даже такой дремучий новичок, как я, сможет настроить МК на нужную частоту.
Спасибо.
P.S. Еще один вопрос. Подскажите, пожалуйста, возможно ли лить скетчи через UART, например, в Atmega 8 int 1mhz ?
На 1 мгц скорость уарт должна быть очень низкая, эта скорость указывается при генерации кода в боард.тхт. Работать должно, но конструктор сейчас для меня не актуален и по этому все его возможности не протестированы.
На 1 мгц скорость уарт должна быть очень низкая, эта скорость указывается при генерации кода в боард.тхт. Работать должно, но конструктор сейчас для меня не актуален и по этому все его возможности не протестированы.
Спасибо. Будем экспериментировать.
Жаль, что конструктор не актуален....Как я понял, многие им пользуются
Прогрес не стоит на месте, смысла в ардуинах на атмегах 16мгц сейчас не вижу. Уже есть ESP8266 , где проц значительно мощнее и писать код так же можно как в ардуино получая сразу wi-fi интерфейс. У меня проект вообще не использует ардуино IDE и работает на чистом Си и имеет огромный функционал по сравнению с ардуинами..
PS. конструктор временно не работает, будет работать скорее всего только вечером.
Попробовал.....не получилось...Видима причина в другом :(
Упорно пишет: " Yikes! Invalid device signature.
Double check connections and try again, or use -F to
override this check."
Может сам микроконтроллер неисправный? Я не знаю как это проверить...
При подробном выводе говорит что сигнатура 00000000, одни нули.
P.S. Пробовал поиграть с Atmega 328 d DIP корпусе на макетке. Все прошло без особых проблем. Делал на частоту 1 мегагерц, 8 мегегерц от внутреннего генератора и 16 мегагерц от внешнего кварца. Использовар выше означенный калькулятор. Получились работоспособные МК, но по UART шился только с внешним кварцем на 16 мегагерц.
А прошитые на 1 и 8 мегагерц от внутреннего, через ISP скетчи заливались, а через UART категорически отказались, типа RESP 0X00.
Joiner, ну ты даёшь! с 2014 года не нашёл полчаса что б разобраться с дудкой? Это же наше всё! Качай последнюю дуду дабы не лазать по папкам в ide, разархивируй оба файла в отдельную папку.
avrdude.exe -p m8 -c usbasp -P usb -скажет текущие фузы. Должно быть E:FF, H:DC, L:E1 Если не так, то зашей правильные:
Разархивировал...попробовал запустить.. не запустилось. Я так понял, это для USBASP программатора? Сообщение системы что на моем компе отсутствует libusb0.dll , запуск невозможен
Ок. Сейчас закажу программатор. dimax, кинь пожалуйста ссылочку, чтобы по ошибке не купить не то что надо. Я на ебее затариваюсь.
Joiner, UNO в качестве программатора -г@вно. Пригоден для прошивки себе подобных (=мега328) Шаг влево шаг вправо -он уже не хочет шить или глючит. Покупай программатор USBASP. ( Обязательно с перемычкой для low-speed контроллеров.)
Joiner, UNO в качестве программатора -г@вно. Пригоден для прошивки себе подобных (=мега328) Шаг влево шаг вправо -он уже не хочет шить или глючит. Покупай программатор USBASP. ( Обязательно с перемычкой для low-speed контроллеров.)
А ссылочку бы..... пожалуйста.
Поискал, там всяких полно.....что брать не понимаю
Joiner, да нет у меня проверенной ссылочки. Я сам взял в своё время не правильный программатор, (без вывода джампера для low-speed) потом пришлось штудировать инет, вызванивать ноги, в конце-концов припаял соплю, заработало. Подозреваю, что если взять модель где много джамперов, то один их них возможно окажется нужным. Вот например как тут, возможно что нераспаянный JP3 это и есть нужный джампер. Но гарантировать не могу, по плате не видно. Должно идти на 25 ногу МК. Второй джампер скорее всего разрешение самопрошивки. Ну и последний подписан.
Joiner, да нет у меня проверенной ссылочки. Я сам взял в своё время не правильный программатор, (без вывода джампера для low-speed) потом пришлось штудировать инет, вызванивать ноги, в конце-концов припаял соплю, заработало. Подозреваю, что если взять модель где много джамперов, то один их них возможно окажется нужным. Вот например как тут, возможно что нераспаянный JP3 это и есть нужный джампер. Но гарантировать не могу, по плате не видно. Должно идти на 25 ногу МК. Второй джампер скорее всего разрешение самопрошивки. Ну и последний подписан.
Joiner, попробовал сейчас загрузить бутлоадер для меги8L через UNO - всё работает.
И так, снова попробуй считать без услуг arduino ide. Ком порт только свой ставь. Строчки, аналогичные #289, но для программатора UNO as ISP. Прочитать чип, фузы:
Там просто определение опций - не более
Собрать могу, если время будет
Собрать могу, если время будет
После этой фразы вспомнил о Мужском движении.
Убил вечер, получил загрузчик, записывающий и считывающий и eeprom и flash:
Взял optiboot 5.0a в исходниках.
В arduino 1.5.8 разархивировал, получил
/hardware/tools/avr/optiboot
3. Чтоб не морочиться с путями, все нужное и ненужное накопировал в эту папку
В m.bat
Файлы Makefile и optiboot.c патченые (см. мой пост выше).
В optiboot.c мне пришлось вырезать все мигания LED и еще кое чего,
чтобы загрузчик уместился во флеш.
Теперь, думаю, можно было бы какие-то мигания и оставить (так сильно нужен был EEPROM, что вырезал лишнее беспощадно).
Ниже привожу сильно подрезаный код.
Оставил только то, что нужно мне для atmega328p 16Mhz 5V.
optiboot.c
Makefile
В наличии две Atmega8... Один МК работает с UART на 8Mhz(внутренний), а второй нет. В чем может быть причина?
в конструкторе нет возможности изменить скорость загрузки
не мог ли бы ты собрать бутлоадер c такими параметрами, по сути изменения только в скорости
в конструкторе нет возможности изменить скорость загрузки
не мог ли бы ты собрать бутлоадер c такими параметрами, по сути изменения только в скорости
А в чем проблема один раз сделать для себя сборщик bootloader так, как я описывал выше и всегда делать себе любой загрузчик?
Все необходимое есть в папках с IDE arduino.
Вчера попробовал собрать для скорости 230400 и поддержкой eeprom для atrmega328p - все работает!
ну раз так просто может выложишь куда нибудь архив, а я поправлю скорость и скомпилирую
я пробовал. не получилось
ну раз так просто может выложишь куда нибудь архив, а я поправлю скорость и скомпилирую
я пробовал. не получилось
Я не в городе живу, инет не быстрый.
Просто повтори то, что я в посте сделал - это же минут 20ть всего уйдет.
И опиши, что не получилось.
У меня pro mini 5V 16Mhz.
Если под него bootloader на разную скорость нужно - скинь в личку почту свою - вышлю.
мне нужен один бутлоадер: optiboot для меги8 для скорости uart 38400/ это все. пробовал. накидал файлов. запустил батник. он выдал ошибку что не знает комманду make
также пробовал в codevision скомпилировать, но тоже не получилось. не разобрался что сделать чтобы заработало
проще будет если просто соберешь
jeka_tm@mail.ru
кстати работать на внутреннем генераторе, частота 8мгц
короче как бутлоадер на 115200 но на скорость 38400
мне нужен один бутлоадер: optiboot для меги8 для скорости uart 38400/ это все. пробовал. накидал файлов. запустил батник. он выдал ошибку что не знает комманду make
Раз не знает, значит не все файлы скопировал в каталог optiboot.
Я же приложил листинг каталога, make легко найти в подкаталогах arduino и скопировать в optiboot.
На шару не прокатит. Надо внимательно и шаг за шагом.
проще будет если просто соберешь
Совсем просто - это игнорировать.
у тебя бы это заняло меньше минуты, поэтому и попросил
я не планирую каждый день делать бутлоадеры
но я сделал что то. файла hex в папке не появилось
изменил в makefile частоту для меги8 на 8000000 получил следующее. hex так и нет. зато появился elf
собирать я так понял не будешь? хочешь чтобы я сам научился?
помогите новичку
плиззз. ну или хотя бы что должно быть в m.bat
я пробовал по разному
кстати постоянно вылетает LD.exe с ошибкой
Все правильно делаешь, только это нужно делать на чистой установке.
Т.е. загружаешь свежее arduino 1.5.8, ставишь, копируешь из подкаталогов все указанные мною в посте файлы в один каталог и пускаешь make.
У меня в командной строке: make atmega328 BAUD_RATE=230400 SUPPORT_EEPROM=1
Удобно делать в вирт машине, например в vmware player ставишь xp и там экспериментируешь.
так должна быть 1.5.8?
я на 1.0.6 пробовал
и кстати windows7
хорошо попробую на вирт машине xp накатить и проверить
накатил виртуальную машину. чистую ардуину идэ. и обе версии: 1.5.8 и 1.0.6. и что толкьо не делал
и нифига. ошибки также сыпятся. нахрен. больше не буду даже больше пытаться. цель перестала оправдывать средства
osetroff а ты больше похож на садиста
нашел бутлоадер в инете на скорость 38400, правда не optiboot и занимает 1к памяти
как и предполагалось работает программирование через uart при 3.3в питания, и теперь не нужно гордить 2 питания: для микроконтроллера и nrf24l01 или дисплея
Спасибо за проект.
Внезапным для меня оказался фьюз изменения BOD6 у меня 2.7, Ваш генератор предложил 1.8.
Не понятно, как добавлять в boards.txt: архитектура изменилась.
Почитал тему, захотелось попробовать поиграться с Atmega8L. С горем пополам спаял такую штуку
Захотелось запустить это на внутреннем генераторе на 1 мегагерц. Короче изломал всю голову, читал и тему и интернет до пара из ушей. В конструкторе бутлоадера сгенерил вставку в boards.txt, правда не очень понял в какой файл вставлять. В тот, который в мои документы/ардуино/.... или в тот который с/програм файл/ардуино.... Не понял как сделать hex файл. Скопировал из ИЕ в блокнот и сохранил, тоже сам не понял куда. Короче полный лес.
Результат:
Результат:
Эта ошибка никак не связана с бутлоадером и уже много раз обсуждалась, надо было просто погуглить. В файле avrdude.conf для выбранного микроконтроллера неправильно указана сигнатура. Она не совпадает с той, которая считывается из МК. Ну или бывает вообще не считывается, вместо сигнатуры сплошные нули. Тогда это проблема с соединением.
Прочитал это и тоже ни чего не понимаю. Что такое "use -F override" ?
Это ключ для командной строки вызова avrdude, чтобы игнорировать ошибку.
[quote=Jeka_M............Это ключ для командной строки вызова avrdude, чтобы игнорировать ошибку.[/quote]
Спасибо.
А как эту avrdude вызвать и куда вставлять ключ?
Проверил, может что с платой. Тестером в режиме проверки диодов прозвонил на землю все выводы, и цифровые и аналоговые. Все показвают 0.9в. Вроде ни чего не замкнуто и не оборвано
А как эту avrdude вызвать и куда вставлять ключ?
Вы не стого боку заходите, сначала надо с сигнатурой разобраться, не нужен пока этот ключ.
Avrdude - это консольная утилита для прошивки микроконтроллера, Arduino IDE после компиляции прошивки вызывает эту утилиту с параметрами. Находится она тут: <корень иде>\hardware\tools\avr\bin\avrdude.exe, конфигурационный файл: <корень иде>\hardware\tools\avr\etc\avrdude.conf
Сначала нужно посмотреть, какая сигнатура читается. Для этого в настройках IDE включите подробный вывод при загрузке.
Справка по ключам для командной строки avrdude
А как эту avrdude вызвать и куда вставлять ключ?
Вы не стого боку заходите, сначала надо с сигнатурой разобраться, не нужен пока этот ключ.
Avrdude - это консольная утилита для прошивки микроконтроллера, Arduino IDE после компиляции прошивки вызывает эту утилиту с параметрами. Находится она тут: <корень иде>\hardware\tools\avr\bin\avrdude.exe, конфигурационный файл: <корень иде>\hardware\tools\avr\etc\avrdude.conf
Сначала нужно посмотреть, какая сигнатура читается. Для этого в настройках IDE включите подробный вывод при загрузке.
Справка по ключам для командной строки avrdude
Не знаю что и делать....Так и пишет "инвалид сигнатура". Может кто знает куда копнуть, как узнать где проблемма?
Не знаю что и делать....Так и пишет "инвалид сигнатура". Может кто знает куда копнуть, как узнать где проблемма?
Ну я же расписал всё выше... В настройках IDE включаете подробный вывод при загрузке. Собственно при попытке загрузки внизу на черном фоне возле сообщения об ошибке будет написана сигнатура, которая считалась. Она не должна состоять из нулей и должна совпадать с сигнатурой, которая записана в avrdude.conf для этого микроконтроллера. Что не понятно?
Я вот сейчас специально проверил и указал неправильную сигнатуру для Atmega328P в avrdude.conf, оно мне выдало такие строки:
Включил подробный вывод, вот что получил
Если объясните, что это означает, буду очень благодарен. Сам я в этих записях ни чего не понимаю.
Спасибо, что откликнулись на мою проблему.
Попробовал зашить откалькулированный загрузчик на Atmega 328. Хотел на 1 ьегагерц, но калькулятор позволяет только 8 мегагерц от внутреннего генератора.
Первая попытка не увенчалась успехом, т.к. атмега была с загрузчиком и на кварц 16 мегагерц. Подсунул ей кварц, все получилось. Через ISP записал Blink, все нормальгно, моргет раз в секунду. Прошил загрузчик на 8 мегагерц снова и попробовал загрузить Blink через TX, RX. Подключил DTR...и хрен вам. Респ 0Х00.
Короче получилось, но совсем не совсем.....
Крик вопиющего в пустыне. Знатоки, подскажите... Я так понимаю, что загрузчик нужен для загрузки через UART.
Но получается, что загрузчик работает только на стандартных для Ардуино частотах. В других случаях придется заливать скетчи через ISP? Получается что калькулятор служит лишь для правильного выставления фьюзов.
Я правильно понял?
Конструктор позволяет задать любую частоту, 1мгц на внутреннем генераторе достигается включением 8 мгц и включением делителя на 8.
Конструктор позволяет задать любую частоту, 1мгц на внутреннем генераторе достигается включением 8 мгц и включением делителя на 8.
Да с частотой примерно понятно... У меня получилось записать загрузчик на Atmegy 328 на частоту от внутреннего кварца 8 мегагерц. Но залить в нее скетч через UART не удалось.....только через ISP. Это на самом деле невозможно, или это мои кривые руки?
Потом переписав на загрузчик от UNO (Atmega 328 16m), проверил, льется через UART без проблем.
В любом случае присоединяюсь к людям, которые сказали спасибо за Ваш труд. Теперь даже такой дремучий новичок, как я, сможет настроить МК на нужную частоту.
Спасибо.
P.S. Еще один вопрос. Подскажите, пожалуйста, возможно ли лить скетчи через UART, например, в Atmega 8 int 1mhz ?
На 1 мгц скорость уарт должна быть очень низкая, эта скорость указывается при генерации кода в боард.тхт. Работать должно, но конструктор сейчас для меня не актуален и по этому все его возможности не протестированы.
На 1 мгц скорость уарт должна быть очень низкая, эта скорость указывается при генерации кода в боард.тхт. Работать должно, но конструктор сейчас для меня не актуален и по этому все его возможности не протестированы.
Спасибо. Будем экспериментировать.
Жаль, что конструктор не актуален....Как я понял, многие им пользуются
Прогрес не стоит на месте, смысла в ардуинах на атмегах 16мгц сейчас не вижу. Уже есть ESP8266 , где проц значительно мощнее и писать код так же можно как в ардуино получая сразу wi-fi интерфейс. У меня проект вообще не использует ардуино IDE и работает на чистом Си и имеет огромный функционал по сравнению с ардуинами..
PS. конструктор временно не работает, будет работать скорее всего только вечером.
Понял, спасибо.
Короче, эту гребаную Atmega8L я не победил :( Так и не понял, что ей не хватает, и что означает сигнатура 00000.
На помойку ее .......
Joiner, ай яй яй, а как же добиваться своего?)
Для тебя скомпилил бут и вставку :) Проверил -работает !
бутлоадер для меги 8/8L на 1 МГц :
Вставка для boards.txt
Для новых версий ардуины потребуется ещё пару строк:
В них, в новых версиях, boards.txt нужно править не в папке с программой, а в юзерском профиле.. в общем найдёшь)
Joiner, ай яй яй........
dimax, спасибо.
Попробовал.....не получилось...Видима причина в другом :(
Упорно пишет: " Yikes! Invalid device signature.
Double check connections and try again, or use -F to
override this check."
Может сам микроконтроллер неисправный? Я не знаю как это проверить...
При подробном выводе говорит что сигнатура 00000000, одни нули.
P.S. Пробовал поиграть с Atmega 328 d DIP корпусе на макетке. Все прошло без особых проблем. Делал на частоту 1 мегагерц, 8 мегегерц от внутреннего генератора и 16 мегагерц от внешнего кварца. Использовар выше означенный калькулятор. Получились работоспособные МК, но по UART шился только с внешним кварцем на 16 мегагерц.
А прошитые на 1 и 8 мегагерц от внутреннего, через ISP скетчи заливались, а через UART категорически отказались, типа RESP 0X00.
Joiner, нет никакой инфы что б что-то понять.
Чем шьёшь, как? Считай фузы для начала, какие они? Какая строка запуска avrdude ?
Вот на всякий случай моя рабочая строчка:
avrdude.exe -p m8 -c usbasp -P usb -U flash:w:"R:\atmega8l.hex":a
....................................
avrdude.exe -p m8 -c usbasp -P usb -U flash:w:"R:\atmega8l.hex":a
Я пытаюсь прошить через ардуино UNO, ардуина как программатор
Joiner, ну ты даёшь! с 2014 года не нашёл полчаса что б разобраться с дудкой? Это же наше всё! Качай последнюю дуду дабы не лазать по папкам в ide, разархивируй оба файла в отдельную папку.
avrdude.exe -p m8 -c usbasp -P usb -скажет текущие фузы. Должно быть E:FF, H:DC, L:E1 Если не так, то зашей правильные:
avrdude.exe -p m8 -c usbasp -P usb -U lfuse:w:0xe1:m -U hfuse:w:0xdc:m -U lock:w:0x3f:m
Если зашились нормально, то кидай прошивку в папку с дудкой и зашивай бут:
avrdude.exe -p m8 -c usbasp -P usb -U flash:w:"atmega8l.hex":a
Если снова не ругалось, то микруха прошита и бут гарантированно рабочий. Если завопит про сигнатуру, ну тогда попробуй с ключом -F
Пример для USBASP разумеется
Я пытаюсь прошить через ардуино UNO, ардуина как программатор
Возможно в этом и проблема, без нормального программатора вобще не стоит подобными вещами заниматься.
.......................................
Пример для USBASP разумеется
Ок. Сейчас закажу программатор. dimax, кинь пожалуйста ссылочку, чтобы по ошибке не купить не то что надо. Я на ебее затариваюсь.
Спасибо.
Joiner, UNO в качестве программатора -г@вно. Пригоден для прошивки себе подобных (=мега328) Шаг влево шаг вправо -он уже не хочет шить или глючит. Покупай программатор USBASP. ( Обязательно с перемычкой для low-speed контроллеров.)
Joiner, UNO в качестве программатора -г@вно. Пригоден для прошивки себе подобных (=мега328) Шаг влево шаг вправо -он уже не хочет шить или глючит. Покупай программатор USBASP. ( Обязательно с перемычкой для low-speed контроллеров.)
Поискал, там всяких полно.....что брать не понимаю
Joiner, да нет у меня проверенной ссылочки. Я сам взял в своё время не правильный программатор, (без вывода джампера для low-speed) потом пришлось штудировать инет, вызванивать ноги, в конце-концов припаял соплю, заработало. Подозреваю, что если взять модель где много джамперов, то один их них возможно окажется нужным. Вот например как тут, возможно что нераспаянный JP3 это и есть нужный джампер. Но гарантировать не могу, по плате не видно. Должно идти на 25 ногу МК. Второй джампер скорее всего разрешение самопрошивки. Ну и последний подписан.
Joiner, да нет у меня проверенной ссылочки. Я сам взял в своё время не правильный программатор, (без вывода джампера для low-speed) потом пришлось штудировать инет, вызванивать ноги, в конце-концов припаял соплю, заработало. Подозреваю, что если взять модель где много джамперов, то один их них возможно окажется нужным. Вот например как тут, возможно что нераспаянный JP3 это и есть нужный джампер. Но гарантировать не могу, по плате не видно. Должно идти на 25 ногу МК. Второй джампер скорее всего разрешение самопрошивки. Ну и последний подписан.
Заказал такой http://www.ebay.com/itm/310506909410?_trksid=p2057872.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT
Не знаю угадал или нет :) В любом случае на что-нибудь сгодится.
Joiner, попробовал сейчас загрузить бутлоадер для меги8L через UNO - всё работает.
И так, снова попробуй считать без услуг arduino ide. Ком порт только свой ставь. Строчки, аналогичные #289, но для программатора UNO as ISP. Прочитать чип, фузы:
Если фузы не те, то команда на запись правильных:
avrdude.exe -p m8 -c stk500v1 -PCOM4 -b19200 -U lfuse:w:0xe1:m -U hfuse:w:0xdc:m
Команда записать бутлоадер:
avrdude.exe -p m8 -c stk500v1 -PCOM4 -b19200 -U flash:w:"atmega8l.hex":a
После этого я зашёл в Arduino IDE, выбрал в меню чип мега8L, и прошил "блинк", всё работает.
Joiner, попробовал всё работает.........
Эти строчки в командной строке Windows нужно писать?
Я попробовал, опять что-то не срастается :(
А ГДЕ
avrdude.exe -p m8 -c stk500v1 -PCOM4 -b19200 -U lfuse:w:0xe1:m -U hfuse:w:0xdc:m
вам же сказали в посте #289, скачать, разархивировать и положить все файлы в одну папку, у вас не хватает .conf файла
А ГДЕ
avrdude.exe -p m8 -c stk500v1 -PCOM4 -b19200 -U lfuse:w:0xe1:m -U hfuse:w:0xdc:m
вам же сказали в посте #289, скачать, разархивировать и положить все файлы в одну папку, у вас не хватает .conf файла
Может у меня просто дохлая атмега? Как в этом убедиться?