I have been fighting using the Sigma Delta(ΣΔ) for a few weeks now and all of my research so far has not been fruitful. So, My intention this week is to implement a very basic ΣΔ operation that will change the prescaler for the whole range of possibilities 0 – 255.
The hardware watchdog timer triggers after about 6 seconds without a WDT reset. I have decided I want the sigma delta prescaler to step from 0 to 255 every 5 seconds. I will put each step of the prescaler out to the serial port using system calls.
I will put all the code in the user_main.c file so that I, and anyone else that looks at my code can see all that is going on. I extracted a new set of SDK files into a new folder called SigmaDelta. I then created a new Eclipse project file in this new folder. I struggled with creating the project in Eclipse. I finally got it set up the way I wanted. In the past setting up a project in Eclipse has always been easier, but this time it just didn’t work well for me.
I copied my shell scripts(that is batch files for windows users) that I use to automate building and testing from the UProgrammer folder. Next, I removed the references to AT_CUSTOM_UPGRADE in user_main.c and user_config.h. I then performed a sanity check by putting one line of code to send “Hello World” out the serial connection and tried to build. It failed because I forgot a semicolon. I fixed that and got a new message saying code will not fit in irom0_0_seg. I need to update the linker file. I copied the one from the UProgrammer folder. Built again and it compiled. Next I uploaded it to see if it still works. It doesn’t seem to work. The baud rate is set to 115200, but I am getting a little bit of garbled text after boot completes. I decided to try putting a small delay(5 ms) in before printing the “hello World”. This also didn’t work.
I need to implement a timer and looked at the sntp example in the API guide. I set the timer to repeat every 5 seconds. Unfortunately it seems to just hang. I had a similar problem when I moved to this version of the API, I removed the uart_init line and I started getting regular data coming across the serial line. Still garbled, but happening every 5 seconds. So I looked at uart_init from the uart.c. I found and copied the call that actually sets the baud rate. I used this to modify the baud rate for UART0 and I started getting Hello World every 5 seconds. Next step, turn on the Sigma Delta and start incrementing the prescaler.
I created the variables prescaler and duty and set them to 0. Then I went back to my old code and grabbed a copy of the set prescaler code. I put the code in to set the prescaler, increment it, and print out the value every the timer event is called. I compiled, uploaded it and I saw numbers increasing across the serial terminal. Then I waited for it to get to 100. It continued to count. I let it continue all the way up to 255 and then changed the wifi mode to STATION_MODE like the UProgrammer firmware. Next, I modified the code to turn on the output(GPIO4) and change the duty cycle.
Still working. Connected to wifi and tested again. Still working. I explicitly set GPIO4 as an output set to 1 and tried again. Still working I turned on HSPI overlap mode and tried again. It started crashing and rebooting. It looks like somehow the HSPI is conflicting with the SigmaDelta generator.
I commented out the code to set up GPIO4, and the code to connect to the wifi access point and it crashes. I changed the duty back to 0 and it doesn’t crash anymore. Next I checked the Pin assignment worksheet to see what else is connected to GPIO4 and I didn’t find anything interesting.
It looks like I have to do an HSPI overlap deinit immediately after getting data out of the RAM. This could be a problem because I want to be generating Vpp while transferring data into the processor. This could limit my options. If my code is small, I can generate Vpp. If it’s large, I may have to program in blocks.
I do have the capabilities to assemble and test the voltage booster now. I will go back into the UProgrammer Firmware code and deinit the HSPI overlap and see what happens.
I have put this week’s test code on GitHub here. How do you find problem code?