Merge branch 'master' of ssh://thor:22/OneWireIO
Conflicts: OneWireIO.ino
This commit is contained in:
commit
e8677549ea
121
OneWireIO.ino
121
OneWireIO.ino
@ -5,25 +5,6 @@
|
|||||||
#define OWPin 2
|
#define OWPin 2
|
||||||
#define InterruptNumber 0 // Must correspond to the OWPin to correctly detect state changes. On Arduino Uno, interrupt 0 is for digital pin 2
|
#define InterruptNumber 0 // Must correspond to the OWPin to correctly detect state changes. On Arduino Uno, interrupt 0 is for digital pin 2
|
||||||
|
|
||||||
// how many samples we want to skip between two samples we keep (can be used to lower the sampling frequency)
|
|
||||||
#define SkipSamples 0
|
|
||||||
byte regularEncodedFrequency;
|
|
||||||
byte burstEncodedFrequency;
|
|
||||||
|
|
||||||
int regularADCSRA;
|
|
||||||
int burstADCSRA;
|
|
||||||
|
|
||||||
const int BufferSize = 128;
|
|
||||||
const int BurstBufferSize = 1024;
|
|
||||||
byte buffer1[BufferSize];
|
|
||||||
byte buffer2[BufferSize];
|
|
||||||
byte burstBuffer[BurstBufferSize];
|
|
||||||
volatile byte* backBuffer = buffer1;
|
|
||||||
volatile short backBufferPos = 0;
|
|
||||||
byte samplesSkipped = SkipSamples;
|
|
||||||
volatile unsigned long backBufferStartTime = micros();
|
|
||||||
|
|
||||||
SerialChannel oscilloscope("oscilloscope");
|
|
||||||
SerialChannel debug("debug");
|
SerialChannel debug("debug");
|
||||||
|
|
||||||
void setup()
|
void setup()
|
||||||
@ -33,116 +14,20 @@ void setup()
|
|||||||
|
|
||||||
digitalWrite(LEDPin, LOW);
|
digitalWrite(LEDPin, LOW);
|
||||||
|
|
||||||
//attachInterrupt(InterruptNumber,onewireInterrupt,CHANGE);
|
attachInterrupt(InterruptNumber,onewireInterrupt,CHANGE);
|
||||||
|
|
||||||
cli();//disable interrupts
|
|
||||||
|
|
||||||
//set up continuous sampling of analog pin 0
|
|
||||||
//clear ADCSRA and ADCSRB registers
|
|
||||||
ADCSRA = 0;
|
|
||||||
ADCSRB = 0;
|
|
||||||
|
|
||||||
ADMUX |= (1 << REFS0); //set reference voltage
|
|
||||||
ADMUX |= (1 << ADLAR); //left align the ADC value- so we can read highest 8 bits from ADCH register only
|
|
||||||
|
|
||||||
byte skipSamples = 0;
|
|
||||||
#if SkipSamples > 0
|
|
||||||
skipSamples = SkipSamples;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int ADPS = (1 << ADPS2) | (0 << ADPS1) | (1 << ADPS0);
|
|
||||||
regularADCSRA = 0;
|
|
||||||
regularADCSRA |= ADPS; //set ADC clock with 32 prescaler- 16mHz/32=500KHz ; 13 cycles for a conversion which means 38000 samples per second
|
|
||||||
regularADCSRA |= (1 << ADATE); //enabble auto trigger
|
|
||||||
regularADCSRA |= (1 << ADIE); //enable interrupts when measurement complete
|
|
||||||
regularADCSRA |= (1 << ADEN); //enable ADC
|
|
||||||
regularADCSRA |= (1 << ADSC); //start ADC measurements
|
|
||||||
|
|
||||||
regularEncodedFrequency = (byte)ADPS;
|
|
||||||
regularEncodedFrequency |= skipSamples << 3;
|
|
||||||
|
|
||||||
ADCSRA = regularADCSRA;
|
|
||||||
|
|
||||||
ADPS = (0 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
|
|
||||||
burstADCSRA = 0;
|
|
||||||
burstADCSRA |= ADPS; //set ADC clock with 32 prescaler- 16mHz/32=500KHz ; 13 cycles for a conversion which means 38000 samples per second
|
|
||||||
burstADCSRA |= (1 << ADATE); //enabble auto trigger
|
|
||||||
burstADCSRA |= (1 << ADIE); //enable interrupts when measurement complete
|
|
||||||
burstADCSRA |= (1 << ADEN); //enable ADC
|
|
||||||
burstADCSRA |= (1 << ADSC); //start ADC measurements
|
|
||||||
|
|
||||||
burstEncodedFrequency = (byte)ADPS;
|
|
||||||
burstEncodedFrequency |= skipSamples << 3;
|
|
||||||
|
|
||||||
sei();//enable interrupts
|
|
||||||
|
|
||||||
Serial.begin(400000);
|
Serial.begin(400000);
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop()
|
void loop()
|
||||||
{
|
{
|
||||||
while(backBufferPos < BufferSize / 2 || (backBuffer == burstBuffer && backBufferPos < BurstBufferSize - 1)) ;
|
|
||||||
cli();//disable interrupts
|
cli();//disable interrupts
|
||||||
byte* currentBuffer = (byte*)backBuffer;
|
|
||||||
short currentBufferSize = backBufferPos;
|
|
||||||
backBuffer = (backBuffer == buffer1 ? buffer2 : buffer1);
|
|
||||||
backBufferPos = 0;
|
|
||||||
if(currentBuffer == burstBuffer)
|
|
||||||
{
|
|
||||||
ADCSRA = regularADCSRA;
|
|
||||||
}
|
|
||||||
sei();//enable interrupts
|
|
||||||
unsigned long currentBufferStartTime = backBufferStartTime;
|
|
||||||
backBufferStartTime = micros();
|
|
||||||
digitalWrite(LEDPin, LOW);
|
|
||||||
|
|
||||||
byte encodedFrequency = currentBuffer == burstBuffer ? burstEncodedFrequency : regularEncodedFrequency;
|
sei();//enable interrupts
|
||||||
|
|
||||||
//Serial.write(currentBuffer, currentBufferSize);
|
|
||||||
oscilloscope.beginWrite(currentBufferSize + 1, currentBufferStartTime);
|
|
||||||
oscilloscope.continueWrite(&encodedFrequency, 1);
|
|
||||||
oscilloscope.continueWrite(currentBuffer, currentBufferSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
ISR(ADC_vect) {//when new ADC value ready
|
|
||||||
byte sample = ADCH; //store 8 bit value from analog pin 0
|
|
||||||
|
|
||||||
#if SkipSamples > 0
|
|
||||||
if(samplesSkipped++ < SkipSamples)
|
|
||||||
return;
|
|
||||||
samplesSkipped = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
backBuffer[backBufferPos++] = sample;
|
|
||||||
if(backBuffer == burstBuffer)
|
|
||||||
{
|
|
||||||
if(backBufferPos >= BurstBufferSize)
|
|
||||||
{
|
|
||||||
backBufferPos = BurstBufferSize - 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(backBufferPos >= BufferSize)
|
|
||||||
{
|
|
||||||
// overflow of back buffer, we loose the current sample
|
|
||||||
digitalWrite(LEDPin, HIGH);
|
|
||||||
backBufferPos = BufferSize - 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// switch to burst mode if the trigger condition is met
|
|
||||||
/*if(backBuffer != burstBuffer && sample < 127)
|
|
||||||
{
|
|
||||||
backBuffer = burstBuffer;
|
|
||||||
ADCSRA = burstADCSRA;
|
|
||||||
backBufferPos = 0;
|
|
||||||
backBufferStartTime = micros();
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void onewireInterrupt(void)
|
void onewireInterrupt(void)
|
||||||
{
|
{
|
||||||
//digitalWrite(LEDPin, digitalRead(OWPin));
|
digitalWrite(LEDPin, digitalRead(OWPin));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
102
Oscilloscope.ino
Normal file
102
Oscilloscope.ino
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
#include "Arduino.h"
|
||||||
|
#include "SerialChannel.h"
|
||||||
|
|
||||||
|
#define LEDPin 13
|
||||||
|
#define OWPin 2
|
||||||
|
#define InterruptNumber 0 // Must correspond to the OWPin to correctly detect state changes. On Arduino Uno, interrupt 0 is for digital pin 2
|
||||||
|
|
||||||
|
// how many samples we want to skip between two samples we keep (can be used to lower the sampling frequency)
|
||||||
|
#define SkipSamples 0
|
||||||
|
byte regularEncodedFrequency;
|
||||||
|
|
||||||
|
const int BufferSize = 512;
|
||||||
|
byte buffer1[BufferSize];
|
||||||
|
byte buffer2[BufferSize];
|
||||||
|
byte* backBuffer = buffer1;
|
||||||
|
volatile short backBufferPos = 0;
|
||||||
|
byte samplesSkipped = SkipSamples;
|
||||||
|
unsigned long backBufferStartTime = micros();
|
||||||
|
|
||||||
|
SerialChannel oscilloscope("oscilloscope");
|
||||||
|
SerialChannel debug("debug");
|
||||||
|
|
||||||
|
void setup()
|
||||||
|
{
|
||||||
|
pinMode(LEDPin, OUTPUT);
|
||||||
|
pinMode(OWPin, INPUT);
|
||||||
|
|
||||||
|
digitalWrite(LEDPin, LOW);
|
||||||
|
|
||||||
|
//attachInterrupt(InterruptNumber,onewireInterrupt,CHANGE);
|
||||||
|
|
||||||
|
cli();//disable interrupts
|
||||||
|
|
||||||
|
//set up continuous sampling of analog pin 0
|
||||||
|
//clear ADCSRA and ADCSRB registers
|
||||||
|
ADCSRA = 0;
|
||||||
|
ADCSRB = 0;
|
||||||
|
|
||||||
|
ADMUX |= (1 << REFS0); //set reference voltage
|
||||||
|
ADMUX |= (1 << ADLAR); //left align the ADC value- so we can read highest 8 bits from ADCH register only
|
||||||
|
|
||||||
|
int ADPS = (1 << ADPS2) | (0 << ADPS1) | (1 << ADPS0);
|
||||||
|
ADCSRA |= ADPS; //set ADC clock with 32 prescaler- 16mHz/32=500KHz ; 13 cycles for a conversion which means 38000 samples per second
|
||||||
|
ADCSRA |= (1 << ADATE); //enabble auto trigger
|
||||||
|
ADCSRA |= (1 << ADIE); //enable interrupts when measurement complete
|
||||||
|
ADCSRA |= (1 << ADEN); //enable ADC
|
||||||
|
ADCSRA |= (1 << ADSC); //start ADC measurements
|
||||||
|
|
||||||
|
regularEncodedFrequency = (byte)ADPS;
|
||||||
|
byte skipSamples = 0;
|
||||||
|
#if SkipSamples > 0
|
||||||
|
skipSamples = SkipSamples;
|
||||||
|
#endif
|
||||||
|
regularEncodedFrequency |= skipSamples << 3;
|
||||||
|
|
||||||
|
sei();//enable interrupts
|
||||||
|
|
||||||
|
Serial.begin(400000);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop()
|
||||||
|
{
|
||||||
|
while(backBufferPos < BufferSize / 2) ;
|
||||||
|
cli();//disable interrupts
|
||||||
|
byte* currentBuffer = backBuffer;
|
||||||
|
short currentBufferSize = backBufferPos;
|
||||||
|
backBuffer = (backBuffer == buffer1 ? buffer2 : buffer1);
|
||||||
|
backBufferPos = 0;
|
||||||
|
sei();//enable interrupts
|
||||||
|
unsigned long currentBufferStartTime = backBufferStartTime;
|
||||||
|
backBufferStartTime = micros();
|
||||||
|
digitalWrite(LEDPin, LOW);
|
||||||
|
|
||||||
|
//Serial.write(currentBuffer, currentBufferSize);
|
||||||
|
oscilloscope.beginWrite(currentBufferSize + 1, currentBufferStartTime);
|
||||||
|
oscilloscope.continueWrite(®ularEncodedFrequency, 1);
|
||||||
|
oscilloscope.continueWrite(currentBuffer, currentBufferSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
ISR(ADC_vect) {//when new ADC value ready
|
||||||
|
byte sample = ADCH; //store 8 bit value from analog pin 0
|
||||||
|
|
||||||
|
#if SkipSamples > 0
|
||||||
|
if(samplesSkipped++ < SkipSamples)
|
||||||
|
return;
|
||||||
|
samplesSkipped = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
backBuffer[backBufferPos++] = sample;
|
||||||
|
if(backBufferPos >= BufferSize)
|
||||||
|
{
|
||||||
|
// overflow of back buffer, we loose the current sample
|
||||||
|
digitalWrite(LEDPin, HIGH);
|
||||||
|
backBufferPos = BufferSize - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void onewireInterrupt(void)
|
||||||
|
{
|
||||||
|
//digitalWrite(LEDPin, digitalRead(OWPin));
|
||||||
|
}
|
||||||
|
|
BIN
traces/search-without-arduino.bewf
Normal file
BIN
traces/search-without-arduino.bewf
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user