forked from youen/OneWireArduinoSlave
Youen Toupin
10 years ago
6 changed files with 263 additions and 108 deletions
@ -0,0 +1,93 @@
|
||||
#ifndef _LowLevel_h |
||||
#define _LowLevel_h |
||||
|
||||
#include <inttypes.h> |
||||
|
||||
#if ARDUINO >= 100 |
||||
#include "Arduino.h" // for delayMicroseconds, digitalPinToBitMask, etc |
||||
#else |
||||
#include "WProgram.h" // for delayMicroseconds |
||||
#include "pins_arduino.h" // for digitalPinToBitMask, etc |
||||
#endif |
||||
|
||||
#if defined(__AVR__) |
||||
#define PIN_TO_BASEREG(pin) (portInputRegister(digitalPinToPort(pin))) |
||||
#define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin)) |
||||
#define IO_REG_TYPE uint8_t |
||||
#define IO_REG_ASM asm("r30") |
||||
#define DIRECT_READ(base, mask) (((*(base)) & (mask)) ? 1 : 0) |
||||
#define DIRECT_MODE_INPUT(base, mask) ((*((base)+1)) &= ~(mask)) |
||||
#define DIRECT_MODE_OUTPUT(base, mask) ((*((base)+1)) |= (mask)) |
||||
#define DIRECT_WRITE_LOW(base, mask) ((*((base)+2)) &= ~(mask)) |
||||
#define DIRECT_WRITE_HIGH(base, mask) ((*((base)+2)) |= (mask)) |
||||
|
||||
#elif defined(__MK20DX128__) || defined(__MK20DX256__) |
||||
#define PIN_TO_BASEREG(pin) (portOutputRegister(pin)) |
||||
#define PIN_TO_BITMASK(pin) (1) |
||||
#define IO_REG_TYPE uint8_t |
||||
#define IO_REG_ASM |
||||
#define DIRECT_READ(base, mask) (*((base)+512)) |
||||
#define DIRECT_MODE_INPUT(base, mask) (*((base)+640) = 0) |
||||
#define DIRECT_MODE_OUTPUT(base, mask) (*((base)+640) = 1) |
||||
#define DIRECT_WRITE_LOW(base, mask) (*((base)+256) = 1) |
||||
#define DIRECT_WRITE_HIGH(base, mask) (*((base)+128) = 1) |
||||
|
||||
#elif defined(__SAM3X8E__) |
||||
// Arduino 1.5.1 may have a bug in delayMicroseconds() on Arduino Due.
|
||||
// http://arduino.cc/forum/index.php/topic,141030.msg1076268.html#msg1076268
|
||||
// If you have trouble with OneWire on Arduino Due, please check the
|
||||
// status of delayMicroseconds() before reporting a bug in OneWire!
|
||||
#define PIN_TO_BASEREG(pin) (&(digitalPinToPort(pin)->PIO_PER)) |
||||
#define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin)) |
||||
#define IO_REG_TYPE uint32_t |
||||
#define IO_REG_ASM |
||||
#define DIRECT_READ(base, mask) (((*((base)+15)) & (mask)) ? 1 : 0) |
||||
#define DIRECT_MODE_INPUT(base, mask) ((*((base)+5)) = (mask)) |
||||
#define DIRECT_MODE_OUTPUT(base, mask) ((*((base)+4)) = (mask)) |
||||
#define DIRECT_WRITE_LOW(base, mask) ((*((base)+13)) = (mask)) |
||||
#define DIRECT_WRITE_HIGH(base, mask) ((*((base)+12)) = (mask)) |
||||
#ifndef PROGMEM |
||||
#define PROGMEM |
||||
#endif |
||||
#ifndef pgm_read_byte |
||||
#define pgm_read_byte(addr) (*(const uint8_t *)(addr)) |
||||
#endif |
||||
|
||||
#elif defined(__PIC32MX__) |
||||
#define PIN_TO_BASEREG(pin) (portModeRegister(digitalPinToPort(pin))) |
||||
#define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin)) |
||||
#define IO_REG_TYPE uint32_t |
||||
#define IO_REG_ASM |
||||
#define DIRECT_READ(base, mask) (((*(base+4)) & (mask)) ? 1 : 0) //PORTX + 0x10
|
||||
#define DIRECT_MODE_INPUT(base, mask) ((*(base+2)) = (mask)) //TRISXSET + 0x08
|
||||
#define DIRECT_MODE_OUTPUT(base, mask) ((*(base+1)) = (mask)) //TRISXCLR + 0x04
|
||||
#define DIRECT_WRITE_LOW(base, mask) ((*(base+8+1)) = (mask)) //LATXCLR + 0x24
|
||||
#define DIRECT_WRITE_HIGH(base, mask) ((*(base+8+2)) = (mask)) //LATXSET + 0x28
|
||||
|
||||
#else |
||||
#error "Please define I/O register types here" |
||||
#endif |
||||
|
||||
class Pin |
||||
{ |
||||
private: |
||||
IO_REG_TYPE mask; |
||||
volatile IO_REG_TYPE *reg; |
||||
|
||||
public: |
||||
inline Pin(uint8_t pin) |
||||
{ |
||||
mask = PIN_TO_BITMASK(pin); |
||||
reg = PIN_TO_BASEREG(pin); |
||||
} |
||||
|
||||
inline void inputMode() { DIRECT_MODE_INPUT(reg, mask); } |
||||
inline void outputMode() { DIRECT_MODE_OUTPUT(reg, mask); } |
||||
|
||||
inline bool read() { return DIRECT_READ(reg, mask); } |
||||
inline void writeLow() { DIRECT_WRITE_LOW(reg, mask); } |
||||
inline void writeHigh() { DIRECT_WRITE_HIGH(reg, mask); } |
||||
inline void write(bool value) { if (value) writeHigh(); else writeLow(); } |
||||
}; |
||||
|
||||
#endif |
@ -0,0 +1,44 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00 |
||||
# Visual Studio 2013 |
||||
VisualStudioVersion = 12.0.31101.0 |
||||
MinimumVisualStudioVersion = 10.0.40219.1 |
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OneWireIO", "OneWireIO.vcxproj", "{3B500971-1570-460F-81C3-22AC3B7764B9}" |
||||
EndProject |
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SerialMonitor", "SerialMonitor\SerialMonitor\SerialMonitor.csproj", "{97704F53-6CA1-4155-9E8F-AEBFEEC20A8B}" |
||||
EndProject |
||||
Global |
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution |
||||
Debug|Any CPU = Debug|Any CPU |
||||
Debug|Mixed Platforms = Debug|Mixed Platforms |
||||
Debug|Win32 = Debug|Win32 |
||||
Release|Any CPU = Release|Any CPU |
||||
Release|Mixed Platforms = Release|Mixed Platforms |
||||
Release|Win32 = Release|Win32 |
||||
EndGlobalSection |
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution |
||||
{3B500971-1570-460F-81C3-22AC3B7764B9}.Debug|Any CPU.ActiveCfg = Debug|Win32 |
||||
{3B500971-1570-460F-81C3-22AC3B7764B9}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 |
||||
{3B500971-1570-460F-81C3-22AC3B7764B9}.Debug|Mixed Platforms.Build.0 = Debug|Win32 |
||||
{3B500971-1570-460F-81C3-22AC3B7764B9}.Debug|Win32.ActiveCfg = Debug|Win32 |
||||
{3B500971-1570-460F-81C3-22AC3B7764B9}.Debug|Win32.Build.0 = Debug|Win32 |
||||
{3B500971-1570-460F-81C3-22AC3B7764B9}.Release|Any CPU.ActiveCfg = Release|Win32 |
||||
{3B500971-1570-460F-81C3-22AC3B7764B9}.Release|Mixed Platforms.ActiveCfg = Release|Win32 |
||||
{3B500971-1570-460F-81C3-22AC3B7764B9}.Release|Mixed Platforms.Build.0 = Release|Win32 |
||||
{3B500971-1570-460F-81C3-22AC3B7764B9}.Release|Win32.ActiveCfg = Release|Win32 |
||||
{3B500971-1570-460F-81C3-22AC3B7764B9}.Release|Win32.Build.0 = Release|Win32 |
||||
{97704F53-6CA1-4155-9E8F-AEBFEEC20A8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
{97704F53-6CA1-4155-9E8F-AEBFEEC20A8B}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
{97704F53-6CA1-4155-9E8F-AEBFEEC20A8B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU |
||||
{97704F53-6CA1-4155-9E8F-AEBFEEC20A8B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU |
||||
{97704F53-6CA1-4155-9E8F-AEBFEEC20A8B}.Debug|Win32.ActiveCfg = Debug|Any CPU |
||||
{97704F53-6CA1-4155-9E8F-AEBFEEC20A8B}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
{97704F53-6CA1-4155-9E8F-AEBFEEC20A8B}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
{97704F53-6CA1-4155-9E8F-AEBFEEC20A8B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU |
||||
{97704F53-6CA1-4155-9E8F-AEBFEEC20A8B}.Release|Mixed Platforms.Build.0 = Release|Any CPU |
||||
{97704F53-6CA1-4155-9E8F-AEBFEEC20A8B}.Release|Win32.ActiveCfg = Release|Any CPU |
||||
EndGlobalSection |
||||
GlobalSection(SolutionProperties) = preSolution |
||||
HideSolutionNode = FALSE |
||||
EndGlobalSection |
||||
EndGlobal |
@ -0,0 +1,81 @@
|
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
||||
<ItemGroup Label="ProjectConfigurations"> |
||||
<ProjectConfiguration Include="Debug|Win32"> |
||||
<Configuration>Debug</Configuration> |
||||
<Platform>Win32</Platform> |
||||
</ProjectConfiguration> |
||||
<ProjectConfiguration Include="Release|Win32"> |
||||
<Configuration>Release</Configuration> |
||||
<Platform>Win32</Platform> |
||||
</ProjectConfiguration> |
||||
</ItemGroup> |
||||
<PropertyGroup Label="Globals"> |
||||
<ProjectGuid>{3B500971-1570-460F-81C3-22AC3B7764B9}</ProjectGuid> |
||||
<RootNamespace>OneWireIO</RootNamespace> |
||||
</PropertyGroup> |
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> |
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> |
||||
<ConfigurationType>Application</ConfigurationType> |
||||
<UseDebugLibraries>true</UseDebugLibraries> |
||||
<PlatformToolset>v120</PlatformToolset> |
||||
<CharacterSet>MultiByte</CharacterSet> |
||||
</PropertyGroup> |
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> |
||||
<ConfigurationType>Application</ConfigurationType> |
||||
<UseDebugLibraries>false</UseDebugLibraries> |
||||
<PlatformToolset>v120</PlatformToolset> |
||||
<WholeProgramOptimization>true</WholeProgramOptimization> |
||||
<CharacterSet>MultiByte</CharacterSet> |
||||
</PropertyGroup> |
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> |
||||
<ImportGroup Label="ExtensionSettings"> |
||||
</ImportGroup> |
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> |
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> |
||||
</ImportGroup> |
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> |
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> |
||||
</ImportGroup> |
||||
<PropertyGroup Label="UserMacros" /> |
||||
<PropertyGroup /> |
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> |
||||
<ClCompile> |
||||
<WarningLevel>Level3</WarningLevel> |
||||
<Optimization>Disabled</Optimization> |
||||
<SDLCheck>true</SDLCheck> |
||||
<AdditionalIncludeDirectories>D:\Outils\Arduino\hardware\arduino\avr\cores\arduino</AdditionalIncludeDirectories> |
||||
<PreprocessorDefinitions>_MBCS;%(PreprocessorDefinitions);ARDUINO=160;__AVR__</PreprocessorDefinitions> |
||||
</ClCompile> |
||||
<Link> |
||||
<GenerateDebugInformation>true</GenerateDebugInformation> |
||||
</Link> |
||||
</ItemDefinitionGroup> |
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> |
||||
<ClCompile> |
||||
<WarningLevel>Level3</WarningLevel> |
||||
<Optimization>MaxSpeed</Optimization> |
||||
<FunctionLevelLinking>true</FunctionLevelLinking> |
||||
<IntrinsicFunctions>true</IntrinsicFunctions> |
||||
<SDLCheck>true</SDLCheck> |
||||
</ClCompile> |
||||
<Link> |
||||
<GenerateDebugInformation>true</GenerateDebugInformation> |
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding> |
||||
<OptimizeReferences>true</OptimizeReferences> |
||||
</Link> |
||||
</ItemDefinitionGroup> |
||||
<ItemGroup> |
||||
<None Include="OneWireIO.ino" /> |
||||
</ItemGroup> |
||||
<ItemGroup> |
||||
<ClCompile Include="SerialChannel.cpp" /> |
||||
</ItemGroup> |
||||
<ItemGroup> |
||||
<ClInclude Include="LowLevel.h" /> |
||||
<ClInclude Include="SerialChannel.h" /> |
||||
</ItemGroup> |
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> |
||||
<ImportGroup Label="ExtensionTargets"> |
||||
</ImportGroup> |
||||
</Project> |
@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
||||
<ItemGroup> |
||||
<None Include="OneWireIO.ino" /> |
||||
</ItemGroup> |
||||
<ItemGroup> |
||||
<ClCompile Include="SerialChannel.cpp" /> |
||||
</ItemGroup> |
||||
<ItemGroup> |
||||
<ClInclude Include="SerialChannel.h" /> |
||||
<ClInclude Include="LowLevel.h" /> |
||||
</ItemGroup> |
||||
</Project> |
@ -1,102 +0,0 @@
|
||||
#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