Cleanup 3rd party samples; update README.md; add some missing copyright, fix builds for boards without certain pin definitions
This commit is contained in:
@@ -1,3 +1,9 @@
|
||||
;
|
||||
; Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
|
||||
;
|
||||
; SPDX-License-Identifier: BSD-3-Clause
|
||||
;
|
||||
|
||||
.program addition
|
||||
|
||||
; Pop two 32 bit integers from the TX FIFO, add them together, and push the
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
;
|
||||
; Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
|
||||
;
|
||||
; SPDX-License-Identifier: BSD-3-Clause
|
||||
;
|
||||
|
||||
.program hub75_row
|
||||
|
||||
; side-set pin 0 is LATCH
|
||||
|
||||
@@ -25,43 +25,37 @@ int main() {
|
||||
uint rx_gpio = 15; // choose which GPIO pin is connected to the IR detector
|
||||
|
||||
// configure and enable the state machines
|
||||
//
|
||||
int tx_sm = nec_tx_init (pio, tx_gpio); // uses two state machines, 16 instructions and one IRQ
|
||||
int rx_sm = nec_rx_init (pio, rx_gpio); // uses one state machine and 9 instructions
|
||||
int tx_sm = nec_tx_init(pio, tx_gpio); // uses two state machines, 16 instructions and one IRQ
|
||||
int rx_sm = nec_rx_init(pio, rx_gpio); // uses one state machine and 9 instructions
|
||||
|
||||
if (tx_sm == -1 || rx_sm == -1) {
|
||||
printf ("could not configure PIO\n");
|
||||
printf("could not configure PIO\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
// transmit and receive frames
|
||||
//
|
||||
uint8_t tx_address = 0x00, tx_data = 0x00, rx_address, rx_data;
|
||||
while (true) {
|
||||
|
||||
// create a 32-bit frame and add it to the transmit FIFO
|
||||
//
|
||||
uint32_t tx_frame = nec_encode_frame (tx_address, tx_data);
|
||||
pio_sm_put (pio, tx_sm, tx_frame);
|
||||
printf ("\nsent: %02x, %02x", tx_address, tx_data);
|
||||
uint32_t tx_frame = nec_encode_frame(tx_address, tx_data);
|
||||
pio_sm_put(pio, tx_sm, tx_frame);
|
||||
printf("\nsent: %02x, %02x", tx_address, tx_data);
|
||||
|
||||
// allow time for the frame to be transmitted (optional)
|
||||
//
|
||||
sleep_ms (100);
|
||||
sleep_ms(100);
|
||||
|
||||
// display any frames in the receive FIFO
|
||||
//
|
||||
while (!pio_sm_is_rx_fifo_empty (pio, rx_sm)) {
|
||||
uint32_t rx_frame = pio_sm_get (pio, rx_sm);
|
||||
while (!pio_sm_is_rx_fifo_empty(pio, rx_sm)) {
|
||||
uint32_t rx_frame = pio_sm_get(pio, rx_sm);
|
||||
|
||||
if (nec_decode_frame (rx_frame, &rx_address, &rx_data)) {
|
||||
printf ("\treceived: %02x, %02x", rx_address, rx_data);
|
||||
if (nec_decode_frame(rx_frame, &rx_address, &rx_data)) {
|
||||
printf("\treceived: %02x, %02x", rx_address, rx_data);
|
||||
} else {
|
||||
printf ("\treceived: %08x", rx_frame);
|
||||
printf("\treceived: %08x", rx_frame);
|
||||
}
|
||||
}
|
||||
|
||||
sleep_ms (900);
|
||||
sleep_ms(900);
|
||||
tx_data += 1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,56 +4,40 @@
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
|
||||
// SDK types and declarations
|
||||
//
|
||||
#include "pico/stdlib.h"
|
||||
#include "hardware/pio.h"
|
||||
#include "hardware/clocks.h" // for clock_get_hz()
|
||||
|
||||
|
||||
// declare the public API functions
|
||||
//
|
||||
#include "nec_receive.h"
|
||||
|
||||
|
||||
// import the assembled PIO state machine program
|
||||
//
|
||||
#include "nec_receive.pio.h"
|
||||
|
||||
|
||||
// define the public API functions
|
||||
//
|
||||
|
||||
// Claim an unused state machine on the specified PIO and configure it
|
||||
// to receive NEC IR frames on the given GPIO pin.
|
||||
//
|
||||
// Returns: the state machine number on success, otherwise -1
|
||||
//
|
||||
int nec_rx_init(PIO pio, uint pin_num) {
|
||||
|
||||
// disable pull-up and pull-down on gpio pin
|
||||
//
|
||||
gpio_disable_pulls (pin_num);
|
||||
gpio_disable_pulls(pin_num);
|
||||
|
||||
// install the program in the PIO shared instruction space
|
||||
//
|
||||
uint offset;
|
||||
if (pio_can_add_program (pio, &nec_receive_program)) {
|
||||
offset = pio_add_program (pio, &nec_receive_program);
|
||||
if (pio_can_add_program(pio, &nec_receive_program)) {
|
||||
offset = pio_add_program(pio, &nec_receive_program);
|
||||
} else {
|
||||
return -1; // the program could not be added
|
||||
}
|
||||
|
||||
// claim an unused state machine on this PIO
|
||||
//
|
||||
int sm = pio_claim_unused_sm (pio, true);
|
||||
int sm = pio_claim_unused_sm(pio, true);
|
||||
if (sm == -1) {
|
||||
return -1; // we were unable to claim a state machine
|
||||
}
|
||||
|
||||
// configure and enable the state machine
|
||||
//
|
||||
nec_receive_program_init(pio, sm, offset, pin_num);
|
||||
|
||||
return sm;
|
||||
@@ -64,8 +48,7 @@ int nec_rx_init(PIO pio, uint pin_num) {
|
||||
// provided.
|
||||
//
|
||||
// Returns: `true` if the frame was valid, otherwise `false`
|
||||
//
|
||||
bool nec_decode_frame (uint32_t frame, uint8_t *p_address, uint8_t *p_data) {
|
||||
bool nec_decode_frame(uint32_t frame, uint8_t *p_address, uint8_t *p_data) {
|
||||
|
||||
// access the frame data as four 8-bit fields
|
||||
//
|
||||
@@ -83,14 +66,12 @@ bool nec_decode_frame (uint32_t frame, uint8_t *p_address, uint8_t *p_data) {
|
||||
|
||||
// a valid (non-extended) 'NEC' frame should contain 8 bit
|
||||
// address, inverted address, data and inverted data
|
||||
//
|
||||
if (f.address != (f.inverted_address ^ 0xff) ||
|
||||
f.data != (f.inverted_data ^ 0xff)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// store the validated address and data
|
||||
//
|
||||
*p_address = f.address;
|
||||
*p_data = f.data;
|
||||
|
||||
|
||||
@@ -1,7 +1,13 @@
|
||||
/**
|
||||
* Copyright (c) 2021 mjcross
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include "pico/stdlib.h"
|
||||
#include "hardware/pio.h"
|
||||
|
||||
// public API
|
||||
//
|
||||
int nec_rx_init (PIO pio, uint pin);
|
||||
bool nec_decode_frame (uint32_t sm, uint8_t *p_address, uint8_t *p_data);
|
||||
|
||||
int nec_rx_init(PIO pio, uint pin);
|
||||
bool nec_decode_frame(uint32_t sm, uint8_t *p_address, uint8_t *p_data);
|
||||
|
||||
@@ -10,48 +10,34 @@
|
||||
#include "pico/stdlib.h"
|
||||
#include "hardware/pio.h"
|
||||
#include "hardware/clocks.h" // for clock_get_hz()
|
||||
|
||||
|
||||
// declare the public API functions
|
||||
//
|
||||
#include "nec_transmit.h"
|
||||
|
||||
|
||||
// import the assembled PIO state machine programs
|
||||
//
|
||||
#include "nec_carrier_burst.pio.h"
|
||||
#include "nec_carrier_control.pio.h"
|
||||
|
||||
|
||||
// define the public API functions
|
||||
//
|
||||
|
||||
// Claim an unused state machine on the specified PIO and configure it
|
||||
// to transmit NEC IR frames on the specificied GPIO pin.
|
||||
//
|
||||
// Returns: on success, the number of the carrier_control state machine
|
||||
// otherwise -1
|
||||
//
|
||||
int nec_tx_init(PIO pio, uint pin_num) {
|
||||
|
||||
// install the carrier_burst program in the PIO shared instruction space
|
||||
//
|
||||
uint carrier_burst_offset;
|
||||
if (pio_can_add_program (pio, &nec_carrier_burst_program)) {
|
||||
if (pio_can_add_program(pio, &nec_carrier_burst_program)) {
|
||||
carrier_burst_offset = pio_add_program(pio, &nec_carrier_burst_program);
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
|
||||
// claim an unused state machine on this PIO
|
||||
//
|
||||
int carrier_burst_sm = pio_claim_unused_sm(pio, true);
|
||||
if (carrier_burst_sm == -1) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
// configure and enable the state machine
|
||||
//
|
||||
nec_carrier_burst_program_init(pio,
|
||||
carrier_burst_sm,
|
||||
carrier_burst_offset,
|
||||
@@ -59,27 +45,24 @@ int nec_tx_init(PIO pio, uint pin_num) {
|
||||
38.222e3); // 38.222 kHz carrier
|
||||
|
||||
// install the carrier_control program in the PIO shared instruction space
|
||||
//
|
||||
uint carrier_control_offset;
|
||||
if (pio_can_add_program (pio, &nec_carrier_control_program)) {
|
||||
if (pio_can_add_program(pio, &nec_carrier_control_program)) {
|
||||
carrier_control_offset = pio_add_program(pio, &nec_carrier_control_program);
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
|
||||
// claim an unused state machine on this PIO
|
||||
//
|
||||
int carrier_control_sm = pio_claim_unused_sm(pio, true);
|
||||
if (carrier_control_sm == -1) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
// configure and enable the state machine
|
||||
//
|
||||
nec_carrier_control_program_init(pio,
|
||||
carrier_control_sm,
|
||||
carrier_control_offset,
|
||||
2 * (1 / 562.5e-6), // 2 ticks per 562.5us carrier burst
|
||||
2 * (1 / 562.5e-6f), // 2 ticks per 562.5us carrier burst
|
||||
32); // 32 bits per frame
|
||||
|
||||
return carrier_control_sm;
|
||||
@@ -89,9 +72,7 @@ int nec_tx_init(PIO pio, uint pin_num) {
|
||||
// Create a frame in `NEC` format from the provided 8-bit address and data
|
||||
//
|
||||
// Returns: a 32-bit encoded frame
|
||||
//
|
||||
uint32_t nec_encode_frame (uint8_t address, uint8_t data) {
|
||||
uint32_t nec_encode_frame(uint8_t address, uint8_t data) {
|
||||
// a normal 32-bit frame is encoded as address, inverted address, data, inverse data,
|
||||
//
|
||||
return address | (address ^ 0xff) << 8 | data << 16 | (data ^ 0xff) << 24;
|
||||
}
|
||||
|
||||
@@ -1,7 +1,13 @@
|
||||
/**
|
||||
* Copyright (c) 2021 mjcross
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include "pico/stdlib.h"
|
||||
#include "hardware/pio.h"
|
||||
|
||||
// public API
|
||||
//
|
||||
|
||||
int nec_tx_init(PIO pio, uint pin);
|
||||
uint32_t nec_encode_frame (uint8_t address, uint8_t data);
|
||||
uint32_t nec_encode_frame(uint8_t address, uint8_t data);
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
/**
|
||||
* Copyright (c) 2021 pmarques-dev @ github
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include "pico/stdlib.h"
|
||||
#include "hardware/pio.h"
|
||||
@@ -13,7 +19,7 @@
|
||||
// updated. At any point, the main code can query the current count by using
|
||||
// the quadrature_encoder_*_count functions. The counter is kept in a full
|
||||
// 32 bit register that just wraps around. Two's complement arithmetic means
|
||||
// that it can be interpreted as a 32 bit signed or unsigned value and it will
|
||||
// that it can be interpreted as a 32-bit signed or unsigned value, and it will
|
||||
// work anyway.
|
||||
//
|
||||
// As an example, a two wheel robot being controlled at 100Hz, can use two
|
||||
@@ -26,34 +32,30 @@
|
||||
// encoder count updated and because of that it supports very high step rates.
|
||||
//
|
||||
|
||||
int main() {
|
||||
int new_value, delta, old_value = 0;
|
||||
|
||||
int main()
|
||||
{
|
||||
int new_value, delta, old_value = 0;
|
||||
// Base pin to connect the A phase of the encoder.
|
||||
// The B phase must be connected to the next pin
|
||||
const uint PIN_AB = 10;
|
||||
|
||||
// Base pin to connect the A phase of the encoder.
|
||||
// The B phase must be connected to the next pin
|
||||
const uint PIN_AB = 10;
|
||||
stdio_init_all();
|
||||
|
||||
stdio_init_all();
|
||||
PIO pio = pio0;
|
||||
const uint sm = 0;
|
||||
|
||||
PIO pio = pio0;
|
||||
const uint sm = 0;
|
||||
uint offset = pio_add_program(pio, &quadrature_encoder_program);
|
||||
quadrature_encoder_program_init(pio, sm, offset, PIN_AB, 0);
|
||||
|
||||
uint offset = pio_add_program(pio, &quadrature_encoder_program);
|
||||
quadrature_encoder_program_init(pio, sm, offset, PIN_AB, 0);
|
||||
while (1) {
|
||||
// note: thanks to two's complement arithmetic delta will always
|
||||
// be correct even when new_value wraps around MAXINT / MININT
|
||||
new_value = quadrature_encoder_get_count(pio, sm);
|
||||
delta = new_value - old_value;
|
||||
old_value = new_value;
|
||||
|
||||
while (1) {
|
||||
// note: thanks to two's complement arithmetic delta will always
|
||||
// be correct even when new_value wraps around MAXINT / MININT
|
||||
new_value = quadrature_encoder_get_count(pio, sm);
|
||||
delta = new_value - old_value;
|
||||
old_value = new_value;
|
||||
|
||||
printf("position %8d, delta %6d\n", new_value, delta);
|
||||
sleep_ms(100);
|
||||
}
|
||||
|
||||
return 0;
|
||||
printf("position %8d, delta %6d\n", new_value, delta);
|
||||
sleep_ms(100);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
;
|
||||
; Copyright (c) 2021 pmarques-dev @ github
|
||||
;
|
||||
; SPDX-License-Identifier: BSD-3-Clause
|
||||
;
|
||||
|
||||
.program quadrature_encoder
|
||||
|
||||
@@ -6,7 +11,7 @@
|
||||
.origin 0
|
||||
|
||||
|
||||
; the code works by running a loop that contiously shifts the 2 phase pins into
|
||||
; the code works by running a loop that continuously shifts the 2 phase pins into
|
||||
; ISR and looks at the lower 4 bits to do a computed jump to an instruction that
|
||||
; does the proper "do nothing" | "increment" | "decrement" action for that pin
|
||||
; state change (or no change)
|
||||
|
||||
@@ -14,9 +14,12 @@
|
||||
|
||||
#define IS_RGBW true
|
||||
#define NUM_PIXELS 150
|
||||
#ifndef PICO_DEFAULT_WS2812_PIN
|
||||
#warning "no WS2812 default PIN defined for board, please check if pin 2 is okay"
|
||||
#define PICO_DEFAULT_WS2812_PIN 2
|
||||
|
||||
#ifdef PICO_DEFAULT_WS2812_PIN
|
||||
#define WS2812_PIN PICO_DEFAULT_WS2812_PIN
|
||||
#else
|
||||
// default to pin 2 if the board doesn't have a default WS2812 pin defined
|
||||
#define WS2812_PIN 2
|
||||
#endif
|
||||
|
||||
static inline void put_pixel(uint32_t pixel_grb) {
|
||||
@@ -81,14 +84,14 @@ const struct {
|
||||
int main() {
|
||||
//set_sys_clock_48();
|
||||
stdio_init_all();
|
||||
puts("WS2812 Smoke Test");
|
||||
printf("WS2812 Smoke Test, using pin %d", WS2812_PIN);
|
||||
|
||||
// todo get free sm
|
||||
PIO pio = pio0;
|
||||
int sm = 0;
|
||||
uint offset = pio_add_program(pio, &ws2812_program);
|
||||
|
||||
ws2812_program_init(pio, sm, offset, PICO_DEFAULT_WS2812_PIN, 800000, IS_RGBW);
|
||||
ws2812_program_init(pio, sm, offset, WS2812_PIN, 800000, IS_RGBW);
|
||||
|
||||
int t = 0;
|
||||
while (1) {
|
||||
|
||||
Reference in New Issue
Block a user