As amazing as CircuitPython is, it hasn’t yet been ported to any 8-bit microcontrollers. [Chris Heo] was unsatisfied with his inability to use Python on his 8-bit ATmega4808 AVR, so he worked out a way to zombify it and bend it to his will using Python on his PC.
The trick to making this all work is the UPDI interface: a single-wire UART interface for programming and debugging Microchip’s newer 8-bit AVR microcontrollers. UPDI reaches deep into the microcontroller’s core, allowing you to stop and start execution of microcontroller code and access all of the onboard data and I/O. [Chris] realized this could be used to stop execution of any code running on the AVR and directly control the output pins using the pyupdi library. Since UPDI lets him modify the AVR’s I/O registers, he was also able to blink an LED and use the microcontrollers UART to send a message back to his PC without compiling a single line of code.
This may seem like an entirely unnecessary hack, but for devices too small or basic to have a JTAG interface for debugging this could be the best way to test and debug peripherals in an assembled circuit. We hope this catches on and would love to see how much of the chip can be controlled in this way. Maybe this will make it easy to experiment with the programmable logic that’s on some of the newer AVRs.
[Mansour Behabadi] wanted to harness the high power capability of USB-C using as simple a hardware design as possible. After some research and experimental prototyping, he designed the fpx — an easy to use USB‑C power delivery board. The fpx is an improved follow up to his earlier USB PD project fabpide2 which we featured some time back. However, practical implementation of the USB PD protocol can be a bed of thorns. Negotiating power delivery usually requires a dedicated PD controller coupled with a micro-controller for user control.
With USB PD, a USB-C port can be configured as either a source, a sink, or both and allows connected devices to negotiate up to 100 W (20 V, 5 A) of power. The fpx is based around the popular STUSB4500 PD controller, which does most of the PD heavy lifting. To program the STUSB4500, he used an ATtiny 816 micro-controller, whose UPDI programming and debugging interface consumes lower board real estate.
However, what’s a little bit different is the way the fpx is programmed — by sending binary black and white flashes from any device that can display a web page. Using light isn’t a particularly new way of programming. We’ve seen it used almost a decade back by WayneAndLayne for their Blinky PoV projects, and later by the Electric Imp’s BlinkUp app. The fpx uses a similar method to read flashes of light from a screen which are picked up by a photo-transistor connected to the ATtiny. The ATtiny then communicates with the STUSB4500 over I2C. This eliminates the requirement for special software or an IDE for programming and doesn’t need any physical cable connection. Check out [Mansour]’s blog post where he walks us through the details of how he managed to wrangle the optical programming challenge.
Many of the commercially available USB PD decoy/detector/trigger boards use either solder jumpers or a switch with an RGB LED to adjust Power Delivery Output (PDO). [Mansour]’s method may be a little more robust and reliable. The STUSB4500 can store two separate PDO values and can negotiate with a source according to its capability. If the source cannot offer either of these options, the fpx can either request for a minimal 5 V / 100 mA setting, or disable the output. The fpx is an open source project, accessible on Github. Check out the video after the break for an overview of the fpx.
Continue reading “Easy USB‑C Power For All Your Devices”
When [Alain] wanted to use some of the new TinyAVR 0 chips — specifically, the Attiny406 — it seemed overkill to use the Windows IDE. There are plenty of sources of information on programming other AVR chips using simple command line tools, but not for these newer 0-series parts which use a new programming protocol known as UPDI. That led to a deep diving into how to program a TinyAVR 0 with a text editor, makefile, and USB-to-serial cable.
The Attiny406 has 4K of flash, 256 bytes of RAM and can run at 20 MHz with no external clock. You might think programming would be similar to a regular AVR part, but these tiny devices use UPDI (Unified Programming and Debug Interface) which uses 3 pins for programming. Older devices used different protocols.
It is very easy to create a UPDI programmer. A USB to logic-level serial cable and a 4.7K resistor is all it takes. There’s Python code that knows how to drive the protocol, too. You can also use the logic-level serial port on the Raspberry Pi with some device tree modifications explained in the code’s documentation.
[Alain] made a nice breakout board for the device. It fits a breadboard, allows for 5V or 3.3V operation, and has an LED and switch. Nothing fancy, but handy. Once you know how to ship a hex file to the chip, the rest is pretty standard. While the AVR version of gcc doesn’t cross-compile for the ATTiny out of the box, there is a device pack from Microchip that enables that feature.
The trend is to go to bigger processors, not smaller, but when you need to cram something in a small space, save a few pennies per unit, or draw very little power, these tiny processors can be just the ticket. The processors may be small, but if you work you can do some pretty big things with them.
Like many of us who fiddle with microcontrollers, [Mike] and [Brian] often found themselves using an ISP programmer and a USB-to-serial adapter. But when they started working on the latest generation of ATtiny chips, they found themselves in need of a Unified Program, and Debug Interface (UPDI) programmer as well. So they decided to wrap all three functions into one handy open hardware gadget.
They call their creation the AVR General Purpose Programmer, or AVRgpp for short. It runs on an ATmega328P with a Pro Mini bootloader, which means that the programmer itself is fully compatible with the Arduino IDE. USB-to-serial capability is provided by a CH330N, and a MC14053 digital switch IC is used to select between talking to the AVRgpp’s onboard MCU or the target device.
A 128 x 32 I2C OLED and two push buttons are used to select the device’s current mode, and there’s a physical switch to select between 5 V or 3.3 V power for the target. There’s also a ST662 12 V regulator, as UPDI targets occasionally need a high voltage pulse to switch into programming mode. Everything is packaged up in a pocket-sized laser cut enclosure that you can easily toss in your bag.
[Mike] and [Brian] say they are considering putting the AVRgpp into small scale production if there’s enough interest, so let them know if you’d like to get one without having to build it yourself.