Not able to get cog_run to run code
JonM
Posts: 318
So, I'm attempting to create a animated display using a Parallax 96x64 OLED Display Module and a FLiP and what I would like is to be able to update the screen from a function that runs in another cog. The code I have which is written in 'C' using SimpleIDE works fine when not running in a separate cog, but when I try to run this same code using 'cog_run' or 'cogstart' the OLED update does not occur. I've added a simple blink LED code fragment in the mix and the LED on the FLiP blinks as expected even when the function is run in a separate cog butt the OLED update does not occur from 'cog_run' or 'cogstart'.
I've tried to increase the stack size and the OLED code still will not run even with a stack set to 4096.
The code and libs I am using as an example came from the following link:
https://parallax.com/downloads/96-x-64-color-oled-display-propeller-c-code
It all works just fine without trying to run in a separate cog so It just baffles me as to why the code to update the OLED does not update.
Any suggestions would be most appreciated.
This is the code I am trying to run in a separate cog.
NOTE: This was borrowed from the 'oled_shapes_examples.c' example.
I've tried to increase the stack size and the OLED code still will not run even with a stack set to 4096.
The code and libs I am using as an example came from the following link:
https://parallax.com/downloads/96-x-64-color-oled-display-propeller-c-code
It all works just fine without trying to run in a separate cog so It just baffles me as to why the code to update the OLED does not update.
Any suggestions would be most appreciated.
This is the code I am trying to run in a separate cog.
NOTE: This was borrowed from the 'oled_shapes_examples.c' example.
#include "simpletools.h" // Include simple tools #include "oledc.h" // oledc library // Define communication pins withing init function oledc_init(). #define SID 6 // Serial data in. #define SCLK 7 // Clock #define CS 8 // Chip select. #define RS 9 #define RST 10 #define SCRN_ROT 2 // Screen rotation chosse between 0, 1, 2, 3, unsigned int stack[512]; int *cog; void snowBalls(); int main() // Main function { int i = 0; oledc_init(SID,SCLK,CS,RS,RST,SCRN_ROT); //Initiate SPI communication. oledc_clear(0,0,oledc_getWidth(),oledc_getHeight());//Clear entire screen. //cogstart(snowBalls, NULL, stack, sizeof(stack)); cog = cog_run(snowBalls, 128); // Does not run oledc code while(1) { //snowBalls(); // Runs oledc code fine when running normally pause(500); print("Cog0 is running\n"); // This gets displayed when running 'cog_run' or 'cogstart' } oledc_clear(0,0,oledc_getWidth(),oledc_getHeight());//Clear entire screen. } //Draw and fill in in circles. //void snowBalls(void *par) void snowBalls() { #define MAXSBS 6 int aSize = 0; int yUpdate[MAXSBS] = {5, 8, 11, 15, 12, 10}; struct sbVal { int x0; int y0; int r; int sbColor; }; struct sbVal sb_vals[MAXSBS] = { {5, 5, 2, WHITE}, {15, 10, 1, WHITE}, {20, 25, 2, WHITE}, {75, 15, 1, WHITE}, {82, 12, 2, WHITE}, {91, 17, 1, WHITE} }; //print("In Cog1 to pring snowBalls\n"); while(1) { for(int i = 0; i < MAXSBS; i++) { oledc_fillCircle(sb_vals[i].x0, sb_vals[i].y0 , sb_vals[i].r, sb_vals[i].sbColor); } //print("In Cog1 to print snowBalls\n"); high(26); // LED on pause(100); low(26); // LED off //pause(100); pause(500); for(int i = 0; i < MAXSBS; i++) { oledc_fillCircle(sb_vals[i].x0, sb_vals[i].y0 , sb_vals[i].r, SKYBLUE); } for(int i = 0; i < MAXSBS; i++) { if(sb_vals[i].y0 > 75) { sb_vals[i].y0 = 0; }else{ sb_vals[i].y0 += yUpdate[i]; } } } }
Comments
Ah, awesome! I knew I was missing something.
I moved "oledc_init" to the snowBalls function and it works perfectly now.
Thanks a bunch!