|
|
- #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*/
-
-
-
- }
-
-
|