Skip to content

Electronics Design

Task

  • Group assignment:

    • Use the test equipment in your lab to observe the operation of a microcontroller circuit board (as a minimum, you should demonstrate the use of a multimeter and oscilloscope)
    • Document your work on the group work page and reflect what you learned on your individual page
  • Individual assignment:

    • Use an EDA tool to design a development board to interact and communicate with an embedded microcontroller

Group assignment

My contribution was that I did the group assignment.

Follow the link to find it: group assignment week 08

Trials and tribulations of a board designer

Board design

For board design, we used KiCAD. First you open the schematic editor, which looks like this:

Schematic

In here, you add components and link them to each other and to the pins in the MCU in an abstract way. Then you open up the PCB editor and set out to actually manifest those connections in a physical layout by placing the components and connecting them with traces.

PCB

The most important settings that you need to be mindful of are in File / Board Setup / Net Classes. Here are the default sizes for via size and, most importantly, clearance: it needs to be bigger than 0.4mm so that the 1/64th inch endmill can route in between traces. Holes need to be at least 0.8mm so that the 1/32nd inch endmill can drill them.

Some MCUs have pads that are closer than 0.4mm, so you'll have to edit the footprint directly:

  1. Select pad
  2. Click "E" or right click / Properties....
  3. Edit size
  4. Close dialog
  5. Right click / Push pad properties to other pads

If you want to have traces in several different sizes it's convenient to do that from the top left of the PCB editing module (Track: use netclass width / Edit pre-defined sizes). There you can put in different sizes (eg 0.6, .4, .3mm) and change between them quickly.

Board 01

I made a board. I called it board_01. It looks like this:

Board 01

I chose an ATTiny 3216 because we did the local class with a 1614, but this one has more pins. I added R, G and B LEDs and two pushbuttons for fun. I also added pin headers for the pins on the left and through holes for future expansion on the right, because it feels wrong to leave pins unaccessible.

Follow links for KiCAD project, schematic, and pcb, if you want.

Milling and soldering

Milling went fine! It helped a lot that last week I did the miniature gears, so I had refreshed the workflow for the Roland mini router.

A virgin, hopeful board

Soldering went mostly fine. Soldering the MCU was hard but everything came out ok. Upside down it looks like a robot's skull!

A robot's skull!

I was happy. I did not know the troubles that awaited.

Troubleshooting

The first problem that I had turned out to be hardware. I would get the error A programmer is required to upload

After much testing of pins, review of connections and scratching of heads, with Adai's help, I discovered that there was some connection between the UPDI pin in my board and ground.

Adai testing

I bent the connector to see whether there was some stray solder beneath it... and the spurious connection was gone! It did not come back when I bent the connector back, either.

One problem down, one (unfixable) one to go.

Software Troubleshooting

The setup to program board_01 is the following: a QuenTorres, connected through USB to my mac and through a FTDI to UPDI adapter to the target board:

Programming setup

Software is the following: Arduino IDE 2.3.2 and MegaTinyCore 2.6.10 to be able to use the QuenTorres as a programmer, running on an M1 macbook air (Ventura 13.6.1).

I haven't been able to program board_01 after following the steps in the QuenTorres repo. The QuenTorres gets programmed fine (steps 1 to 3), but programming the board fails with the message PymcuprogError: UPDI initialisation failed

Harbinger of bad news. Click to show error message.
"/Users/dani/Library/Arduino15/packages/megaTinyCore/tools/python3/3.7.2-post1/python3" -u "/Users/dani/Library/Arduino15/packages/megaTinyCore/hardware/megaavr/2.6.10/tools/prog.py"  -t uart -u /dev/cu.usbmodem4471FA153 -b 460800 -d attiny3216 --fuses 0:0b00000000 2:0x02 6:0x04 7:0x00 8:0x00 "-f/private/var/folders/zp/8f7jsfk57wv4xty1g8w6r_9c0000gn/T/arduino/sketches/B9DFFDC852BFA3C4BBBE0F0D6721ACA0/board_01_test.ino.hex" -a write -v
SerialUPDI
UPDI programming for Arduino using a serial adapter
Based on pymcuprog, with significant modifications
By Quentin Bolsee and Spence Konde
Version 1.2.3 - Jan 2022
Using serial port /dev/cu.usbmodem4471FA153 at 460800 baud.
Target: attiny3216
Set fuses: ['0:0b00000000', '2:0x02', '6:0x04', '7:0x00', '8:0x00']
Action: write
File: /private/var/folders/zp/8f7jsfk57wv4xty1g8w6r_9c0000gn/T/arduino/sketches/B9DFFDC852BFA3C4BBBE0F0D6721ACA0/board_01_test.ino.hex
pymcuprog.programmer - INFO - Setting up programming session for 'attiny3216'
pymcuprog.deviceinfo.deviceinfo - INFO - Looking for device attiny3216
pymcuprog.serialupdi.physical - INFO - Opening port '/dev/cu.usbmodem4471FA153' at '115200' baud
pymcuprog.serialupdi.link - INFO - STCS 08 to 0x03
pymcuprog.serialupdi.link - INFO - STCS 06 to 0x02
pymcuprog.serialupdi.link - INFO - LDCS from 0x00
pymcuprog.serialupdi.link - WARNING - UPDI init failed: Can't read CS register.
pymcuprog.serialupdi.physical - INFO - Sending double break
pymcuprog.serialupdi.physical - INFO - Double-break sent. Retrying.
pymcuprog.serialupdi.physical - INFO - Opening port '/dev/cu.usbmodem4471FA153' at '115200' baud
pymcuprog.serialupdi.link - INFO - STCS 08 to 0x03
pymcuprog.serialupdi.link - INFO - STCS 06 to 0x02
pymcuprog.serialupdi.link - INFO - LDCS from 0x00
pymcuprog.serialupdi.link - WARNING - UPDI init failed: Can't read CS register.
Traceback (most recent call last):
  File "/Users/dani/Library/Arduino15/packages/megaTinyCore/hardware/megaavr/2.6.10/tools/prog.py", line 286, in <module>
pymcuprog.serialupdi.physical - INFO - Closing port '/dev/cu.usbmodem4471FA153'
    main()
  File "/Users/dani/Library/Arduino15/packages/megaTinyCore/hardware/megaavr/2.6.10/tools/prog.py", line 128, in main
    return_code = pymcuprog_basic(args, fuses_dict)
  File "/Users/dani/Library/Arduino15/packages/megaTinyCore/hardware/megaavr/2.6.10/tools/prog.py", line 199, in pymcuprog_basic
    status = pymcu._start_session(backend,
  File "/Users/dani/Library/Arduino15/packages/megaTinyCore/hardware/megaavr/2.6.10/tools/libs/pymcuprog/pymcuprog_main.py", line 545, in _start_session
    backend.start_session(sessionconfig)
  File "/Users/dani/Library/Arduino15/packages/megaTinyCore/hardware/megaavr/2.6.10/tools/libs/pymcuprog/backend.py", line 359, in start_session
    self.programmer.setup_device(
  File "/Users/dani/Library/Arduino15/packages/megaTinyCore/hardware/megaavr/2.6.10/tools/libs/pymcuprog/programmer.py", line 78, in setup_device
    self.device_model = get_nvm_access_provider(self.transport,
  File "/Users/dani/Library/Arduino15/packages/megaTinyCore/hardware/megaavr/2.6.10/tools/libs/pymcuprog/nvm.py", line 42, in get_nvm_access_provider
    accessprovider = NvmAccessProviderSerial(transport, device_info, baud=frequency, options=options)
  File "/Users/dani/Library/Arduino15/packages/megaTinyCore/hardware/megaavr/2.6.10/tools/libs/pymcuprog/nvmserialupdi.py", line 54, in __init__
    self.avr = UpdiApplication(port, baud, self.dut)
  File "/Users/dani/Library/Arduino15/packages/megaTinyCore/hardware/megaavr/2.6.10/tools/libs/pymcuprog/serialupdi/application.py", line 79, in __init__
    datalink.init_datalink()
  File "/Users/dani/Library/Arduino15/packages/megaTinyCore/hardware/megaavr/2.6.10/tools/libs/pymcuprog/serialupdi/link.py", line 44, in init_datalink
    raise PymcuprogError("UPDI initialisation failed")
pymcuprog.pymcuprog_errors.PymcuprogError: UPDI initialisation failed
Failed programming: uploading error: exit status 1

This has represented quite a lot of back and forth. Adai helped me a lot, but we didn't manage to fix the issue. We even contacted Adrián Torres, who created the QuenTorres, but he couldn't help us either.

At some point I quickly made a minimal board with an ATTiny 1614 to see if the problem was the chip. It wasn't: it failed in the same way.

tinytester

We finally were able to program the board from a Windows machine and a Linux machine, but not from my mac. We tested many combinations of hardware and software and were able to eliminate the Arduino IDE version from the equation bu uploading through pymcuprog.

It seems there is some incompatibility between mac and pymcuprog, the Python library that the Arduino IDE uses to upload the compiled code to the board. After much trial and error, Adai and I found that we could upload a sketch compiled as .hex file to my board from a Windows or Linux computer with pymcuprog version 3.16.8.40 and get the green and blue LEDs to blink, but the same .hex would fail to upload from my mac.

From my mac, with Adai's hex file, I get the error: Error with st:

mac$ pymcuprog write -t uart -u /dev/cu.usbmodem4471FA153 -d attiny3216 -f ~/Downloads/Blink_ATiny3216.ino.t3216.20c0.mD0.v2610.hex --erase --verify -v debug
Connecting to SerialUPDI
pymcuprog.programmer - INFO - Setting up programming session for 'attiny3216'
pymcuprog.deviceinfo.deviceinfo - INFO - Looking for device attiny3216
pymcuprog.serialupdi.physical - INFO - Opening port '/dev/cu.usbmodem4471FA153' at 115200 baud (timeout 1.0s)
pymcuprog.serialupdi.physical - DEBUG - send : [0x00]
pymcuprog.serialupdi.link - DEBUG - STCS to 0x03
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC3, 0x08]
pymcuprog.serialupdi.link - DEBUG - STCS to 0x02
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC2, 0x80]
pymcuprog.serialupdi.link - DEBUG - LDCS from 0x00
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x80]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.link - INFO - UPDI init OK
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xE6]
pymcuprog.serialupdi.application - INFO - SIB: 'tinyAVR P:0D:0-3M2 (02.59B17.0)'
pymcuprog.serialupdi.application - INFO - Device family ID: 'tinyAVR'
pymcuprog.serialupdi.application - INFO - NVM interface: 'P:0'
pymcuprog.serialupdi.application - INFO - Debug interface: 'D:0'
pymcuprog.serialupdi.application - INFO - PDI oscillator: '3M2'
pymcuprog.serialupdi.application - INFO - Extra info: '(02.59B17.0)'
pymcuprog.serialupdi.application - INFO - NVM P:0
pymcuprog.serialupdi.link - DEBUG - STCS to 0x03
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC3, 0x08]
pymcuprog.serialupdi.link - DEBUG - STCS to 0x02
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC2, 0x80]
pymcuprog.serialupdi.link - DEBUG - LDCS from 0x00
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x80]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.link - INFO - UPDI init OK
pymcuprog.serialupdi.link - DEBUG - LDCS from 0x00
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x80]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.application - INFO - PDI revision = 0x04
pymcuprog.serialupdi.link - DEBUG - LDCS from 0x0B
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x8B]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x82]
pymcuprog.serialupdi.link - DEBUG - LDCS from 0x0B
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x8B]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x82]
pymcuprog.serialupdi.application - INFO - Entering NVM programming mode
pymcuprog.serialupdi.application - INFO - Apply reset
pymcuprog.serialupdi.link - DEBUG - STCS to 0x08
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC8, 0x59]
pymcuprog.serialupdi.link - DEBUG - Writing key
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xE0]
pymcuprog.serialupdi.physical - DEBUG - send : [0x20, 0x67, 0x6F, 0x72, 0x50, 0x4D, 0x56, 0x4E]
pymcuprog.serialupdi.link - DEBUG - LDCS from 0x07
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x87]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x10]
pymcuprog.serialupdi.application - DEBUG - Key status = 0x10
pymcuprog.serialupdi.application - INFO - Apply reset
pymcuprog.serialupdi.link - DEBUG - STCS to 0x08
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC8, 0x59]
pymcuprog.serialupdi.application - INFO - Release reset
pymcuprog.serialupdi.link - DEBUG - STCS to 0x08
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC8, 0x00]
pymcuprog.serialupdi.link - DEBUG - LDCS from 0x0B
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x8B]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x28]
pymcuprog.serialupdi.link - DEBUG - LDCS from 0x0B
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x8B]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x08]
pymcuprog.serialupdi.application - DEBUG - Now in NVM programming mode
Pinging device...
pymcuprog.programmer - INFO - Reading device ID...
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xE6]
pymcuprog.serialupdi.application - INFO - SIB: 'tinyAVR P:0D:0-3M2 (02.59B17.0)'
pymcuprog.serialupdi.application - INFO - Device family ID: 'tinyAVR'
pymcuprog.serialupdi.application - INFO - NVM interface: 'P:0'
pymcuprog.serialupdi.application - INFO - Debug interface: 'D:0'
pymcuprog.serialupdi.application - INFO - PDI oscillator: '3M2'
pymcuprog.serialupdi.application - INFO - Extra info: '(02.59B17.0)'
pymcuprog.serialupdi.application - INFO - NVM P:0
pymcuprog.serialupdi.link - DEBUG - STCS to 0x03
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC3, 0x08]
pymcuprog.serialupdi.link - DEBUG - STCS to 0x02
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC2, 0x80]
pymcuprog.serialupdi.link - DEBUG - LDCS from 0x00
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x80]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.link - INFO - UPDI init OK
pymcuprog.serialupdi.link - DEBUG - LDCS from 0x00
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x80]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.application - INFO - PDI revision = 0x04
pymcuprog.serialupdi.link - DEBUG - LDCS from 0x0B
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x8B]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x08]
pymcuprog.serialupdi.readwrite - DEBUG - Reading 3 bytes from 0x1100
pymcuprog.serialupdi.link - DEBUG - ST to ptr
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x69, 0x00, 0x11]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.link - DEBUG - Repeat 3
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xA0, 0x02]
pymcuprog.serialupdi.link - DEBUG - LD8 from ptr++
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x24]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x1E, 0x95, 0x21]
pymcuprog.serialupdi.readwrite - DEBUG - Reading 1 bytes from 0x0F01
pymcuprog.serialupdi.link - DEBUG - ST to ptr
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x69, 0x01, 0x0F]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.link - DEBUG - LD8 from ptr++
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x24]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x02]
pymcuprog.serialupdi.application - INFO - Device ID from serialupdi = '1E9521' rev 'C'
pymcuprog.nvm - INFO - Device family: 'tinyAVR'
pymcuprog.serialupdi.readwrite - DEBUG - Reading 3 bytes from 0x1100
pymcuprog.serialupdi.link - DEBUG - ST to ptr
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x69, 0x00, 0x11]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.link - DEBUG - Repeat 3
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xA0, 0x02]
pymcuprog.serialupdi.link - DEBUG - LD8 from ptr++
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x24]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x1E, 0x95, 0x21]
pymcuprog.nvm - INFO - Device ID: '1E9521'
pymcuprog.serialupdi.readwrite - DEBUG - Reading 1 bytes from 0x0F01
pymcuprog.serialupdi.link - DEBUG - ST to ptr
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x69, 0x01, 0x0F]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.link - DEBUG - LD8 from ptr++
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x24]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x02]
pymcuprog.nvm - DEBUG - Device revision: 0x02
pymcuprog.nvm - INFO - Device revision: '0.2'
pymcuprog.serialupdi.readwrite - DEBUG - Reading 10 bytes from 0x1103
pymcuprog.serialupdi.link - DEBUG - ST to ptr
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x69, 0x03, 0x11]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.link - DEBUG - Repeat 10
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xA0, 0x09]
pymcuprog.serialupdi.link - DEBUG - LD8 from ptr++
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x24]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x33, 0x33, 0x34, 0x33, 0x31, 0x35, 0x78, 0xEB, 0x3F, 0x10]
pymcuprog.nvm - INFO - Device serial number: 'b'33333433313578eb3f10''
Ping response: 1E9521
Erasing device before writing from hex file...
pymcuprog.programmer - INFO - Erase...
pymcuprog.serialupdi.nvmp0 - DEBUG - Chip erase using NVM CTRL
pymcuprog.serialupdi.nvmp0 - DEBUG - Wait NVM ready
pymcuprog.serialupdi.link - DEBUG - LD from 0x001002
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x04, 0x02, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x00]
pymcuprog.serialupdi.nvmp0 - DEBUG - NVMCMD 5 executing
pymcuprog.serialupdi.link - DEBUG - ST to 0x001000
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x44, 0x00, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.physical - DEBUG - send : [0x05]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.nvmp0 - DEBUG - Wait NVM ready
pymcuprog.serialupdi.link - DEBUG - LD from 0x001002
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x04, 0x02, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x00]
Writing from hex file...
Writing flash...
pymcuprog.programmer - INFO - Write...
pymcuprog.programmer - INFO - Writing 1010 bytes of data to flash...
pymcuprog.nvm - DEBUG - Writing 128 bytes to address 0x008000
pymcuprog.serialupdi.nvmp0 - DEBUG - Wait NVM ready
pymcuprog.serialupdi.link - DEBUG - LD from 0x001002
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x04, 0x02, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x00]
pymcuprog.serialupdi.nvmp0 - DEBUG - Clear page buffer
pymcuprog.serialupdi.nvmp0 - DEBUG - NVMCMD 4 executing
pymcuprog.serialupdi.link - DEBUG - ST to 0x001000
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x44, 0x00, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.physical - DEBUG - send : [0x04]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.nvmp0 - DEBUG - Wait NVM ready
pymcuprog.serialupdi.link - DEBUG - LD from 0x001002
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x04, 0x02, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x00]
pymcuprog.serialupdi.link - DEBUG - ST to ptr
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x69, 0x00, 0x80]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.link - DEBUG - Repeat 64
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xA0, 0x3F]
pymcuprog.serialupdi.link - DEBUG - ST16 to *ptr++
pymcuprog.serialupdi.link - DEBUG - ACKless block write
pymcuprog.serialupdi.link - DEBUG - STCS to 0x02
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC2, 0x88]
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x65]
pymcuprog.serialupdi.physical - DEBUG - send : [0x3D, 0xC0, 0x00, 0x00, 0x57, 0xC0, 0x00, 0x00, 0x55, 0xC0, 0x00, 0x00, 0x53, 0xC0, 0x00, 0x00, 0x51, 0xC0, 0x00, 0x00, 0x4F, 0xC0, 0x00, 0x00, 0x4D, 0xC0, 0x00, 0x00, 0x4B, 0xC0, 0x00, 0x00, 0x49, 0xC0, 0x00, 0x00, 0x47, 0xC0, 0x00, 0x00, 0x45, 0xC0, 0x00, 0x00, 0x43, 0xC0, 0x00, 0x00, 0x41, 0xC0, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x3D, 0xC0, 0x00, 0x00, 0x33, 0xC1, 0x00, 0x00, 0x39, 0xC0, 0x00, 0x00, 0x37, 0xC0, 0x00, 0x00, 0x35, 0xC0, 0x00, 0x00, 0x33, 0xC0, 0x00, 0x00, 0x31, 0xC0, 0x00, 0x00, 0x2F, 0xC0, 0x00, 0x00, 0x2D, 0xC0, 0x00, 0x00, 0x2B, 0xC0, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x00, 0x27, 0xC0, 0x00, 0x00, 0x25, 0xC0, 0x00, 0x00, 0x23, 0xC0, 0x00, 0x00, 0x21, 0xC0, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x1D, 0xC0, 0x00, 0x00, 0x11, 0x24, 0x1F, 0xBE]
pymcuprog.serialupdi.link - DEBUG - STCS to 0x02
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC2, 0x80]
pymcuprog.serialupdi.nvmp0 - DEBUG - Committing data
pymcuprog.serialupdi.nvmp0 - DEBUG - NVMCMD 1 executing
pymcuprog.serialupdi.link - DEBUG - ST to 0x001000
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x44, 0x00, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : []
pymcuprog.pymcuprog_main - ERROR - Error with st
pymcuprog.serialupdi.application - INFO - Leaving NVM programming mode
pymcuprog.serialupdi.application - INFO - Apply reset
pymcuprog.serialupdi.link - DEBUG - STCS to 0x08
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC8, 0x59]
pymcuprog.serialupdi.application - INFO - Release reset
pymcuprog.serialupdi.link - DEBUG - STCS to 0x08
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC8, 0x00]
pymcuprog.serialupdi.link - DEBUG - STCS to 0x03
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC3, 0x0C]
Done.
pymcuprog.serialupdi.physical - INFO - Closing port '/dev/cu.usbmodem4471FA153'

The relevant section is:

pymcuprog.serialupdi.link - debug - stcs to 0x02
pymcuprog.serialupdi.physical - debug - send : [0x55, 0xc2, 0x80]
pymcuprog.serialupdi.nvmp0 - debug - committing data
pymcuprog.serialupdi.nvmp0 - debug - nvmcmd 1 executing
pymcuprog.serialupdi.link - debug - st to 0x001000
pymcuprog.serialupdi.physical - debug - send : [0x55, 0x44, 0x00, 0x10]
pymcuprog.serialupdi.physical - debug - receive : []
pymcuprog.pymcuprog_main - error - error with st
pymcuprog.serialupdi.application - info - leaving nvm programming mode
pymcuprog.serialupdi.application - info - apply reset
pymcuprog.serialupdi.link - debug - stcs to 0x08
pymcuprog.serialupdi.physical - debug - send : [0x55, 0xc8, 0x59]
pymcuprog.serialupdi.application - info - release reset
pymcuprog.serialupdi.link - debug - stcs to 0x08
pymcuprog.serialupdi.physical - debug - send : [0x55, 0xc8, 0x00]
pymcuprog.serialupdi.link - debug - stcs to 0x03
pymcuprog.serialupdi.physical - debug - send : [0x55, 0xc3, 0x0c]
done.
pymcuprog.serialupdi.physical - info - closing port '/dev/cu.usbmodem4471fa153

so it seems that, after sending bytes [0x55, 0x44, 0x00, 0x10], it gets back an empty response and closes the connection.

This is the same hexfile, uploaded with the same pymcuprog version, but from a linux machine.

`linux_machine$ pymcuprog write -t uart -u /dev/ttyACM0 -d attiny3216 -f ~/Downloads/Blink_ATiny3216.ino.t3216.20c0.mD0.v2610.hex --erase --verify -v debug`
Connecting to SerialUPDI
pymcuprog.programmer - INFO - Setting up programming session for 'attiny3216'
pymcuprog.deviceinfo.deviceinfo - INFO - Looking for device attiny3216
pymcuprog.serialupdi.physical - INFO - Opening port '/dev/ttyACM0' at 115200 baud (timeout 1.0s)
pymcuprog.serialupdi.physical - DEBUG - send : [0x00]
pymcuprog.serialupdi.link - DEBUG - STCS to 0x03
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC3, 0x08]
pymcuprog.serialupdi.link - DEBUG - STCS to 0x02
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC2, 0x80]
pymcuprog.serialupdi.link - DEBUG - LDCS from 0x00
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x80]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.link - INFO - UPDI init OK
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xE6]
pymcuprog.serialupdi.application - INFO - SIB: 'tinyAVR P:0D:0-3M2 (02.59B17.0)'
pymcuprog.serialupdi.application - INFO - Device family ID: 'tinyAVR'
pymcuprog.serialupdi.application - INFO - NVM interface: 'P:0'
pymcuprog.serialupdi.application - INFO - Debug interface: 'D:0'
pymcuprog.serialupdi.application - INFO - PDI oscillator: '3M2'
pymcuprog.serialupdi.application - INFO - Extra info: '(02.59B17.0)'
pymcuprog.serialupdi.application - INFO - NVM P:0
pymcuprog.serialupdi.link - DEBUG - STCS to 0x03
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC3, 0x08]
pymcuprog.serialupdi.link - DEBUG - STCS to 0x02
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC2, 0x80]
pymcuprog.serialupdi.link - DEBUG - LDCS from 0x00
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x80]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.link - INFO - UPDI init OK
pymcuprog.serialupdi.link - DEBUG - LDCS from 0x00
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x80]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.application - INFO - PDI revision = 0x04
pymcuprog.serialupdi.link - DEBUG - LDCS from 0x0B
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x8B]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x82]
pymcuprog.serialupdi.link - DEBUG - LDCS from 0x0B
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x8B]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x82]
pymcuprog.serialupdi.application - INFO - Entering NVM programming mode
pymcuprog.serialupdi.application - INFO - Apply reset
pymcuprog.serialupdi.link - DEBUG - STCS to 0x08
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC8, 0x59]
pymcuprog.serialupdi.link - DEBUG - Writing key
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xE0]
pymcuprog.serialupdi.physical - DEBUG - send : [0x20, 0x67, 0x6F, 0x72, 0x50, 0x4D, 0x56, 0x4E]
pymcuprog.serialupdi.link - DEBUG - LDCS from 0x07
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x87]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x10]
pymcuprog.serialupdi.application - DEBUG - Key status = 0x10
pymcuprog.serialupdi.application - INFO - Apply reset
pymcuprog.serialupdi.link - DEBUG - STCS to 0x08
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC8, 0x59]
pymcuprog.serialupdi.application - INFO - Release reset
pymcuprog.serialupdi.link - DEBUG - STCS to 0x08
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC8, 0x00]
pymcuprog.serialupdi.link - DEBUG - LDCS from 0x0B
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x8B]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x28]
pymcuprog.serialupdi.link - DEBUG - LDCS from 0x0B
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x8B]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x08]
pymcuprog.serialupdi.application - DEBUG - Now in NVM programming mode
Pinging device...
pymcuprog.programmer - INFO - Reading device ID...
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xE6]
pymcuprog.serialupdi.application - INFO - SIB: 'tinyAVR P:0D:0-3M2 (02.59B17.0)'
pymcuprog.serialupdi.application - INFO - Device family ID: 'tinyAVR'
pymcuprog.serialupdi.application - INFO - NVM interface: 'P:0'
pymcuprog.serialupdi.application - INFO - Debug interface: 'D:0'
pymcuprog.serialupdi.application - INFO - PDI oscillator: '3M2'
pymcuprog.serialupdi.application - INFO - Extra info: '(02.59B17.0)'
pymcuprog.serialupdi.application - INFO - NVM P:0
pymcuprog.serialupdi.link - DEBUG - STCS to 0x03
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC3, 0x08]
pymcuprog.serialupdi.link - DEBUG - STCS to 0x02
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC2, 0x80]
pymcuprog.serialupdi.link - DEBUG - LDCS from 0x00
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x80]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.link - INFO - UPDI init OK
pymcuprog.serialupdi.link - DEBUG - LDCS from 0x00
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x80]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.application - INFO - PDI revision = 0x04
pymcuprog.serialupdi.link - DEBUG - LDCS from 0x0B
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x8B]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x08]
pymcuprog.serialupdi.readwrite - DEBUG - Reading 3 bytes from 0x1100
pymcuprog.serialupdi.link - DEBUG - ST to ptr
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x69, 0x00, 0x11]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.link - DEBUG - Repeat 3
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xA0, 0x02]
pymcuprog.serialupdi.link - DEBUG - LD8 from ptr++
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x24]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x1E, 0x95, 0x21]
pymcuprog.serialupdi.readwrite - DEBUG - Reading 1 bytes from 0x0F01
pymcuprog.serialupdi.link - DEBUG - ST to ptr
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x69, 0x01, 0x0F]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.link - DEBUG - LD8 from ptr++
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x24]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x02]
pymcuprog.serialupdi.application - INFO - Device ID from serialupdi = '1E9521' rev 'C'
pymcuprog.nvm - INFO - Device family: 'tinyAVR'
pymcuprog.serialupdi.readwrite - DEBUG - Reading 3 bytes from 0x1100
pymcuprog.serialupdi.link - DEBUG - ST to ptr
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x69, 0x00, 0x11]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.link - DEBUG - Repeat 3
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xA0, 0x02]
pymcuprog.serialupdi.link - DEBUG - LD8 from ptr++
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x24]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x1E, 0x95, 0x21]
pymcuprog.nvm - INFO - Device ID: '1E9521'
pymcuprog.serialupdi.readwrite - DEBUG - Reading 1 bytes from 0x0F01
pymcuprog.serialupdi.link - DEBUG - ST to ptr
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x69, 0x01, 0x0F]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.link - DEBUG - LD8 from ptr++
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x24]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x02]
pymcuprog.nvm - DEBUG - Device revision: 0x02
pymcuprog.nvm - INFO - Device revision: '0.2'
pymcuprog.serialupdi.readwrite - DEBUG - Reading 10 bytes from 0x1103
pymcuprog.serialupdi.link - DEBUG - ST to ptr
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x69, 0x03, 0x11]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.link - DEBUG - Repeat 10
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xA0, 0x09]
pymcuprog.serialupdi.link - DEBUG - LD8 from ptr++
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x24]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x33, 0x33, 0x34, 0x33, 0x31, 0x35, 0x78, 0xEB, 0x3F, 0x10]
pymcuprog.nvm - INFO - Device serial number: 'b'33333433313578eb3f10''
Ping response: 1E9521
Erasing device before writing from hex file...
pymcuprog.programmer - INFO - Erase...
pymcuprog.serialupdi.nvmp0 - DEBUG - Chip erase using NVM CTRL
pymcuprog.serialupdi.nvmp0 - DEBUG - Wait NVM ready
pymcuprog.serialupdi.link - DEBUG - LD from 0x001002
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x04, 0x02, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x00]
pymcuprog.serialupdi.nvmp0 - DEBUG - NVMCMD 5 executing
pymcuprog.serialupdi.link - DEBUG - ST to 0x001000
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x44, 0x00, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.physical - DEBUG - send : [0x05]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.nvmp0 - DEBUG - Wait NVM ready
pymcuprog.serialupdi.link - DEBUG - LD from 0x001002
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x04, 0x02, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x00]
Writing from hex file...
Writing flash...
pymcuprog.programmer - INFO - Write...
pymcuprog.programmer - INFO - Writing 1010 bytes of data to flash...
pymcuprog.nvm - DEBUG - Writing 128 bytes to address 0x008000
pymcuprog.serialupdi.nvmp0 - DEBUG - Wait NVM ready
pymcuprog.serialupdi.link - DEBUG - LD from 0x001002
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x04, 0x02, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x00]
pymcuprog.serialupdi.nvmp0 - DEBUG - Clear page buffer
pymcuprog.serialupdi.nvmp0 - DEBUG - NVMCMD 4 executing
pymcuprog.serialupdi.link - DEBUG - ST to 0x001000
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x44, 0x00, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.physical - DEBUG - send : [0x04]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.nvmp0 - DEBUG - Wait NVM ready
pymcuprog.serialupdi.link - DEBUG - LD from 0x001002
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x04, 0x02, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x00]
pymcuprog.serialupdi.link - DEBUG - ST to ptr
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x69, 0x00, 0x80]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.link - DEBUG - Repeat 64
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xA0, 0x3F]
pymcuprog.serialupdi.link - DEBUG - ST16 to *ptr++
pymcuprog.serialupdi.link - DEBUG - ACKless block write
pymcuprog.serialupdi.link - DEBUG - STCS to 0x02
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC2, 0x88]
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x65]
pymcuprog.serialupdi.physical - DEBUG - send : [0x3D, 0xC0, 0x00, 0x00, 0x57, 0xC0, 0x00, 0x00, 0x55, 0xC0, 0x00, 0x00, 0x53, 0xC0, 0x00, 0x00, 0x51, 0xC0, 0x00, 0x00, 0x4F, 0xC0, 0x00, 0x00, 0x4D, 0xC0, 0x00, 0x00, 0x4B, 0xC0, 0x00, 0x00, 0x49, 0xC0, 0x00, 0x00, 0x47, 0xC0, 0x00, 0x00, 0x45, 0xC0, 0x00, 0x00, 0x43, 0xC0, 0x00, 0x00, 0x41, 0xC0, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x3D, 0xC0, 0x00, 0x00, 0x33, 0xC1, 0x00, 0x00, 0x39, 0xC0, 0x00, 0x00, 0x37, 0xC0, 0x00, 0x00, 0x35, 0xC0, 0x00, 0x00, 0x33, 0xC0, 0x00, 0x00, 0x31, 0xC0, 0x00, 0x00, 0x2F, 0xC0, 0x00, 0x00, 0x2D, 0xC0, 0x00, 0x00, 0x2B, 0xC0, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x00, 0x27, 0xC0, 0x00, 0x00, 0x25, 0xC0, 0x00, 0x00, 0x23, 0xC0, 0x00, 0x00, 0x21, 0xC0, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x1D, 0xC0, 0x00, 0x00, 0x11, 0x24, 0x1F, 0xBE]
pymcuprog.serialupdi.link - DEBUG - STCS to 0x02
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC2, 0x80]
pymcuprog.serialupdi.nvmp0 - DEBUG - Committing data
pymcuprog.serialupdi.nvmp0 - DEBUG - NVMCMD 1 executing
pymcuprog.serialupdi.link - DEBUG - ST to 0x001000
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x44, 0x00, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.physical - DEBUG - send : [0x01]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.nvmp0 - DEBUG - Wait NVM ready
pymcuprog.serialupdi.link - DEBUG - LD from 0x001002
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x04, 0x02, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x00]
pymcuprog.nvm - DEBUG - Writing 128 bytes to address 0x008080
pymcuprog.serialupdi.nvmp0 - DEBUG - Wait NVM ready
pymcuprog.serialupdi.link - DEBUG - LD from 0x001002
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x04, 0x02, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x00]
pymcuprog.serialupdi.nvmp0 - DEBUG - Clear page buffer
pymcuprog.serialupdi.nvmp0 - DEBUG - NVMCMD 4 executing
pymcuprog.serialupdi.link - DEBUG - ST to 0x001000
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x44, 0x00, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.physical - DEBUG - send : [0x04]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.nvmp0 - DEBUG - Wait NVM ready
pymcuprog.serialupdi.link - DEBUG - LD from 0x001002
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x04, 0x02, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x00]
pymcuprog.serialupdi.link - DEBUG - ST to ptr
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x69, 0x80, 0x80]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.link - DEBUG - Repeat 64
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xA0, 0x3F]
pymcuprog.serialupdi.link - DEBUG - ST16 to *ptr++
pymcuprog.serialupdi.link - DEBUG - ACKless block write
pymcuprog.serialupdi.link - DEBUG - STCS to 0x02
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC2, 0x88]
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x65]
pymcuprog.serialupdi.physical - DEBUG - send : [0xCF, 0xEF, 0xCD, 0xBF, 0xDF, 0xE3, 0xDE, 0xBF, 0x80, 0x91, 0x40, 0x00, 0x80, 0x93, 0x40, 0x00, 0x81, 0x11, 0x05, 0xC0, 0x98, 0xED, 0x21, 0xE0, 0x94, 0xBF, 0x20, 0x93, 0x41, 0x00, 0x8C, 0xBB, 0x28, 0xE3, 0xA0, 0xE0, 0xB8, 0xE3, 0x01, 0xC0, 0x1D, 0x92, 0xAA, 0x30, 0xB2, 0x07, 0xE1, 0xF7, 0x28, 0xD1, 0x79, 0xC1, 0xA5, 0xCF, 0x9F, 0xB7, 0xF8, 0x94, 0x88, 0xE0, 0x80, 0x93, 0x84, 0x0A, 0x80, 0x91, 0x8E, 0x0A, 0x81, 0xFF, 0xFC, 0xCF, 0x80, 0x91, 0x8D, 0x0A, 0xE0, 0x91, 0xA2, 0x0A, 0xF0, 0x91, 0xA3, 0x0A, 0x20, 0x91, 0x00, 0x38, 0x30, 0x91, 0x01, 0x38, 0x40, 0x91, 0x02, 0x38, 0x50, 0x91, 0x03, 0x38, 0x9F, 0xBF, 0x80, 0xFF, 0x07, 0xC0, 0xE7, 0x30, 0xF1, 0x05, 0x20, 0xF4, 0x2F, 0x5F, 0x3F, 0x4F, 0x4F, 0x4F, 0x5F, 0x4F, 0xBF, 0x01, 0x76, 0x95, 0x67, 0x95, 0xCF, 0x01]
pymcuprog.serialupdi.link - DEBUG - STCS to 0x02
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC2, 0x80]
pymcuprog.serialupdi.nvmp0 - DEBUG - Committing data
pymcuprog.serialupdi.nvmp0 - DEBUG - NVMCMD 1 executing
pymcuprog.serialupdi.link - DEBUG - ST to 0x001000
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x44, 0x00, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.physical - DEBUG - send : [0x01]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.nvmp0 - DEBUG - Wait NVM ready
pymcuprog.serialupdi.link - DEBUG - LD from 0x001002
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x04, 0x02, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x00]
pymcuprog.nvm - DEBUG - Writing 128 bytes to address 0x008100
pymcuprog.serialupdi.nvmp0 - DEBUG - Wait NVM ready
pymcuprog.serialupdi.link - DEBUG - LD from 0x001002
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x04, 0x02, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x00]
pymcuprog.serialupdi.nvmp0 - DEBUG - Clear page buffer
pymcuprog.serialupdi.nvmp0 - DEBUG - NVMCMD 4 executing
pymcuprog.serialupdi.link - DEBUG - ST to 0x001000
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x44, 0x00, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.physical - DEBUG - send : [0x04]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.nvmp0 - DEBUG - Wait NVM ready
pymcuprog.serialupdi.link - DEBUG - LD from 0x001002
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x04, 0x02, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x00]
pymcuprog.serialupdi.link - DEBUG - ST to ptr
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x69, 0x00, 0x81]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.link - DEBUG - Repeat 64
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xA0, 0x3F]
pymcuprog.serialupdi.link - DEBUG - ST16 to *ptr++
pymcuprog.serialupdi.link - DEBUG - ACKless block write
pymcuprog.serialupdi.link - DEBUG - STCS to 0x02
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC2, 0x88]
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x65]
pymcuprog.serialupdi.physical - DEBUG - send : [0x86, 0x0F, 0x91, 0x1D, 0xE6, 0x2F, 0xE6, 0x95, 0xE6, 0x95, 0x76, 0x2F, 0x72, 0x95, 0x7F, 0x70, 0xE7, 0x1B, 0xFF, 0x0B, 0x67, 0xFD, 0x31, 0x96, 0xE8, 0x0F, 0xF9, 0x1F, 0xA0, 0xE3, 0xB3, 0xE0, 0x29, 0xD1, 0x6E, 0x0F, 0x7F, 0x1F, 0x81, 0x1D, 0x91, 0x1D, 0x08, 0x95, 0xCF, 0x92, 0xDF, 0x92, 0xEF, 0x92, 0xFF, 0x92, 0xCF, 0x93, 0xDF, 0x93, 0xBE, 0xDF, 0xEB, 0x01, 0x88, 0xEE, 0xC8, 0x2E, 0x83, 0xE0, 0xD8, 0x2E, 0xE1, 0x2C, 0xF1, 0x2C, 0xB6, 0xDF, 0x6C, 0x1B, 0x7D, 0x0B, 0x68, 0x3E, 0x73, 0x40, 0xA0, 0xF0, 0xC1, 0x14, 0xD1, 0x04, 0xE1, 0x04, 0xF1, 0x04, 0x39, 0xF4, 0xDF, 0x91, 0xCF, 0x91, 0xFF, 0x90, 0xEF, 0x90, 0xDF, 0x90, 0xCF, 0x90, 0x08, 0x95, 0x81, 0xE0, 0xC8, 0x1A, 0xD1, 0x08, 0xE1, 0x08, 0xF1, 0x08, 0xC8, 0x51, 0xDC, 0x4F, 0xE6, 0xCF, 0xC1, 0x14, 0xD1, 0x04]
pymcuprog.serialupdi.link - DEBUG - STCS to 0x02
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC2, 0x80]
pymcuprog.serialupdi.nvmp0 - DEBUG - Committing data
pymcuprog.serialupdi.nvmp0 - DEBUG - NVMCMD 1 executing
pymcuprog.serialupdi.link - DEBUG - ST to 0x001000
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x44, 0x00, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.physical - DEBUG - send : [0x01]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.nvmp0 - DEBUG - Wait NVM ready
pymcuprog.serialupdi.link - DEBUG - LD from 0x001002
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x04, 0x02, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x00]
pymcuprog.nvm - DEBUG - Writing 128 bytes to address 0x008180
pymcuprog.serialupdi.nvmp0 - DEBUG - Wait NVM ready
pymcuprog.serialupdi.link - DEBUG - LD from 0x001002
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x04, 0x02, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x00]
pymcuprog.serialupdi.nvmp0 - DEBUG - Clear page buffer
pymcuprog.serialupdi.nvmp0 - DEBUG - NVMCMD 4 executing
pymcuprog.serialupdi.link - DEBUG - ST to 0x001000
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x44, 0x00, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.physical - DEBUG - send : [0x04]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.nvmp0 - DEBUG - Wait NVM ready
pymcuprog.serialupdi.link - DEBUG - LD from 0x001002
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x04, 0x02, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x00]
pymcuprog.serialupdi.link - DEBUG - ST to ptr
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x69, 0x80, 0x81]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.link - DEBUG - Repeat 64
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xA0, 0x3F]
pymcuprog.serialupdi.link - DEBUG - ST16 to *ptr++
pymcuprog.serialupdi.link - DEBUG - ACKless block write
pymcuprog.serialupdi.link - DEBUG - STCS to 0x02
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC2, 0x88]
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x65]
pymcuprog.serialupdi.physical - DEBUG - send : [0xE1, 0x04, 0xF1, 0x04, 0x09, 0xF7, 0xEB, 0xCF, 0xCF, 0x93, 0xDF, 0x93, 0x82, 0x31, 0x08, 0xF0, 0x47, 0xC0, 0x90, 0xE0, 0xEC, 0x01, 0xC0, 0x52, 0xDC, 0x47, 0x28, 0x81, 0x2F, 0x3F, 0x09, 0xF4, 0x3F, 0xC0, 0xAC, 0x01, 0x42, 0x53, 0x5C, 0x47, 0xDA, 0x01, 0xEC, 0x91, 0xB0, 0xE2, 0xEB, 0x9F, 0xF0, 0x01, 0x11, 0x24, 0xFC, 0x5F, 0x61, 0x11, 0x36, 0xC0, 0x26, 0x83, 0x30, 0x81, 0x23, 0x23, 0xA1, 0xF4, 0x9C, 0x01, 0x24, 0x54, 0x3C, 0x47, 0xD9, 0x01, 0x2C, 0x91, 0x30, 0x97, 0x69, 0xF1, 0x28, 0x30, 0x58, 0xF5, 0x70, 0x96, 0xE2, 0x0F, 0xF1, 0x1D, 0x3F, 0xB7, 0xF8, 0x94, 0x20, 0x81, 0x61, 0x11, 0x26, 0xC0, 0x27, 0x7F, 0x20, 0x83, 0x3F, 0xBF, 0x86, 0x55, 0x9C, 0x47, 0xFC, 0x01, 0x90, 0x81, 0x99, 0x23, 0xA9, 0xF0, 0x88, 0x81, 0x90, 0x34, 0x09, 0xF1, 0x90, 0x38, 0xE1, 0xF0]
pymcuprog.serialupdi.link - DEBUG - STCS to 0x02
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC2, 0x80]
pymcuprog.serialupdi.nvmp0 - DEBUG - Committing data
pymcuprog.serialupdi.nvmp0 - DEBUG - NVMCMD 1 executing
pymcuprog.serialupdi.link - DEBUG - ST to 0x001000
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x44, 0x00, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.physical - DEBUG - send : [0x01]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.nvmp0 - DEBUG - Wait NVM ready
pymcuprog.serialupdi.link - DEBUG - LD from 0x001002
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x04, 0x02, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x00]
pymcuprog.nvm - DEBUG - Writing 128 bytes to address 0x008200
pymcuprog.serialupdi.nvmp0 - DEBUG - Wait NVM ready
pymcuprog.serialupdi.link - DEBUG - LD from 0x001002
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x04, 0x02, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x00]
pymcuprog.serialupdi.nvmp0 - DEBUG - Clear page buffer
pymcuprog.serialupdi.nvmp0 - DEBUG - NVMCMD 4 executing
pymcuprog.serialupdi.link - DEBUG - ST to 0x001000
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x44, 0x00, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.physical - DEBUG - send : [0x04]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.nvmp0 - DEBUG - Wait NVM ready
pymcuprog.serialupdi.link - DEBUG - LD from 0x001002
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x04, 0x02, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x00]
pymcuprog.serialupdi.link - DEBUG - ST to ptr
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x69, 0x00, 0x82]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.link - DEBUG - Repeat 64
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xA0, 0x3F]
pymcuprog.serialupdi.link - DEBUG - ST16 to *ptr++
pymcuprog.serialupdi.link - DEBUG - ACKless block write
pymcuprog.serialupdi.link - DEBUG - STCS to 0x02
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC2, 0x88]
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x65]
pymcuprog.serialupdi.physical - DEBUG - send : [0x90, 0x31, 0x71, 0xF4, 0xDA, 0x01, 0x9C, 0x91, 0x91, 0x30, 0xA1, 0xF4, 0x85, 0x30, 0x10, 0xF0, 0x88, 0x0F, 0x82, 0x95, 0x90, 0x91, 0x01, 0x0A, 0x80, 0x95, 0x89, 0x23, 0x80, 0x93, 0x01, 0x0A, 0xDF, 0x91, 0xCF, 0x91, 0x08, 0x95, 0x25, 0x83, 0xC9, 0xCF, 0xF0, 0xE0, 0xE0, 0xE0, 0xD5, 0xCF, 0x28, 0x60, 0xD9, 0xCF, 0x88, 0x0F, 0xEE, 0xCF, 0x10, 0x92, 0xA0, 0x06, 0xF1, 0xCF, 0x20, 0xE4, 0x82, 0x30, 0x09, 0xF4, 0x20, 0xE8, 0x90, 0x91, 0x92, 0x0A, 0x92, 0x23, 0x49, 0xF3, 0x6F, 0xB7, 0xF8, 0x94, 0x90, 0x91, 0x80, 0x0A, 0x9E, 0x7F, 0x90, 0x93, 0x80, 0x0A, 0x40, 0x91, 0x92, 0x0A, 0x30, 0xE0, 0x20, 0x95, 0x30, 0x95, 0x50, 0xE0, 0x24, 0x23, 0x35, 0x23, 0x98, 0xED, 0x94, 0xBF, 0x20, 0x93, 0x92, 0x0A, 0x90, 0x91, 0x8E, 0x0A, 0x90, 0xFF, 0xFC, 0xCF, 0x90, 0x91, 0x80, 0x0A]
pymcuprog.serialupdi.link - DEBUG - STCS to 0x02
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC2, 0x80]
pymcuprog.serialupdi.nvmp0 - DEBUG - Committing data
pymcuprog.serialupdi.nvmp0 - DEBUG - NVMCMD 1 executing
pymcuprog.serialupdi.link - DEBUG - ST to 0x001000
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x44, 0x00, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.physical - DEBUG - send : [0x01]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.nvmp0 - DEBUG - Wait NVM ready
pymcuprog.serialupdi.link - DEBUG - LD from 0x001002
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x04, 0x02, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x00]
pymcuprog.nvm - DEBUG - Writing 128 bytes to address 0x008280
pymcuprog.serialupdi.nvmp0 - DEBUG - Wait NVM ready
pymcuprog.serialupdi.link - DEBUG - LD from 0x001002
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x04, 0x02, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x00]
pymcuprog.serialupdi.nvmp0 - DEBUG - Clear page buffer
pymcuprog.serialupdi.nvmp0 - DEBUG - NVMCMD 4 executing
pymcuprog.serialupdi.link - DEBUG - ST to 0x001000
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x44, 0x00, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.physical - DEBUG - send : [0x04]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.nvmp0 - DEBUG - Wait NVM ready
pymcuprog.serialupdi.link - DEBUG - LD from 0x001002
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x04, 0x02, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x00]
pymcuprog.serialupdi.link - DEBUG - ST to ptr
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x69, 0x80, 0x82]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.link - DEBUG - Repeat 64
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xA0, 0x3F]
pymcuprog.serialupdi.link - DEBUG - ST16 to *ptr++
pymcuprog.serialupdi.link - DEBUG - ACKless block write
pymcuprog.serialupdi.link - DEBUG - STCS to 0x02
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC2, 0x88]
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x65]
pymcuprog.serialupdi.physical - DEBUG - send : [0x91, 0x60, 0x90, 0x93, 0x80, 0x0A, 0x81, 0x30, 0x39, 0xF4, 0x80, 0x91, 0x50, 0x04, 0x8F, 0x77, 0x80, 0x93, 0x50, 0x04, 0x6F, 0xBF, 0xC4, 0xCF, 0x80, 0x91, 0x51, 0x04, 0x8F, 0x77, 0x80, 0x93, 0x51, 0x04, 0xF8, 0xCF, 0x8F, 0x93, 0x81, 0xE0, 0x80, 0x93, 0x8D, 0x0A, 0x8F, 0xB7, 0x8F, 0x93, 0xEF, 0x93, 0xFF, 0x93, 0xE0, 0xE0, 0xF8, 0xE3, 0x9F, 0x93, 0x68, 0x94, 0x8F, 0xEF, 0x0D, 0xC0, 0xE8, 0x94, 0x84, 0x81, 0x95, 0x81, 0x80, 0x5D, 0x9C, 0x4F, 0x84, 0x83, 0x95, 0x83, 0x88, 0x5E, 0x93, 0x40, 0x80, 0xF0, 0x84, 0x83, 0x95, 0x83, 0x8F, 0xEF, 0x90, 0x81, 0x98, 0x1B, 0x91, 0x93, 0x90, 0x81, 0x9F, 0x4F, 0x91, 0x93, 0x90, 0x81, 0x9F, 0x4F, 0x91, 0x93, 0x90, 0x81, 0x9F, 0x4F, 0x91, 0x93, 0x36, 0xF3, 0x9F, 0x91, 0xFF, 0x91, 0xEF, 0x91, 0x8F, 0x91, 0x8F, 0xBF, 0x8F, 0x91]
pymcuprog.serialupdi.link - DEBUG - STCS to 0x02
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC2, 0x80]
pymcuprog.serialupdi.nvmp0 - DEBUG - Committing data
pymcuprog.serialupdi.nvmp0 - DEBUG - NVMCMD 1 executing
pymcuprog.serialupdi.link - DEBUG - ST to 0x001000
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x44, 0x00, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.physical - DEBUG - send : [0x01]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.nvmp0 - DEBUG - Wait NVM ready
pymcuprog.serialupdi.link - DEBUG - LD from 0x001002
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x04, 0x02, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x00]
pymcuprog.nvm - DEBUG - Writing 128 bytes to address 0x008300
pymcuprog.serialupdi.nvmp0 - DEBUG - Wait NVM ready
pymcuprog.serialupdi.link - DEBUG - LD from 0x001002
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x04, 0x02, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x00]
pymcuprog.serialupdi.nvmp0 - DEBUG - Clear page buffer
pymcuprog.serialupdi.nvmp0 - DEBUG - NVMCMD 4 executing
pymcuprog.serialupdi.link - DEBUG - ST to 0x001000
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x44, 0x00, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.physical - DEBUG - send : [0x04]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.nvmp0 - DEBUG - Wait NVM ready
pymcuprog.serialupdi.link - DEBUG - LD from 0x001002
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x04, 0x02, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x00]
pymcuprog.serialupdi.link - DEBUG - ST to ptr
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x69, 0x00, 0x83]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.link - DEBUG - Repeat 64
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xA0, 0x3F]
pymcuprog.serialupdi.link - DEBUG - ST16 to *ptr++
pymcuprog.serialupdi.link - DEBUG - ACKless block write
pymcuprog.serialupdi.link - DEBUG - STCS to 0x02
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC2, 0x88]
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x65]
pymcuprog.serialupdi.physical - DEBUG - send : [0x18, 0x95, 0x88, 0xED, 0x90, 0xE0, 0x84, 0xBF, 0x90, 0x93, 0x61, 0x00, 0xE0, 0xE0, 0xF6, 0xE0, 0x83, 0xE5, 0x82, 0x83, 0x8D, 0xE0, 0x85, 0x83, 0x80, 0xE2, 0x83, 0x83, 0x81, 0xE0, 0x80, 0x83, 0x10, 0x92, 0x02, 0x02, 0x80, 0x93, 0x03, 0x0A, 0x9E, 0xEF, 0x90, 0x93, 0x26, 0x0A, 0x90, 0x93, 0x27, 0x0A, 0x9B, 0xE0, 0x90, 0x93, 0x00, 0x0A, 0xE0, 0xE8, 0xFA, 0xE0, 0x2D, 0xEF, 0x31, 0xE0, 0x26, 0xA7, 0x37, 0xA7, 0x11, 0x82, 0x90, 0xE8, 0x92, 0x83, 0x84, 0x87, 0x81, 0xE1, 0x80, 0x83, 0x78, 0x94, 0x84, 0xE0, 0x80, 0x93, 0x01, 0x04, 0x80, 0x91, 0x12, 0x04, 0x87, 0x7F, 0x80, 0x93, 0x12, 0x04, 0x61, 0xE0, 0x8F, 0xE0, 0x10, 0xDF, 0xE1, 0xDE, 0x60, 0xE0, 0x8F, 0xE0, 0x0C, 0xDF, 0xDD, 0xDE, 0xF7, 0xCF, 0x09, 0xD0, 0xA5, 0x9F, 0x90, 0x0D, 0xB4, 0x9F, 0x90, 0x0D, 0xA4, 0x9F]
pymcuprog.serialupdi.link - DEBUG - STCS to 0x02
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC2, 0x80]
pymcuprog.serialupdi.nvmp0 - DEBUG - Committing data
pymcuprog.serialupdi.nvmp0 - DEBUG - NVMCMD 1 executing
pymcuprog.serialupdi.link - DEBUG - ST to 0x001000
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x44, 0x00, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.physical - DEBUG - send : [0x01]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.nvmp0 - DEBUG - Wait NVM ready
pymcuprog.serialupdi.link - DEBUG - LD from 0x001002
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x04, 0x02, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x00]
pymcuprog.nvm - DEBUG - Writing 128 bytes to address 0x008380
pymcuprog.serialupdi.nvmp0 - DEBUG - Wait NVM ready
pymcuprog.serialupdi.link - DEBUG - LD from 0x001002
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x04, 0x02, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x00]
pymcuprog.serialupdi.nvmp0 - DEBUG - Clear page buffer
pymcuprog.serialupdi.nvmp0 - DEBUG - NVMCMD 4 executing
pymcuprog.serialupdi.link - DEBUG - ST to 0x001000
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x44, 0x00, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.physical - DEBUG - send : [0x04]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.nvmp0 - DEBUG - Wait NVM ready
pymcuprog.serialupdi.link - DEBUG - LD from 0x001002
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x04, 0x02, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x00]
pymcuprog.serialupdi.link - DEBUG - ST to ptr
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x69, 0x80, 0x83]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.link - DEBUG - Repeat 64
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xA0, 0x3F]
pymcuprog.serialupdi.link - DEBUG - ST16 to *ptr++
pymcuprog.serialupdi.link - DEBUG - ACKless block write
pymcuprog.serialupdi.link - DEBUG - STCS to 0x02
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC2, 0x88]
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x65]
pymcuprog.serialupdi.physical - DEBUG - send : [0x80, 0x0D, 0x91, 0x1D, 0x11, 0x24, 0x08, 0x95, 0xA2, 0x9F, 0xB0, 0x01, 0xB3, 0x9F, 0xC0, 0x01, 0xA3, 0x9F, 0x70, 0x0D, 0x81, 0x1D, 0x11, 0x24, 0x91, 0x1D, 0xB2, 0x9F, 0x70, 0x0D, 0x81, 0x1D, 0x11, 0x24, 0x91, 0x1D, 0x08, 0x95, 0xF8, 0x94, 0xFF, 0xCF, 0x10, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x04, 0x05, 0x06, 0x07, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x01, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x40, 0x80, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x04, 0x08, 0x02, 0x04, 0x08, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
pymcuprog.serialupdi.link - DEBUG - STCS to 0x02
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC2, 0x80]
pymcuprog.serialupdi.nvmp0 - DEBUG - Committing data
pymcuprog.serialupdi.nvmp0 - DEBUG - NVMCMD 1 executing
pymcuprog.serialupdi.link - DEBUG - ST to 0x001000
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x44, 0x00, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.physical - DEBUG - send : [0x01]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.nvmp0 - DEBUG - Wait NVM ready
pymcuprog.serialupdi.link - DEBUG - LD from 0x001002
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x04, 0x02, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x00]
pymcuprog.programmer - INFO - Write complete.
Verifying flash...
pymcuprog.programmer - INFO - Reading 1010 bytes from flash...
pymcuprog.nvm - DEBUG - Reading 256 bytes from address 0x008000
pymcuprog.serialupdi.readwrite - DEBUG - Reading 256 bytes from 0x8000
pymcuprog.serialupdi.link - DEBUG - ST to ptr
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x69, 0x00, 0x80]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.link - DEBUG - Repeat 256
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xA0, 0xFF]
pymcuprog.serialupdi.link - DEBUG - LD8 from ptr++
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x24]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x3D, 0xC0, 0x00, 0x00, 0x57, 0xC0, 0x00, 0x00, 0x55, 0xC0, 0x00, 0x00, 0x53, 0xC0, 0x00, 0x00, 0x51, 0xC0, 0x00, 0x00, 0x4F, 0xC0, 0x00, 0x00, 0x4D, 0xC0, 0x00, 0x00, 0x4B, 0xC0, 0x00, 0x00, 0x49, 0xC0, 0x00, 0x00, 0x47, 0xC0, 0x00, 0x00, 0x45, 0xC0, 0x00, 0x00, 0x43, 0xC0, 0x00, 0x00, 0x41, 0xC0, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x3D, 0xC0, 0x00, 0x00, 0x33, 0xC1, 0x00, 0x00, 0x39, 0xC0, 0x00, 0x00, 0x37, 0xC0, 0x00, 0x00, 0x35, 0xC0, 0x00, 0x00, 0x33, 0xC0, 0x00, 0x00, 0x31, 0xC0, 0x00, 0x00, 0x2F, 0xC0, 0x00, 0x00, 0x2D, 0xC0, 0x00, 0x00, 0x2B, 0xC0, 0x00, 0x00, 0x29, 0xC0, 0x00, 0x00, 0x27, 0xC0, 0x00, 0x00, 0x25, 0xC0, 0x00, 0x00, 0x23, 0xC0, 0x00, 0x00, 0x21, 0xC0, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x1D, 0xC0, 0x00, 0x00, 0x11, 0x24, 0x1F, 0xBE, 0xCF, 0xEF, 0xCD, 0xBF, 0xDF, 0xE3, 0xDE, 0xBF, 0x80, 0x91, 0x40, 0x00, 0x80, 0x93, 0x40, 0x00, 0x81, 0x11, 0x05, 0xC0, 0x98, 0xED, 0x21, 0xE0, 0x94, 0xBF, 0x20, 0x93, 0x41, 0x00, 0x8C, 0xBB, 0x28, 0xE3, 0xA0, 0xE0, 0xB8, 0xE3, 0x01, 0xC0, 0x1D, 0x92, 0xAA, 0x30, 0xB2, 0x07, 0xE1, 0xF7, 0x28, 0xD1, 0x79, 0xC1, 0xA5, 0xCF, 0x9F, 0xB7, 0xF8, 0x94, 0x88, 0xE0, 0x80, 0x93, 0x84, 0x0A, 0x80, 0x91, 0x8E, 0x0A, 0x81, 0xFF, 0xFC, 0xCF, 0x80, 0x91, 0x8D, 0x0A, 0xE0, 0x91, 0xA2, 0x0A, 0xF0, 0x91, 0xA3, 0x0A, 0x20, 0x91, 0x00, 0x38, 0x30, 0x91, 0x01, 0x38, 0x40, 0x91, 0x02, 0x38, 0x50, 0x91, 0x03, 0x38, 0x9F, 0xBF, 0x80, 0xFF, 0x07, 0xC0, 0xE7, 0x30, 0xF1, 0x05, 0x20, 0xF4, 0x2F, 0x5F, 0x3F, 0x4F, 0x4F, 0x4F, 0x5F, 0x4F, 0xBF, 0x01, 0x76, 0x95, 0x67, 0x95, 0xCF, 0x01]
pymcuprog.nvm - DEBUG - Reading 256 bytes from address 0x008100
pymcuprog.serialupdi.readwrite - DEBUG - Reading 256 bytes from 0x8100
pymcuprog.serialupdi.link - DEBUG - ST to ptr
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x69, 0x00, 0x81]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.link - DEBUG - Repeat 256
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xA0, 0xFF]
pymcuprog.serialupdi.link - DEBUG - LD8 from ptr++
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x24]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x86, 0x0F, 0x91, 0x1D, 0xE6, 0x2F, 0xE6, 0x95, 0xE6, 0x95, 0x76, 0x2F, 0x72, 0x95, 0x7F, 0x70, 0xE7, 0x1B, 0xFF, 0x0B, 0x67, 0xFD, 0x31, 0x96, 0xE8, 0x0F, 0xF9, 0x1F, 0xA0, 0xE3, 0xB3, 0xE0, 0x29, 0xD1, 0x6E, 0x0F, 0x7F, 0x1F, 0x81, 0x1D, 0x91, 0x1D, 0x08, 0x95, 0xCF, 0x92, 0xDF, 0x92, 0xEF, 0x92, 0xFF, 0x92, 0xCF, 0x93, 0xDF, 0x93, 0xBE, 0xDF, 0xEB, 0x01, 0x88, 0xEE, 0xC8, 0x2E, 0x83, 0xE0, 0xD8, 0x2E, 0xE1, 0x2C, 0xF1, 0x2C, 0xB6, 0xDF, 0x6C, 0x1B, 0x7D, 0x0B, 0x68, 0x3E, 0x73, 0x40, 0xA0, 0xF0, 0xC1, 0x14, 0xD1, 0x04, 0xE1, 0x04, 0xF1, 0x04, 0x39, 0xF4, 0xDF, 0x91, 0xCF, 0x91, 0xFF, 0x90, 0xEF, 0x90, 0xDF, 0x90, 0xCF, 0x90, 0x08, 0x95, 0x81, 0xE0, 0xC8, 0x1A, 0xD1, 0x08, 0xE1, 0x08, 0xF1, 0x08, 0xC8, 0x51, 0xDC, 0x4F, 0xE6, 0xCF, 0xC1, 0x14, 0xD1, 0x04, 0xE1, 0x04, 0xF1, 0x04, 0x09, 0xF7, 0xEB, 0xCF, 0xCF, 0x93, 0xDF, 0x93, 0x82, 0x31, 0x08, 0xF0, 0x47, 0xC0, 0x90, 0xE0, 0xEC, 0x01, 0xC0, 0x52, 0xDC, 0x47, 0x28, 0x81, 0x2F, 0x3F, 0x09, 0xF4, 0x3F, 0xC0, 0xAC, 0x01, 0x42, 0x53, 0x5C, 0x47, 0xDA, 0x01, 0xEC, 0x91, 0xB0, 0xE2, 0xEB, 0x9F, 0xF0, 0x01, 0x11, 0x24, 0xFC, 0x5F, 0x61, 0x11, 0x36, 0xC0, 0x26, 0x83, 0x30, 0x81, 0x23, 0x23, 0xA1, 0xF4, 0x9C, 0x01, 0x24, 0x54, 0x3C, 0x47, 0xD9, 0x01, 0x2C, 0x91, 0x30, 0x97, 0x69, 0xF1, 0x28, 0x30, 0x58, 0xF5, 0x70, 0x96, 0xE2, 0x0F, 0xF1, 0x1D, 0x3F, 0xB7, 0xF8, 0x94, 0x20, 0x81, 0x61, 0x11, 0x26, 0xC0, 0x27, 0x7F, 0x20, 0x83, 0x3F, 0xBF, 0x86, 0x55, 0x9C, 0x47, 0xFC, 0x01, 0x90, 0x81, 0x99, 0x23, 0xA9, 0xF0, 0x88, 0x81, 0x90, 0x34, 0x09, 0xF1, 0x90, 0x38, 0xE1, 0xF0]
pymcuprog.nvm - DEBUG - Reading 256 bytes from address 0x008200
pymcuprog.serialupdi.readwrite - DEBUG - Reading 256 bytes from 0x8200
pymcuprog.serialupdi.link - DEBUG - ST to ptr
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x69, 0x00, 0x82]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.link - DEBUG - Repeat 256
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xA0, 0xFF]
pymcuprog.serialupdi.link - DEBUG - LD8 from ptr++
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x24]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x90, 0x31, 0x71, 0xF4, 0xDA, 0x01, 0x9C, 0x91, 0x91, 0x30, 0xA1, 0xF4, 0x85, 0x30, 0x10, 0xF0, 0x88, 0x0F, 0x82, 0x95, 0x90, 0x91, 0x01, 0x0A, 0x80, 0x95, 0x89, 0x23, 0x80, 0x93, 0x01, 0x0A, 0xDF, 0x91, 0xCF, 0x91, 0x08, 0x95, 0x25, 0x83, 0xC9, 0xCF, 0xF0, 0xE0, 0xE0, 0xE0, 0xD5, 0xCF, 0x28, 0x60, 0xD9, 0xCF, 0x88, 0x0F, 0xEE, 0xCF, 0x10, 0x92, 0xA0, 0x06, 0xF1, 0xCF, 0x20, 0xE4, 0x82, 0x30, 0x09, 0xF4, 0x20, 0xE8, 0x90, 0x91, 0x92, 0x0A, 0x92, 0x23, 0x49, 0xF3, 0x6F, 0xB7, 0xF8, 0x94, 0x90, 0x91, 0x80, 0x0A, 0x9E, 0x7F, 0x90, 0x93, 0x80, 0x0A, 0x40, 0x91, 0x92, 0x0A, 0x30, 0xE0, 0x20, 0x95, 0x30, 0x95, 0x50, 0xE0, 0x24, 0x23, 0x35, 0x23, 0x98, 0xED, 0x94, 0xBF, 0x20, 0x93, 0x92, 0x0A, 0x90, 0x91, 0x8E, 0x0A, 0x90, 0xFF, 0xFC, 0xCF, 0x90, 0x91, 0x80, 0x0A, 0x91, 0x60, 0x90, 0x93, 0x80, 0x0A, 0x81, 0x30, 0x39, 0xF4, 0x80, 0x91, 0x50, 0x04, 0x8F, 0x77, 0x80, 0x93, 0x50, 0x04, 0x6F, 0xBF, 0xC4, 0xCF, 0x80, 0x91, 0x51, 0x04, 0x8F, 0x77, 0x80, 0x93, 0x51, 0x04, 0xF8, 0xCF, 0x8F, 0x93, 0x81, 0xE0, 0x80, 0x93, 0x8D, 0x0A, 0x8F, 0xB7, 0x8F, 0x93, 0xEF, 0x93, 0xFF, 0x93, 0xE0, 0xE0, 0xF8, 0xE3, 0x9F, 0x93, 0x68, 0x94, 0x8F, 0xEF, 0x0D, 0xC0, 0xE8, 0x94, 0x84, 0x81, 0x95, 0x81, 0x80, 0x5D, 0x9C, 0x4F, 0x84, 0x83, 0x95, 0x83, 0x88, 0x5E, 0x93, 0x40, 0x80, 0xF0, 0x84, 0x83, 0x95, 0x83, 0x8F, 0xEF, 0x90, 0x81, 0x98, 0x1B, 0x91, 0x93, 0x90, 0x81, 0x9F, 0x4F, 0x91, 0x93, 0x90, 0x81, 0x9F, 0x4F, 0x91, 0x93, 0x90, 0x81, 0x9F, 0x4F, 0x91, 0x93, 0x36, 0xF3, 0x9F, 0x91, 0xFF, 0x91, 0xEF, 0x91, 0x8F, 0x91, 0x8F, 0xBF, 0x8F, 0x91]
pymcuprog.nvm - DEBUG - Reading 242 bytes from address 0x008300
pymcuprog.serialupdi.readwrite - DEBUG - Reading 242 bytes from 0x8300
pymcuprog.serialupdi.link - DEBUG - ST to ptr
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x69, 0x00, 0x83]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.link - DEBUG - Repeat 242
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xA0, 0xF1]
pymcuprog.serialupdi.link - DEBUG - LD8 from ptr++
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x24]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x18, 0x95, 0x88, 0xED, 0x90, 0xE0, 0x84, 0xBF, 0x90, 0x93, 0x61, 0x00, 0xE0, 0xE0, 0xF6, 0xE0, 0x83, 0xE5, 0x82, 0x83, 0x8D, 0xE0, 0x85, 0x83, 0x80, 0xE2, 0x83, 0x83, 0x81, 0xE0, 0x80, 0x83, 0x10, 0x92, 0x02, 0x02, 0x80, 0x93, 0x03, 0x0A, 0x9E, 0xEF, 0x90, 0x93, 0x26, 0x0A, 0x90, 0x93, 0x27, 0x0A, 0x9B, 0xE0, 0x90, 0x93, 0x00, 0x0A, 0xE0, 0xE8, 0xFA, 0xE0, 0x2D, 0xEF, 0x31, 0xE0, 0x26, 0xA7, 0x37, 0xA7, 0x11, 0x82, 0x90, 0xE8, 0x92, 0x83, 0x84, 0x87, 0x81, 0xE1, 0x80, 0x83, 0x78, 0x94, 0x84, 0xE0, 0x80, 0x93, 0x01, 0x04, 0x80, 0x91, 0x12, 0x04, 0x87, 0x7F, 0x80, 0x93, 0x12, 0x04, 0x61, 0xE0, 0x8F, 0xE0, 0x10, 0xDF, 0xE1, 0xDE, 0x60, 0xE0, 0x8F, 0xE0, 0x0C, 0xDF, 0xDD, 0xDE, 0xF7, 0xCF, 0x09, 0xD0, 0xA5, 0x9F, 0x90, 0x0D, 0xB4, 0x9F, 0x90, 0x0D, 0xA4, 0x9F, 0x80, 0x0D, 0x91, 0x1D, 0x11, 0x24, 0x08, 0x95, 0xA2, 0x9F, 0xB0, 0x01, 0xB3, 0x9F, 0xC0, 0x01, 0xA3, 0x9F, 0x70, 0x0D, 0x81, 0x1D, 0x11, 0x24, 0x91, 0x1D, 0xB2, 0x9F, 0x70, 0x0D, 0x81, 0x1D, 0x11, 0x24, 0x91, 0x1D, 0x08, 0x95, 0xF8, 0x94, 0xFF, 0xCF, 0x10, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x04, 0x05, 0x06, 0x07, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x01, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x40, 0x80, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x01, 0x02, 0x04, 0x08, 0x02, 0x04, 0x08, 0x01]
pymcuprog.programmer - INFO - Verifying...
OK
pymcuprog.serialupdi.application - INFO - Leaving NVM programming mode
pymcuprog.serialupdi.application - INFO - Apply reset
pymcuprog.serialupdi.link - DEBUG - STCS to 0x08
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC8, 0x59]
pymcuprog.serialupdi.application - INFO - Release reset
pymcuprog.serialupdi.link - DEBUG - STCS to 0x08
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC8, 0x00]
pymcuprog.serialupdi.link - DEBUG - STCS to 0x03
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC3, 0x0C]
Done.
pymcuprog.serialupdi.physical - INFO - Closing port '/dev/ttyACM0'

The equivalent section is:

pymcuprog.serialupdi.link - DEBUG - STCS to 0x02
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0xC2, 0x80]
pymcuprog.serialupdi.nvmp0 - DEBUG - Committing data
pymcuprog.serialupdi.nvmp0 - DEBUG - NVMCMD 1 executing
pymcuprog.serialupdi.link - DEBUG - ST to 0x001000
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x44, 0x00, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.physical - DEBUG - send : [0x01]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x40]
pymcuprog.serialupdi.nvmp0 - DEBUG - Wait NVM ready
pymcuprog.serialupdi.link - DEBUG - LD from 0x001002
pymcuprog.serialupdi.physical - DEBUG - send : [0x55, 0x04, 0x02, 0x10]
pymcuprog.serialupdi.physical - DEBUG - receive : [0x00]
pymcuprog.programmer - INFO - Write complete.

These are the messages I get when the board is in a "virgin" state. After a failure, the board gets stuck in a different state where pymcuprog erase and pymcuprog ping fail. It can be rescued by programming it successfully in a Windows or Linux machine.

So there seems to be something wrong specifically with the mac version of pymcuprog. I've decided to just skip this architecture altogether: at this point I'm not married to it.

Sketch here, hex file here.

Update

board_01 is saved! Josep, Adai and Julia managed to program it from a mac using a different programmer: a SAMD11-based USB to UART bridge

Understanding my board

I wrote a sketch to turn on the pins in groups of 4, but it's behaving weirdly. For example, the green LED is turning on at the same time as the blue, but fainter, and turning off earlier.

void setup() {


  for (int i = 0; i < 17; i++) {  // pin 17 (physical 6) is UPDI
    pinMode(i, OUTPUT);
  }
  Serial.begin(115200);  // I can't get serial through a programmer?
}

void loop() {

  // led_cycle();
  for (int i = 0; i < 5; i++) {
    for (int j = 0; j < 5; j++) {
      digitalWrite(i * 4 + j, HIGH);
    }

    delay(500);

    for (int j = 0; j < 5; j++) {
      digitalWrite(i * 4 + j, LOW);
    }
  }
}

Other observations:

  • The updi pin is at 3.5V judging by my multimeter (temporal averaging of 5V signal, maybe?)
  • The red LED seems to be fried.
  • Surprisingly (to me at least), it doesn't seem to matter if I write HIGH on the UPDI pin: it can still be programmed.

Choosing a platform for my final project

Now that I've had my first (aversive) experience with board design, I feel I'd rather design a dev board that I can use for my final project. First step is choosing a platform. My thinking is reflected in the Final project page

Board 02

Interesting reference: Adafruit feathers.

Platform: SAMD21E18A (datasheet) (pdf)

  • How to program it? I'm not super sure about using the QuenTorres. The documentation mentions using fab SAM core which seems mostly abandoned and is a fork of an abandoned fork of ArduinoCore-samd.
    • We have SWD programmers lying around.

Wishlist

These were my initial desired features. I've crossed out those that didn't make it to v1.

  • Connector for at least 12 single-color LEDs + ground
    • Breakout board with the LEDs and the Hall effect sensor.
    • Connector is not invertible for idiot-proof operation.
  • Connector for a display for debugging.
  • JTAG connector for flashing bootloader.
  • USB-C connector for programming directly.
  • Boot and reset buttons: SAMD21 reboots by double-clicking reset, apparently
  • General purpose button(s): 1
  • LEDs for Rx / Tx or equivalent
    • How do I wire these?
  • Programmable LED(s)
  • Capacitive touch pads Demoted to breakout board
  • Built-in USB-serial converter to make the UART available to your PC: will burn USB bootloader through JTAG then it should be fine.
  • Micropython ready
  • Wireless communication

Design

Questions that I asked myself while designing:

  • How to add a reset button? -> connect it to the reset pin, pulled up to VDD.
  • How to add a boot button? -> not needed, SAMD21 goes to bootloader mode by clicking reset twice.
  • How to add a USB programming connector, type C if possible? -> connect it to pins 23 (USBDM) and 24 (USBDP) in the ATSMAD21E18A, power, and ground.
    • Are the USBC connectors we have power-only? -> we have both: the data ones are too hard to solder manually.
    • Do we have microUSB connectors? -> Yes, but miniUSB is easier to hand solder.
  • How to regulate input voltage? Do I need to regulate down the 5V USB to 3.3V? -> yes.
  • Bootloader mode? Double tap? -> yes

Checks

The beautiful result

  • SWDIO is pulled up (?) to 3.3V. Is this correct? What will the QuenTorres put in here? -> Yes. 3.3V.
  • LEDs: I've chosen very low-resistance resistors (10Ω) because I want blue LEDs and the board works at 3.3V. How low is too low?
    • TODO check in a breadboard with the voltage regulator and the appropriate LEDs.
  • Is my reset button properly set? It's open-high, closed-low -> Yes.
  • Is my JTAG connector properly configured? -> There was a mistake: see below
  • Do I need more decoupling capacitors? -> I'm fine.

Making it work

Notes to myself

  • VDDCORE is "internal regulated output supply" 1.2V.
  • Pins on the left of the package are PA00 to PA07. All analog pins are here.
  • Pins on the right of the package are PA16 to PA19 and PA22 to PA 25.
  • Pins on the top of the package are various voltages, ground, reset, and PA27, PA28, PA30 and PA312.

Flashing USB bootloader

Get ATSAMD21E18A binary form here

This is abandoned; a fork can be found here

Troubleshooting

  • Trouble found: SWD target connect was wired wrong! RESET and DATA pins were swapped. Fixed for V1.1.
  • Another mistake: Button1 pull-up capacitor was not connected. Fixed for V1.1.
  • Fix: connect USB housing to GND.
  • Issue: can't program through USB but I can through a programmer
    • Diagnosis: not found.

In order to program my board I need to use the QuenTorres every time. In order to read serial communication, I have to program it with at least 2 UART. Reading the documentation suggested this would come out thrgouh PA11, but trial and error showed it was actually PA10. - 2x UART - Tx pin to Rx in QuenTorres

2024-03-28 Fixed! Adai desoldered a stray resistor and the board showed itself! My mac was saying it was disabled because it was "consuming too much power". Was this

Local class

Components, pull up resistors, decoupling and crossover capacitors.

Software: Eagle, Fritzing, KiCAD.

KiCAD: components, footprints, components and footprint libraries.

Steps

  1. Choose microcontroller.
  2. Look for a Hello Board: a board that basically has the minimum necessary for the MCU to work. We have several here
  3. Choose what else you want to add to it and read its datasheet.
  4. Decide what pin to connect it to.
  5. Figure out the connections and additional components.

Board setup in KiCAD

(File -> Board setup)

  • Clearance 0.4mm (because of 1/32" endmill)
  • Track width 0.3mm, more if you can manage
  • Via hole 0.8mm (because of 1/64" endmill)
  • Via size: bigger than via hole; 1.2mm is good

Try to leave a bit of extra space between voltage and ground.

References

Pending questions: TODO ask

  • How would you build a 1D touch slider?
  • Maybe using the peripheral touch controller in an ATtiny, or similar?
  • How would you build a proximity sensor if you wanted to know the general direction of the stimulus?
  • capacitive array?
  • IR array?
  • ultrasonic array?
  • sonar-like?

  • Why is there so much use of global state rather than returning variables?

  • Why are the capacitive sensor readings different at rest? (600, 600, 600, 20)

  • Why do they go to 20 if I touch the wifi antenna with my other hand?

TODOs / unexplored ideas

  • TODO: PCB in the shape of a constellation like https://kitspace.org/boards/github.com/lincolnuehara/aquarius/, but prettier
  • TODO: capacitive slider test

References