forked from youen/OneWireArduinoSlave
Youen Toupin
10 years ago
2 changed files with 105 additions and 72 deletions
@ -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));
|
||||
} |
||||
|
Loading…
Reference in new issue