This post was originally going to be about building a tool to access I²C devices on a Mac, reaching them via USB and an Excamera Labs I2CMini adaptor board. But then I accidentally snapped the pins and board traces off my I2CMini, so I had to go back to the drawing board. Now it’s about accessing I²C devices on a Mac using a Raspberry Pi Pico, or any other RP2040-based board, as the adaptor.
Continue readingTag Archives: Pico
How to manage multiple serial devices on a Mac
I connect to my Mac many USB devices that communicate over a serial (UART) bus to send debug information to the host or to receive data and code. You know, Raspberry Pi Picos, Adafruit Feathers, FTDI cables — that kind of thing. Often I have more than one connected. Is there an easy way to see what’s connected without listing /dev
every time and to remember connected devices’ paths?

ARM Assembly on the Pi Pico: Stack attack
This time round, I’ll wrap up my coverage of the key ARMv6-M Thumb instructions and mnemonics that you can use to command the Raspberry Pi RP2040. There are not many instructions left that were not covered in parts one and two, and I won’t be including all the remaining mnemonics, only those you’re likely to use frequently.
Continue readingThe Golden Age of Wireless: Adopting Raspberry Pi’s Pico W
I was travelling when the Raspberry Pi Foundation launched the Pico W, so I had to wait to get back before I could get my hands on one. I have one now, and to try it out, I decided to port my network-oriented PicoWeather app, this time creating a MicroPython version — it was released for CircuitPython.
Continue readingArm Assembly on the Pi Pico: Mnemonics #2
A number of the Cortex-M0+ Thumb ops I covered last time update the core’s Program Status Register (PSR) based on the outcome of the operation. The ops that do so have an S
appended to their mnemonics and they only work with the core’s ‘low’ registers, R0-7.

ARM Assembly on the Pi Pico: Mnemonics #1
Last time, I covered the basics of doing ARM assembly programming on the Raspberry Pi Pico’s RP2040 microcontroller. Now it’s time to get to grips with the dozens of instructions to which the RP2040’s Cortex-M0+ cores respond.

Get Started with ARM Assembly on the Pi Pico
When I got my first microcomputer, I already knew Basic programming. My machine had a different Basic dialect from the one I’d learned at school, and there was a stack of graphics and sound functionality to get to grips with too, but it wasn’t long before I felt I’d mastered the high-level stuff and that it was time to move on to machine code. That’s how I’ve come to feel about the Raspberry Pi Pico’s RP2040 chip. The time’s right to learn ARM assembly programming on the Pico.
Continue readingFreeRTOS and the Pi Pico: timers
I made use of FreeRTOS’ timer functionality in the most recent post in this series, but I didn’t go into detail because the post was focused on other features. It’s time to address that deficiency. Today I’m talking about timers.

FreeRTOS and the Pi Pico: interrupts, semaphores and notifications
One of the reasons why an embedded application developer might choose to build their code on top of a real-time operating system like FreeRTOS is to emphasise the event-driven nature of the application. For “events” read data coming in on a serial link or from an I²C peripheral, or a signal to a GPIO from a sensor that a certain threshold has been exceeded. These events are typically announced by interrupting whatever job the host microcontroller is engaged upon, so interrupts are what I’ve chosen to examine next in my exploration of FreeRTOS on the Raspberry Pi RP2040 chip.
Continue readingFreeRTOS and the Pi Pico: sizing up scheduling
FreeRTOS scheduling is hard in as much at can be difficult to decide how to configure it. I wanted to try and figure out the options.
The popular real-time operating system provides the configUSE_TIME_SLICING
and configUSE_PREEMPTION
as settings values. You can add them to your FreeRTOSConfig.h
file Tasks themselves can be assigned priority values, and there are API calls to allows tasks to sleep, to yield up the CPU, and be suspended and subsequently resumed.