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