Simple HC-SR04 ultrasonic distance sensor setup
parent
eb7914190f
commit
ca31fcc1ed
|
@ -0,0 +1,225 @@
|
|||
#include "KS0066.h"
|
||||
|
||||
#include <util/delay.h>
|
||||
|
||||
KS0066::KS0066()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
KS0066::KS0066(ShiftRegister &shiftRegister)
|
||||
{
|
||||
setShiftRegister(shiftRegister);
|
||||
}
|
||||
|
||||
void KS0066::setShiftRegister(ShiftRegister &shiftRegister)
|
||||
{
|
||||
m_shiftRegister = &shiftRegister;
|
||||
|
||||
initDisplay();
|
||||
}
|
||||
|
||||
void KS0066::initDisplay()
|
||||
{
|
||||
_delay_ms(30);
|
||||
|
||||
execute((1 << m_db5) | 1 << m_db4);
|
||||
_delay_ms(5);
|
||||
execute((1 << m_db5) | 1 << m_db4);
|
||||
_delay_us(100);
|
||||
execute((1 << m_db5) | 1 << m_db4);
|
||||
execute((1 << m_db5));
|
||||
|
||||
functionSet(false, true, true);
|
||||
|
||||
onOffControl(true, false, false);
|
||||
displayClear();
|
||||
|
||||
entryMode(true, false);
|
||||
}
|
||||
|
||||
void KS0066::functionSet(bool interface8bit, bool twoLine, bool displayFont)
|
||||
{
|
||||
uint8_t command = 0b00100000;
|
||||
|
||||
if (interface8bit)
|
||||
{
|
||||
command |= (1 << 4);
|
||||
}
|
||||
|
||||
if (twoLine)
|
||||
{
|
||||
command |= (1 << 3);
|
||||
}
|
||||
|
||||
if (displayFont)
|
||||
{
|
||||
command |= (1 << 2);
|
||||
}
|
||||
|
||||
sendCommand(command);
|
||||
|
||||
_delay_us(53);
|
||||
}
|
||||
|
||||
void KS0066::onOffControl(bool displayOn, bool cursorOn, bool blinkingOn)
|
||||
{
|
||||
uint8_t command = 0b00001000;
|
||||
|
||||
if (displayOn)
|
||||
{
|
||||
command |= (1 << 2);
|
||||
}
|
||||
|
||||
if (cursorOn)
|
||||
{
|
||||
command |= (1 << 1);
|
||||
}
|
||||
|
||||
if (blinkingOn)
|
||||
{
|
||||
command |= (1 << 0);
|
||||
}
|
||||
|
||||
sendCommand(command);
|
||||
|
||||
_delay_us(53);
|
||||
}
|
||||
|
||||
void KS0066::displayClear()
|
||||
{
|
||||
uint8_t command = 0b00000001;
|
||||
|
||||
sendCommand(command);
|
||||
|
||||
_delay_ms(2.16);
|
||||
}
|
||||
|
||||
void KS0066::entryMode(bool incrementMode, bool entireShift)
|
||||
{
|
||||
uint8_t command = 0b00000100;
|
||||
|
||||
if (incrementMode)
|
||||
{
|
||||
command |= (1 << 1);
|
||||
}
|
||||
|
||||
if (entireShift)
|
||||
{
|
||||
command |= (1 << 0);
|
||||
}
|
||||
|
||||
sendCommand(command);
|
||||
|
||||
_delay_us(53);
|
||||
}
|
||||
|
||||
void KS0066::setCursorPos(uint8_t line, uint8_t column)
|
||||
{
|
||||
sendCommand(0b10000000 + column + (line * 40));
|
||||
}
|
||||
|
||||
void KS0066::sendCommand(uint8_t data)
|
||||
{
|
||||
sendByte(data, true);
|
||||
}
|
||||
|
||||
void KS0066::sendChar(char c)
|
||||
{
|
||||
sendByte(c, false);
|
||||
|
||||
_delay_us(53);
|
||||
}
|
||||
|
||||
void KS0066::sendString(const char *string)
|
||||
{
|
||||
uint8_t count = 0;
|
||||
while (string != nullptr && *string != 0 && count < (m_lines * m_columns))
|
||||
{
|
||||
if (count % m_columns == 0)
|
||||
{
|
||||
setCursorPos(count / m_columns, 0);
|
||||
}
|
||||
sendChar(*string);
|
||||
string++;
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
void KS0066::sendByte(uint8_t data, bool isCommand)
|
||||
{
|
||||
uint8_t registerValue = 0;
|
||||
|
||||
if (!isCommand)
|
||||
{
|
||||
registerValue |= (1 << m_rs);
|
||||
}
|
||||
|
||||
if (data & (1 << 7))
|
||||
{
|
||||
registerValue |= (1 << m_db7);
|
||||
}
|
||||
|
||||
if (data & (1 << 6))
|
||||
{
|
||||
registerValue |= (1 << m_db6);
|
||||
}
|
||||
|
||||
if (data & (1 << 5))
|
||||
{
|
||||
registerValue |= (1 << m_db5);
|
||||
}
|
||||
|
||||
if (data & (1 << 4))
|
||||
{
|
||||
registerValue |= (1 << m_db4);
|
||||
}
|
||||
|
||||
execute(registerValue);
|
||||
|
||||
registerValue &= (1 << m_rs);
|
||||
|
||||
if (data & (1 << 3))
|
||||
{
|
||||
registerValue |= (1 << m_db7);
|
||||
}
|
||||
|
||||
if (data & (1 << 2))
|
||||
{
|
||||
registerValue |= (1 << m_db6);
|
||||
}
|
||||
|
||||
if (data & (1 << 1))
|
||||
{
|
||||
registerValue |= (1 << m_db5);
|
||||
}
|
||||
|
||||
if (data & (1 << 0))
|
||||
{
|
||||
registerValue |= (1 << m_db4);
|
||||
}
|
||||
|
||||
execute(registerValue);
|
||||
}
|
||||
|
||||
void KS0066::execute(uint8_t registerValue)
|
||||
{
|
||||
registerValue |= (1 << m_e);
|
||||
m_shiftRegister->output(registerValue);
|
||||
_delay_us(2);
|
||||
|
||||
registerValue &= ~(1 << m_e);
|
||||
m_shiftRegister->output(registerValue);
|
||||
}
|
||||
|
||||
void KS0066::set(const char *string)
|
||||
{
|
||||
displayClear();
|
||||
sendString(string);
|
||||
}
|
||||
|
||||
void KS0066::clear()
|
||||
{
|
||||
displayClear();
|
||||
}
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
#pragma once
|
||||
|
||||
#include "environment.h"
|
||||
|
||||
#include <avr/io.h>
|
||||
|
||||
#include "ShiftRegister.h"
|
||||
|
||||
class KS0066
|
||||
{
|
||||
private:
|
||||
ShiftRegister *m_shiftRegister;
|
||||
|
||||
static const uint8_t m_rs = 1;
|
||||
static const uint8_t m_rw = 2;
|
||||
static const uint8_t m_e = 3;
|
||||
static const uint8_t m_db4 = 4;
|
||||
static const uint8_t m_db5 = 5;
|
||||
static const uint8_t m_db6 = 6;
|
||||
static const uint8_t m_db7 = 7;
|
||||
|
||||
uint8_t m_lines = 2;
|
||||
uint8_t m_columns = 16;
|
||||
|
||||
public:
|
||||
KS0066();
|
||||
KS0066(ShiftRegister &shiftRegister);
|
||||
|
||||
void setShiftRegister(ShiftRegister &shiftRegister);
|
||||
|
||||
void clear();
|
||||
|
||||
void set(const char *string);
|
||||
|
||||
|
||||
private:
|
||||
|
||||
void initDisplay();
|
||||
|
||||
void functionSet(bool interface8bit, bool twoLine, bool displayOn);
|
||||
void onOffControl(bool displayOn, bool cursorOn, bool blinkingOn);
|
||||
void entryMode(bool incrementMode, bool entireShift);
|
||||
void displayClear();
|
||||
|
||||
void setCursorPos(uint8_t line, uint8_t column);
|
||||
|
||||
void sendCommand(uint8_t data);
|
||||
|
||||
void sendChar(char c);
|
||||
void sendString(const char *string);
|
||||
|
||||
void sendByte(uint8_t data, bool isCommand);
|
||||
|
||||
void execute(uint8_t registerValue);
|
||||
};
|
|
@ -0,0 +1,43 @@
|
|||
#include "Pin.h"
|
||||
|
||||
#include "environment.h"
|
||||
|
||||
#include <util/delay.h>
|
||||
|
||||
Pin::Pin(volatile uint8_t *port, uint8_t pin)
|
||||
: m_port(port)
|
||||
, m_pin(pin)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void Pin::pulse()
|
||||
{
|
||||
*m_port |= (1 << m_pin);
|
||||
*m_port &= ~(1 << m_pin);
|
||||
}
|
||||
|
||||
void Pin::set(bool value)
|
||||
{
|
||||
if (value == true)
|
||||
{
|
||||
*m_port |= (1 << m_pin);
|
||||
}
|
||||
else
|
||||
{
|
||||
*m_port &= ~(1 << m_pin);
|
||||
}
|
||||
}
|
||||
|
||||
void Pin::toggle()
|
||||
{
|
||||
*m_port ^= (1 << m_pin);
|
||||
}
|
||||
|
||||
void Pin::blink()
|
||||
{
|
||||
*m_port |= (1 << m_pin);
|
||||
_delay_ms(50);
|
||||
*m_port &= ~(1 << m_pin);
|
||||
}
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
#pragma once
|
||||
|
||||
#include <avr/io.h>
|
||||
|
||||
class Pin
|
||||
{
|
||||
private:
|
||||
volatile uint8_t *m_port;
|
||||
uint8_t m_pin;
|
||||
|
||||
public:
|
||||
Pin(volatile uint8_t *port, uint8_t pin);
|
||||
|
||||
void pulse();
|
||||
void set(bool value);
|
||||
void toggle();
|
||||
|
||||
void blink();
|
||||
};
|
|
@ -0,0 +1,23 @@
|
|||
#include "ShiftRegister.h"
|
||||
|
||||
ShiftRegister::ShiftRegister(volatile uint8_t *shiftClockPort, uint8_t shiftClockPin,
|
||||
volatile uint8_t *dataPort, uint8_t dataPin,
|
||||
volatile uint8_t *latchClockPort, uint8_t latchClockPin)
|
||||
: m_shiftClockPin(shiftClockPort, shiftClockPin)
|
||||
, m_dataPin(dataPort, dataPin)
|
||||
, m_latchClockPin(latchClockPort, latchClockPin)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void ShiftRegister::output(int8_t value)
|
||||
{
|
||||
for (int8_t bitIdx = 7; bitIdx >= 0; --bitIdx)
|
||||
{
|
||||
m_dataPin.set(value & (1 << bitIdx));
|
||||
m_shiftClockPin.pulse();
|
||||
}
|
||||
|
||||
m_latchClockPin.pulse();
|
||||
}
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
#pragma once
|
||||
|
||||
#include <avr/io.h>
|
||||
|
||||
#include "Pin.h"
|
||||
|
||||
class ShiftRegister
|
||||
{
|
||||
Pin m_shiftClockPin;
|
||||
Pin m_dataPin;
|
||||
Pin m_latchClockPin;
|
||||
|
||||
public:
|
||||
ShiftRegister(volatile uint8_t *shiftClockPort, uint8_t shiftClockPin,
|
||||
volatile uint8_t *dataPort, uint8_t dataPin,
|
||||
volatile uint8_t *latchClockPort, uint8_t latchClockPin);
|
||||
|
||||
void output(int8_t value);
|
||||
};
|
|
@ -0,0 +1,22 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Atmel Studio Solution File, Format Version 11.00
|
||||
VisualStudioVersion = 14.0.23107.0
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{E66E83B9-2572-4076-B26E-6BE79FF3018A}") = "dist", "dist.cppproj", "{DCE6C7E3-EE26-4D79-826B-08594B9AD897}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|AVR = Debug|AVR
|
||||
Release|AVR = Release|AVR
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{DCE6C7E3-EE26-4D79-826B-08594B9AD897}.Debug|AVR.ActiveCfg = Debug|AVR
|
||||
{DCE6C7E3-EE26-4D79-826B-08594B9AD897}.Debug|AVR.Build.0 = Debug|AVR
|
||||
{DCE6C7E3-EE26-4D79-826B-08594B9AD897}.Release|AVR.ActiveCfg = Release|AVR
|
||||
{DCE6C7E3-EE26-4D79-826B-08594B9AD897}.Release|AVR.Build.0 = Release|AVR
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
|
@ -0,0 +1,86 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Store xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="AtmelPackComponentManagement">
|
||||
<ProjectComponents>
|
||||
<ProjectComponent z:Id="i1" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">
|
||||
<CApiVersion></CApiVersion>
|
||||
<CBundle></CBundle>
|
||||
<CClass>Device</CClass>
|
||||
<CGroup>Startup</CGroup>
|
||||
<CSub></CSub>
|
||||
<CVariant></CVariant>
|
||||
<CVendor>Atmel</CVendor>
|
||||
<CVersion>1.0.0</CVersion>
|
||||
<DefaultRepoPath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs</DefaultRepoPath>
|
||||
<DependentComponents xmlns:d4p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays" />
|
||||
<Description></Description>
|
||||
<Files xmlns:d4p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
|
||||
<d4p1:anyType i:type="FileInfo">
|
||||
<AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.0.91\include</AbsolutePath>
|
||||
<Attribute></Attribute>
|
||||
<Category>include</Category>
|
||||
<Condition>C</Condition>
|
||||
<FileContentHash i:nil="true" />
|
||||
<FileVersion></FileVersion>
|
||||
<Name>include</Name>
|
||||
<SelectString></SelectString>
|
||||
<SourcePath></SourcePath>
|
||||
</d4p1:anyType>
|
||||
<d4p1:anyType i:type="FileInfo">
|
||||
<AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.0.91\include\avr\iom32.h</AbsolutePath>
|
||||
<Attribute></Attribute>
|
||||
<Category>header</Category>
|
||||
<Condition>C</Condition>
|
||||
<FileContentHash>lmy51QeNKtBwSFwznyeJmw==</FileContentHash>
|
||||
<FileVersion></FileVersion>
|
||||
<Name>include/avr/iom32.h</Name>
|
||||
<SelectString></SelectString>
|
||||
<SourcePath></SourcePath>
|
||||
</d4p1:anyType>
|
||||
<d4p1:anyType i:type="FileInfo">
|
||||
<AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.0.91\templates\main.c</AbsolutePath>
|
||||
<Attribute>template</Attribute>
|
||||
<Category>source</Category>
|
||||
<Condition>C Exe</Condition>
|
||||
<FileContentHash>GD1k8YYhulqRs6FD1B2Hog==</FileContentHash>
|
||||
<FileVersion></FileVersion>
|
||||
<Name>templates/main.c</Name>
|
||||
<SelectString>Main file (.c)</SelectString>
|
||||
<SourcePath></SourcePath>
|
||||
</d4p1:anyType>
|
||||
<d4p1:anyType i:type="FileInfo">
|
||||
<AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.0.91\templates\main.cpp</AbsolutePath>
|
||||
<Attribute>template</Attribute>
|
||||
<Category>source</Category>
|
||||
<Condition>C Exe</Condition>
|
||||
<FileContentHash>wKai3ogZ32ogXB2qogNlyQ==</FileContentHash>
|
||||
<FileVersion></FileVersion>
|
||||
<Name>templates/main.cpp</Name>
|
||||
<SelectString>Main file (.cpp)</SelectString>
|
||||
<SourcePath></SourcePath>
|
||||
</d4p1:anyType>
|
||||
<d4p1:anyType i:type="FileInfo">
|
||||
<AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.0.91\gcc\dev\atmega32</AbsolutePath>
|
||||
<Attribute></Attribute>
|
||||
<Category>libraryPrefix</Category>
|
||||
<Condition>GCC</Condition>
|
||||
<FileContentHash i:nil="true" />
|
||||
<FileVersion></FileVersion>
|
||||
<Name>gcc/dev/atmega32</Name>
|
||||
<SelectString></SelectString>
|
||||
<SourcePath></SourcePath>
|
||||
</d4p1:anyType>
|
||||
</Files>
|
||||
<PackName>ATmega_DFP</PackName>
|
||||
<PackPath>C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.0.91/Atmel.ATmega_DFP.pdsc</PackPath>
|
||||
<PackVersion>1.0.91</PackVersion>
|
||||
<PresentInProject>true</PresentInProject>
|
||||
<ReferenceConditionId>ATmega32</ReferenceConditionId>
|
||||
<RteComponents xmlns:d4p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
|
||||
<d4p1:string></d4p1:string>
|
||||
</RteComponents>
|
||||
<Status>Resolved</Status>
|
||||
<VersionMode>Fixed</VersionMode>
|
||||
<IsComponentInAtProject>true</IsComponentInAtProject>
|
||||
</ProjectComponent>
|
||||
</ProjectComponents>
|
||||
</Store>
|
|
@ -0,0 +1,137 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="14.0">
|
||||
<PropertyGroup>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectVersion>7.0</ProjectVersion>
|
||||
<ToolchainName>com.Atmel.AVRGCC8.CPP</ToolchainName>
|
||||
<ProjectGuid>dce6c7e3-ee26-4d79-826b-08594b9ad897</ProjectGuid>
|
||||
<avrdevice>ATmega32</avrdevice>
|
||||
<avrdeviceseries>none</avrdeviceseries>
|
||||
<OutputType>Executable</OutputType>
|
||||
<Language>CPP</Language>
|
||||
<OutputFileName>$(MSBuildProjectName)</OutputFileName>
|
||||
<OutputFileExtension>.elf</OutputFileExtension>
|
||||
<OutputDirectory>$(MSBuildProjectDirectory)\$(Configuration)</OutputDirectory>
|
||||
<AssemblyName>dist</AssemblyName>
|
||||
<Name>dist</Name>
|
||||
<RootNamespace>dist</RootNamespace>
|
||||
<ToolchainFlavour>Native</ToolchainFlavour>
|
||||
<KeepTimersRunning>true</KeepTimersRunning>
|
||||
<OverrideVtor>false</OverrideVtor>
|
||||
<CacheFlash>true</CacheFlash>
|
||||
<ProgFlashFromRam>true</ProgFlashFromRam>
|
||||
<RamSnippetAddress>0x20000000</RamSnippetAddress>
|
||||
<UncachedRange />
|
||||
<preserveEEPROM>true</preserveEEPROM>
|
||||
<OverrideVtorValue>exception_table</OverrideVtorValue>
|
||||
<BootSegment>2</BootSegment>
|
||||
<eraseonlaunchrule>0</eraseonlaunchrule>
|
||||
<avrtool>com.atmel.avrdbg.tool.stk500</avrtool>
|
||||
<avrtoolserialnumber />
|
||||
<avrdeviceexpectedsignature>0x1E9502</avrdeviceexpectedsignature>
|
||||
<com_atmel_avrdbg_tool_stk500>
|
||||
<ToolOptions>
|
||||
<InterfaceProperties>
|
||||
<IspClock>125000</IspClock>
|
||||
</InterfaceProperties>
|
||||
<InterfaceName>ISP</InterfaceName>
|
||||
</ToolOptions>
|
||||
<ToolType>com.atmel.avrdbg.tool.stk500</ToolType>
|
||||
<ToolNumber>
|
||||
</ToolNumber>
|
||||
<ToolName>STK500</ToolName>
|
||||
</com_atmel_avrdbg_tool_stk500>
|
||||
<avrtoolinterface>ISP</avrtoolinterface>
|
||||
<avrtoolinterfaceclock>125000</avrtoolinterfaceclock>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
||||
<ToolchainSettings>
|
||||
<AvrGccCpp>
|
||||
<avrgcc.common.Device>-mmcu=atmega32 -B "%24(PackRepoDir)\atmel\ATmega_DFP\1.0.91\gcc\dev\atmega32"</avrgcc.common.Device>
|
||||
<avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex>
|
||||
<avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss>
|
||||
<avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep>
|
||||
<avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec>
|
||||
<avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures>
|
||||
<avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
|
||||
<avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
|
||||
<avrgcc.compiler.directories.IncludePaths><ListValues><Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.0.91\include</Value></ListValues></avrgcc.compiler.directories.IncludePaths>
|
||||
<avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
|
||||
<avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
|
||||
<avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
|
||||
<avrgcccpp.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcccpp.compiler.general.ChangeDefaultCharTypeUnsigned>
|
||||
<avrgcccpp.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcccpp.compiler.general.ChangeDefaultBitFieldUnsigned>
|
||||
<avrgcccpp.compiler.directories.IncludePaths><ListValues><Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.0.91\include</Value></ListValues></avrgcccpp.compiler.directories.IncludePaths>
|
||||
<avrgcccpp.compiler.optimization.PackStructureMembers>True</avrgcccpp.compiler.optimization.PackStructureMembers>
|
||||
<avrgcccpp.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcccpp.compiler.optimization.AllocateBytesNeededForEnum>
|
||||
<avrgcccpp.compiler.warnings.AllWarnings>True</avrgcccpp.compiler.warnings.AllWarnings>
|
||||
<avrgcccpp.compiler.miscellaneous.OtherFlags>-std=c++11</avrgcccpp.compiler.miscellaneous.OtherFlags>
|
||||
<avrgcccpp.linker.libraries.Libraries><ListValues><Value>libm</Value></ListValues></avrgcccpp.linker.libraries.Libraries>
|
||||
<avrgcc.compiler.symbols.DefSymbols><ListValues><Value>NDEBUG</Value></ListValues></avrgcc.compiler.symbols.DefSymbols>
|
||||
<avrgcc.compiler.optimization.level>Optimize for size (-Os)</avrgcc.compiler.optimization.level>
|
||||
<avrgcccpp.compiler.symbols.DefSymbols><ListValues><Value>NDEBUG</Value></ListValues></avrgcccpp.compiler.symbols.DefSymbols>
|
||||
<avrgcccpp.compiler.optimization.level>Optimize for size (-Os)</avrgcccpp.compiler.optimization.level>
|
||||
</AvrGccCpp>
|
||||
</ToolchainSettings>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||
<ToolchainSettings>
|
||||
<AvrGccCpp>
|
||||
<avrgcc.common.Device>-mmcu=atmega32 -B "%24(PackRepoDir)\atmel\ATmega_DFP\1.0.91\gcc\dev\atmega32"</avrgcc.common.Device>
|
||||
<avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex>
|
||||
<avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss>
|
||||
<avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep>
|
||||
<avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec>
|
||||
<avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures>
|
||||
<avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
|
||||
<avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
|
||||
<avrgcc.compiler.directories.IncludePaths><ListValues><Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.0.91\include</Value></ListValues></avrgcc.compiler.directories.IncludePaths>
|
||||
<avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
|
||||
<avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
|
||||
<avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
|
||||
<avrgcccpp.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcccpp.compiler.general.ChangeDefaultCharTypeUnsigned>
|
||||
<avrgcccpp.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcccpp.compiler.general.ChangeDefaultBitFieldUnsigned>
|
||||
<avrgcccpp.compiler.directories.IncludePaths><ListValues><Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.0.91\include</Value></ListValues></avrgcccpp.compiler.directories.IncludePaths>
|
||||
<avrgcccpp.compiler.optimization.PackStructureMembers>True</avrgcccpp.compiler.optimization.PackStructureMembers>
|
||||
<avrgcccpp.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcccpp.compiler.optimization.AllocateBytesNeededForEnum>
|
||||
<avrgcccpp.compiler.warnings.AllWarnings>True</avrgcccpp.compiler.warnings.AllWarnings>
|
||||
<avrgcccpp.compiler.miscellaneous.OtherFlags>-std=c++11</avrgcccpp.compiler.miscellaneous.OtherFlags>
|
||||
<avrgcccpp.linker.libraries.Libraries><ListValues><Value>libm</Value></ListValues></avrgcccpp.linker.libraries.Libraries>
|
||||
<avrgcc.compiler.symbols.DefSymbols><ListValues><Value>DEBUG</Value></ListValues></avrgcc.compiler.symbols.DefSymbols>
|
||||
<avrgcc.compiler.optimization.level>Optimize (-O1)</avrgcc.compiler.optimization.level>
|
||||
<avrgcc.compiler.optimization.DebugLevel>Default (-g2)</avrgcc.compiler.optimization.DebugLevel>
|
||||
<avrgcccpp.compiler.symbols.DefSymbols><ListValues><Value>DEBUG</Value></ListValues></avrgcccpp.compiler.symbols.DefSymbols>
|
||||
<avrgcccpp.compiler.optimization.level>Optimize (-O1)</avrgcccpp.compiler.optimization.level>
|
||||
<avrgcccpp.compiler.optimization.DebugLevel>Default (-g2)</avrgcccpp.compiler.optimization.DebugLevel>
|
||||
<avrgcccpp.assembler.debugging.DebugLevel>Default (-Wa,-g)</avrgcccpp.assembler.debugging.DebugLevel>
|
||||
</AvrGccCpp>
|
||||
</ToolchainSettings>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="environment.h">
|
||||
<SubType>compile</SubType>
|
||||
</Compile>
|
||||
<Compile Include="KS0066.cpp">
|
||||
<SubType>compile</SubType>
|
||||
</Compile>
|
||||
<Compile Include="KS0066.h">
|
||||
<SubType>compile</SubType>
|
||||
</Compile>
|
||||
<Compile Include="main.cpp">
|
||||
<SubType>compile</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Pin.cpp">
|
||||
<SubType>compile</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Pin.h">
|
||||
<SubType>compile</SubType>
|
||||
</Compile>
|
||||
<Compile Include="ShiftRegister.cpp">
|
||||
<SubType>compile</SubType>
|
||||
</Compile>
|
||||
<Compile Include="ShiftRegister.h">
|
||||
<SubType>compile</SubType>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<Import Project="$(AVRSTUDIO_EXE_PATH)\\Vs\\Compiler.targets" />
|
||||
</Project>
|
|
@ -0,0 +1,3 @@
|
|||
#pragma once
|
||||
|
||||
#define F_CPU 12000000
|
|
@ -0,0 +1,79 @@
|
|||
#include "environment.h"
|
||||
|
||||
#include <avr/io.h>
|
||||
#include <util/delay.h>
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "ShiftRegister.h"
|
||||
#include "KS0066.h"
|
||||
|
||||
int main(void)
|
||||
{
|
||||
DDRC |= (1 << PC4) | (1 << PC3) | (1 << PC2);
|
||||
|
||||
ShiftRegister shiftRegister(&PORTC, PC4, &PORTC, PC2, &PORTC, PC3);
|
||||
KS0066 lcd(shiftRegister);
|
||||
|
||||
lcd.set("Ultra-sonic");
|
||||
|
||||
DDRB |= (1 << PB0); // PB0 trigger output
|
||||
DDRB &= ~(1 << PB1); // PB1 pulse input
|
||||
|
||||
// Timer 1, normal mode
|
||||
TCCR1A = 0;
|
||||
|
||||
// Timer 1, clk/64 prescaler
|
||||
TCCR1B |= (1 << CS10) | (1 << CS11);
|
||||
|
||||
_delay_ms(2000);
|
||||
lcd.clear();
|
||||
|
||||
while (true)
|
||||
{
|
||||
uint8_t errorNum = 0;
|
||||
|
||||
PORTB |= (1 << PB0);
|
||||
_delay_us(15);
|
||||
PORTB &= ~(1 << PB0);
|
||||
_delay_us(20);
|
||||
|
||||
TCNT1 = 0;
|
||||
while ((PINB & (1 << PB1)) == 0 && errorNum == 0)
|
||||
{
|
||||
if (TCNT1 > 60000)
|
||||
{
|
||||
errorNum = 1;
|
||||
lcd.set("Timeout");
|
||||
}
|
||||
}
|
||||
|
||||
if (errorNum == 0)
|
||||
{
|
||||
TCNT1 = 0;
|
||||
|
||||
while ((PINB & (1 << PB1)) != 0 && errorNum == 0)
|
||||
{
|
||||
if (TCNT1 > 60000)
|
||||
{
|
||||
errorNum = 2;
|
||||
lcd.set("No object");
|
||||
}
|
||||
}
|
||||
|
||||
if (errorNum == 0)
|
||||
{
|
||||
uint16_t ticks = TCNT1;
|
||||
|
||||
uint16_t cm = (ticks * 1.835) / 20.0;
|
||||
|
||||
char buffer[16];
|
||||
sprintf(buffer, "%3i cm", cm);
|
||||
lcd.set(buffer);
|
||||
}
|
||||
}
|
||||
|
||||
_delay_ms(200);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue