From c31a2cd66910b7843d3bd7550335463c118cf8d3 Mon Sep 17 00:00:00 2001 From: Brad Nelson Date: Sat, 16 Dec 2023 00:37:37 -0800 Subject: [PATCH] Adding pico ADC. --- pico-ice/CMakeLists.txt | 1 + pico-ice/builtins.h | 26 +++++++++++++++++++++++++- site/pico-ice.html | 23 +++++++++++++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/pico-ice/CMakeLists.txt b/pico-ice/CMakeLists.txt index e072ce4..7177d1b 100644 --- a/pico-ice/CMakeLists.txt +++ b/pico-ice/CMakeLists.txt @@ -29,6 +29,7 @@ add_executable(${CMAKE_PROJECT_NAME} main.c) target_link_libraries(${CMAKE_PROJECT_NAME} pico_ice_sdk pico_stdio_usb + hardware_adc ) target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../ diff --git a/pico-ice/builtins.h b/pico-ice/builtins.h index 03d38ba..a0145f4 100644 --- a/pico-ice/builtins.h +++ b/pico-ice/builtins.h @@ -27,6 +27,7 @@ # include "ice_led.h" # include "ice_spi.h" # include "ice_sram.h" +# include "hardware/adc.h" #endif // TODO: Implement RESIZE-FILE. @@ -42,6 +43,7 @@ OPTIONAL_LED_SUPPORT \ OPTIONAL_SPI_SUPPORT \ OPTIONAL_SRAM_SUPPORT \ + OPTIONAL_ADC_SUPPORT \ CALLING_OPCODE_LIST \ FLOATING_POINT_LIST @@ -160,7 +162,29 @@ YV(ice, ice_sram_write_blocking, ice_sram_write_blocking(n2, b1, n0); DROPn(3)) #endif -#define VOCABULARY_LIST V(forth) V(internals) V(ice) +#ifdef UEFORTH_SIM +# define OPTIONAL_ADC_SUPPORT +#else +# define OPTIONAL_ADC_SUPPORT \ + YV(pico, adc_init, adc_init()) \ + YV(pico, adc_gpio_init, adc_gpio_init(n0); DROP) \ + YV(pico, adc_select_input, adc_select_input(n0); DROP) \ + YV(pico, adc_get_selected_input, PUSH adc_get_selected_input()) \ + YV(pico, adc_set_round_robin, adc_set_round_robin(n0); DROP) \ + YV(pico, adc_set_temp_sensor_enabled, adc_set_temp_sensor_enabled(n0); DROP) \ + YV(pico, adc_read, PUSH adc_read()) \ + YV(pico, adc_run, adc_run(n0); DROP) \ + YV(pico, adc_set_clkdiv, adc_set_clkdiv(*fp--)) \ + YV(pico, adc_fifo_setup, adc_fifo_setup(n4, n3, n2, n1, n0); DROPn(5)) \ + YV(pico, adc_fifo_is_empty, PUSH adc_fifo_is_empty()) \ + YV(pico, adc_fifo_get_level, PUSH adc_fifo_get_level()) \ + YV(pico, adc_fifo_get, PUSH adc_fifo_get()) \ + YV(pico, adc_fifo_get_blocking, PUSH adc_fifo_get_blocking()) \ + YV(pico, adc_fifo_drain, adc_fifo_drain()) \ + YV(pico, adc_irq_set_enabled, adc_irq_set_enabled(n0)) +#endif + +#define VOCABULARY_LIST V(forth) V(internals) V(pico) V(ice) #define PATH_MAX 256 static char filename[PATH_MAX]; diff --git a/site/pico-ice.html b/site/pico-ice.html index 0cb4787..8f53d10 100644 --- a/site/pico-ice.html +++ b/site/pico-ice.html @@ -139,6 +139,29 @@ REPOSITION-FILE ( n fh -- ior ) FILE-SIZE ( fh -- n ior ) +
pico
+These words are inside the pico vocabulary. +See here +for details on the underlying hardware SDK. +
+adc_init ( -- ) Initialize HW ADC
+adc_gpio_init ( n -- ) Init GPIO for use as ADC
+adc_select_input ( n -- ) Select ADC input
+adc_get_selected_input ( -- n ) Get selected ADC input
+adc_set_round_robin ( mask -- ) Round robin sampler selector
+adc_set_temp_sensor_enabled ( f -- ) Enable/disable onboard tempurature sensor
+adc_read ( -- u ) Perform a single conversion
+adc_run ( f -- ) Enable/disable free-running sample mode
+adc_set_clkdiv ( f: clkdiv -- ) Set ADC clock divisor
+adc_fifo_setup ( en dreq_en dreq_thresh err_in_fifo byte_shift -- ) Setup ADC FIFO
+adc_fifo_is_empty ( -- f ) Check FIFO empty state
+adc_fifo_get_level ( -- n ) Get number ADC FIFO entries
+adc_fifo_get ( -- n ) Get ADC result from FIFO
+adc_fifo_drain ( -- ) Drain FIFO.
+adc_fifo_get_blocking ( -- n ) Wait for ADC to have data
+adc_irq_set_enabled ( f -- ) Enable/disable ADC interrupts
+
+
ice
These words are inside the ice vocabulary. See here