integrated Timer1 library (instead of custom code) ; but for an unknown reason it breaks the 1-wire communication (timer code doesn't work at all, or timings are wrong, or both) ; search algorithm is broken, and probably everything else as well
This commit is contained in:
parent
64b496a549
commit
3e251a82f6
31
LowLevel.h
31
LowLevel.h
@ -27,39 +27,8 @@
|
|||||||
|
|
||||||
#if defined (__AVR_ATtiny85__)
|
#if defined (__AVR_ATtiny85__)
|
||||||
#define CLEARINTERRUPT GIFR |= (1 << INTF0)
|
#define CLEARINTERRUPT GIFR |= (1 << INTF0)
|
||||||
#include "UserTimer.h" //ATtiny-support based on TinyCore1 Arduino-core for ATtiny at http://github.com/Coding-Badly/TinyCore1.git
|
|
||||||
__attribute__((always_inline)) static inline void UserTimer_Init( void )
|
|
||||||
{
|
|
||||||
UserTimer_SetToPowerup();
|
|
||||||
UserTimer_SetWaveformGenerationMode(UserTimer_(CTC_OCR));
|
|
||||||
}
|
|
||||||
__attribute__((always_inline)) static inline void UserTimer_Run(short skipTicks)
|
|
||||||
{
|
|
||||||
UserTimer_SetCount(0);
|
|
||||||
UserTimer_SetOutputCompareMatchAndClear(skipTicks);
|
|
||||||
UserTimer_ClockSelect(UserTimer_(Prescale_Value_64));
|
|
||||||
}
|
|
||||||
#define UserTimer_Stop() UserTimer_ClockSelect(UserTimer_(Stopped))
|
|
||||||
|
|
||||||
#elif defined (__AVR_ATmega328P__)
|
#elif defined (__AVR_ATmega328P__)
|
||||||
#define CLEARINTERRUPT EIFR |= (1 << INTF0)
|
#define CLEARINTERRUPT EIFR |= (1 << INTF0)
|
||||||
#define USERTIMER_COMPA_vect TIMER1_COMPA_vect
|
|
||||||
|
|
||||||
__attribute__((always_inline)) static inline void UserTimer_Init( void )
|
|
||||||
{
|
|
||||||
TCCR1A = 0;
|
|
||||||
TCCR1B = 0;
|
|
||||||
// enable timer compare interrupt
|
|
||||||
TIMSK1 |= (1 << OCIE1A);
|
|
||||||
}
|
|
||||||
__attribute__((always_inline)) static inline void UserTimer_Run(short skipTicks)
|
|
||||||
{
|
|
||||||
TCNT1 = 0;
|
|
||||||
OCR1A = skipTicks;
|
|
||||||
// turn on CTC mode with 64 prescaler
|
|
||||||
TCCR1B = (1 << WGM12) | (1 << CS11) | (1 << CS10);
|
|
||||||
}
|
|
||||||
#define UserTimer_Stop() TCCR1B = 0
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#elif defined(__MK20DX128__) || defined(__MK20DX256__)
|
#elif defined(__MK20DX128__) || defined(__MK20DX256__)
|
||||||
|
@ -96,10 +96,15 @@ exit /B 1
|
|||||||
<ClCompile Include="OneWireSlave.cpp">
|
<ClCompile Include="OneWireSlave.cpp">
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="TimerOne.cpp">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ClInclude Include="config\known_16bit_timers.h" />
|
||||||
<ClInclude Include="LowLevel.h" />
|
<ClInclude Include="LowLevel.h" />
|
||||||
<ClInclude Include="OneWireSlave.h" />
|
<ClInclude Include="OneWireSlave.h" />
|
||||||
|
<ClInclude Include="TimerOne.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
<ImportGroup Label="ExtensionTargets">
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
@ -2,10 +2,13 @@
|
|||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="OneWireSlave.cpp" />
|
<ClCompile Include="OneWireSlave.cpp" />
|
||||||
|
<ClCompile Include="TimerOne.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="LowLevel.h" />
|
<ClInclude Include="LowLevel.h" />
|
||||||
<ClInclude Include="OneWireSlave.h" />
|
<ClInclude Include="OneWireSlave.h" />
|
||||||
|
<ClInclude Include="TimerOne.h" />
|
||||||
|
<ClInclude Include="config\known_16bit_timers.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<CustomBuild Include="OneWireIO.ino" />
|
<CustomBuild Include="OneWireIO.ino" />
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
#include "OneWireSlave.h"
|
#include "OneWireSlave.h"
|
||||||
|
#include "TimerOne.h"
|
||||||
|
|
||||||
// uncomment this line to enable sending messages along with errors (but takes more program memory)
|
// uncomment this line to enable sending messages along with errors (but takes more program memory)
|
||||||
//#define ERROR_MESSAGES
|
//#define ERROR_MESSAGES
|
||||||
@ -68,9 +69,9 @@ void(*OneWireSlave::singleBitSentCallback_)(bool error);
|
|||||||
void(*OneWireSlave::logCallback_)(const char* message);
|
void(*OneWireSlave::logCallback_)(const char* message);
|
||||||
|
|
||||||
|
|
||||||
ISR(USERTIMER_COMPA_vect) // timer1 interrupt
|
void timer1Interrupt()
|
||||||
{
|
{
|
||||||
UserTimer_Stop(); // disable clock
|
Timer1.detachInterrupt();
|
||||||
void(*event)() = timerEvent;
|
void(*event)() = timerEvent;
|
||||||
timerEvent = 0;
|
timerEvent = 0;
|
||||||
event();
|
event();
|
||||||
@ -98,7 +99,8 @@ void OneWireSlave::begin(const byte* rom, byte pinNumber)
|
|||||||
pin_.writeLow(); // make sure the internal pull-up resistor is disabled
|
pin_.writeLow(); // make sure the internal pull-up resistor is disabled
|
||||||
|
|
||||||
// prepare hardware timer
|
// prepare hardware timer
|
||||||
UserTimer_Init();
|
Timer1.initialize(4);
|
||||||
|
Timer1.stop();
|
||||||
|
|
||||||
// start 1-wire activity
|
// start 1-wire activity
|
||||||
beginWaitReset_();
|
beginWaitReset_();
|
||||||
@ -234,16 +236,19 @@ byte OneWireSlave::crc8(const byte* data, short numBytes)
|
|||||||
void OneWireSlave::setTimerEvent_(short delayMicroSeconds, void(*handler)())
|
void OneWireSlave::setTimerEvent_(short delayMicroSeconds, void(*handler)())
|
||||||
{
|
{
|
||||||
delayMicroSeconds -= 10; // remove overhead (tuned on Arduino Uno)
|
delayMicroSeconds -= 10; // remove overhead (tuned on Arduino Uno)
|
||||||
|
if (delayMicroSeconds < 1)
|
||||||
|
delayMicroSeconds = 1;
|
||||||
|
|
||||||
short skipTicks = (delayMicroSeconds - 3) / 4; // round the micro seconds delay to a number of ticks to skip (4us per tick, so 4us must skip 0 tick, 8us must skip 1 tick, etc.)
|
|
||||||
if (skipTicks < 1) skipTicks = 1;
|
|
||||||
timerEvent = handler;
|
timerEvent = handler;
|
||||||
UserTimer_Run(skipTicks);
|
Timer1.attachInterrupt(timer1Interrupt);
|
||||||
|
Timer1.setPeriod(delayMicroSeconds);
|
||||||
|
Timer1.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
void OneWireSlave::disableTimer_()
|
void OneWireSlave::disableTimer_()
|
||||||
{
|
{
|
||||||
UserTimer_Stop();
|
Timer1.stop();
|
||||||
|
Timer1.detachInterrupt();
|
||||||
}
|
}
|
||||||
|
|
||||||
void OneWireSlave::onEnterInterrupt_()
|
void OneWireSlave::onEnterInterrupt_()
|
||||||
|
Loading…
Reference in New Issue
Block a user