본문으로 건너뛰기
cccskills
무료GitHub에 공개

atmega328p-nano

Firmware development for the Arduino Nano (A000005, ATmega328P @ 16 MHz, 5 V) — its 30 KB usable flash, 2 KB SRAM, 1 KB EEPROM, 8-channel 10-bit ADC, six 8-bit PWM pins across three timers, UART shared with the USB-serial chip, I2C on A4/A5, SPI on D10–D13, sleep modes, and the Arduino AVR core + PlatformIO setup around them. Use when working on this board or any ATmega328P Nano clone (FTDI or CH340 USB): project setup, platformio.ini, old-vs-new bootloader uploads, pin mapping, A6/A7 restrictions, timer/Servo/tone conflicts, the 2 KB SRAM budget, analog references, powering from VIN, ICSP recovery, or debugging why something on the board does not work.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

실행 점수 미검증

설치 방법 보기

포함된 파일(11)

  • SKILL.md11.3 KB
  • assets/IMAGE.md432 B
  • reference/board-hardware.md29.8 KB
  • reference/recipes.md9.7 KB
  • template/.gitignore13 B
  • template/include/board.h2.5 KB
  • template/platformio.ini1.1 KB
  • template/README.md2.8 KB
  • template/src/main.cpp3.1 KB
  • template/variants/minimal/main.cpp535 B
  • template/variants/new-project.sh1.3 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

Arduino Nano (ATmega328P)

Board-specific firmware knowledge. The Nano is simple enough that every failure mode is silent — the sketch compiles, uploads, runs, and does something subtly wrong — so read the reference file rather than guessing.

  • reference/board-hardware.md — the complete board reference: corrected pin map (the official manual's own tables contain errors), power tree, clock, memory map, connector/LED inventory plus a development guide (Part II: §8 toolchain, §10 peripheral cookbook, §11 gotchas, §12 flashing, §13 symptom → cause → fix table).
  • reference/recipes.md — copy-paste code: platformio.ini, board.h, non-blocking timing, serial + free RAM, EEPROM with update semantics, ADC and references, interrupts, the timer/PWM map, Servo vs tone(), power-down sleep, PROGMEM tables.
  • template/ — a project that builds clean, in two variants, plus a scaffold script. See template/README.md.

Orientation

MCUATmega328P, 8-bit AVR @ 16 MHz (crystal — fixed, no PLL), Harvard architecture
Memory32 KB flash (30,720 B usable — 2 KB bootloader reserve), 2 KB SRAM, 1 KB EEPROM. No DMA, no MPU
LED / buttonL = D13 (LED_BUILTIN), on = HIGH · RESET button, active-low
ADC8 × 10-bit, 0–5 V, ~100 µs per analogRead(); A6/A7 are analog-input only
PWM6 × 8-bit: D3, D11 (~490 Hz, Timer2), D9, D10 (~490 Hz, Timer1), D5, D6 (~980 Hz, Timer0)
UARTD0/D1 — shared with the USB-serial chip, not free pins
I2C / SPIA4=SDA, A5=SCL · D10=SS, D11=MOSI, D12=MISO, D13=SCK (+ICSP header)
Power5 V logic. USB Mini-B, VIN 7–12 V via LDO, +5V pin (bypasses regulator). 3V3 pin 50 mA max
DebugNo SWD/JTAG — only the 6-pin ICSP header (pin 1 at the outer edge; some diagrams rotate it 180°)
ToolchainPlatformIO 6.1 + atmelavr 5.3.0 + Arduino AVR core, board = nanoatmega328new (Optiboot) / nanoatmega328 (old bootloader)

Rules that prevent the expensive mistakes

Each of these produces a failure that looks like something else.

  1. upload_speed = 57600 on old-bootloader boards. Genuine Nanos sold before Jan 2018 and most clones run the old ATmegaBOOT at 57600 baud, not Optiboot's 115200. The wrong choice fails uploads with not in sync / stk500_recv — which reads like a driver or cable problem, not a firmware-era problem. In the Arduino IDE the equivalent is Tools → Processor → ATmega328P (Old Bootloader).
  2. The 2 KB SRAM is the wall, not the 30 KB flash. Every Serial.print string literal, const array and String copy lands in SRAM by default. The failure is a heap/stack collision that corrupts variables or crashes after minutes-to-days — nothing prints "out of memory". F() on every literal, PROGMEM for tables, static buffers instead of String, and watch free RAM (recipe 4).
  3. digitalWrite(A6) / digitalRead(A7) compile and silently misbehave. A6/A7 feed the ADC mux only — there is no port register behind them. They are analog-input-only; any digital use needs the signal moved to a real pin. A0–A5 are full digital pins (aliases 14–19).
  4. D0/D1 are wired to the FTDI/CH340 chip, not to free GPIO. Using them while Serial is open produces garbage in both directions, and anything external wired to them blocks uploads. The TX/RX LEDs show USB-serial traffic only — they say nothing about D1 driven manually.
  5. Never write TCCR0A/TCCR0B. Timer0 is millis(), micros() and delay() and the ~980 Hz PWM on D5/D6. "Just changing the PWM frequency" on those pins makes delay() lie and baud-rate-timed software (SoftwareSerial, DHT, NeoPixel) glitch, with no error anywhere.
  6. Every PWM pin is rented from a library. Servo takes Timer1 — D9/D10 analogWrite() dead while attached. tone() takes Timer2 — D3/D11 dead while playing. Servo + tone coexist (different timers) but neither survives touching Timer0. Also: PlatformIO's AVR core bundles only EEPROM/HID/SoftwareSerial/SPI/Wire — #include <Servo.h> is a compile error until lib_deps = arduino-libraries/Servo is added (the Arduino IDE bundles it).
  7. D13 is the LED and the SPI clock. The LED + series resistor load the line, which matters when D13 is an input or SCK: a flaky SPI bus that blinks L with the clock is this, not your wiring.
  8. All GPIO are 5 V push-pull. Into a 3.3 V-only peripheral that is damage, not a logic level. The 3V3 pin is an output limited to 50 mA — powering a sensor is fine, a radio module is not.
  9. analogReference(EXTERNAL) before any voltage touches AREF, and AREF ≤ 5 V always. Driving AREF while an internal reference is selected burns the pin.
  10. The +5V pin bypasses the regulator. Feeding it from anything above 5.0 V — or from a "5 V" supply that drifts — goes straight into the MCU. Unregulated input belongs on VIN, which needs ≥ 7 V to clear the LDO dropout (7–12 V recommended).
  11. wdt_disable() first in setup() (and clear MCUSR). A sketch that leaves the watchdog enabled boot-loops boards with the old ATmegaBOOT bootloader — it does not clear the WDT on entry — and the loop survives re-uploading; only ICSP recovery or Optiboot fixes it.
  12. Unconnected inputs are not zero — they float. Pull-ups (20–50 kΩ) are off by default: INPUT_PULLUP or an external resistor, or the pin reads random noise.
  13. USB + VIN together = auto power selection, highest voltage wins. A 9 V VIN while debugging over USB back-feeds the USB port. Power actuators from VIN, the debug session from USB, grounds common — or accept VIN < 5 V.

When the task is memory

2,048 B covers globals, heap and stack together, and there is no MPU: the heap grows up, the stack grows down, and their collision is whatever random corruption results. The arithmetic that matters:

  • A Serial.println("temperature sensor ready") costs 26 B of SRAM forever; in F() it costs 0. A 256-entry uint16_t table is an eighth of the chip — PROGMEM it (recipe 11).
  • The Arduino core + a Blink already use ~600 B flash and single-digit bytes of RAM; Serial adds ~1.5 KB flash. The template's full variant — heartbeat + serial report + ADC + EEPROM counter — totals 2,874 B flash, 201 B RAM. Budget accordingly: a 1 KB receive buffer is half the machine.
  • String fragments the small heap; static char[] buffers do not. On this part, prefer snprintf() into a fixed buffer.
  • Instrument, don't estimate: the free_ram() probe in recipe 4 costs 20 B flash. Below ~200 B free, stop adding features and restructure.

When the task is timing

The three timers are the whole scheduling story, and all of them are spoken for:

TimerOwned byPWM pinsFree to reconfigure?
Timer0millis()/micros()/delay()D5, D6 (~980 Hz)never
Timer1Servo libraryD9, D10 (~490 Hz)if Servo is not used (recipe 8 has the fast-PWM setup)
Timer2tone()D3, D11 (~490 Hz)if tone is not used

Consequences worth internalizing: an ISR or noInterrupts() section longer than ~100 µs starts eating UART characters and skewing millis()-based intervals; delayMicroseconds() is cycle-counted and stays exact; and anything bit-banged (DHT, one-wire, SoftwareSerial) degrades when interrupts are blocked — including by long Servo pulses. The non-blocking millis() pattern (recipe 3) is the default shape of every loop on this board.

Starting a new project

Do not hand-assemble one. template/ builds clean; scaffold from it:

~/.claude/skills/atmega328p-nano/template/variants/new-project.sh <target-dir> [--full|--minimal]
cd <target-dir> && pio run
  • --minimal — the classic Blink on the "L" LED, hardware-verified. 924 B flash, 9 B RAM. Flash this first on an unfamiliar board: if it does not blink, the problem is the toolchain, the COM port or the bootloader era (rule 1), not the code.
  • --full (default) — non-blocking heartbeat, serial report with F() strings, free-RAM watch, ADC sample on A0, EEPROM boot counter. 2,874 B flash, 201 B RAM.

Both build as-is with platform-atmelavr 5.3.0 (verified). Nothing is generated and no paths are embedded, so copying the tree by hand works identically. template/README.md maps files to subsystems.

When the user already has a project, prefer bringing it in line with the template's platformio.ini and include/board.h over rewriting their code.

Flashing

Over the Mini-B USB cable, nothing to press — the DTR auto-reset opens the bootloader (Optiboot listens ~1 s at 115200, old ATmegaBOOT ~1–2 s at 57600):

pio run -t upload -t monitor

The board enumerates as a COM port: FTDI VCP on genuine boards, CH340 on most clones (needs the WCH driver — its absence is why a clone "does not appear on any port").

Upload failure checklist, in order: wrong bootloader era (rule 1), wrong COM port / missing CH340 driver, something wired to D0/D1 (disconnect), and only then assume the sketch. A sketch that crashes instantly or blocks interrupts can be replaced by timing a RESET press during upload.

The recovery route is the 6-pin ICSP header with a second Arduino running 11.ArduinoISP, a USBasp, or avrdude — it bypasses the bootloader entirely, so no bad firmware permanently bricks this board. Burn Bootloader over ICSP also restores the fuse set (LOW=0xFF, HIGH=0xDA, EXT=0xFD — PlatformIO's own board definition; avrdude reads back the equivalent 0x05 on some tools since only the low 3 BODLEVEL bits are implemented) — the fix for clones with mis-set clock fuses and for WDT boot-loops. ICSP is also how to upload bootloader-less and reclaim the reserved 2 KB.

Reporting

Say what is verified on hardware and what is derived. In this skill the Blink (the template's --minimal variant) ran on an Arduino Nano A000005 v3.x with the Optiboot bootloader, and the pin map it relies on is the corrected physical pinout of §2 — the official A000005 manual's own pin tables contain errors (they omit RESET/GND and AREF, mislabel 3V3, and invent "Serial Wire Debug" pins), so quote this skill's tables, not Arduino's. Everything marked ⚠︎ compile-checked only in reference/recipes.md — ADC references, interrupts, Timer1 PWM, Servo/ tone, sleep, PROGMEM — compiles against the Arduino AVR core but was not run on hardware by the author. The VIN range is reported inconsistently by the sources (7–15 V, 7–12 V, 6–20 V); this skill states 7–12 V recommended as the conservative intersection.

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

Firmware development for the Beetle — the CJMCU / DFRobot "Mini Arduino Leonardo" USB board (ATmega32U4 @ 16 MHz, 5 V, 21×28 mm, castellated pads) — its native USB (CDC serial + HID keyboard/mouse/joystick), Caterina bootloader and 1200 bps touch upload, ten exposed I/O pads, four PWM pins across Timer0/Timer1, five ADC channels, I2C on D2/D3, SPI on the back-side ICSP pads, 28 KB usable flash and 2.5 KB SRAM, and the PlatformIO + Arduino AVR core (`board = leonardo`) setup around them. Use when working on this board or any ATmega32U4 Leonardo/Micro/Pro-Micro-class clone: project setup, platformio.ini, why the board shows up as two different serial ports, uploads that fail or hang, recovering a bricked or HID-spamming board by shorting the ICSP reset pads, pin mapping and which pads are missing, PWM/timer conflicts, Servo and tone, USB HID keyboard projects, the SRAM budget, powering from the + pad, or debugging why something on the board does not work.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

alexex1993/mcu-skills202026년 10월 16일 업데이트

Разработка прошивок для BE-U1000 (Baikal Electronics / Байкал Электроникс, три ядра RISC-V: BR-350 и BM-310) на отладочных платах EVU-BA-2.1, EVU-BA-2.0 и EVU-BA-1.2 — её eFlash и QSPI flash, UART0/BootROM CLI, PWMA (захват и импульсы), АЦП с DMA, CAN FD, SPI, WDT, CLIC, а также SDK Байкала и его система сборки на make. Use when working on this board or any BE-U1000 / BMCU_U project (SDK 2.1/2.3, riscv32-none-elf, dfu-util, OpenOCD): настройка проекта, Makefile и MEM_REG_ROM, карта выводов и разъёмы XP1/XP8/XP9/XP10, режимы начальной загрузки и страповые выводы, прошивка по UART XMODEM либо USB DFU, работа с eFlash и TCM, прерывания и CLIC, отладка по JTAG — и разбор, почему плата молчит, не стартует, зависает или почему периферия «настроилась», а обмена нет.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

alexex1993/mcu-skills202026년 10월 16일 업데이트

Firmware development for the 30-pin ESP32-WROOM-32 development board — the DOIT ESP32 DevKit V1 / ESP32 CH340 Type-C / NodeMCU-ESP32 30-pin form factor, 15 pins per side, CH340G or CP2102 USB-UART bridge, AMS1117 LDO, user LED on GPIO2. Use when working on a 30-pin ESP32 devkit (ESP32-D0WDQ6 / ESP32-D0WD-V3, ESP-WROOM-32 module): project setup, platformio.ini and sdkconfig for ESP-IDF or Arduino, pin mapping and which GPIOs are safe, strapping pins, ADC1 vs ADC2 with Wi-Fi, SPI speed and IO_MUX pins, I2C, deep sleep and RTC wake pins, flashing over the CH340 bridge, BOOT/EN recovery, brownouts, or debugging why something on the board does not work.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

alexex1993/mcu-skills202026년 10월 16일 업데이트

Firmware development for the 36-pin ESP32-WROOM-32 development board — the original DOIT ESP32 DevKit V1 with 18 pins per side, i.e. the 30-pin layout plus the six in-package flash pins (SD0 SD1 SD2 SD3 CMD CLK = GPIO6-11) broken out at the USB end, CH340G or CP2102 bridge, AMS1117 LDO, user LED on GPIO2, GPIO0 not on the header. Use when working on a 36-pin ESP32 devkit (ESP32-D0WDQ6 / ESP32-D0WD-V3, ESP-WROOM-32 module), or when identifying which ESP32 board size you have: project setup, platformio.ini and sdkconfig for ESP-IDF or Arduino, pin mapping and which GPIOs are safe, the flash-pin trap, strapping pins, ADC1 vs ADC2 with Wi-Fi, SPI speed and IO_MUX pins, deep sleep and RTC wake pins, flashing, BOOT/EN recovery, brownouts, or debugging why something on the board does not work.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

alexex1993/mcu-skills202026년 10월 16일 업데이트

Firmware development for the 38-pin ESP32-WROOM-32 development board — Espressif ESP32-DevKitC V4, Ai-Thinker NodeMCU-32S, DOIT ESP32 DevKit V1 38-pin and their CH340/CP2102 clones, 19 pins per side, with GPIO0 and the six in-package flash pins (GPIO6-11, labelled D0 D1 D2 D3 CMD CLK or SD0-SD3) broken out. Use when working on a 38-pin ESP32 devkit (ESP32-D0WDQ6 / ESP32-D0WD-V3, ESP-WROOM-32 or ESP32-WROVER module): project setup, platformio.ini and sdkconfig for ESP-IDF or Arduino, pin mapping and which GPIOs are safe, the flash-pin and IO0 traps, WROVER GPIO16/17 PSRAM conflict, strapping pins, ADC1 vs ADC2 with Wi-Fi, SPI speed and IO_MUX pins, deep sleep and RTC wake pins, flashing, BOOT/EN recovery, brownouts, or debugging why something on the board does not work.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

alexex1993/mcu-skills202026년 10월 16일 업데이트

Firmware development for the ESP32-C3 0.42" OLED board (ESP32-C3FH4, QFN32) — the ABRobot / 01Space "ESP32-C3-0.42LCD" mini board and its clones, sold as "ESP32-C3 SuperMini with OLED" and "ESP32 C3 OLED development board". Covers its 72x40 SSD1306 OLED on I2C, the single I2C bus, blue LED on GPIO8, BOOT button on GPIO9, USB Serial/JTAG console, ADC1, Wi-Fi/BLE, and the ESP-IDF + PlatformIO setup around them. Use when working on this board or a bare ESP32-C3: project setup, platformio.ini and sdkconfig, pin mapping and strapping pins, getting the 0.42-inch display to show something other than snow, U8g2 offsets, adding a second I2C device, flashing over USB-C, or debugging why something on the board does not work.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

alexex1993/mcu-skills202026년 10월 16일 업데이트

alexex1993의 스킬 모두 보기

이 스킬의 문제 신고