Конструктор Bootloader`а для Arduino

MaksMS
Offline
Зарегистрирован: 11.03.2013

Там просто определение опций - не более

Собрать могу, если время будет

osetroff
Offline
Зарегистрирован: 27.08.2014

MaksMS пишет:

Собрать могу, если время будет

После этой фразы вспомнил о Мужском движении.

Убил вечер, получил загрузчик, записывающий и считывающий и eeprom и flash:

Взял optiboot 5.0a в исходниках.

В arduino 1.5.8 разархивировал, получил

/hardware/tools/avr/optiboot

3. Чтоб не морочиться с путями, все нужное и ненужное накопировал в эту папку





03.04.2014  21:02           537я088 avr-addr2line.exe
03.04.2014  21:02           563я712 avr-ar.exe
03.04.2014  21:02           768я000 avr-as.exe
03.04.2014  22:43           672я768 avr-c++.exe
03.04.2014  21:02           535я552 avr-c++filt.exe
03.04.2014  22:43           671я744 avr-cpp.exe
03.04.2014  21:02            30я208 avr-elfedit.exe
03.04.2014  22:43           672я768 avr-g++.exe
03.04.2014  22:43           670я208 avr-gcc-4.8.1.exe
03.04.2014  22:43            23я552 avr-gcc-ar.exe
03.04.2014  22:43            23я552 avr-gcc-nm.exe
03.04.2014  22:43            23я552 avr-gcc-ranlib.exe
03.04.2014  22:43           670я208 avr-gcc.exe
03.04.2014  22:43           268я288 avr-gcov.exe
03.04.2014  21:02           602я112 avr-gprof.exe
03.04.2014  21:02         1я049я600 avr-ld.bfd.exe
03.04.2014  21:02         1я049я600 avr-ld.exe
03.04.2014  21:02           547я840 avr-nm.exe
03.04.2014  21:02           707я072 avr-objcopy.exe
03.04.2014  21:02           806я912 avr-objdump.exe
03.04.2014  21:02           563я712 avr-ranlib.exe
03.04.2014  21:02           346я112 avr-readelf.exe
03.04.2014  21:02           547я328 avr-size.exe
03.04.2014  21:02           537я600 avr-strings.exe
03.04.2014  21:02           707я072 avr-strip.exe
03.04.2014  23:12           379я392 avrdude.exe
04.04.2013  18:42             1я563 baudcheck.c
09.01.2015  09:47               575 baudcheck.tmp.sh
04.04.2013  18:42            34я011 boot.h
01.10.2014  17:21           103я453 cyggcc_s-1.dll
01.10.2014  17:21         1я008я654 cygiconv-2.dll
01.10.2014  17:21         3я113я398 cygwin1.dll
01.10.2014  17:21            74я269 cygz.dll
01.10.2014  17:23           898я048 libiconv2.dll
01.10.2014  17:23           101я888 libintl3.dll
03.04.2014  23:11            67я680 libusb0.dll
03.04.2014  23:12            12я288 loaddrv.exe
09.01.2015  01:13                32 m.bat
01.10.2014  17:23           175я104 make.exe
09.01.2015  00:29             7я505 Makefile
04.04.2013  18:42             2я640 Makefile.isp
09.01.2015  01:29            15я769 optiboot.c
04.04.2013  18:42            15я380 pin_defs.h
04.04.2013  18:42             1я636 stk500.h

В m.bat





make atmega328 BAUD_RATE=115200 SUPPORT_EEPROM=1

Файлы 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 $< $@

 

 

 

gppsoft
Offline
Зарегистрирован: 13.10.2014

В наличии две Atmega8... Один МК работает с UART на 8Mhz(внутренний), а второй нет. В чем может быть причина?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

в конструкторе нет возможности изменить скорость загрузки

не мог ли бы ты собрать бутлоадер c такими параметрами, по сути изменения только в скорости

a8_8MHz.name=atmega8 (8 MHz) 
a8_8MHz.upload.protocol=arduino 
a8_8MHz.upload.maximum_size=7680 
a8_8MHz.upload.speed=38400 
a8_8MHz.bootloader.low_fuses=0xa4 
a8_8MHz.bootloader.high_fuses=0xdc 
a8_8MHz.bootloader.path=optiboot 
a8_8MHz.bootloader.file=a8_8MHz_a4_dc.hex 
a8_8MHz.build.mcu=atmega8 
a8_8MHz.build.f_cpu=8000000L 
a8_8MHz.build.core=arduino 
a8_8MHz.build.variant=standard 

 

osetroff
Offline
Зарегистрирован: 27.08.2014

jeka_tm пишет:

в конструкторе нет возможности изменить скорость загрузки

не мог ли бы ты собрать бутлоадер c такими параметрами, по сути изменения только в скорости

А в чем проблема один раз сделать для себя сборщик bootloader так, как я описывал выше и всегда делать себе любой загрузчик?

Все необходимое есть в папках с IDE arduino.

Вчера попробовал собрать для скорости 230400 и поддержкой eeprom для atrmega328p - все работает!

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну раз так просто может выложишь куда нибудь архив, а я поправлю  скорость и скомпилирую

я пробовал. не получилось

osetroff
Offline
Зарегистрирован: 27.08.2014

jeka_tm пишет:

ну раз так просто может выложишь куда нибудь архив, а я поправлю  скорость и скомпилирую

я пробовал. не получилось

Я не в городе живу, инет не быстрый.

Просто повтори то, что я в посте сделал - это же минут 20ть всего уйдет.

И опиши, что не получилось.

У меня pro mini 5V 16Mhz.

Если под него bootloader на разную скорость нужно - скинь в личку почту свою - вышлю.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

мне нужен один бутлоадер: optiboot для меги8 для скорости uart 38400/ это все. пробовал. накидал файлов. запустил батник. он выдал ошибку что не знает комманду make

также пробовал в codevision скомпилировать, но тоже не получилось. не разобрался что сделать чтобы заработало

проще будет если просто соберешь

jeka_tm@mail.ru

кстати работать на внутреннем генераторе, частота 8мгц

короче как бутлоадер на 115200 но на скорость 38400

osetroff
Offline
Зарегистрирован: 27.08.2014

jeka_tm пишет:

мне нужен один бутлоадер: optiboot для меги8 для скорости uart 38400/ это все. пробовал. накидал файлов. запустил батник. он выдал ошибку что не знает комманду make

Раз не знает, значит не все файлы скопировал в каталог optiboot.

Я же приложил листинг каталога, make легко найти в подкаталогах arduino и скопировать в optiboot.

На шару не прокатит. Надо внимательно и шаг за шагом.

jeka_tm пишет:

проще будет если просто соберешь

Совсем просто - это игнорировать.

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

у тебя бы это заняло меньше минуты, поэтому и попросил

я не планирую каждый день делать бутлоадеры

но я сделал что то. файла hex в папке не появилось

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

изменил в makefile частоту для меги8 на 8000000 получил следующее. hex так и нет. зато появился elf

собирать я так понял не будешь? хочешь чтобы я сам научился?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

помогите новичку

плиззз. ну или хотя бы что должно быть в m.bat

я пробовал по разному

make atmega8  BAUD_RATE=38400
make atmega8 AVR_FREQ=8000000L BAUD_RATE=38400 LED=D0
make atmega8 AVR_FREQ=8000000L BAUD_RATE=38400

кстати постоянно вылетает LD.exe с ошибкой

osetroff
Offline
Зарегистрирован: 27.08.2014

Все правильно делаешь, только это нужно делать на чистой установке.

Т.е. загружаешь свежее arduino 1.5.8, ставишь, копируешь из подкаталогов все указанные мною в посте файлы в один каталог и пускаешь make.

У меня в командной строке: make atmega328 BAUD_RATE=230400 SUPPORT_EEPROM=1

Удобно делать в вирт машине, например в vmware player ставишь xp и там экспериментируешь.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

так должна быть 1.5.8?

я на 1.0.6 пробовал

и кстати windows7

хорошо попробую на вирт машине xp накатить и проверить

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

накатил виртуальную машину. чистую ардуину идэ. и обе версии: 1.5.8 и 1.0.6. и что толкьо не делал

и нифига. ошибки также сыпятся. нахрен. больше не буду даже больше пытаться. цель перестала оправдывать средства

osetroff а ты больше похож на садиста

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

нашел бутлоадер в инете на скорость 38400, правда не optiboot и занимает 1к памяти

как и предполагалось работает программирование через uart при 3.3в питания, и теперь не нужно гордить 2 питания: для микроконтроллера и nrf24l01 или дисплея

nkk
nkk аватар
Offline
Зарегистрирован: 18.03.2016

Спасибо за проект.

Внезапным для меня оказался фьюз изменения BOD6 у меня 2.7, Ваш генератор предложил 1.8.

Не понятно, как добавлять в boards.txt: архитектура изменилась.

Joiner
Offline
Зарегистрирован: 04.09.2014

Почитал тему, захотелось попробовать поиграться с 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 мегагерц запустить!
Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Joiner пишет:

Результат:

avrdude: Yikes!  Invalid device signature.
         Double check connections and try again, or use -F to override

Эта ошибка никак не связана с бутлоадером и уже много раз обсуждалась, надо было просто погуглить. В файле avrdude.conf для выбранного микроконтроллера неправильно указана сигнатура. Она не совпадает с той, которая считывается из МК. Ну или бывает вообще не считывается, вместо сигнатуры сплошные нули. Тогда это проблема с соединением.

Joiner пишет:

Прочитал это и тоже ни чего не понимаю. Что такое "use -F override" ?

Это ключ для командной строки вызова avrdude, чтобы игнорировать ошибку.

Joiner
Offline
Зарегистрирован: 04.09.2014

[quote=Jeka_M............Это ключ для командной строки вызова avrdude, чтобы игнорировать ошибку.[/quote]

Спасибо.

А как эту avrdude вызвать и куда вставлять ключ?

Проверил, может что с платой. Тестером в режиме проверки диодов прозвонил на землю все выводы, и цифровые и аналоговые. Все показвают 0.9в. Вроде ни чего не замкнуто и не оборвано

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Joiner пишет:

А как эту avrdude вызвать и куда вставлять ключ?

Вы не стого боку заходите, сначала надо с сигнатурой разобраться, не нужен пока этот ключ.

Avrdude - это консольная утилита для прошивки микроконтроллера, Arduino IDE после компиляции прошивки вызывает эту утилиту с параметрами. Находится она тут: <корень иде>\hardware\tools\avr\bin\avrdude.exe, конфигурационный файл: <корень иде>\hardware\tools\avr\etc\avrdude.conf

Сначала нужно посмотреть, какая сигнатура читается. Для этого в настройках IDE включите подробный вывод при загрузке.

Справка по ключам для командной строки avrdude

Joiner
Offline
Зарегистрирован: 04.09.2014

Jeka_M пишет:

Joiner пишет:

А как эту avrdude вызвать и куда вставлять ключ?

Вы не стого боку заходите, сначала надо с сигнатурой разобраться, не нужен пока этот ключ.

Avrdude - это консольная утилита для прошивки микроконтроллера, Arduino IDE после компиляции прошивки вызывает эту утилиту с параметрами. Находится она тут: <корень иде>\hardware\tools\avr\bin\avrdude.exe, конфигурационный файл: <корень иде>\hardware\tools\avr\etc\avrdude.conf

Сначала нужно посмотреть, какая сигнатура читается. Для этого в настройках IDE включите подробный вывод при загрузке.

Справка по ключам для командной строки avrdude

Большое спасибо! Пошел грызть гранит...Попробую разобраться.

Не знаю что и делать....Так и пишет "инвалид сигнатура". Может кто знает куда копнуть, как узнать где проблемма?

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Joiner пишет:

Не знаю что и делать....Так и пишет "инвалид сигнатура". Может кто знает куда копнуть, как узнать где проблемма?

Ну я же расписал всё выше... В настройках IDE включаете подробный вывод при загрузке. Собственно при попытке загрузки внизу на черном фоне возле сообщения об ошибке будет написана сигнатура, которая считалась. Она не должна состоять из нулей и должна совпадать с сигнатурой, которая записана в avrdude.conf для этого микроконтроллера. Что не понятно?

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Я вот сейчас специально проверил и указал неправильную сигнатуру для Atmega328P в avrdude.conf, оно мне выдало такие строки:

avrdude: Device signature = 0x1e950f
avrdude: Expected signature for ATMEGA328P is 1E 95 00
         Double check chip, or use -F to override this check.
 
Вот и ищите подобное сообщение об ошибке при включённом подробном выводе при загрузке.
 
У вас может быть так: avrdude: Device signature = 0x000000 или какие-то другие цифры.
Joiner
Offline
Зарегистрирован: 04.09.2014

Включил подробный вывод, вот что получил

C:\Users\Sergey\Documents\Arduino\ARDUINO_1_0_5\arduino-1.0.5-r2\hardware/tools/avr/bin/avrdude -CC:\Users\Sergey\Documents\Arduino\ARDUINO_1_0_5\arduino-1.0.5-r2\hardware/tools/avr/etc/avrdude.conf -v -v -v -v -patmega8 -cstk500v1 -P\\.\COM7 -b19200 -e -Uhfuse:w:0xdc:m -Ulfuse:w:0xa1:m 

avrdude: Version 5.11, compiled on Sep  2 2011 at 19:38:36
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2009 Joerg Wunsch

         System wide configuration file is "C:\Users\Sergey\Documents\Arduino\ARDUINO_1_0_5\arduino-1.0.5-r2\hardware/tools/avr/etc/avrdude.conf"

         Using Port                    : \\.\COM7
         Using Programmer              : stk500v1
         Overriding Baud Rate          : 19200
avrdude: Send: 0 [30]   [20] 
avrdude: Send: 0 [30]   [20] 
avrdude: Send: 0 [30]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 
         AVR Part                      : ATMEGA8
         Chip Erase delay              : 10000 us
         PAGEL                         : PD7
         BS2                           : PC2
         RESET disposition             : dedicated
         RETRY pulse                   : SCK
         serial program mode           : yes
         parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         ByteDelay                     : 0
         PollIndex                     : 3
         PollValue                     : 0x53
         Memory Detail                 :

                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom         4    20   128    0 no        512    4      0  9000  9000 0xff 0xff
                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           flash         33    10    64    0 yes      8192   64    128  4500  4500 0xff 0x00
                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           lfuse          0     0     0    0 no          1    0      0  2000  2000 0x00 0x00
                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           hfuse          0     0     0    0 no          1    0      0  2000  2000 0x00 0x00
                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           lock           0     0     0    0 no          1    0      0  2000  2000 0x00 0x00
                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           calibration    0     0     0    0 no          4    0      0     0     0 0x00 0x00
                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

         Programmer Type : STK500
         Description     : Atmel STK500 Version 1.x firmware
avrdude: Send: A [41] . [80]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [02] 
avrdude: Recv: . [10] 
avrdude: Send: A [41] . [81]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [01] 
avrdude: Recv: . [10] 
avrdude: Send: A [41] . [82]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [12] 
avrdude: Recv: . [10] 
avrdude: Send: A [41] . [98]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [00] 
avrdude: Recv: . [10] 
         Hardware Version: 2
         Firmware Version: 1.18
         Topcard         : Unknown
avrdude: Send: A [41] . [84]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [00] 
avrdude: Recv: . [10] 
avrdude: Send: A [41] . [85]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [00] 
avrdude: Recv: . [10] 
avrdude: Send: A [41] . [86]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [00] 
avrdude: Recv: . [10] 
avrdude: Send: A [41] . [87]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [00] 
avrdude: Recv: . [10] 
avrdude: Send: A [41] . [89]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [00] 
avrdude: Recv: . [10] 
         Vtarget         : 0.0 V
         Varef           : 0.0 V
         Oscillator      : Off
         SCK period      : 0.1 us

avrdude: Send: A [41] . [81]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [01] 
avrdude: Recv: . [10] 
avrdude: Send: A [41] . [82]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [12] 
avrdude: Recv: . [10] 
avrdude: Send: B [42] p [70] . [00] . [00] . [01] . [01] . [01] . [01] . [02] . [ff] . [00] . [ff] . [ff] . [00] @ [40] . [02] . [00] . [00] . [00]   [20] . [00]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 
avrdude: Send: E [45] . [05] . [04] . [d7] . [c2] . [00]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 
avrdude: Send: P [50]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 
avrdude: AVR device initialized and ready to accept instructions

Reading | avrdude: Send: V [56] 0 [30] . [00] . [00] . [00]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [00] 
avrdude: Recv: . [10] 
avrdude: Send: V [56] 0 [30] . [00] . [01] . [00]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [00] 
avrdude: Recv: . [10] 
################avrdude: Send: V [56] 0 [30] . [00] . [02] . [00]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [00] 
avrdude: Recv: . [10] 
################################## | 100% 0.06s

avrdude: Device signature = 0x000000
avrdude: Yikes!  Invalid device signature.
         Double check connections and try again, or use -F to override
         this check.

avrdude: Send: Q [51]   [20] 
avrdude: Recv: . [14] 
avrdude: Recv: . [10] 

avrdude done.  Thank you.

Если объясните, что это означает, буду очень благодарен. Сам я в этих записях ни чего не понимаю.

Спасибо, что откликнулись на мою проблему.

Joiner
Offline
Зарегистрирован: 04.09.2014

Попробовал зашить откалькулированный загрузчик на Atmega 328. Хотел на 1 ьегагерц, но калькулятор позволяет только 8 мегагерц от внутреннего генератора.

Первая попытка не увенчалась успехом, т.к. атмега была с загрузчиком и на кварц 16 мегагерц. Подсунул ей кварц, все получилось. Через ISP записал Blink, все нормальгно, моргет раз в секунду. Прошил загрузчик на 8 мегагерц снова и попробовал загрузить Blink через TX, RX. Подключил DTR...и хрен вам. Респ 0Х00.

Короче получилось, но совсем не совсем.....

Joiner
Offline
Зарегистрирован: 04.09.2014

Крик вопиющего в пустыне. Знатоки, подскажите... Я так понимаю, что загрузчик нужен для загрузки через UART.

Но получается, что загрузчик работает только на стандартных для Ардуино частотах. В других случаях придется заливать скетчи через ISP? Получается что калькулятор служит лишь для правильного выставления фьюзов.

Я правильно понял?

MaksMS
Offline
Зарегистрирован: 11.03.2013

Конструктор позволяет задать любую частоту, 1мгц на внутреннем генераторе достигается включением 8 мгц и включением делителя на 8.

Joiner
Offline
Зарегистрирован: 04.09.2014

MaksMS пишет:

Конструктор позволяет задать любую частоту, 1мгц на внутреннем генераторе достигается включением 8 мгц и включением делителя на 8.

Да с частотой примерно понятно... У меня получилось записать загрузчик на Atmegy 328 на частоту от внутреннего кварца 8 мегагерц. Но залить в нее скетч через UART не удалось.....только через ISP. Это на самом деле невозможно, или это мои кривые руки?

Потом переписав на загрузчик от UNO (Atmega 328 16m), проверил, льется через UART без проблем.

В любом случае присоединяюсь к людям, которые сказали спасибо за Ваш труд. Теперь даже такой дремучий новичок, как я, сможет настроить МК на нужную частоту.

Спасибо.

P.S. Еще один вопрос. Подскажите, пожалуйста, возможно ли лить скетчи через UART, например, в Atmega 8 int 1mhz ?

MaksMS
Offline
Зарегистрирован: 11.03.2013

На 1 мгц скорость уарт должна быть очень низкая, эта скорость указывается при генерации кода в боард.тхт. Работать должно, но конструктор сейчас для меня не актуален и по этому все его возможности не протестированы.

Joiner
Offline
Зарегистрирован: 04.09.2014

MaksMS пишет:

На 1 мгц скорость уарт должна быть очень низкая, эта скорость указывается при генерации кода в боард.тхт. Работать должно, но конструктор сейчас для меня не актуален и по этому все его возможности не протестированы.

Спасибо. Будем экспериментировать.

Жаль, что конструктор не актуален....Как я понял, многие им пользуются

MaksMS
Offline
Зарегистрирован: 11.03.2013

Прогрес не стоит на месте, смысла в ардуинах на атмегах 16мгц сейчас не вижу. Уже есть ESP8266 , где проц значительно мощнее и писать код так же можно как в ардуино получая сразу wi-fi интерфейс. У меня проект вообще не использует ардуино IDE и работает на чистом Си и имеет огромный функционал по сравнению с ардуинами..

PS. конструктор временно не работает, будет работать скорее всего только вечером.

Joiner
Offline
Зарегистрирован: 04.09.2014

Понял, спасибо.

Joiner
Offline
Зарегистрирован: 04.09.2014

Короче, эту гребаную Atmega8L я не победил :( Так и не понял, что ей не хватает, и что означает сигнатура 00000.

На помойку ее .......

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Joiner, ай яй яй, а как же добиваться своего?)

 Для тебя скомпилил бут и вставку :) Проверил -работает !

бутлоадер для меги 8/8L на 1 МГц :

:101E000011248FE594E09EBF8DBF84B714BE81FF7F
:101E1000E2D085E08EBD82E08BB988E18AB986E8A0
:101E200080BD8CE089B98EE0C2D0BD9A96E023ECEB
:101E30003FEF54E040E23DBD2CBD58BF08B602FE66
:101E4000FDCF88B3842788BBA8959150A1F7CC24F7
:101E5000DD2488248394B5E0AB2EA1E19A2EF3E033
:101E6000BF2E9ED0813461F49BD0082FA4D00238BD
:101E700011F0013811F484E001C083E08DD089C0F5
:101E8000823411F484E103C0853419F485E09BD0D9
:101E900080C0853579F484D0E82EFF2481D0082FC6
:101EA00010E0102F00270E291F29000F111F83D0CB
:101EB00068016FC0863521F484E085D080E0DECFF4
:101EC000843609F040C06CD06BD0082F69D080E018
:101ED000C81688E1D80618F4F601B7BEE895C0E048
:101EE000D1E05ED089930C17E1F7F0E0CF16F8E16E
:101EF000DF0618F0F601B7BEE8955DD007B600FC26
:101F0000FDCFA601A0E0B1E02C9130E011968C91BC
:101F1000119790E0982F8827822B932B1296FA0125
:101F20000C0187BEE89511244E5F5F4FF1E0A034AD
:101F3000BF0751F7F601A7BEE89507B600FCFDCF35
:101F400097BEE89526C08437B1F42AD029D0F82E60
:101F500027D031D0F601EF2C8F010F5F1F4F8491F6
:101F60001BD0EA94F801C1F70894C11CD11CFA9463
:101F7000CF0CD11C0EC0853739F41DD08EE10CD0AA
:101F800083E90AD087E07ACF813511F488E00FD059
:101F900012D080E101D065CF5D9BFECF8CB9089552
:101FA0005F9BFECF5C9901C0A8958CB1089598E124
:101FB00091BD81BD0895F4DF803219F088E0F7DF2C
:101FC000FFCF84E1E9CF1F93182FEADF1150E9F723
:101FD000F2DF1F91089580E0EADFEE27FF270994E2
:021FFE000404D9
:0400000300001E00DB
:00000001FF

 

Вставка для boards.txt

###############################################################
atmega8l.name=ATMega8L 1MHz int osc

atmega8l.upload.protocol=arduino
atmega8l.upload.maximum_size=7680
atmega8l.upload.speed=9600

atmega8l.bootloader.low_fuses=0xe1
atmega8l.bootloader.high_fuses=0xcc
atmega8l.bootloader.path=atmega8
atmega8l.bootloader.file=atmega8l.hex
atmega8l.bootloader.unlock_bits=0x3F
atmega8l.bootloader.lock_bits=0x0F

atmega8l.build.mcu=atmega8
atmega8l.build.f_cpu=1000000L
atmega8l.build.core=arduino
atmega8l.build.variant=standard

Для новых версий ардуины потребуется ещё пару строк:

atmega8l.build.board=AVR_NG
atmega8l.upload.tool=avrdude

В них, в новых версиях,  boards.txt нужно править не в папке с программой, а в юзерском профиле.. в общем найдёшь)

 

Joiner
Offline
Зарегистрирован: 04.09.2014

dimax пишет:

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.                 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Joiner,  нет никакой инфы что б что-то понять.

Чем шьёшь, как? Считай фузы для начала, какие они?  Какая строка запуска avrdude ?

Вот на всякий случай моя рабочая строчка:

avrdude.exe -p m8 -c usbasp -P usb -U flash:w:"R:\atmega8l.hex":a

 

Joiner
Offline
Зарегистрирован: 04.09.2014

dimax пишет:

....................................

avrdude.exe -p m8 -c usbasp -P usb -U flash:w:"R:\atmega8l.hex":a

А что это за строчка? Где ее писать? Как прочитать фьюзы?

Я пытаюсь прошить через ардуино UNO, ардуина как программатор

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

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 разумеется

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Joiner пишет:

Я пытаюсь прошить через ардуино UNO, ардуина как программатор

Возможно в этом и проблема, без нормального программатора вобще не стоит подобными вещами заниматься.

Joiner
Offline
Зарегистрирован: 04.09.2014

dimax пишет:

.......................................

Пример для USBASP разумеется

Разархивировал...попробовал запустить.. не запустилось. Я так понял, это для USBASP программатора? Сообщение системы что на моем компе отсутствует libusb0.dll , запуск невозможен

Ок. Сейчас закажу программатор. dimax, кинь пожалуйста ссылочку, чтобы по ошибке не купить не то что надо. Я на ебее затариваюсь.

Спасибо.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Joiner, UNO в качестве программатора -г@вно. Пригоден для прошивки себе подобных (=мега328)  Шаг влево шаг вправо -он уже не хочет шить или глючит. Покупай программатор USBASP. ( Обязательно с перемычкой для low-speed контроллеров.)

Joiner
Offline
Зарегистрирован: 04.09.2014

dimax пишет:

Joiner, UNO в качестве программатора -г@вно. Пригоден для прошивки себе подобных (=мега328)  Шаг влево шаг вправо -он уже не хочет шить или глючит. Покупай программатор USBASP. ( Обязательно с перемычкой для low-speed контроллеров.)

А ссылочку бы..... пожалуйста.

Поискал, там всяких полно.....что брать не понимаю

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Joiner, да нет у меня проверенной ссылочки. Я сам взял в своё время не правильный программатор, (без вывода джампера для low-speed) потом пришлось штудировать инет, вызванивать ноги, в конце-концов припаял соплю, заработало. Подозреваю, что если взять модель где много джамперов, то один их них возможно окажется нужным. Вот например как тут, возможно что нераспаянный JP3 это и есть нужный джампер. Но гарантировать не могу, по плате не видно. Должно идти на 25 ногу МК. Второй джампер скорее всего разрешение самопрошивки. Ну и последний подписан.

Joiner
Offline
Зарегистрирован: 04.09.2014

dimax пишет:

Joiner, да нет у меня проверенной ссылочки. Я сам взял в своё время не правильный программатор, (без вывода джампера для low-speed) потом пришлось штудировать инет, вызванивать ноги, в конце-концов припаял соплю, заработало. Подозреваю, что если взять модель где много джамперов, то один их них возможно окажется нужным. Вот например как тут, возможно что нераспаянный JP3 это и есть нужный джампер. Но гарантировать не могу, по плате не видно. Должно идти на 25 ногу МК. Второй джампер скорее всего разрешение самопрошивки. Ну и последний подписан.

Спасибо. Попробую разобраться.

Joiner
Offline
Зарегистрирован: 04.09.2014

Заказал такой  http://www.ebay.com/itm/310506909410?_trksid=p2057872.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT

Не знаю угадал или нет :) В любом случае на что-нибудь сгодится.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Joiner, попробовал сейчас загрузить бутлоадер для меги8L  через UNO - всё работает.

И так, снова попробуй считать без услуг arduino ide. Ком порт только свой ставь.  Строчки, аналогичные #289, но для программатора UNO as ISP.  Прочитать чип, фузы:

R:\dude>avrdude.exe -p m8 -c stk500v1 -PCOM4 -b19200
avrdude.exe: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.03s
avrdude.exe: Device signature = 0x1e9307 (probably m8)
avrdude.exe: safemode: Fuses OK (E:FF, H:CC, L:E1)
avrdude.exe done.  Thank you.

Если фузы не те, то команда на запись правильных:

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
Offline
Зарегистрирован: 04.09.2014

dimax пишет:

Joiner, попробовал всё работает.........

dimax, извини меня за дремучесть в этом вопросе.

Эти строчки в командной строке Windows нужно писать?

Я попробовал, опять что-то не срастается :(

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

А ГДЕ

avrdude.exe -p m8 -c stk500v1 -PCOM4 -b19200   -U lfuse:w:0xe1:m -U hfuse:w:0xdc:m

вам же сказали в посте #289, скачать, разархивировать и положить все файлы в одну папку, у вас не хватает .conf файла

Joiner
Offline
Зарегистрирован: 04.09.2014

Valera19701 пишет:

А ГДЕ

avrdude.exe -p m8 -c stk500v1 -PCOM4 -b19200   -U lfuse:w:0xe1:m -U hfuse:w:0xdc:m

вам же сказали в посте #289, скачать, разархивировать и положить все файлы в одну папку, у вас не хватает .conf файла

Сделал, все нашлось, но прошить не удается. Чего не так не понимаю

Может у меня просто дохлая атмега? Как в этом убедиться?