Commit beb6ac6c by karudu

Ekraanitäie mõõtmise režiim, sakkide näitamine, peatamise nupp

parent 17d365e7
Showing with 62 additions and 15 deletions
#define PIN_BUTTON_1 5
#define PIN_BUTTON_2 4
#define PIN_BUTTON_3 3
#define PIN_BUTTON_4 2
#define PIN_BUTTON_1 5 // BUTTON_RANGE_DN
#define PIN_BUTTON_2 4 // BUTTON_RANGE_UP
#define PIN_BUTTON_3 3 // BUTTON_FREQ
#define PIN_BUTTON_4 2 // BUTTON_SHUTDOWN
#define PIN_ADC 7 // A7
#define BUTTON_RANGE_DN 0
#define BUTTON_RANGE_UP 1
#define BUTTON_FREQ 2 // Change frequency
#define BUTTON_RUNSTOP 3
#define BUTTON_SHUTDOWN 3
#define PERIOD_10MS 0
#define PERIOD_1MS 1
......@@ -16,22 +16,36 @@
#define PERIOD_100MS 4
#define PERIOD_1S 5
/* Configuration options */
// Cursor values in format xx.x
#define CURSOR_1 "5.0"
#define CURSOR_2 "0.0"
// Uncomment to run in oneshot mode
//#define ONESHOT_MODE
// Period to measure in
#define ONESHOT_PERIOD PERIOD_1MS
// How many points to measure before stopping (Serial Monitor display is 49 points wide)
#define ONESHOT_POINTS 49
// https://www.gammon.com.au/adc
// Globals
/* Globals */
char G_PrintfBuf[32];
char G_CursorBuf[5+1+5+1+1];
char G_MeasureFreq;
char G_TimeCounter;
#define TIME_L_VALUE '0'
#define TIME_H_VALUE "0.5"
#ifdef ONESHOT_MODE
int G_OneshotPoints;
#endif
// ReadButton globals
unsigned long G_LastDebounceTime[4];
int G_ButtonState[4];
int G_PrevButtonState[4];
#define DEBOUNCE_DELAY_MS 25
// Flash data
/* Flash data */
extern const char FLASH_VoltageTable[1024 * 3] PROGMEM;
byte ReadButton(int Button)
......@@ -53,6 +67,21 @@ byte ReadButton(int Button)
return 0;
}
// Restore peripherals to default state and stop the program
void Stop()
{
TCCR1A = 0;
TCCR1B = 0; // Stop the timer
Serial.end();
Serial.begin(9600);
ADCSRA = bit(ADEN);
ADCSRA |= bit(ADPS2) | bit(ADPS1) | bit(ADPS0); // Prescaler 128
ADMUX = bit(REFS0) | PIN_ADC;
ADCSRB = bit(ADTS0);
for(;;) {}
}
// Error occured, light the onboard LED and stop the program
void Error()
{
......@@ -141,9 +170,23 @@ ISR(ADC_vect)
Serial.write('.');
Serial.write(pgm_read_word_near(FLASH_VoltageTable + P + 1));
Serial.write(pgm_read_word_near(FLASH_VoltageTable + P + 2));
if(G_MeasureFreq != PERIOD_100US)
{
Serial.write('\t');
G_TimeCounter--;
if(G_TimeCounter == 0)
{
G_TimeCounter = 10;
Serial.write(TIME_H_VALUE);
}
else Serial.write(TIME_L_VALUE);
}
Serial.write('\r');
Serial.write('\n');
#ifdef ONESHOT_MODE
G_OneshotPoints++;
if(G_OneshotPoints == ONESHOT_POINTS + 1) Stop();
#endif
//Serial.println(micros() - tstart);
}
......@@ -158,15 +201,22 @@ void setup()
pinMode(PIN_BUTTON_4, INPUT_PULLUP);
Serial.begin(2000000);
#ifndef ONESHOT_MODE
SetTimerPeriod(PERIOD_10MS);
G_MeasureFreq = PERIOD_10MS;
#else
SetTimerPeriod(ONESHOT_PERIOD);
G_MeasureFreq = ONESHOT_PERIOD;
G_OneshotPoints = 0;
#endif
InitADC();
for(int i = 0; i < 4; i++) G_LastDebounceTime[i] = 0;
for(int i = 0; i < 4; i++) G_PrevButtonState[i] = HIGH;
sprintf(G_CursorBuf, "%s\t%s\t", CURSOR_1, CURSOR_2); // Precalculate the cursor string
G_TimeCounter = 10;
}
int lstate = LOW;
......@@ -189,15 +239,12 @@ void loop()
if(ReadButton(BUTTON_FREQ) == 1)
{
G_MeasureFreq++;
if(G_MeasureFreq == PERIOD_10US + 1) G_MeasureFreq = PERIOD_10MS;
//if(G_MeasureFreq == PERIOD_1S + 1) G_MeasureFreq = PERIOD_10MS;
if(G_MeasureFreq == PERIOD_100US + 1) G_MeasureFreq = PERIOD_10MS;
SetTimerPeriod(G_MeasureFreq);
}
if(ReadButton(BUTTON_RUNSTOP) == 1)
if(ReadButton(BUTTON_SHUTDOWN) == 1)
{
if(lstate == LOW) lstate = HIGH;
else lstate = LOW;
digitalWrite(LED_BUILTIN, lstate);
Stop();
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment