آردوینو سخت افزار میکروکنترلر AVR

آموزش برنامه نویسی AVR با استفاده از بوت لودر و نرم افزار آردوینو

programming-avr-with-arduino-ide-and-bootloader-digispark-
نوشته شده توسط علی زاهدی

در واقع بوت لودر فایل هگزی بر روی میکروکنترلر می باشد که این اجازه را به ما میدهد تا پس از روشن شدن میکروکنترلر بتوان از طریق درگاه UART میکروکنترلر را پروگرام کنیم. این شبیه به BIOS است که بر روی کامپیوتر اجرا می شود. در این آموزش قصد داریم تا بوت لودر آردوینو را بر روی میکروکنترلر Atmega8 انتقال دهیم و سپس با استفاده از مبدل USB to TTL و نرم افزار Arduino IDE میکروکنترلر Atmega8 را پروگرام کنیم. در ادامه با مرجع تخصصی بردهای امبدد به زبان فارسی، دیجی اسپارک همراه باشید.

 


انتقال بوت لودر به میکروکنترلر Atmega8


ابتدا مدار را طبق نقشه زیر بر روی بِردبُرد ببندید و سپس کد را بر روی برد آردوینو آپلود کنید. با این کار بوت لودر بر روی میکروکنترلر منتقل می‌شود. سریال مانیتور را باز کنید تا از اینکه بوت لودر به طور صحیح انتقال یافته و هیچ خطایی وجود ندارد مطمئن شوید.

 

کدهای زیر مخصوص بوت لودر برای آی سی میکرو هستند. کافیست یکبار روی آی سی آپلود شوند. پس از آن امکان پروگرام کردن تراشه‌های میکروکنترلر با مبدل USB to TTL وجود دارد. بنابراین کدهای زیر را کپی کرده و بر روی برد آردوینو آپلود کنید. کتابخانه optiLoader.h را همراه با کد زیر میتوانید از لینک دانلود فرمایید.

// optiLoader.pde
//
// this sketch allows an Arduino to program Optiboot onto any other
// Arduino-like device containing ATmega8, ATmega168, or ATmega328
// microcontroller chips.
//
// Copyright (c) 2011, 2015 by Bill Westfield ("WestfW")

//-------------------------------------------------------------------------------------
// "MIT Open Source Software License":
// Permission is hereby granted, free of charge, to any person obtaining a copy of
// this software and associated documentation files (the "Software"), to deal in the
// Software without restriction, including without limitation the rights to use, copy,
// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
// and to permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//-------------------------------------------------------------------------------------

//
// this sketch allows an Arduino to program Optiboot onto any other
// Arduino-like device containing ATmega8, ATmega168, or ATmega328
// microcontroller chips.
//
// It is based on AVRISP
//
// Designed to connect to a generic programming cable,
// using the following pins:
// ۱۰: slave reset
// ۱۱: MOSI
// ۱۲: MISO
// ۱۳: SCK
//  ۹: Power to external chip.
//     This is a little questionable, since the power it is legal to draw
//     from a PIC pin is pretty close to the power consumption of an AVR
//     chip being programmed.  But it permits the target to be entirely
//     powered down for safe reconnection of the programmer to additional
//     targets, and it seems to work for most Arduinos.  If the target board
//     contains additional circuitry and is expected to draw more than 40mA,
//     connect the target power to a stronger source of +5V.  Do not use pin
//     ۹ to power more complex Arduino boards that draw more than 40mA, such
//     as the Arduino Uno Ethernet !
//
// If the aim is to reprogram the bootloader in one Arduino using another
// Arudino as the programmer, you can just use jumpers between the connectors
// on the Arduino board.  In this case, connect:
// Pin 13 to Pin 13
// Pin 12 to Pin 12
// Pin 11 to Pin 11
// Pin 10 (of "programmer") to RESET (of "target" (on the "power" connector))
// +۵V to +5V and GND to GND.  Only the "programmer" board should be powered
//     by USB or external power.
//
// ----------------------------------------------------------------------

// The following credits are from AVRISP.  It turns out that there isn't
// a lot of AVRISP left in this sketch, but probably if AVRISP had never
// existed,  this sketch would not have been written.
//
// October 2009 by David A. Mellis
// - Added support for the read signature command
//
// February 2009 by Randall Bohn
// - Added support for writing to EEPROM (what took so long?)
// Windows users should consider WinAVR's avrdude instead of the
// avrdude included with Arduino software.
//
// January 2008 by Randall Bohn
// - Thanks to Amplificar for helping me with the STK500 protocol
// - The AVRISP/STK500 (mk I) protocol is used in the arduino bootloader
// - The SPI functions herein were developed for the AVR910_ARD programmer
// - More information at http://code.google.com/p/mega-isp


#include <avr/pgmspace.h>
#include "optiLoader.h"

char Arduino_preprocessor_hint;

/*
   Pins to target
*/
#define SCK 13
#define MISO 12
#define MOSI 11
#define RESET 10
#define POWER 9

// STK Definitions; we can still use these as return codes
#define STK_OK 0x10
#define STK_FAILED 0x11


// Useful message printing definitions
#define fp(string) flashprint(PSTR(string));
#define debug(string) // flashprint(PSTR(string));
#define error(string) flashprint(PSTR(string));

// Forward references
void pulse(int pin, int times);
void read_image(const image_t *ip);

// Global Variables

/*
   Table of defined images
*/
const image_t * images[] = {
  &image_328, &image_328p, &image_168, &image_8, 0
};

/*
   Table of "Aliases."  Chips that are effectively the same as chips
   that we have a bootloader for.  These work by simply overriding the
   signature read with the signature of the chip we "know."
*/
const alias_t aliases[] = {
  { "ATmega168PA", 0x940B, 0x9406 },	/* Treat 168P same as 168 */
  { "ATmega168PB", 0x9415, 0x9406 },	/* Treat 168PB same as 168 */
  { "ATmega328PB", 0x9516, 0x950F },	/* Treat 328PB same as 328P */
  { "ATmega328",   0x9514, 0x950F },	/* Treat 328 same as 328P */
};

int pmode = 0;
// address for reading and writing, set by 'U' command
int here;

uint16_t target_type = 0;		/* type of target_cpu */
uint16_t target_startaddr;
uint8_t target_pagesize;       /* Page size for flash programming (bytes) */
uint8_t *buff;

const image_t *target_flashptr; 	       /* pointer to target info in flash */
uint8_t target_code[512];	       /* The whole code */

void setup (void) {
  Serial.begin(19200); 			/* Initialize serial for status msgs */
  pinMode(13, OUTPUT); 			/* Blink the pin13 LED a few times */
#ifdef PIN_SPI_SS
#if PIN_SPI_SS != RESET
  // on non-AtmegaXX8 boards (MEGA, Leonardo, etc) the SPI SS pin is NOT pin 10,
  // and although SS is driven manually (RESET to the target), SS should not be
  // allowed to default to INPUT and floating, or the SPI hardware may decide that
  // some other SPI master is trying to use the bus.  (See Datasheet SS description.)
  pinMode(PIN_SPI_SS, INPUT_PULLUP);
#endif
#endif
  pulse(13, 20);
}

void loop (void) {
  fp("\nOptiLoader Bootstrap programmer.\n2011 by Bill Westfield (WestfW)\n\n");
  if (target_poweron()) {		/* Turn on target power */
    do {
      if (!target_identify()) 		/* Figure out what kind of CPU */
        break;
      if (!target_findimage())		/* look for an image */
        break;
      if (!target_progfuses())		/* get fuses ready to program */
        break;
      if (!target_program()) 		/* Program the image */
        break;
      (void) target_normfuses(); 	/* reset fuses to normal mode */
    }
    while (0);
  }
  else {
    Serial.println();
  }
  target_poweroff(); 			/* turn power off */

  fp ("\nType 'G' or hit RESET for next chip\n")
  while (1) {
    if (Serial.read() == 'G')
      break;
  }
}

/*
   Low level support functions
*/

/*
   flashprint
   print a text string direct from flash memory to Serial
*/
void flashprint (const char p[])
{
  uint8_t c;
  while (0 != (c = pgm_read_byte(p++))) {
    Serial.write(c);
  }
}

/*
   hexton
   Turn a Hex digit (0..9, A..F) into the equivalent binary value (0-16)
*/
uint8_t hexton (uint8_t h)
{
  if (h >= '0' && h <= '9')
    return (h - '0');
  if (h >= 'A' && h <= 'F')
    return ((h - 'A') + 10);
  error("Bad hex digit!");
  return (0);
}

/*
   pulse
   turn a pin on and off a few times; indicates life via LED
*/
#define PTIME 30
void pulse (int pin, int times) {
  do {
    digitalWrite(pin, HIGH);
    delay(PTIME);
    digitalWrite(pin, LOW);
    delay(PTIME);
  }
  while (times--);
}

/*
   spi_init
   initialize the AVR SPI peripheral
*/
void spi_init (void) {
  uint8_t x;
  SPCR = 0x53;  // SPIE | MSTR | SPR1 | SPR0
  x = SPSR;
  x = SPDR;
}

/*
   spi_wait
   wait for SPI transfer to complete
*/
void spi_wait (void) {
  debug("spi_wait");
  do {
  }
  while (!(SPSR & (1 << SPIF)));
}

/*
   spi_send
   send a byte via SPI, wait for the transfer.
*/
uint8_t spi_send (uint8_t b) {
  uint8_t reply;
  SPDR = b;
  spi_wait();
  reply = SPDR;
  return reply;
}


/*
   Functions specific to ISP programming of an AVR
*/

/*
   target_identify
   read the signature bytes (if possible) and check whether it's
   a legal value (atmega8, atmega168, atmega328)
*/

boolean target_identify ()
{
  boolean result;
  target_type = 0;
  fp("\nReading signature:");
  target_type = read_signature();
  if (target_type == 0 || target_type == 0xFFFF) {
    fp(" Bad value: ");
    result = false;
  }
  else {
    result = true;
  }
  Serial.println(target_type, HEX);
  if (target_type == 0) {
    fp("  (no target attached?)\n");
  }
  return result;
}

unsigned long spi_transaction (uint8_t a, uint8_t b, uint8_t c, uint8_t d) {
  uint8_t n, m;
  spi_send(a);
  n = spi_send(b);
  //if (n != a) error = -1;
  m = spi_send(c);
  return 0xFFFFFF & ((((uint32_t)n) << 16) + (m << 8) + spi_send(d));
}

uint16_t start_pmode () {
  uint16_t result;

  pinMode(13, INPUT); // restore to default
  spi_init();
  debug("...spi_init done");
  // following delays may not work on all targets...
  pinMode(RESET, OUTPUT);
  digitalWrite(RESET, HIGH);
  pinMode(SCK, OUTPUT);
  digitalWrite(SCK, LOW);
  delay(50);
  digitalWrite(RESET, LOW);
  delay(50);
  pinMode(MISO, INPUT);
  pinMode(MOSI, OUTPUT);
  debug("...spi_transaction");
  result = spi_transaction(0xAC, 0x53, 0x00, 0x00);
  debug("...Done");
  pmode = 1;
  return result;
}

void end_pmode (void) {
  SPCR = 0; 				/* reset SPI */
  digitalWrite(MISO, 0); 		/* Make sure pullups are off too */
  pinMode(MISO, INPUT);
  digitalWrite(MOSI, 0);
  pinMode(MOSI, INPUT);
  digitalWrite(SCK, 0);
  pinMode(SCK, INPUT);
  digitalWrite(RESET, 0);
  pinMode(RESET, INPUT);
  pmode = 0;
}

/*
   read_image

   Read an intel hex image from a string in pgm memory.
   We assume that the image does not exceed the 512 bytes that we have
   allowed for it to have.  that would be bad.
   Also read other data from the image, such as fuse and protecttion byte
   values during programming, and for after we're done.
*/
void read_image (const image_t *ip)
{
  uint16_t len, totlen = 0, addr;
  const char *hextext = &ip->image_hexcode[0];
  target_startaddr = 0;
  target_pagesize = pgm_read_byte(&ip->image_pagesize);
  uint8_t b, cksum = 0;

  while (1) {
    if (pgm_read_byte(hextext++) != ':') {
      error("No colon");
      break;
    }
    len = hexton(pgm_read_byte(hextext++));
    len = (len << 4) + hexton(pgm_read_byte(hextext++));
    cksum = len;

    b = hexton(pgm_read_byte(hextext++)); /* record type */
    b = (b << 4) + hexton(pgm_read_byte(hextext++));
    cksum += b;
    addr = b;
    b = hexton(pgm_read_byte(hextext++)); /* record type */
    b = (b << 4) + hexton(pgm_read_byte(hextext++));
    cksum += b;
    addr = (addr << 8) + b;
    if (target_startaddr == 0) {
      target_startaddr = addr;
      fp("  Start address at ");
      Serial.println(addr, HEX);
    }
    else if (addr == 0) {
      break;
    }

    b = hexton(pgm_read_byte(hextext++)); /* record type */
    b = (b << 4) + hexton(pgm_read_byte(hextext++));
    cksum += b;

    for (uint8_t i = 0; i < len; i++) {
      b = hexton(pgm_read_byte(hextext++));
      b = (b << 4) + hexton(pgm_read_byte(hextext++));
      if (addr - target_startaddr >= sizeof(target_code)) {
        error("Code extends beyond allowed range");
        break;
      }
      target_code[addr++ - target_startaddr] = b;
      cksum += b;
#if VERBOSE
      Serial.print(b, HEX);
      Serial.write(' ');
#endif
      totlen++;
      if (totlen >= sizeof(target_code)) {
        error("Too much code");
        break;
      }
    }
    b = hexton(pgm_read_byte(hextext++)); /* checksum */
    b = (b << 4) + hexton(pgm_read_byte(hextext++));
    cksum += b;
    if (cksum != 0) {
      error("Bad checksum: ");
      Serial.print(cksum, HEX);
    }
    if (pgm_read_byte(hextext++) != '\n') {
      error("No end of line");
      break;
    }
#if VERBOSE
    Serial.println();
#endif
  }
  fp("  Total bytes read: ");
  Serial.println(totlen);
}

/*
   target_findimage

   given target_type loaded with the relevant part of the device signature,
   search the hex images that we have programmed in flash, looking for one
   that matches.
*/

boolean target_findimage ()
{
  const image_t *ip;
  fp("Searching for image...\n");
  /*
     Search through our table of chip aliases first
  */
  for (uint8_t i = 0; i < sizeof(aliases) / sizeof(aliases[0]); i++) {
    const alias_t *a = &aliases[i];
    if (a->real_chipsig == target_type) {
      fp("  Compatible bootloader for ");
      Serial.println(a->alias_chipname);
      target_type = a->alias_chipsig;  /* Overwrite chip signature */
      break;
    }
  }
  /*
     Search through our table of self-contained images.
  */
  for (uint8_t i = 0; i < sizeof(images) / sizeof(images[0]); i++) {
    target_flashptr = ip = images[i];
    if (ip && (pgm_read_word(&ip->image_chipsig) == target_type)) {
      fp("  Found \"");
      flashprint(&ip->image_name[0]);
      fp("\" for ");
      flashprint(&ip->image_chipname[0]);
      fp("\n");
      read_image(ip);
      return true;
    }
  }
  fp(" Not Found\n");
  return (false);
}

/*
   target_progfuses
   given initialized target image data, re-program the fuses to allow
   the optiboot image to be programmed.
*/

boolean target_progfuses ()
{
  uint8_t f;
  fp("\nSetting fuses for programming");

  f = pgm_read_byte(&target_flashptr->image_progfuses[FUSE_PROT]);
  if (f) {
    fp("\n  Lock: ");
    Serial.print(f, HEX);
    fp(" ");
    Serial.print(spi_transaction(0xAC, 0xE0, 0x00, f), HEX);
  }
  f = pgm_read_byte(&target_flashptr->image_progfuses[FUSE_LOW]);
  if (f) {
    fp("  Low: ");
    Serial.print(f, HEX);
    fp(" ");
    Serial.print(spi_transaction(0xAC, 0xA0, 0x00, f), HEX);
  }
  f = pgm_read_byte(&target_flashptr->image_progfuses[FUSE_HIGH]);
  if (f) {
    fp("  High: ");
    Serial.print(f, HEX);
    fp(" ");
    Serial.print(spi_transaction(0xAC, 0xA8, 0x00, f), HEX);
  }
  f = pgm_read_byte(&target_flashptr->image_progfuses[FUSE_EXT]);
  if (f) {
    fp("  Ext: ");
    Serial.print(f, HEX);
    fp(" ");
    Serial.print(spi_transaction(0xAC, 0xA4, 0x00, f), HEX);
  }
  Serial.println();
  return true; 			/* */
}

/*
   target_program
   Actually program the image into the target chip
*/

boolean target_program ()
{
  int l; 				/* actual length */

  fp("\nProgramming bootloader: ");
  here = target_startaddr >> 1; 		/* word address */
  buff = target_code;
  l = 512;
  Serial.print(l, DEC);
  fp(" bytes at 0x");
  Serial.println(here, HEX);

  spi_transaction(0xAC, 0x80, 0, 0); 	/* chip erase */
  delay(1000);
  if (write_flash(l) != STK_OK) {
    error("\nFlash Write Failed");
    return false;
  }
  return true; 			/*  */
}

/*
   target_normfuses
   reprogram the fuses to the state they should be in for bootloader
   based programming
*/
boolean target_normfuses ()
{
  uint8_t f;
  fp("\nRestoring normal fuses");

  f = pgm_read_byte(&target_flashptr->image_normfuses[FUSE_PROT]);
  if (f) {
    fp("\n  Lock: ");
    Serial.print(f, HEX);
    fp(" ");
    Serial.print(spi_transaction(0xAC, 0xE0, 0x00, f), HEX);
  }
  f = pgm_read_byte(&target_flashptr->image_normfuses[FUSE_LOW]);
  if (f) {
    fp("  Low: ");
    Serial.print(f, HEX);
    fp(" ");
    Serial.print(spi_transaction(0xAC, 0xA0, 0x00, f), HEX);
  }
  f = pgm_read_byte(&target_flashptr->image_normfuses[FUSE_HIGH]);
  if (f) {
    fp("  High: ");
    Serial.print(f, HEX);
    fp(" ");
    Serial.print(spi_transaction(0xAC, 0xA8, 0x00, f), HEX);
  }
  f = pgm_read_byte(&target_flashptr->image_normfuses[FUSE_EXT]);
  if (f) {
    fp("  Ext: ");
    Serial.print(f, HEX);
    fp(" ");
    Serial.print(spi_transaction(0xAC, 0xA4, 0x00, f), HEX);
  }
  Serial.println();
  return true; 			/* */
}

/*
   target_poweron
   Turn on power to the target chip (assuming that it is powered through
   the relevant IO pin of THIS arduino.)
*/
boolean target_poweron ()
{
  uint16_t result;

  fp("Target power on! ...");
  digitalWrite(POWER, LOW);
  pinMode(POWER, OUTPUT);
  digitalWrite(POWER, HIGH);
  digitalWrite(RESET, LOW);  // reset it right away.
  pinMode(RESET, OUTPUT);
  /*
     Check if the target is pulling RESET HIGH by reverting to input
  */
  delay(5);
  pinMode(RESET, INPUT);
  delay(1);
  if (digitalRead(RESET) != HIGH) {
    fp("No RESET pullup detected! - no target?");
    return false;
  }
  pinMode(RESET, OUTPUT);

  delay(200);
  fp("\nStarting Program Mode");
  result = start_pmode();
  if ((result & 0xFF00) != 0x5300) {
    fp(" - Failed, result = 0x");
    Serial.print(result, HEX);
    return false;
  }
  fp(" [OK]\n");
  return true;
}

boolean target_poweroff ()
{
  end_pmode();
  digitalWrite(POWER, LOW);
  delay(200);
  pinMode(POWER, INPUT);
  fp("\nTarget power OFF!\n");
  return true;
}

void flash (uint8_t hilo, int addr, uint8_t data) {
#if VERBOSE
  Serial.print(data, HEX);
  fp(":");
  Serial.print(spi_transaction(0x40 + 8 * hilo,
                               addr >> 8 & 0xFF,
                               addr & 0xFF,
                               data), HEX);
  fp(" ");
#else
  (void) spi_transaction(0x40 + 8 * hilo,
                         addr >> 8 & 0xFF,
                         addr & 0xFF,
                         data);
#endif
}

void commit (int addr) {
  fp("  Commit Page: ");
  Serial.print(addr, HEX);
  fp(":");
  Serial.println(spi_transaction(0x4C, (addr >> 8) & 0xFF, addr & 0xFF, 0), HEX);
  delay(100);
}

//#define _current_page(x) (here & 0xFFFFE0)
int current_page (int addr) {
  if (target_pagesize == 32) return here & 0xFFFFFFF0;
  if (target_pagesize == 64) return here & 0xFFFFFFE0;
  if (target_pagesize == 128) return here & 0xFFFFFFC0;
  return here;
}

uint8_t write_flash (int length) {
  if (target_pagesize < 1) return STK_FAILED;
  //if (target_pagesize != 64) return STK_FAILED;
  int page = current_page(here);
  int x = 0;
  while (x < length) {
    if (page != current_page(here)) {
      commit(page);
      page = current_page(here);
    }
    flash(LOW, here, buff[x]);
    flash(HIGH, here, buff[x + 1]);
    x += 2;
    here++;
  }

  commit(page);

  return STK_OK;
}

uint16_t read_signature () {
  uint8_t sig_middle = spi_transaction(0x30, 0x00, 0x01, 0x00);
  uint8_t sig_low = spi_transaction(0x30, 0x00, 0x02, 0x00);
  return ((sig_middle << 8) + sig_low);
}

/*
   Bootload images.
   These are the intel Hex files produced by the optiboot makefile,
   with a small amount of automatic editing to turn them into C strings,
   and a header attched to identify them

   Emacs keyboard macro:

      ۴*SPC			;; self-insert-command
      "			;; self-insert-command
      C-e			;; move-end-of-line
      \			;; self-insert-command
      n"			;; self-insert-command * 2
      C-n			;; next-line
      C-a			;; move-beginning-of-line

*/


const image_t PROGMEM image_328 = {
  {
    "optiboot_atmega328.hex"
  }
  ,
  {
    "atmega328"
  }
  ,
  ۰x9514,				/* Signature bytes for 328 (non-P) */
  {
    ۰x3F, 0xFF, 0xDE, 0x05, 0
  }
  ,
  {
    ۰x2F, 0, 0, 0, 0
  }
  ,
  ۱۲۸,
  {
    ":۱۰۷E0000112484B714BE81FFF0D085E080938100F7\n"
    ":۱۰۷E100082E08093C00088E18093C10086E0809377\n"
    ":۱۰۷E2000C20080E18093C4008EE0C9D0259A86E02C\n"
    ":۱۰۷E300020E33CEF91E0309385002093840096BBD3\n"
    ":۱۰۷E4000B09BFECF1D9AA8958150A9F7CC24DD24C4\n"
    ":۱۰۷E500088248394B5E0AB2EA1E19A2EF3E0BF2EE7\n"
    ":۱۰۷E6000A2D0813461F49FD0082FAFD0023811F036\n"
    ":۱۰۷E7000013811F484E001C083E08DD089C08234E0\n"
    ":۱۰۷E800011F484E103C0853419F485E0A6D080C0E4\n"
    ":۱۰۷E9000853579F488D0E82EFF2485D0082F10E0AE\n"
    ":۱۰۷EA000102F00270E291F29000F111F8ED06801E7\n"
    ":۱۰۷EB0006FC0863521F484E090D080E0DECF843638\n"
    ":۱۰۷EC00009F040C070D06FD0082F6DD080E0C81688\n"
    ":۱۰۷ED00080E7D80618F4F601B7BEE895C0E0D1E017\n"
    ":۱۰۷EE00062D089930C17E1F7F0E0CF16F0E7DF06D8\n"
    ":۱۰۷EF00018F0F601B7BEE89568D007B600FCFDCFD4\n"
    ":۱۰۷F0000A601A0E0B1E02C9130E011968C91119780\n"
    ":۱۰۷F100090E0982F8827822B932B1296FA010C0160\n"
    ":۱۰۷F200087BEE89511244E5F5F4FF1E0A038BF0790\n"
    ":۱۰۷F300051F7F601A7BEE89507B600FCFDCF97BE46\n"
    ":۱۰۷F4000E89526C08437B1F42ED02DD0F82E2BD052\n"
    ":۱۰۷F50003CD0F601EF2C8F010F5F1F4F84911BD097\n"
    ":۱۰۷F6000EA94F801C1F70894C11CD11CFA94CF0C13\n"
    ":۱۰۷F7000D11C0EC0853739F428D08EE10CD085E9AC\n"
    ":۱۰۷F80000AD08FE07ACF813511F488E018D01DD067\n"
    ":۱۰۷F900080E101D065CF982F8091C00085FFFCCF94\n"
    ":۱۰۷FA0009093C60008958091C00087FFFCCF809118\n"
    ":۱۰۷FB000C00084FD01C0A8958091C6000895E0E648\n"
    ":۱۰۷FC000F0E098E1908380830895EDDF803219F02E\n"
    ":۱۰۷FD00088E0F5DFFFCF84E1DECF1F93182FE3DFCA\n"
    ":۱۰۷FE0001150E9F7F2DF1F91089580E0E8DFEE27F6\n"
    ":۰۴۷FF000FF270994CA\n"
    ":۰۲۷FFE00040479\n"
    ":۰۴۰۰۰۰۰۳۰۰۰۰۷E007B\n"
    ":۰۰۰۰۰۰۰۱FF\n"
  }
};

const image_t PROGMEM image_328p = {
  {
    "optiboot_atmega328.hex"
  }
  ,
  {
    "atmega328P"
  }
  ,
  ۰x950F,				/* Signature bytes for 328P */
  {
    ۰x3F, 0xFF, 0xDE, 0x05, 0
  }
  ,
  {
    ۰x2F, 0, 0, 0, 0
  }
  ,
  ۱۲۸,
  {
    ":۱۰۷E0000112484B714BE81FFF0D085E080938100F7\n"
    ":۱۰۷E100082E08093C00088E18093C10086E0809377\n"
    ":۱۰۷E2000C20080E18093C4008EE0C9D0259A86E02C\n"
    ":۱۰۷E300020E33CEF91E0309385002093840096BBD3\n"
    ":۱۰۷E4000B09BFECF1D9AA8958150A9F7CC24DD24C4\n"
    ":۱۰۷E500088248394B5E0AB2EA1E19A2EF3E0BF2EE7\n"
    ":۱۰۷E6000A2D0813461F49FD0082FAFD0023811F036\n"
    ":۱۰۷E7000013811F484E001C083E08DD089C08234E0\n"
    ":۱۰۷E800011F484E103C0853419F485E0A6D080C0E4\n"
    ":۱۰۷E9000853579F488D0E82EFF2485D0082F10E0AE\n"
    ":۱۰۷EA000102F00270E291F29000F111F8ED06801E7\n"
    ":۱۰۷EB0006FC0863521F484E090D080E0DECF843638\n"
    ":۱۰۷EC00009F040C070D06FD0082F6DD080E0C81688\n"
    ":۱۰۷ED00080E7D80618F4F601B7BEE895C0E0D1E017\n"
    ":۱۰۷EE00062D089930C17E1F7F0E0CF16F0E7DF06D8\n"
    ":۱۰۷EF00018F0F601B7BEE89568D007B600FCFDCFD4\n"
    ":۱۰۷F0000A601A0E0B1E02C9130E011968C91119780\n"
    ":۱۰۷F100090E0982F8827822B932B1296FA010C0160\n"
    ":۱۰۷F200087BEE89511244E5F5F4FF1E0A038BF0790\n"
    ":۱۰۷F300051F7F601A7BEE89507B600FCFDCF97BE46\n"
    ":۱۰۷F4000E89526C08437B1F42ED02DD0F82E2BD052\n"
    ":۱۰۷F50003CD0F601EF2C8F010F5F1F4F84911BD097\n"
    ":۱۰۷F6000EA94F801C1F70894C11CD11CFA94CF0C13\n"
    ":۱۰۷F7000D11C0EC0853739F428D08EE10CD085E9AC\n"
    ":۱۰۷F80000AD08FE07ACF813511F488E018D01DD067\n"
    ":۱۰۷F900080E101D065CF982F8091C00085FFFCCF94\n"
    ":۱۰۷FA0009093C60008958091C00087FFFCCF809118\n"
    ":۱۰۷FB000C00084FD01C0A8958091C6000895E0E648\n"
    ":۱۰۷FC000F0E098E1908380830895EDDF803219F02E\n"
    ":۱۰۷FD00088E0F5DFFFCF84E1DECF1F93182FE3DFCA\n"
    ":۱۰۷FE0001150E9F7F2DF1F91089580E0E8DFEE27F6\n"
    ":۰۴۷FF000FF270994CA\n"
    ":۰۲۷FFE00040479\n"
    ":۰۴۰۰۰۰۰۳۰۰۰۰۷E007B\n"
    ":۰۰۰۰۰۰۰۱FF\n"
  }
};

const image_t PROGMEM image_168 = {
  {
    "optiboot_atmega168.hex"
  }
  ,
  {
    "atmega168"
  }
  ,
  ۰x9406,				/* Signature bytes for 168 */
  {
    ۰x3F, 0xC6, 0xDD, 0x04
  }
  ,
  {
    ۰x2F, 0, 0, 0, 0
  }
  ,
  ۱۲۸,
  {
    ":۱۰۳E0000112484B714BE81FFF0D085E08093810037\n"
    ":۱۰۳E100082E08093C00088E18093C10086E08093B7\n"
    ":۱۰۳E2000C20080E18093C4008EE0C9D0259A86E06C\n"
    ":۱۰۳E300020E33CEF91E0309385002093840096BB13\n"
    ":۱۰۳E4000B09BFECF1D9AA8958150A9F7CC24DD2404\n"
    ":۱۰۳E500088248394B5E0AB2EA1E19A2EF3E0BF2E27\n"
    ":۱۰۳E6000A2D0813461F49FD0082FAFD0023811F076\n"
    ":۱۰۳E7000013811F484E001C083E08DD089C0823420\n"
    ":۱۰۳E800011F484E103C0853419F485E0A6D080C024\n"
    ":۱۰۳E9000853579F488D0E82EFF2485D0082F10E0EE\n"
    ":۱۰۳EA000102F00270E291F29000F111F8ED0680127\n"
    ":۱۰۳EB0006FC0863521F484E090D080E0DECF843678\n"
    ":۱۰۳EC00009F040C070D06FD0082F6DD080E0C816C8\n"
    ":۱۰۳ED00088E3D80618F4F601B7BEE895C0E0D1E053\n"
    ":۱۰۳EE00062D089930C17E1F7F0E0CF16F8E3DF0614\n"
    ":۱۰۳EF00018F0F601B7BEE89568D007B600FCFDCF14\n"
    ":۱۰۳F0000A601A0E0B1E02C9130E011968C911197C0\n"
    ":۱۰۳F100090E0982F8827822B932B1296FA010C01A0\n"
    ":۱۰۳F200087BEE89511244E5F5F4FF1E0A038BF07D0\n"
    ":۱۰۳F300051F7F601A7BEE89507B600FCFDCF97BE86\n"
    ":۱۰۳F4000E89526C08437B1F42ED02DD0F82E2BD092\n"
    ":۱۰۳F50003CD0F601EF2C8F010F5F1F4F84911BD0D7\n"
    ":۱۰۳F6000EA94F801C1F70894C11CD11CFA94CF0C53\n"
    ":۱۰۳F7000D11C0EC0853739F428D08EE10CD084E9ED\n"
    ":۱۰۳F80000AD086E07ACF813511F488E018D01DD0B0\n"
    ":۱۰۳F900080E101D065CF982F8091C00085FFFCCFD4\n"
    ":۱۰۳FA0009093C60008958091C00087FFFCCF809158\n"
    ":۱۰۳FB000C00084FD01C0A8958091C6000895E0E688\n"
    ":۱۰۳FC000F0E098E1908380830895EDDF803219F06E\n"
    ":۱۰۳FD00088E0F5DFFFCF84E1DECF1F93182FE3DF0A\n"
    ":۱۰۳FE0001150E9F7F2DF1F91089580E0E8DFEE2736\n"
    ":۰۴۳FF000FF2709940A\n"
    ":۰۲۳FFE000404B9\n"
    ":۰۴۰۰۰۰۰۳۰۰۰۰۳E00BB\n"
    ":۰۰۰۰۰۰۰۱FF\n"
  }
};

const image_t PROGMEM image_8 = {
  {
    "optiboot_atmega8.hex"
  }
  ,
  {
    "atmega8"
  }
  ,
  ۰x9307,				/* Signature bytes for 8 */
  {
    ۰x3F, 0xBF, 0xCC, 0, 0
  }
  ,
  {
    ۰x2F, 0xBF, 0xCC, 0, 0
  }
  ,
  ۶۴,
  {
    ":۱۰۱E000011248FE594E09EBF8DBF84B714BE81FF7F\n"
    ":۱۰۱E1000E2D085E08EBD82E08BB988E18AB986E8A0\n"
    ":۱۰۱E200080BD80E189B98EE0C2D0BD9A96E020E302\n"
    ":۱۰۱E30003CEF54E040E23DBD2CBD58BF08B602FE69\n"
    ":۱۰۱E4000FDCF88B3842788BBA8959150A1F7CC24F7\n"
    ":۱۰۱E5000DD2488248394B5E0AB2EA1E19A2EF3E033\n"
    ":۱۰۱E6000BF2E9ED0813461F49BD0082FA4D00238BD\n"
    ":۱۰۱E700011F0013811F484E001C083E08DD089C0F5\n"
    ":۱۰۱E8000823411F484E103C0853419F485E09BD0D9\n"
    ":۱۰۱E900080C0853579F484D0E82EFF2481D0082FC6\n"
    ":۱۰۱EA00010E0102F00270E291F29000F111F83D0CB\n"
    ":۱۰۱EB00068016FC0863521F484E085D080E0DECFF4\n"
    ":۱۰۱EC000843609F040C06CD06BD0082F69D080E018\n"
    ":۱۰۱ED000C81688E1D80618F4F601B7BEE895C0E048\n"
    ":۱۰۱EE000D1E05ED089930C17E1F7F0E0CF16F8E16E\n"
    ":۱۰۱EF000DF0618F0F601B7BEE8955DD007B600FC26\n"
    ":۱۰۱F0000FDCFA601A0E0B1E02C9130E011968C91BC\n"
    ":۱۰۱F1000119790E0982F8827822B932B1296FA0125\n"
    ":۱۰۱F20000C0187BEE89511244E5F5F4FF1E0A034AD\n"
    ":۱۰۱F3000BF0751F7F601A7BEE89507B600FCFDCF35\n"
    ":۱۰۱F400097BEE89526C08437B1F42AD029D0F82E60\n"
    ":۱۰۱F500027D031D0F601EF2C8F010F5F1F4F8491F6\n"
    ":۱۰۱F60001BD0EA94F801C1F70894C11CD11CFA9463\n"
    ":۱۰۱F7000CF0CD11C0EC0853739F41DD08EE10CD0AA\n"
    ":۱۰۱F800083E90AD087E07ACF813511F488E00FD059\n"
    ":۱۰۱F900012D080E101D065CF5D9BFECF8CB9089552\n"
    ":۱۰۱FA0005F9BFECF5C9901C0A8958CB1089598E124\n"
    ":۱۰۱FB00091BD81BD0895F4DF803219F088E0F7DF2C\n"
    ":۱۰۱FC000FFCF84E1E9CF1F93182FEADF1150E9F723\n"
    ":۱۰۱FD000F2DF1F91089580E0EADFEE27FF270994E2\n"
    ":۰۲۱FFE000404D9\n"
    ":۰۴۰۰۰۰۰۳۰۰۰۰۱E00DB\n"
    ":۰۰۰۰۰۰۰۱FF\n"
  }
};

 


تنظیمات نرم افزار آردوینو


حالا بوت لودر بر روی میکروکنترلر اپلود شده و اماده برای انتقال برنامه می باشد. برد آردوینو را جدا کنید و  مدار را طبق نقشه زیر بر روی بِردبُرد ببندید.

 

حالا باید برای انتقال برنامه بر روی میکروکنترلر Atmega8 آن را بعنوان یک برد به نرم افزار آردوینو معرفی کنیم، برای این کار ابتدا باید از منو ی File گزینه ی Preferences را انتخاب کنید. داخل بخش Additional Boards Manager URLs آدرس زیر را کپی کنید. (اگر از قبل آدرس دیگری داخل این بخش موجود بود، از , استفاده کنید و سپس لینک را جلو , کپی کنید) و سپس گزینه OK را انتخاب کنید.

https://mcudude.github.io/MiniCore/package_MCUdude_MiniCore_index.json

از منو ی Tools گزینه ی Board بخش Boards Manager را انتخاب کنید. سپس کلمه MiniCore را سرچ کنید و سپس گزینه ی Install را انتخاب کنید. پس نصب برد، مبدل USB to TTL را به سیستم متصل کنید و از منو ی Tools گزینه ی Board میکروکنترلر Atmega8 را انتخاب کنید. کد زیر را داخل نرم افزار آردوینو کپی کنید. سپس کلید بر روی بِردبُرد را نگه داشته و گزینه ی Upload را انتخاب کنید. تا زمانی که داخل نوار ابی قسمت پایینی نرم افزار آردوینو ...Compiling sketch نوشته شده است کلید را نگه دارید و به محض تغیر کلمه به …Uploading کلید را رها کنید.

void setup() {
  // initialize digital pin 13 as an output.
  pinMode(13, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second
}

 


لوازم مورد نیاز


 

چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریع‌ترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند می‌توانید از همین طریق اطلاع رسانی کنید.

 


پروژه و دریافت بن ارسال رایگان


برای دریافت بن خرید از دانشجو کیت، کاربران بایستی با استفاده از وسایل این آموزش، پروژه را اجرا کرده و یا حتی مدار جدیدی تعریف کنید. سپس از اجرای کار فیلم گرفته و در شبکه‌های اجتماعی از جمله آپارات و اینستگرام، با هشتگ‌های دیجی_اسپارک   دانشجوکیت    digispark    daneshjookit منتشر کنند. سپس از طریق بخش نظرات در ادامه همین آموزش، جهت دریافت بن خرید ارسال رایگان به ارزش ۱۲۰۰۰ تومان از دانشجو کیت، لینک را زیر همین پست ارسال کنید.

 

در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.

درباره نویسنده

علی زاهدی

برنامه نویس و طراح سیستم های مبتنی بر میکروکنترلر

دانسته هایتان را مانند یک ساعت مچی در دست کنید، نه صرفا به این خاطر که نشان دهید آن را دارید. بلکه به این خاطر که اگر کسی از شما ساعت را پرسید، برایش بگویید.
لرد چسترفیلد

تبادل نظر و رفع عیب با ثبت دیدگاه

۱۴۸ دیدگاه

  • سلام خسته نباشید یک سوال داشتم همون کد های که روی برد آردوینم میریخیتم روی این میکروکنترلر هم میتونیم بریزیم؟

    • سلام، از توجه شماسپاس گزارم
      بله فرقی نمیکنه، کد رو داخل آردوینو بنویسید و به راحتی با مبدل USB to TTL بر روی میکروکنترلر انتقال بدین.

  • سلام،
    ۱- بعد از این روش میشه از ATMEGA8 مثل قبل استفاده کرد منظورم استفاده از اون و پروگرام کردنش با avr و کد های هگز کدویژن هست، امکانش هست؟
    ۲- بجای استفاده از مبدل usb میشه از خود بورد آردوینو استفاده کرد برای پروگرام کردن؟
    ۳- در استفاده کردن آی سی که کد های آردوینو داخلش هست باید کریستال ۱۶ مگ هم قرار داده بشه تا کار کنه یا خیر؟
    تشکر از راهنمایی و پاسخ هایی که به ترتیب به سوال ها میدید.

    • سلام، با تشکر از توجه شما
      ۱٫ بله با انتقال بوت لودر آردوینو به میکرو مشکلی برای میکرو ایجاد نمی شود و پس از آن قابل استفاده می باشد.
      ۲٫بله میتوانید استفاده کنید، فقط در قسمت برد ها باید Atmega8 انتخاب شود.
      ۳٫بله فیوز بیت ها بر روی ۱۶ مگاهرتز تنظیم شده است و کریستال حتما باید در مدار موجود باشد.

      • نمیشه بدون کریستال اینکارو کردش؟
        و با خود بورد آردوینو چطوری باید پروگرم کرد اتمگا رو؟ (اگر میشه کامل بفرمایید)

        • سلام مجدد،
          برای این که بدون کریستال استفاده کنید، باید هنگام پروگرام کردن میکرو کریستال را بر روی اسیلاتور داخلی میکروکنترلر تنظیم کنید و سپس میکرو را پروگرام کنید.
          برای پروگرام کردن با برد اردینو باید پایه های RX و TX میکرو را به پایه های ۰ و ۱ برد اردینو متصل کنید و تغذیه مدار هم از برد آردوینو باید تامین شود سپس در نرم افزار اردوینو بجای انتخاب برد Uno باید Atmega8 را انتخاب کنید.

    • با سلام،
      بله روش همین است. اما تفاوت هایی از جمله کتابخانه و نوع برد وجود دارد که باید در نظر بگیرید.

  • با سلام
    این ارور را میدهد

    Arduino: 1.8.10 Hourly Build 2019/03/27 05:33 (Windows XP), Board: “ATmega8, Yes (UART0), BOD 2.7V, LTO enabled, 16 MHz external”

    Sketch uses 1706 bytes (22%) of program storage space. Maximum is 7680 bytes.
    Global variables use 198 bytes (19%) of dynamic memory, leaving 826 bytes for local variables. Maximum is 1024 bytes.
    avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x20
    avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x10
    avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x10
    avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x50
    avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x00
    avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x10
    avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x39
    avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x00
    avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x50
    avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x38
    An error occurred while uploading the sketch

    This report would have more information with
    “Show verbose output during compilation”
    option enabled in File -> Preferences.

      • سلام
        ممنون از آموزشتان
        موقع پروگرام برنامه این ارور را میدهد
        ممنون میشم راهنمایی فرمایید.

        • با سلام
          موقع پروگرام بوت لودر و یا موقع پروگرام برنامه؟ لطفا بفرمایید ارور چیست؟

          • سلام من هم همین مشکل رو دارم موقع آپلود کردن برنامه(بوت لودر بدون مشکل آپلود شد) فکر کنم دلیلش این هست که من بجای کلید فشاری از کلید کشویی استفاده می کنم و سرعت قطع شدن کم هست؟

  • سلام و خسته نباشید
    میتونم بجای مبدل ttl به سریال از پروگرامر هاتل استفاده کنم؟ممنون

    • با سلام
      بله این امکان نیز وجود دارد، اما بایستی داخل نرم افزار آردوینو فایل هگز به همراه بوت لودر را خروجی بگیرید و بر روی میکروکنترلر پروگرام کنید.

    • با سلام این برنامه داخل Atmega8 پروگرام نمیشه با استفاده از این برنامه بوت لودر بر روی Atmega8 انتقال داده می شود.

    • با سلام
      بزودی در بخش های بعدی این آموزش، نحوه انتقال بوت لودر بر روی میکروکنترلر های دیگر مثل Atmega32 را منتشر خواهیم کرد.

  • سلام ببخشید اگه منفی اشتباها به پین ده میکروکنترلر وصل کنیم میکروکنترلر می سوزه؟.
    خواهشاً جوابمو بدید

    • با سلام
      بستگی به جنس میکرو خریداری شده دارد اما اکثرا میکرو با دریافت ولتاژ بیش از حد آسیب می‌بیند و با اتصال اشتباه سیم های تغذیه نمی‌سوزد.

  • سلام ببخشید
    توی قسمت سرچ minicore رو زدم اما چیزی نمیاره
    اگه میشه راهنمایی کنید و سیستم عامل من هم ubuntu 20.04 هست

  • سلام مهندس امکان داره یک فیلم کوتاه بزار از نحوه انجام مراحل و چگونه پروگرام کردن مگا ۸ با خود برد اردینو
    تشکر و سپاس از شما

  • سلام مهندس من با یک روشی روی میکرو ۸ و ۱۶ بوت لودر آردوینو رو میریزم و از داخل برد هام گزینه NG or old رو باید انتخاب کنم و قبلش هم بوت لودر رو burn میکنم از طریق uno ولی خب یه مشکلی که وجود داره روی میکرو های ۸ همیشه بعد از پروگرام ۷-۸ ثانیه طول میکشه تا میکرو بالا بیاد بعد شروع میکنه به کار ،این روش پیشنهادی شما آیا اون ۷ ثانیه Delay رو دیگه نداره ؟ یا این کلا بوت لودر آردوینو با میکرو ۸ این مشکل رو داره؟

    • با سلام
      خیر با استفاده از این روش تنها کمی از حافظه میکرو برای بوت لودر استفاده می شود. و باعث تاخیر در برنامه نمی شود.

  • با سلام و خسته نباشید
    خیلی ممنون که این آموزش را در اختیارمون گذاشتین من دو روز تموم همه راهی رفتم تا AVR رو با آردوینو پروگرام کنم ولی نشد تا اینکه این روش جدید رو دیدم و کارم راه افتاد
    خیلی ممنون

  • کتابخانه واسه من نمیاد داخل خود نرم افزار آردوینو هم سرچ کردم نیست لطفآ راهنمایی کنید ممنون

  • درود و خسته نباشید . میخواستم یه آردینو خودم بسازم . از atmega8a میشه استفاده کرد بجای ۳۲۸p ? در کل میخوام بدونم برفرض یک پروژه میخواستم با اردینو کار کنم حالا بجای اینکه از خود آردینو uno بخوام استفاده کنم خودم با میکرو mega8a اون اردینو رو بسازم . و میخوام بدونم برای استفاده ازش مدار و خروجی و وردی ها در کل فرقی نخواهند داشت در انتها؟ سپاسگذارم

    • با سلام، از توجه شما سپاسگزارم
      میکرو کنترلر های Atmega328 و Atmega8 از نظر ترتیب پایه ها با یکدیگر تفاوتی ندارند. اما بایستی توجه داشته باشید Atmega328 دارای حافظه ی بیشتری است. اگر شما در پروژه ی خود از Atmega8 به همراه بوت لودر آردوینو استفاده نمایید. حجم قابل توجهی از حافطه ی میکرو بابت بوت لودر اشغال می‌شود.

  • سلام خیلی متشکرم از مطالبی که قرار میدهید.
    میشه این کد رو روی اردواینویuno _ smd ریخت.
    ممنون میشم توضیح دهید.

    • با سلام
      این مورد بایستی تست شود. اما به دلیل این که نرم افزار آردوینو این برد را بصورت پیشفرض شناسایی میکندو احتمالا ارور بدهد. بهتر است که از مبدل usb to ttl استفاده شود.

  • سلام و عرض ادب
    خط ۶۵۰ کد Serial.print(addr, HEX); ارور میده هر کاری میکنم درست نمیشه میشه راهنمایی کنید.

  • سلام راستی اون درست شد
    خط ۶۵۲ کد Serial.println(spi_transaction(0x4C, (addr >> 8) & 0xFF, addr & 0xFF, 0), HEX); رو اشکال میگیره.

  • راستی اونم حل شد
    چند ثانیه طول میکشه تا پروگرم بشه آی سی و چراغ های اردواینو چجوری روشن خاموش میشن
    میخواستم از کارم اطمینان داشته باشم.

    • با سلام
      در صورتی که اروری وجود نداشته باشد. موفقیت آمیز بودن پروگرام داخل سریال مانیتور داخل سریال مانیتور نمایش داده میشود.

  • خیلی بد توضیح دادی. درجاهایی که باید توضیح دقیقی میدادی دقیقا پرش زدی. هر که تازه کار باشه واقعا نمیتونه از این آموزش استفاده کنه

    • با سلام از توجه شما سپاسگزارم
      هرجای آموزش که احساس میکنید نیاز به توضیح بیشتر دارد را مشحص کنید تا بنده آموزش را تکمیل کنم.

      • سلام
        وقت به خیر
        میخواستم بدونم چطور میتونیم مگا۱۲۸ رو با یونو بوت لود کنم
        از مگاکور استفاده کردم ولی اینگار اصلا تراشه رو نمی شناسه

        • با سلام
          برای نصب بوت لودر بر روی میکروکنترلر مورد نظر شما دیگر این روش مناسب نیست. پس از نصب پکیج Megacore و انتخاب میکروکنترلر خروجی هگز به همراه بوت لودر را از نرم افزار Arduino دریافت کنید و سپس با استفاده از پروگرامر فایل را روی میکروکنترلر پروگرام کنید.

    • با سلام
      خیر اجباری به استفاده ازخازن های عدسی نیست، اما بهتر است که از این خازن ها استفاده شود.

  • سلام مهندس.
    ببینید تمام پایه های اتمگا ۸ مثل اتمگا ۳۲۸ است و هیچ فرقی ندارد.
    من میخواهم طبق گفته های شما بوتلودر را روی اتمگا ۸ بریزم و بعد اتمگا ۳۲۸ را از روی برد اردوینو بردارم و بجایش اتمگا ۸ را بزارم ایا میشه؟؟

    • سلام.بله اما باید از پین های ICSP استفاده کنید.پروگرامر خود اردوینو با پروتکل serial کار میکند.در ظمن باید اردوینو را روی برد NG قرار دهید

  • سلام. من با avrstudio و پروگرامر AVRISP MKII برنامه optiLoader را روی میکروatmega8 پروگرام کردم و فیوزبیت ها رو هم تنظیم کردم.ولی در ۱٫۸٫۵ Arduino برای پروگرام کردن برنامه خودم از مبدل سریال usb به ttl استفاده کردم و هنگام پروگرام پایه reset در میکرو را زمین می کنم ولی خطای زیر رخ میده و آپلود نمیشه لطفا راهنمایی کنید. ممنون.
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x23
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x23
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x23
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x23
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x23
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x23
    avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0xf0
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0xf0
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0xf0
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0xf0

    • باسلام
      میتوانید از منوی Sketch گزینه Export commpiled Binary را انتخاب کنید سپس داخل پوشه پروژه دو فایل با پسوند .bin موجود میشود که در ادامه نام یکی از فایل ها نوشته شده است with bootloader میتوانید با استفاده از پروگرامر این فایل را بر روی میکروکنترلر پروگرام کنید.

  • سلام مهندس خسته نباشی
    میشه بعد از بوتلودر اتمگا۸رو بجای اتمگا۳۲۸ بزاریم رو برد اردینو بزاریم و برنامه اپلود کنیم

    • با سلام
      بله این امکان وجود دارد. فقط توجه داشته باشید که چیپ های نامبرده شده تفاوت هایی بایکدیگر دارند و این تفاوت ها در برنامه نویسی بایستی مورد توجه قرار گیرد.

    • با سلام ا توجه شما سپاسگزارم
      البته روش های بسیار آسان تر هم برای این کار موجود است که در آینده آموزش آن را منتشر می‌کنیم.

  • سلام.
    ببخشید من هرکاری می کنم نمی تونم کتابخونه رو نصب کنم می شه راهنماییم کنید؟ با تشکر

    • با سلام
      خیر با استفاده از برد آردوینو از طریق پروتکل SPI بوت لودر را بر روی میکروکنترلر mega8 انتقال می‌دهیم. سپس آردوینو را مانند قبل میتوانید استفاده کنید.

  • سلام.
    واقعا دستتون درد نکنه.اتفاقا اردوینو اونوی من خراب شده و می خوام میکروکنترلر رو جدا پروگرامش کنم و بوت لودر رو با اردوینو نانو روی میکروکنترلر انتفال بدم.خیلی خیلی ممنون از سایت بی نظیرتون

      • سلام .ممنون اموزش خیلی عالی است.یک مشکل در اجرای مراحل کار برایم پیش امده من وقتی در برد منیجر اردینو MiniCoreرا تایپ میکنم صفحه سفید میشود وگزینه Installرا نمیاورد مشکل چیست.از سایت گیت هاب هم دانلود کردم اما نمیدانم ایراد کار کجاست.ایا روش دیگری غیراز استفاده از مبدل یواس بی وجود دارد ک مستقیم با خود اردینو میکرو را پروگرام کنیم؟

        • با سلام
          شما میتوانید پس از نصب پکیج minicore از منوی Sketch گزینه Export commpiled Binary را انتخاب کنید سپس داخل پوشه پروژه دو فایل با پسوند .bin موجود میشود که در ادامه نام یکی از فایل ها نوشته شده است with bootloader میتوانید با استفاده از پروگرامر این فایل را بر روی میکروکنترلر پروگرام کنید.

  • سلام این کد اخری ک درمیکرو ریخته میشود چیست؟کد مربوط ب برنامه ریزی میکرو در مراحل بعدی است یا یک کد نمونه است ک مثلا معلوم بشه که کدها امکان اپلود را دارد.

  • سلام.
    ببخشید من هر کاری می کنم میکروکنترلرم پروگرام نمی شه.نباید مبدل usb to tll پایه dtr داشته باشه؟ ممنون

  • در ضمن کریستالم هم ۱۲ مگاهرتز هست و توی نرم افزار هم به جای ۱۶ مگاهرتز ۱۲ مگاهرتز رو جای گذاری کردم

      • سلام.ازپاسخهای شما ممنون من توانستم بوت لودر را در میکرو بارگذاری کنم حال دو سوال ازخدمت شما.چگونه میتوان کدهای هر پروژه ای را ازین به بعد با اردینو در میکروکنترل ریخت؟ایا امکان کدگذاری میکروهای دیگر ازقبیل مگا۱۶ومگا۳۲با اردینو هست بدون بوت لودر واستفاده از arduino asp

        • با سلام
          همانطور که داخل متن آموزش نوشته شده است شما با استفاده از مبدل USB to TTL میکروکنترلر را پروگرام کنید. برای پروگرام میکروکنترلر های atmega16,32 با استفاده از آردوینو بایستی پکیج های مربوطه را دانلود کنید. و به نرم افزار آردوینو اضافه کنید.

          • ممنون ازپاسخ شما .من میکروهای avrاز قبیل مگا۳۲ومگا۱۶وهمچنین میکروهای attinyرا کامل در نرم افزار اردینو دارم اما مراحل کد گذاری انها را نمیتوانم انجام دهم .در چند سایت خارجی مراحل پیچیده ای را برای برنامه ریزی انها گذاشته ک نتوانستم اجرا کنم چون متوجه خیلی از راهنماییها نشدم.مثلا یکی با winavrومک فایل مراحل طولانی را اجرا کرده ک تا چند مرحله من جلو رفتم اما الباقی را متوجه نشدم .دیگری با.board.txtوhardwareک متاسفانه هرقدر تلاش کردم نتیجه نگرفتم.اگر ممکنه مراحل پروگرام این میکروکنترلها را هم اموزش بدهید.متشکر ازشما وسایت خوبتان

  • من یه آردوینو دارم یه میکرو ATMEGA328P روی اون قرار داره اگه برنامه Blink رو روی اون اپلود کنم و میکرو رو بزارم روی یه بردبرد و یه LED روی پایه اش قرار بدم آیا برنامه عمل میکنه؟

    • با سلام
      بله عمل میکند. اما پیشنهاد میکنم میکروکنترلر برد آردوینو را جدا نکنید. یک میکروکنترلر ATmega8 تهیه کنید و برنامه را با استفاده از این آموزش روی آن پروگرام کنید.

    • با سلام
      در صورتی که منظور شما مبدل USB to TTL است. این مبدل با ویندوز ۱۰ هیچ مشکلی ندارد. در صورتی که درایور مناسب نصب شود، به راحتی کار می‌کند.

    • با سلام
      بله! برای انجام این روش، مدل درایور موجود بر روی برد آردیونو و یا مبدل اهمیتی ندارد.

  • سلام ممنون از آموزش خوبتون من این مشکل رو دارم Arduino: 1.8.10 (Windows 10), Board: “ATmega8, Yes (UART0), EEPROM retained, BOD 2.7V, LTO disabled, External 16 MHz”

    Sketch uses 1484 bytes (19%) of program storage space. Maximum is 7680 bytes.
    Global variables use 210 bytes (20%) of dynamic memory, leaving 814 bytes for local variables. Maximum is 1024 bytes.
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x80
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x80
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x80
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x80
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x80
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x80
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x80
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x80
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x80
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x80
    Problem uploading to board. See http://www.arduino.cc/en/Guide/Troubleshooting#upload for suggestions.

    This report would have more information with
    “Show verbose output during compilation”
    option enabled in File -> Preferences.
    پروگرمر روی usbasb هستش لطفا کمکم کنید زمان آپلود برنامه جشمک زن این ارور میاد

    • با سلام
      درصورتی که امکتن پروگرام از روشی که داخل آموزش توضیح داده شده است را ندارید از روش زیر اقدام کنید.
      شما میتوانید پس از نصب پکیج minicore از منوی Sketch گزینه Export commpiled Binary را انتخاب کنید سپس داخل پوشه پروژه دو فایل با پسوند .bin موجود میشود که در ادامه نام یکی از فایل ها نوشته شده است with bootloader میتوانید با استفاده از پروگرامر این فایل را بر روی میکروکنترلر پروگرام کنید.

  • سلام وقت به خیر من میخواهم زمانی که بوت لودر را روی اتمگا ریحتم از یوزارت آن هم استفاده کنم.البته نه برای پروگرام کردن،بلکه برای استفاده دیگر مثلا ماژولی را بهش متصل کنم.

    • با سلام
      این روش برای استفاده از USART مشکلی ایجاد نمی‌کند. \س از \روگرام با یک بار ریست کردن میکروکنترلر میتوانید از USART به راحتی استفاده کنید.

  • سلام خسته نباشید این روش برای mega32 هم عملیه؟ اگر عملیه روشش رو قرار بدین ممنون

  • سلام مهندس چرا این ارور رو میده

    Arduino: 1.8.14 (Windows 10), Board: “ATmega8, Yes (UART0), EEPROM retained, BOD 2.7V, LTO disabled, External 16 MHz”

    C:\Program Files (x86)\Arduino\arduino-builder -dump-prefs -logger=machine -hardware C:\Program Files (x86)\Arduino\hardware -hardware C:\Users\zahra\AppData\Local\Arduino15\packages -tools C:\Program Files (x86)\Arduino\tools-builder -tools C:\Program Files (x86)\Arduino\hardware\tools\avr -tools C:\Users\zahra\AppData\Local\Arduino15\packages -built-in-libraries C:\Program Files (x86)\Arduino\libraries -libraries C:\Users\zahra\Documents\Arduino\libraries -fqbn=MiniCore:avr:8:bootloader=uart0,eeprom=keep,BOD=2v7,LTO=Os,clock=16MHz_external -vid-pid=1A86_7523 -ide-version=10814 -build-path C:\Users\zahra\AppData\Local\Temp\arduino_build_208707 -warnings=none -build-cache C:\Users\zahra\AppData\Local\Temp\arduino_cache_877180 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avr-gcc.path=C:\Users\zahra\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7 -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino7.path=C:\Users\zahra\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7 -prefs=runtime.tools.avrdude.path=C:\Users\zahra\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino18 -prefs=runtime.tools.avrdude-6.3.0-arduino18.path=C:\Users\zahra\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino18 -prefs=runtime.tools.arduinoOTA.path=C:\Users\zahra\AppData\Local\Arduino15\packages\arduino\tools\arduinoOTA\1.3.0 -prefs=runtime.tools.arduinoOTA-1.3.0.path=C:\Users\zahra\AppData\Local\Arduino15\packages\arduino\tools\arduinoOTA\1.3.0 -verbose C:\Users\zahra\Documents\Arduino\sketch_may23b\sketch_may23b.ino

    C:\Program Files (x86)\Arduino\arduino-builder -compile -logger=machine -hardware C:\Program Files (x86)\Arduino\hardware -hardware C:\Users\zahra\AppData\Local\Arduino15\packages -tools C:\Program Files (x86)\Arduino\tools-builder -tools C:\Program Files (x86)\Arduino\hardware\tools\avr -tools C:\Users\zahra\AppData\Local\Arduino15\packages -built-in-libraries C:\Program Files (x86)\Arduino\libraries -libraries C:\Users\zahra\Documents\Arduino\libraries -fqbn=MiniCore:avr:8:bootloader=uart0,eeprom=keep,BOD=2v7,LTO=Os,clock=16MHz_external -vid-pid=1A86_7523 -ide-version=10814 -build-path C:\Users\zahra\AppData\Local\Temp\arduino_build_208707 -warnings=none -build-cache C:\Users\zahra\AppData\Local\Temp\arduino_cache_877180 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avr-gcc.path=C:\Users\zahra\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7 -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino7.path=C:\Users\zahra\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7 -prefs=runtime.tools.avrdude.path=C:\Users\zahra\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino18 -prefs=runtime.tools.avrdude-6.3.0-arduino18.path=C:\Users\zahra\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino18 -prefs=runtime.tools.arduinoOTA.path=C:\Users\zahra\AppData\Local\Arduino15\packages\arduino\tools\arduinoOTA\1.3.0 -prefs=runtime.tools.arduinoOTA-1.3.0.path=C:\Users\zahra\AppData\Local\Arduino15\packages\arduino\tools\arduinoOTA\1.3.0 -verbose C:\Users\zahra\Documents\Arduino\sketch_may23b\sketch_may23b.ino

    Using board ‘8’ from platform in folder: C:\Users\zahra\AppData\Local\Arduino15\packages\MiniCore\hardware\avr\2.1.2

    Using core ‘MCUdude_corefiles’ from platform in folder: C:\Users\zahra\AppData\Local\Arduino15\packages\MiniCore\hardware\avr\2.1.2

    Detecting libraries used…

    “C:\\Users\\zahra\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-g++” -c -g -Os -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -w -x c++ -E -CC -mmcu=atmega8 -DF_CPU=16000000L -DARDUINO=10814 -DARDUINO_AVR_ATmega8 -DARDUINO_ARCH_AVR “-IC:\\Users\\zahra\\AppData\\Local\\Arduino15\\packages\\MiniCore\\hardware\\avr\\2.1.2\\cores\\MCUdude_corefiles” “-IC:\\Users\\zahra\\AppData\\Local\\Arduino15\\packages\\MiniCore\\hardware\\avr\\2.1.2\\variants\\standard” “C:\\Users\\zahra\\AppData\\Local\\Temp\\arduino_build_208707\\sketch\\sketch_may23b.ino.cpp” -o nul

    Generating function prototypes…

    “C:\\Users\\zahra\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-g++” -c -g -Os -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -w -x c++ -E -CC -mmcu=atmega8 -DF_CPU=16000000L -DARDUINO=10814 -DARDUINO_AVR_ATmega8 -DARDUINO_ARCH_AVR “-IC:\\Users\\zahra\\AppData\\Local\\Arduino15\\packages\\MiniCore\\hardware\\avr\\2.1.2\\cores\\MCUdude_corefiles” “-IC:\\Users\\zahra\\AppData\\Local\\Arduino15\\packages\\MiniCore\\hardware\\avr\\2.1.2\\variants\\standard” “C:\\Users\\zahra\\AppData\\Local\\Temp\\arduino_build_208707\\sketch\\sketch_may23b.ino.cpp” -o “C:\\Users\\zahra\\AppData\\Local\\Temp\\arduino_build_208707\\preproc\\ctags_target_for_gcc_minus_e.cpp”

    “C:\\Program Files (x86)\\Arduino\\tools-builder\\ctags\\5.8-arduino11/ctags” -u –language-force=c++ -f – –c++-kinds=svpf –fields=KSTtzns –line-directives “C:\\Users\\zahra\\AppData\\Local\\Temp\\arduino_build_208707\\preproc\\ctags_target_for_gcc_minus_e.cpp”

    Compiling sketch…

    “C:\\Users\\zahra\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-g++” -c -g -Os -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega8 -DF_CPU=16000000L -DARDUINO=10814 -DARDUINO_AVR_ATmega8 -DARDUINO_ARCH_AVR “-IC:\\Users\\zahra\\AppData\\Local\\Arduino15\\packages\\MiniCore\\hardware\\avr\\2.1.2\\cores\\MCUdude_corefiles” “-IC:\\Users\\zahra\\AppData\\Local\\Arduino15\\packages\\MiniCore\\hardware\\avr\\2.1.2\\variants\\standard” “C:\\Users\\zahra\\AppData\\Local\\Temp\\arduino_build_208707\\sketch\\sketch_may23b.ino.cpp” -o “C:\\Users\\zahra\\AppData\\Local\\Temp\\arduino_build_208707\\sketch\\sketch_may23b.ino.cpp.o”

    Compiling libraries…

    Compiling core…

    Using precompiled core: C:\Users\zahra\AppData\Local\Temp\arduino_cache_877180\core\core_52b9899e88a6a19eb681a282608e6163.a

    Linking everything together…

    “C:\\Users\\zahra\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-gcc” -w -Os -Wl,–gc-sections -mmcu=atmega8 -o “C:\\Users\\zahra\\AppData\\Local\\Temp\\arduino_build_208707/sketch_may23b.ino.elf” “C:\\Users\\zahra\\AppData\\Local\\Temp\\arduino_build_208707\\sketch\\sketch_may23b.ino.cpp.o” “C:\\Users\\zahra\\AppData\\Local\\Temp\\arduino_build_208707/..\\arduino_cache_877180\\core\\core_52b9899e88a6a19eb681a282608e6163.a” “-LC:\\Users\\zahra\\AppData\\Local\\Temp\\arduino_build_208707” -lm

    “C:\\Users\\zahra\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-objcopy” -O ihex -j .eeprom –set-section-flags=.eeprom=alloc,load –no-change-warnings –change-section-lma .eeprom=0 “C:\\Users\\zahra\\AppData\\Local\\Temp\\arduino_build_208707/sketch_may23b.ino.elf” “C:\\Users\\zahra\\AppData\\Local\\Temp\\arduino_build_208707/sketch_may23b.ino.eep”

    “C:\\Users\\zahra\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-objcopy” -O ihex -R .eeprom “C:\\Users\\zahra\\AppData\\Local\\Temp\\arduino_build_208707/sketch_may23b.ino.elf” “C:\\Users\\zahra\\AppData\\Local\\Temp\\arduino_build_208707/sketch_may23b.ino.hex”

    cmd /C “C:\\Users\\zahra\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-objdump” –disassemble –source –line-numbers –demangle –section=.text “C:\\Users\\zahra\\AppData\\Local\\Temp\\arduino_build_208707/sketch_may23b.ino.elf” > “C:\\Users\\zahra\\AppData\\Local\\Temp\\arduino_build_208707/sketch_may23b.ino_atmega8_16000000L.lst”

    “C:\\Users\\zahra\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-size” -A “C:\\Users\\zahra\\AppData\\Local\\Temp\\arduino_build_208707/sketch_may23b.ino.elf”

    Sketch uses 854 bytes (11%) of program storage space. Maximum is 7680 bytes.

    Global variables use 9 bytes (0%) of dynamic memory, leaving 1015 bytes for local variables. Maximum is 1024 bytes.

    avrdude: stk500_recv(): programmer is not responding

    avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x05

    avrdude: stk500_recv(): programmer is not responding

    avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x05

    avrdude: stk500_recv(): programmer is not responding

    avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x05

    avrdude: stk500_recv(): programmer is not responding

    avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x05

    avrdude: stk500_recv(): programmer is not responding

    avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x05

    avrdude: stk500_recv(): programmer is not responding

    avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x05

    avrdude: stk500_recv(): programmer is not responding

    avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x05

    avrdude: stk500_recv(): programmer is not responding

    avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x05

    avrdude: stk500_recv(): programmer is not responding

    avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x05

    avrdude: stk500_recv(): programmer is not responding

    avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x05

    Problem uploading to board. See https://support.arduino.cc/hc/en-us/sections/360003198300 for suggestions.

    • با سلام
      لطفا مشخص کنید این ارور را هنگام پروگرام بوت رودر روی میکروکنترلر دریافت می‌کند؟
      و یا بوت لودر روی میکروکنترلر پروگرام شده و هنگام دانلود برنامه این ارور دریافت می‌شود؟

  • سلام من یک usbasp و اردوینو مگا ۲۵۶۰ دارم که بوت لودر ۱۶u2اردینو مگا خراب شده و به عنوان کیبورد شناسایی می شود

    چطور میتونم درستش کنم که به عنوان اردوینو مگا ۲۵۶۰ شناخته بشه؟

  • با سلام. ممنون از مطلب مفیدتون. جایی مطالعه میکردم نوشته بود میکرو atmega328 یا atmega8 رو اگر با ۳٫۳v و ۸mhz راه اندازی کنید، مصرف میکرو خیلی خیلی پایین تر میاد. سوالم اینه بعد از اینکه تونستیم میکرو رو با arduino را اندازی کنیم، آیا میشه فرکانس کاریش رو تغییر داد و بالتبع با ۳٫۳ ولت کار کنه؟

    • با سلام
      بله پس از انتقال بوت لودر بر روی میکروکنترلر میتوانید وارد بهش tools شده و فرکانس کاری میکروکنترلر را انتخاب کنید. همچنین برای اعمال ولتاژ ۳٫۳ به میکروکنترلر نیاز به تنظیم خاصی نیست. اکثر میکروکنترلر های AVR هر دو ولتاژ ۳٫۳ و ۵ را ساپورت می کنند.

      • در برنامه آردوینو وارد سربرگ tools شوم؟ کدوم قسمت میشه فرکانس رو تغییر داد؟ پس از اون، تکلیف کریستال خارجی ۱۶ مگ چی میشه؟ آیا باید حذف شه؟

        • با سلام
          زمانی که برد رو از پکیج minicore بر روی mega8 یا ۳۲۸ تنظیم کنید. گزینه های موجود در سربرگ tools تغیر خواهد کرد. از همین سربرگ با انتخاب گزینه Clock میتوانید فرکانس را تنظیم کنید. در صورتی که نیاز به فرکانسی غیر از ۱۶ مگاهرتز نیاز دارید بایستی کریستال را حذف و یا تعویض کنید.

  • سلام و عرض ادب
    مهندس از این روش استفاده کنیم میشه از کتابخانه های آردوینو هم بهره برد ممنون

    • با سلام
      بله، با استفاده از این روش میتواند از تمامی کتابخانه هایی که برای برد های متنی بر تراشه های AVR نوشته شده است، استفاده کنید. تنها موردی که بایستی به آن توجه کنید، حافظه محدود تر میکروکنترلر ATmega8 نسبت به ATmega328 است.

  • سلام. در یه مورد خیلی مبتدی گیر کردم. مطابق راهنمای سایت اردوینو و همینطور سرچ گوگا میخوام atmega328 pu روش بوت لودر بزنم. با روش خودش نشد و avrdude ارور داد که Yikes! Invalid device signature. بعدش اومدم با minicore سعی کنم اونجا هم میگه avrdude: Device signature = 0x000000 موندم چیکار کن. لطفا کمک کنید

  • سلام.ایا اموزشی دارید که بتونیم کاری کنیم که میکروکنترلر ما دیگه پروگرام نشه و فقط برنامه ای که توی حافظش هست رو اجرا کنه؟(برای میکروکنترلر ATmega8)

  • سلام روی atmega8 smd هم همین کد و روش جواب میده ؟
    لطفاً ایمیل کنید جواب رو ممنون خیلی مهمه ❤️

    • با سلام
      بله امکان اجرای این روش روی میکروکنترلر های SMD هم وجود دارد اما بایستی ابتدا هدر بردی برای استفاده از این میکروکنترلر طراحی کرده و سپس از آن استفاده کنید. تا به پایه های آن دسترسی داشته باشید.

  • با سلام
    من بوت لودر را با موفقیت آپلود کردم ولی زمانی که می خواهم برنامه LED را بر روی میکرو آپلود کنم خطای زیر نمایش می دهد لطفا راهنمایی بفرمایید
    is not recognized as an internal or external command,
    operable program or batch file.

    با تشکر

    • با سلام
      آیا قسمت مربوط به انتخاب Mega8 از کتابخانه MiniCore را به درستی انجام داده اید؟

    • با سلام
      مقاومت های استفاده شده یک چهارم وات هستند.اما توان مقاومت ها تاثیری در کارکرد مدار ندارند.

  • سلام بوت لودر نصب شد اما برای من همچین اروری میده هنگام آپلود کد blink.
    An error occurred while uploading the sketch
    avrdude: ser_open(): can’t open device “\\.\COM8”: A device which does not exist was specified.

    اتصالاتم هم درست هست.

    • با سلام
      لطفا در قسمت Device manager ویندوز چک کنید آیا اتصال مازول USB To TTL و درایور آن به درستی صورت گرفته است.

  • سلام مهندس بهرام هستم .یک عدد آی سی اتمگا۸ مربوط به دستگاهی دارم که قفل نیست توسط پروگرامر Avr آنرا Read و save کردم حالا فیوزبیت هایش را Read کردم آنهارا باید دستی یادداشت کنم که در موقع پروگرام کردن آی سی جدید دیگر وارد کنم یا اینکه روش دیگری دارد لطف کنین راهنمایی کنین

  • سلام مهندی من قصد دارم یک ATMEGA8رو به جای اردوینو استفاده کنم راهی هست با پروگرامر بوت لودر بریزم؟

  • سلام مهندس داخل دانشجو کیت نوشته این مبدل از ویندوز ده پشتیابنی نمیکنه شما چه مدلی رو پیشناد میدید؟

    • با سلام
      مدل های CH340 و Cp2102 در صورتی که درایور به درستی نصب شود. برای انجام این پروژه مناسب است.

  • سلام.خسته نباشید.
    برنامه چشمک زن رو که میخوام برای atmega8 کامپایل کنم این ارور رو می ده:
    Error compiling for board Atmega8

    exec “cmd” : executable file not found in %PATH%

    Error compiling for board Atmega8

    راه حلش چیه؟

    متشکرم

    • با سلام
      ممکن است بوت لودر به درستی بر روی میکروکنترلر قرار نگرفته باشد. لطفا مراحل گفته شده را یکبار دیگر با دقت انجام دهید.

  • سلام متاسفانه من نمیتونم کتابخانه optiloaderو پیدا و نصب کنم راهنمایی میفرمایید؟ ای دی ای هم ۱٫۸٫۱۹هستش

  • درود مهندس.
    سپاس فراوان.
    آیا با این روش، فرمت Hex را هم میشود بر روی Atmega8 آپلود کرد؟
    بنده با Atmega8 میخواهم یک پروگرامر AVR بسازم.
    و برای پروگرام کردنِ میکروی مورد استفاده در پروگرامر، به یک پروگرامر AVR نیاز دارم.
    امکان قرض گرفتن از کسی هم ندارم.
    چطور میتوانم فایل HEX مربوط به پروگرامری که ساخته‌ام را روی میکروی آن آپلود کنم؟

  • سلام.
    مهندس من یک سئوال دارم که بعد از این کار ها دیگه ما نیازی به کد ویژن برای نوشتن کد ها نداریم و هر کدی رو که قبلا واسه آردوینو می‌نوشتیم رو میتونیم با همین روش روی میکرو مون آپلود کنیم.
    و بعد از آپلود نیازی به کریستال و خازن داریم یا میتونیم اونارو برداریم؟

  • سلام ارادت چند وقته درگیر ریختن بوتلودر آردوینو روی یه ATMEGA328 هر روشی با برد آردوینو تو آموزشهای نت یود اتجام دادم نشد خطای امضا معتبر نیست میداد. با آموزش شما هم این ارور رو میده
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x03
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x03
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x03
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x03
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x03
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x03
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x03
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x03
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x03
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x03
    Error while burning bootloader.

    • با سلام
      این ارور زمانی مشاهده میشود که آی سی فاقد بوت لودر باشد. برای ریختن بوت لودر روی تراشه Atmega328 بایستی از یک برد آردوینو که دارای بوتلودر است استفاده کنید.