Pysense pinout / wake on pin
@dbrgn The issue is that I use the button to switch to "maintenance" mode (where I activate Wi-Fi and don't go back to sleep right away when the button is pressed).
As stated in my message from yesterday, one can actually use pin 6 on the External I/O header (EXT_IO1), which is connected to RC1, which has interrupts contrary to the rest of port C.
The issue is now (I think) just modifying the ISR so that the INTF flag is cleared when the interrupt is triggered.
I have disassembled the .DFU and found a place where I can put the required instruction, patched the .DFU and re-built the DFU suffix, but when I try to upload that to the Pysense it won't work (upload is accepted, but the Pysense never gets out of DFU mode).
I think there's an additional checksum (2 bytes at offset 0x3efe in the .DFU file), but I have to idea how to compute it (i.e. checksum or CRC, over what data, etc.), but so I'm a bit stuck here, as I don't have access to the bootloader code which is probably the one making this check.
in the ISR?
Alternatively, if you can let me know how that checksum is computed (or exactly what tools I used to generate the DFU file) I could update it myself.
One way to get deep sleep wakeup with an external interrupt would be pin P13 on the pysense (wired to the button). The Pysense wakes up if you press it.
I hope this is going to be supported officially soon, and ideally documented with schematics. Pycom doesn't gain anything from not publishing the schematics, except making life harder for developers that have to find out on their own how the hardware they bought works.
OK, so the good news is that I was wrong on one point, there is an exception for RC1 which does allow interrupts, they are just handled via a different set of registers.
I have confirmed that the interrupt actually works. Now the issue is that I don't know what the interrupt service routine does (yet), and how to modify it for my needs. Also don't know what code there is after the
SLEEPinstruction (i.e. if the wake from deep sleep relies on the ISR or the code after the
I have tried the following things:
- enable INTE with GIE still on: the PIC hangs on interrupt (at least the REPL over USB), probably because INTF is not cleared in the ISR?
- disable GIE: the PIC hangs right away (at least the REPL over USB), probably because it's actually needed for something?
Are the sources for the PIC firmware available? It would save tedious disassembly.
Alternatively, would it be possible to get an updated firmware version which clears INTF (bit 1 in INTCON 0x0b) in the ISR, and a quick overview of how wake up is handled (via the ISR or via code after the SLEEP? Does it check for any specific conditions?).
connected to RC3
ah, you are right. Cleary, there is a trace on RC3 on the pytrack as well, not sure where it leads to though..
@this.wiederkehr Seems consistent with what I found on the Pysense, except I have EXT_IO2 (external I/O header pin 7) connected to RC3 (verified, as I get the same value reading through the ESP32 and the PIC).
However, my hopes of using it as a wake-up source just vanished, as port C does not allow interrupts.
So there does not seem to be anything on the external I/O header which could be used for this purpose, and the documentation is quite incorrect.
Quite a shame RA4 is not connected to anything!
I'm just trying to figure this out for the pytrack here is how I think the PIC is connected, tough this is just a draft:
RA0 USB D+ #IOC # IO INPUT ONLY RA1 USB D- #IOC # IO INPUT ONLY RA3 Button / Programming Button #IOC # INPUT ONLY # Pull up enabled by init script RA4 NC #IOC RA5 Accelerometer INT1, 2 or both? #IOC RB4 I2C SDA #IOC RB5 UART RX #IOC RB6 I2C SCL RTC Calibration #IOC RB7 UART TX #IOC RC0 EXT_IO0 EXT PIN5 ??? RC1 EXT_IO1 EXT PIN6 # INT PIN RC2 Battery Volatage Analog in RC3 NC RC4 PWR EN??? RC5 Reset on Pyboard? # Is made an input in the init script RC6 Power to the sensor RC7 Power to the gps - IOC means this pin support interrupts - NC NOT connected
As you can see above I think only 2 pins from the external IO header are connected to the pic (5,6) the remaining pins 7,8,9,10 seem to be only connected to the pyboard.
Looks like for the pytrack the documentation is quite wrong as well!
Interestingly external pin 5 seems connected to RC0 on the pic, which does not support interrupts ...
Looks like the pinout described here https://docs.pycom.io/chapter/datasheets/downloads/pysense-pinout.pdf is quite wrong.
Still haven't found any connections from EXT_IO4/5 to the PIC.
So I decided to test all the pins on the External IO header against all the pins on the PIC...
- Pin 1/GND is connected to VSS as expected
- Pin 4/3V3_Pymodule is connected to VDD. So I guess that confirms that's actually the power source for the PIC and the sensors, rather than to the Pymodule (whose 3V3 pin is actually connected to Pin 3/3V3_Sensor)
- Surprise: Pins 5, 6 and 7 (EXT_IO0, 1 and 2) are actually connected to RC0, 1 and 3 on the PIC!
- Still no luck finding any connection between EXT_IO4 and 5 and the PIC.
Will try using using RC3 as an input and as a wake-up source...
It would be great if we could have an answer to this. It tried finding the contacts directly on the board, but couldn't find any, probably because the contacts on the PIC are so small and I don't have the right tools for this.
I just need something that says EXT_IO4 is connected to RA4 or something similar.
BTW, I'm surprised that EXT_IO4 and 5 are actually connected to the module socket (EXT_IO4 to G11/P4/SD_CMD and EXT_IO5 to P8/G15/SD_DAT) even though that doesn't appear on the published pinout?