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