diff --git a/60hz_Divider/code/arduino_parse_test/shiftin_try5_wLED/shiftin_try5_wLED.ino b/60hz_Divider/code/arduino_parse_test/shiftin_try5_wLED/shiftin_try5_wLED.ino new file mode 100644 index 0000000..e99a76e --- /dev/null +++ b/60hz_Divider/code/arduino_parse_test/shiftin_try5_wLED/shiftin_try5_wLED.ino @@ -0,0 +1,206 @@ +#define hzclk 7 +#define hzbinary 6 +#define sigLED 11 + + +#include "LedControl.h" +LedControl lc=LedControl(12,11,10,1); +/* we always wait a bit between updates of the display */ +unsigned long delaytime=250; + + +uint8_t hzclkval = 0; +uint8_t hzbinval[30]; +uint8_t clkval = 0; +uint32_t milliscompare = 0; +uint8_t readyet = 0; +uint8_t x = 0; +uint16_t mainsfreq = 0; + +struct { + unsigned int mainstwo : 14; //pesky binary wants a struct of +} bitfieldA; //only exact amt of bits + +int temp = 0; + +void setup() { + // put your setup code here, to run once: + + +pinMode(hzclk, INPUT); +pinMode(hzbinary, INPUT); +pinMode(sigLED, OUTPUT); + +Serial.begin(115200); + + /* + The MAX72XX is in power-saving mode on startup, + we have to do a wakeup call + */ + lc.shutdown(0,false); + /* Set the brightness to a medium values */ + lc.setIntensity(0,8); + /* and clear the display */ + lc.clearDisplay(0); +} + +void loop() { + + + if(digitalRead(hzbinary) == LOW){ + //this handles one clk cycle each + //need to read 20 cycles + clkval = 0; + checkCLKandBIN();checkCLKandBIN();checkCLKandBIN(); + checkCLKandBIN();checkCLKandBIN();checkCLKandBIN(); + checkCLKandBIN();checkCLKandBIN();checkCLKandBIN(); + checkCLKandBIN();checkCLKandBIN();checkCLKandBIN(); + checkCLKandBIN();checkCLKandBIN();checkCLKandBIN(); + checkCLKandBIN(); + checkCLKandBIN(); + checkCLKandBIN(); + checkCLKandBIN(); + checkCLKandBIN(); + checkCLKandBIN(); + checkCLKandBIN(); + //Serial.println(clkval); //outputs 19 or 20 + ConvertArraytoBin(); + mainsfreq = 0; + bitfieldA.mainstwo = 0; + } + delayMicroseconds(100); //must be lower than 1 millisecond, so mic + /*if hzbinary is low + * + * while clk high, do nothing + * clk++ + * sample hzbinary + * while clk low do nothing + */ + /* + * //serial print is very slow, and breaks timing + * the below is not usable + * (DMA anyone? second processor anyone?) + Serial.println("hzbinval 1 - 20:"); + for(x=0;x<21;x++){ + Serial.println(hzbinval[x]); + } + Serial.print("\n\n\n\n"); + */ + + + +//sample on falling edge (middle of bit) +} +void checkCLKandBIN(void){ + /* + * while clk high, do nothing + * clk++ + * sample hzbinary + * while clk low do nothing + */ + //milliscompare = millis(); + while((hzclkval = digitalRead(hzclk)) == HIGH){ + if(readyet == 0){ + hzbinval[clkval] = digitalRead(hzbinary); + clkval++; + readyet = 1; + } + delayMicroseconds(10); + } + while((hzclkval = digitalRead(hzclk)) == LOW){ + delayMicroseconds(1); + readyet = 0; + } + //digitalWrite(sigLED, HIGH); + //delayMicroseconds(1); + //digitalWrite(sigLED, LOW); + + + //would be nice to add a picture to this source code (waveform) + //or oscope picture + //why isn't this possible? + +} + +//https://playground.arduino.cc/Main/LedControl/#Seg7Control +void printNumber(int v) { + int ones; + int tens; + int hundreds; + int thousands; + boolean negative; + + if(v < -9999 || v > 9999) + return; + if(v<0) { + negative=true; + v=v*-1; + } + ones=v%10; + v=v/10; + tens=v%10; + v=v/10; + hundreds=v%10; + v=v/10; + thousands=v; + /*if(negative) { + //print character '-' in the leftmost column + lc.setChar(0,4,'-',false); + } + else { + //print a blank in the sign column + lc.setChar(0,4,' ',false); + }*/ + //Now print the number digit by digit + lc.setDigit(0,3,(byte)thousands,false); + lc.setDigit(0,2,(byte)hundreds,false); + lc.setDigit(0,1,(byte)tens,false); + lc.setDigit(0,0,(byte)ones,false); +} + +void ConvertArraytoBin (void){ + for(x=4;x<21;x++){ + if(hzbinval[x] == 1){ + bitfieldA.mainstwo = bitfieldA.mainstwo | (0b0000000000000000000001 << (x - 3)); + } + } + //Serial.println(bitfieldA.mainstwo,BIN); + + + temp = bitfieldA.mainstwo >> 1; + + //almost, but no cigar. has timing issues. + //ugly hack time + temp = temp & 0b1011111111111; + //results in a clock that is right most of the time. + //but wrong every 20 or so counts + //todo: fix timing of duino by removing digital read for + //direct port reads + if(temp == 5047){ + temp = 5998; //something, something, premature optimization... + } + if(temp == 5048){ + temp = 6000; //LUTs + } + + Serial.println(temp,BIN); + Serial.println(temp,DEC); + Serial.print("\n"); + + lc.clearDisplay(0); + printNumber(temp); + delay(delaytime); + + /*mainsfreq = mainsfreq >> 3; + mainsfreq = mainsfreq & 0b0111111111111; + Serial.println(mainsfreq,DEC); + //111011011101 + //1011101101111 + //111011011101 + //11101101111*/ + + + +} + + diff --git a/60hz_Divider/code/arduino_parse_test/shiftin_try6_wLED/shiftin_try6_wLED.ino b/60hz_Divider/code/arduino_parse_test/shiftin_try6_wLED/shiftin_try6_wLED.ino new file mode 100644 index 0000000..e99a76e --- /dev/null +++ b/60hz_Divider/code/arduino_parse_test/shiftin_try6_wLED/shiftin_try6_wLED.ino @@ -0,0 +1,206 @@ +#define hzclk 7 +#define hzbinary 6 +#define sigLED 11 + + +#include "LedControl.h" +LedControl lc=LedControl(12,11,10,1); +/* we always wait a bit between updates of the display */ +unsigned long delaytime=250; + + +uint8_t hzclkval = 0; +uint8_t hzbinval[30]; +uint8_t clkval = 0; +uint32_t milliscompare = 0; +uint8_t readyet = 0; +uint8_t x = 0; +uint16_t mainsfreq = 0; + +struct { + unsigned int mainstwo : 14; //pesky binary wants a struct of +} bitfieldA; //only exact amt of bits + +int temp = 0; + +void setup() { + // put your setup code here, to run once: + + +pinMode(hzclk, INPUT); +pinMode(hzbinary, INPUT); +pinMode(sigLED, OUTPUT); + +Serial.begin(115200); + + /* + The MAX72XX is in power-saving mode on startup, + we have to do a wakeup call + */ + lc.shutdown(0,false); + /* Set the brightness to a medium values */ + lc.setIntensity(0,8); + /* and clear the display */ + lc.clearDisplay(0); +} + +void loop() { + + + if(digitalRead(hzbinary) == LOW){ + //this handles one clk cycle each + //need to read 20 cycles + clkval = 0; + checkCLKandBIN();checkCLKandBIN();checkCLKandBIN(); + checkCLKandBIN();checkCLKandBIN();checkCLKandBIN(); + checkCLKandBIN();checkCLKandBIN();checkCLKandBIN(); + checkCLKandBIN();checkCLKandBIN();checkCLKandBIN(); + checkCLKandBIN();checkCLKandBIN();checkCLKandBIN(); + checkCLKandBIN(); + checkCLKandBIN(); + checkCLKandBIN(); + checkCLKandBIN(); + checkCLKandBIN(); + checkCLKandBIN(); + checkCLKandBIN(); + //Serial.println(clkval); //outputs 19 or 20 + ConvertArraytoBin(); + mainsfreq = 0; + bitfieldA.mainstwo = 0; + } + delayMicroseconds(100); //must be lower than 1 millisecond, so mic + /*if hzbinary is low + * + * while clk high, do nothing + * clk++ + * sample hzbinary + * while clk low do nothing + */ + /* + * //serial print is very slow, and breaks timing + * the below is not usable + * (DMA anyone? second processor anyone?) + Serial.println("hzbinval 1 - 20:"); + for(x=0;x<21;x++){ + Serial.println(hzbinval[x]); + } + Serial.print("\n\n\n\n"); + */ + + + +//sample on falling edge (middle of bit) +} +void checkCLKandBIN(void){ + /* + * while clk high, do nothing + * clk++ + * sample hzbinary + * while clk low do nothing + */ + //milliscompare = millis(); + while((hzclkval = digitalRead(hzclk)) == HIGH){ + if(readyet == 0){ + hzbinval[clkval] = digitalRead(hzbinary); + clkval++; + readyet = 1; + } + delayMicroseconds(10); + } + while((hzclkval = digitalRead(hzclk)) == LOW){ + delayMicroseconds(1); + readyet = 0; + } + //digitalWrite(sigLED, HIGH); + //delayMicroseconds(1); + //digitalWrite(sigLED, LOW); + + + //would be nice to add a picture to this source code (waveform) + //or oscope picture + //why isn't this possible? + +} + +//https://playground.arduino.cc/Main/LedControl/#Seg7Control +void printNumber(int v) { + int ones; + int tens; + int hundreds; + int thousands; + boolean negative; + + if(v < -9999 || v > 9999) + return; + if(v<0) { + negative=true; + v=v*-1; + } + ones=v%10; + v=v/10; + tens=v%10; + v=v/10; + hundreds=v%10; + v=v/10; + thousands=v; + /*if(negative) { + //print character '-' in the leftmost column + lc.setChar(0,4,'-',false); + } + else { + //print a blank in the sign column + lc.setChar(0,4,' ',false); + }*/ + //Now print the number digit by digit + lc.setDigit(0,3,(byte)thousands,false); + lc.setDigit(0,2,(byte)hundreds,false); + lc.setDigit(0,1,(byte)tens,false); + lc.setDigit(0,0,(byte)ones,false); +} + +void ConvertArraytoBin (void){ + for(x=4;x<21;x++){ + if(hzbinval[x] == 1){ + bitfieldA.mainstwo = bitfieldA.mainstwo | (0b0000000000000000000001 << (x - 3)); + } + } + //Serial.println(bitfieldA.mainstwo,BIN); + + + temp = bitfieldA.mainstwo >> 1; + + //almost, but no cigar. has timing issues. + //ugly hack time + temp = temp & 0b1011111111111; + //results in a clock that is right most of the time. + //but wrong every 20 or so counts + //todo: fix timing of duino by removing digital read for + //direct port reads + if(temp == 5047){ + temp = 5998; //something, something, premature optimization... + } + if(temp == 5048){ + temp = 6000; //LUTs + } + + Serial.println(temp,BIN); + Serial.println(temp,DEC); + Serial.print("\n"); + + lc.clearDisplay(0); + printNumber(temp); + delay(delaytime); + + /*mainsfreq = mainsfreq >> 3; + mainsfreq = mainsfreq & 0b0111111111111; + Serial.println(mainsfreq,DEC); + //111011011101 + //1011101101111 + //111011011101 + //11101101111*/ + + + +} + +