VS Code의 PlaatformiO에서 Arduino의 ATmega328p 디버깅 수행

아두노 UNO, 프로 미니, 나노에서는 마이크로컴퓨터 ATmega328p를 사용했지만 debugwire라는 규격에 맞게 디버깅을 할 수 있다.
debugwire를 사용하려면 고가의 기계가 필요하지만 Digispark Attiny 85라는 1000엔 이하의 개인용 컴퓨터판을 debugwire로 사용하고 dwire-debug를 사용하면 ATmega328p를 디버깅할 수 있다.
이 글을 참고했지만 아두노에 대한 이해가 부족해 빠진 곳이 많기 때문에 디버깅을 수행하기 전의 절차를 소개한다.
https://hackaday.io/project/162302-debugging-arduino-uno-in-vscode
하지만 Arduino UNO R3에 대한 디버깅은 나 혼자 성공하지 못했다.Arduino Pro Mini에서 성공했습니다.또 FUSE를 고쳐 썼기 때문에 고전압 프로그래머가 없으면 고쳐 쓸 수 없는 상태에 빠질 수 있다.위험을 고려한 기초 위에서 진행할 필요가 있다.
Arduino UNO에서는 다음과 같은 경로설정 가공이 필요합니다.
http://easylabo.com/2015/02/atmel/6924/
이 글의 설명은 모두 Linux(Ubuntu)로 기재되어 있지만, 주로 USB 포트의 지정(/dev/tty USB 0)을 목적 OS로 바꾸십시오.

준비물


하드웨어

  • Digispark ATtiny85
  • Arduino Pro Mini
  • 소프트웨어


    다음 소프트웨어가 설치되어 있습니다.
  • VS Code
  • VS 코드의 확장 기능 "PlaatformIO"
  • PlaatformiO에서 Arduino UNO
  • 개발 준비
  • avr-gdb
  • avrdude
  • avr-gdb와 avrdude가 Ubuntu라면 아래에 설치할 수 있습니다.
    sudo apt install -y gdb-avr avrdude
    

    Digispark Attiny 85에 micronucleas boootloader 쓰기


    Digispark Attiny 85에서 dwire-debug를 프로그래밍하려면 micronucleas boootloader에 기록해야 합니다.
    boootloader에 쓰기 위해서는 ISP(In System Programer)가 필요합니다.USBasp을 구매하면 ISP로, 아두노 UNO가 있으면 아두노 UNO를 ISP로 사용할 수 있다.
    우선 아두노 UNO를 ISP로 만들기 위해 아두노 IDE를 열고 메뉴'File'->'Example'->'아두노 ISP'를 열어 이 스케치북을 아두노 UNO에 올린다.
    Arduino UNO와 Digispark Attiny 85를 연결하는 방법은 다음과 같습니다.
    ICSP
    Arduino UNO
    Digispark ATtiny85
    RESET
    10
    P5
    SPI MOSI
    11
    P0
    SPI MISO
    12
    P1
    SPI SCK
    13
    P2
    5V
    5V
    VCC
    GND
    GND
    GND
    avrdude 명령에서 지정한prgrammer의 이름-cavrisp입니다.
    먼저 Digispark Attiny 85의 FSE가 어떤 설정인지 확인합니다.Digispark Attiny 85의 FSE 값은 FE DD C1여야 합니다(엄밀히 말하면 SELFPRGEN의 값은 1).
    avrdude -p attiny85 -c avrisp -P /dev/ttyUSB0 -b 19200
    
    avrdude: safemode: Fuses OK (E:FE, H:DD, L:C1)
    
    FUSE의 설정에서 avrdude 명령을 통해 설정할 수 있는 것 외에 AVR8 burn-o-mat라는 도구를 사용하면 GUI를 통해 설정할 수 있다.
    그러나 FUSE를 잘못 설정하면 다시 시작할 수 없습니다.
    http://avr8-burn-o-mat.aaabbb.de/
    avrdude -p attiny85 -c avrisp -P /dev/ttyUSB0 -b 19200-U lfuse:w:0xEF:m -U hfuse:w:0xDD:m -U efuse:w:0xC1:m
    
    Digispartk Attiny 85용 micronucleas boootloader 이미지는 아래에서 다운로드할 수 있습니다.
    https://github.com/micronucleus/micronucleus/blob/master/firmware/releases/t85_default.hex
    t85default.hex에 쓰려면 다음 명령을 실행하십시오.
    avrdude -p attiny85 -c avrisp -P /dev/ttyUSB0 -b 19200 -U ./t85_default.hex
    
    이렇게 하면 ISP의 역할이 끝난다.
    다음은 이micronucleas boootloader로 dwire-debug의 그림을 씁니다.
    쓰기에 필요한micronucleas의 cli 도구를 다운로드하십시오.
    https://github.com/micronucleus/micronucleus/releases/tag/master-LATEST
    아래에서 dwire-debug의 그림을 다운로드하십시오.
    https://github.com/dcwbrown/dwire-debug/blob/master/usbtiny/main.hex
    그리고 micronucleas boootloader를 통해 쓸 때 다음 명령을 실행합니다.
    디스플레이
    micronucleus --run main.hex
    
    > Please plug in the device ...가 나타나면 Digispark Attiny 85를 PC에 연결합니다(micronucleas 쓰기 방법).
    기록이 성공한 경우 삽입 후 즉시 식별Bus 001 Device 007: ID 16d0:0753 MCS Digistump DigiSpark하고 6초 후Bus 001 Device 031: ID 1781:0c9f Multiple Vendors USBtiny로 변하면 성공한다.Ubuntu의 경우 lsusb 명령을 통해 확인할 수 있습니다.
    마지막으로 USE에서 RESET를 무효화하는 설정(RstdISBL=1).이 설정을 사용하면 일반적인 ISP에 기록할 수 없으며, 이 설정이 성공했는지 확인한 후에 다시 진행하십시오.
    avrdude -p attiny85 -c avrisp -P /dev/ttyUSB0 -b 19200-U lfuse:w:0xEF:m -U hfuse:w:0x5D:m -U efuse:w:0xC1:m
    
    이 Digispark Attiny 85는 ISP의 USBtiny로 사용할 수 있다.

    dwire-debug 명령을 준비합니다 dwire-debug


    MacOS, Windows의 경우 명령은 아래에서 다운로드할 수 있습니다.
    https://github.com/DeqingSun/dwire-debug/releases/
    Ubuntu인 경우 별도로 구성해야 합니다.
    git clone https://github.com/DeqingSun/dwire-debug
    cd dwire-debug
    make
    

    Digispark Attiny 85에 UNO, Pro Mini 연결


    아래와 같이 연결을 진행한다.
    ICSP
    Digispark ATtiny85
    Arduino UNO
    Arduino Pro Mini
    RESET
    P5
    ICSP RST
    RST
    SPI MOSI
    P0
    ICSP MOSI
    11
    SPI MISO
    P1
    ICSP MISO
    12
    SPI SCK
    P2
    ICSP SCK
    13
    ICSP는 Arduino UNO에서 다음과 같은 스핀다운 구성입니다.
    |MISO|VCC|
    |CLK|MOSI|
    |RST|GND|
    올바르게 연결되면 다음 명령을 사용하여 현재 FUSE 값을 얻을 수 있습니다.
    avrdude -patmega328p -cusbtiny
    

    FSE를 사용하여 debugwire 활성화


    USE에서 DWEN = 1을 설정하고 debugwire를 활성화합니다.Arduiino UNO가 앞서 설명한 것처럼 추가 가공을 하지 않으면 사용할 수 없다(필자는 FUSE를 설정해 보았지만 3개의 UNO를 사용할 수 없다).
    avrdude -patmega328p -cusbtiny -U lfuse:w:0xFF:m -U hfuse:w:0xDA:m -U efuse:w:0xFD:m
    

    dwire-debug가 동작하는지 확인


    dwdebug 명령을 실행하여 ATmega328P가 인식되는지 확인합니다.
    dwdebug device usbtiny1
    
    Connected to ATmega328P on UsbTiny1 at 125000 baud.
    
    확인 후 Ctrl-C를 통해 중단합니다.
    또한 dwdebug를 시작하면 디버깅 모드로 시작하고 avrdude 명령과 Upload는 더 이상 받아들일 수 없습니다. 이 때 dwdebug 실행 명령q로 디버깅을 끝낼 수 있습니다.
    dwdebug device usbtiny1
    Connected to ATmega328P on UsbTiny1 at 125000 baud.
    0040: 940c  jmp   $00000c               > qi
    

    USBTiny를 통해 PlaatformIO에 프로그램 쓰기


    PlaatformIO의 설치 및 프로젝트 구축 방법을 생략합니다.
    USBTiny로 작성된 PlaatformIO의 설정은 다음과 같습니다.
    platformio.ini
    [env:uno]
    platform = atmelavr
    board = uno
    framework = arduino
    upload_protocol = usbtiny
    build_type = debug
    
    실제 PlaatformiO의 Upload 단추가 작동하지 않는 경우 avrdude 명령을 다음과 같이 씁니다.
    avrdude -patmega328p -cusbtiny -U .pio/build/uno/firmware.hex
    

    dwire-debug 동작 사용하기


    dwdebug 명령에서 gdb로부터 연결을 받는 상태로 다음 명령을 실행합니다.
    dwdebug device usbtiny1, gdbserver, qr
    
    Connected to ATmega328P on UsbTiny1 at 125000 baud.
    
    Info : avrchip: hardware has something
    Target ready, waiting for GDB connection.
    Use 'target remote :4444'
    

    PlaatformIO에서 avr-gdb를 사용하여 디버깅 시작


    PlaatformIO 설정에 debug 관련 설정을 추가합니다.
    platformio.ini
    [env:uno]
    platform = atmelavr
    board = uno
    framework = arduino
    upload_protocol = usbtiny
    build_type = debug
    debug_tool = custom
    debug_server = /usr/bin/avr-gdb
    debug_init_cmds =
        set remoteaddresssize 32
        target remote localhost:4444
    
    중단점을 설정합니다. 정지하면 디버깅을 실행할 수 있습니다.

    FSE 복원


    디버그가 끝난 후 debugwire에서 FUSE가 활성화된 상태에서 시작합니다.
    avrdude -patmega328p -cusbtiny -U lfuse:w:0xEF:m -U hfuse:w:0xDD:m -U efuse:w:0xC1:m
    

    확인한 일


    좋은 디버깅 체험을 별로 얻지 못했다.
  • 인터럽트 설정은 프로그램이 멈춘 후에 해야 합니다.
  • 브레이크가 중지되면 변수의 값을 참조할 수 있습니다.
  • 단계 실행(다음 줄로 진행, 함수 끝날 때까지)은 작용하지 않으며 각각 단점을 설정해야 한다.
  • 전체적인 동작이 무거워져서 원래의 동작에서 절차를 수행할 수 있다는 것을 느끼지 못한다.
  • 감상


    RaspberryPi Pico와 ESP32의 개발 체험이 좋아서 (디버깅도 가능) 제가 잘 활용하지 못하는 것 같아요.

    좋은 웹페이지 즐겨찾기