- Notifications
You must be signed in to change notification settings - Fork27
Add LED Fade Example#105
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Merged
Uh oh!
There was an error while loading.Please reload this page.
Merged
Changes fromall commits
Commits
Show all changes
3 commits Select commitHold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Uh oh!
There was an error while loading.Please reload this page.
Jump to
Jump to file
Failed to load files.
Loading
Uh oh!
There was an error while loading.Please reload this page.
Diff view
Diff view
There are no files selected for viewing
84 changes: 84 additions & 0 deletionsexamples/fade_s2.py
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,84 @@ | ||
| # | ||
| # This file is part of the micropython-esp32-ulp project, | ||
| # https://github.com/micropython/micropython-esp32-ulp | ||
| # | ||
| # SPDX-FileCopyrightText: 2018-2023, the micropython-esp32-ulp authors, see AUTHORS file. | ||
| # SPDX-License-Identifier: MIT | ||
| """ | ||
| Example for: ESP32-S2 | ||
| This example creates a PWM-like dimming effect using self-modifying ULP code. | ||
| The ULP program rewrites the `WAIT` instructions to control on/off LED durations, | ||
| simulating a variable duty cycle. | ||
| Note: | ||
| The `WAIT` instruction uses an immediate operand (fixed value) for delay cycles. However, we can change the lower half of memory | ||
| to modify these values at runtime, simulating variable wait times via registers. | ||
| """ | ||
| from esp32 import ULP | ||
| from machine import mem32 | ||
| from esp32_ulp import src_to_binary | ||
| from time import sleep | ||
| source = """\ | ||
| # Pin with LED: (0 to 21) | ||
| .set led_pin, 4 | ||
| # constants from: | ||
| # https://github.com/espressif/esp-idf/blob/v5.0.2/components/soc/esp32s2/include/soc/reg_base.h | ||
| #define DR_REG_RTCIO_BASE 0x3f408400 | ||
| # constants from: | ||
| # Espressif Technical Reference Manual (TRM) Chapter 5.15 Register 5.63: | ||
| #define RTCIO_TOUCH_PADn_REG (DR_REG_RTCIO_BASE + 0x84 + 4 * led_pin) | ||
| #define RTCIO_TOUCH_PADn_MUX_SEL_M (BIT(19)) | ||
| # constants from: | ||
| # https://github.com/espressif/esp-idf/blob/v5.0.2/components/soc/esp32s2/include/soc/rtc_io_reg.h | ||
| #define RTC_GPIO_OUT_REG (DR_REG_RTCIO_BASE + 0x0) | ||
| #define RTC_GPIO_ENABLE_REG (DR_REG_RTCIO_BASE + 0xc) | ||
| #define RTC_GPIO_ENABLE_S 10 | ||
| #define RTC_GPIO_OUT_DATA_S 10 | ||
| .global entry | ||
| program_init: | ||
| # connect GPIO to ULP (0: GPIO connected to digital GPIO module, 1: GPIO connected to analog RTC module) | ||
| WRITE_RTC_REG(RTCIO_TOUCH_PADn_REG, RTCIO_TOUCH_PADn_MUX_SEL_M, 1, 1); | ||
| # enable GPIO as output, not input (this also enables a pull-down by default) | ||
| WRITE_RTC_REG(RTC_GPIO_ENABLE_REG, RTC_GPIO_ENABLE_S + led_pin, 1, 1) | ||
| set_waits: add r0, r0, 200 # Increase r0 (delay time) | ||
| move r3, wait_off | ||
| st r0, r3, 0 # Overwrite wait_off with new delay value | ||
| move r2, 0xFFFF | ||
| sub r1, r2, r0 # Calculate complementary delay time | ||
| move r3, wait_on | ||
| st r1, r3, 0 # Overwrite wait_on with new value | ||
| WRITE_RTC_REG(RTC_GPIO_OUT_REG, RTC_GPIO_OUT_DATA_S + led_pin, 1, 0) # turn off led (clear GPIO) | ||
| wait_off: wait 0 # Placeholder; value overwritten dynamically | ||
| WRITE_RTC_REG(RTC_GPIO_OUT_REG, RTC_GPIO_OUT_DATA_S + led_pin, 1, 1) # turn on led (set GPIO) | ||
| wait_on: wait 0 # Placeholder; value overwritten dynamically | ||
| jump set_waits # Loop program | ||
| """ | ||
| binary = src_to_binary(source, cpu="esp32s2") # cpu is esp32 or esp32s2 | ||
| load_addr, entry_addr = 0, 0 | ||
| ULP_MEM_BASE = 0x50000000 | ||
| ulp = ULP() | ||
| ulp.load_binary(load_addr, binary) | ||
| ulp.run(entry_addr) | ||
| while True: | ||
| print(hex(mem32[ULP_MEM_BASE + 40])) # show that the WAIT cycles are changing | ||
| sleep(0.5) |
80 changes: 80 additions & 0 deletionsexamples/tsens_s2.py
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,80 @@ | ||
| # | ||
| # This file is part of the micropython-esp32-ulp project, | ||
| # https://github.com/micropython/micropython-esp32-ulp | ||
| # | ||
| # SPDX-FileCopyrightText: 2018-2023, the micropython-esp32-ulp authors, see AUTHORS file. | ||
| # SPDX-License-Identifier: MIT | ||
| """ | ||
| Example for: ESP32-S2 | ||
| Example showing how to use the TSENS instruction from the ULP | ||
| and access temperature data from the main CPU. | ||
| Note that the temperature sensor clock needs to be enabled for the TSENS instruction to complete. | ||
| """ | ||
| from esp32 import ULP | ||
| from machine import mem32 | ||
| from esp32_ulp import src_to_binary | ||
| from time import sleep | ||
| source = """\ | ||
| # constants from: | ||
| # https://github.com/espressif/esp-idf/blob/v5.0.2/components/soc/esp32s2/include/soc/reg_base.h | ||
| #define DR_REG_SENS_BASE 0x3f408800 | ||
| # constants from: | ||
| # https://github.com/espressif/esp-idf/blob/v5.0.2/components/soc/esp32s2/include/soc/sens_reg.h | ||
| #define SENS_SAR_TSENS_CTRL2_REG (DR_REG_SENS_BASE + 0x0054) | ||
| #define SENS_TSENS_CLKGATE_EN_M (BIT(15)) | ||
| .set token, 0xACED | ||
| .text | ||
| magic: .long 0 | ||
| temperature_data: .long 0 | ||
| .global entry | ||
| entry: | ||
| move r3, magic | ||
| ld r0, r3, 0 | ||
| jumpr start, token, eq #check if we have already initialized | ||
| init: | ||
| # Set SENS_TSENS_CLKGATE_EN to enable temperature sensor clock. | ||
| WRITE_RTC_REG(SENS_SAR_TSENS_CTRL2_REG, SENS_TSENS_CLKGATE_EN_M, 1, 1) | ||
| # Store temperature_data memory location in r2 | ||
| move r2, temperature_data | ||
| # store that we're done with initialisation | ||
| move r0, token | ||
| st r0, r3, 0 | ||
| start: | ||
| tsens r0, 1000 # make measurement for 1000 clock cycles | ||
| st r0, r2, 0 # store the temperature in memory to be read by main CPU | ||
| halt # go back to sleep until next wakeup period | ||
| """ | ||
| binary = src_to_binary(source, cpu="esp32s2") # cpu is esp32 or esp32s2 | ||
| load_addr, entry_addr = 0, 8 | ||
| ULP_MEM_BASE = 0x50000000 | ||
| ULP_DATA_MASK = 0xffff # ULP data is only in lower 16 bits | ||
| ulp = ULP() | ||
| ulp.set_wakeup_period(0, 500000) # use timer0, wakeup after 500000usec (0.5s) | ||
| ulp.load_binary(load_addr, binary) | ||
| ulp.run(entry_addr) | ||
| while True: | ||
| magic_token = hex(mem32[ULP_MEM_BASE + load_addr] & ULP_DATA_MASK) | ||
| current_temperature = 0.4386*(mem32[ULP_MEM_BASE + load_addr + 4] & ULP_DATA_MASK)-20.52 | ||
| print(magic_token, current_temperature) | ||
| sleep(0.5) |
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.