Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fceb81287e | ||
|
|
c3d8d246dc | ||
|
|
1f7cdf9694 | ||
|
|
b2db129ab8 | ||
|
|
b7e4249d2e | ||
|
|
0bbdda5b55 | ||
|
|
acb97f1d46 | ||
|
|
0b26e669af |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -27,7 +27,7 @@
|
|||||||
*.app
|
*.app
|
||||||
*.i*86
|
*.i*86
|
||||||
*.x86_64
|
*.x86_64
|
||||||
*.hex
|
workspace/*.hex
|
||||||
|
|
||||||
# Debug files
|
# Debug files
|
||||||
*.dSYM/
|
*.dSYM/
|
||||||
@@ -36,3 +36,4 @@ workspace/ts100/Debug/*
|
|||||||
workspace/.metadata/*
|
workspace/.metadata/*
|
||||||
|
|
||||||
workspace/ts100/.settings/language.settings.xml
|
workspace/ts100/.settings/language.settings.xml
|
||||||
|
workspace/ts100/.cproject
|
||||||
|
|||||||
2113
Flash Backup.hex
Normal file
2113
Flash Backup.hex
Normal file
File diff suppressed because it is too large
Load Diff
38
README.md
38
README.md
@@ -1,21 +1,45 @@
|
|||||||
# TS100
|
# TS100
|
||||||
This is a complete open source re-write of the software for the ts100 soldering iron sold by minidso
|
This is a complete open source re-write of the software for the ts100 soldering iron.
|
||||||
|
|
||||||
This was started to remove the need for usb for changing system settings.
|
This was started to remove the need for USB for changing system settings.
|
||||||
|
|
||||||
The software has similar functionality to the original firmware.
|
The software has similar functionality to the original firmware.
|
||||||
|
|
||||||
# Features Working
|
## Features Working
|
||||||
* Soldering / Temperature control
|
* Soldering / Temperature control
|
||||||
* Full PID Iron Temp
|
* Full PID Iron Temp
|
||||||
* Adjusting temperature
|
* Adjusting temperature
|
||||||
* Automatic sleep
|
* Automatic sleep
|
||||||
* Motion wake support
|
* Motion wake support
|
||||||
* Basic settings menu
|
* Basic settings menu
|
||||||
|
|
||||||
# Features still to be implimented
|
|
||||||
* Input voltage UVLO measurement
|
* Input voltage UVLO measurement
|
||||||
* Saving settings to flash for persistance
|
* Saving settings to flash for persistence
|
||||||
* Improved GUI
|
* Improved GUI
|
||||||
|
* Use hardware I2C for communications
|
||||||
|
* Can disable movement detection if desired
|
||||||
|
## Features still to be implemented
|
||||||
* Manual Temp Calibration
|
* Manual Temp Calibration
|
||||||
* Use hardware I2C
|
|
||||||
|
# Upgrading your ts100 iron
|
||||||
|
This is completely safe, if it goes wrong just put the .hex file from the official website onto the unit and your back to the old firmware :)
|
||||||
|
|
||||||
|
1. Hold the button closest to the tip, and plug in the USB to the computer.
|
||||||
|
2. The unit will appear as a USB drive.
|
||||||
|
3. Drag the .hex file onto the USB drive.
|
||||||
|
4. The unit will disconnect and reconnect.
|
||||||
|
5. The filename will have changed to end in .RDY or .ERR .
|
||||||
|
6. If it ends with .RDY your done! Otherwise something went wrong.
|
||||||
|
7. If it went wrong try on a windows computer, some Mac / Linux machines do not play well with their boot loader.
|
||||||
|
|
||||||
|
There is also a complete device flash backup included in this repository. (Note this includes the bootloader, so will need a SWD programmer to load onto the unit).
|
||||||
|
|
||||||
|
# New Menu System
|
||||||
|
This new firmware uses a new menu system to allow access to the settings on the device.
|
||||||
|
This menu can be accessed as shown in following flow chart, in the settings numbers roll over from top to bottom.
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
# Version Changes:
|
||||||
|
V1.02
|
||||||
|
- Adds hold both buttons on IDLE to access the therometer mode.
|
||||||
|
- Changes the exit soldering mode to be holding both buttons (Like original firmware).
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
# System Design
|
|
||||||
|
|
||||||
# Movement Detection
|
|
||||||
The unit has a MMA8652FC Accelerometer on the small sub board along with the STM32.
|
|
||||||
This is used for motion detection of the soldering iron.
|
|
||||||
|
|
||||||
# USB Disk
|
|
||||||
When the unit is plugged into the computer, it presents a FAT device to the operating system over the usb connection.
|
|
||||||
This is implemented using a ram buffer for the disk.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Future improvements to be made
|
|
||||||
These features are things I would like to add to the firmware
|
|
||||||
|
|
||||||
* Use the sysTick hardware for timing of events
|
|
||||||
* Move all the settings to an on device menu system instead of usb link
|
|
||||||
* Move error codes into a unified struct
|
|
||||||
* Rewrite most of the OLED stack to not require hardcoded values
|
|
||||||
* Rework the modes of the unit to be neater
|
|
||||||
25
VERSION.txt
25
VERSION.txt
@@ -1,25 +0,0 @@
|
|||||||
v2.11 update (2015/08/03)
|
|
||||||
1, optimizing the key for delay;
|
|
||||||
2, optimized display processing
|
|
||||||
3, optimization of high-temperature alarm;
|
|
||||||
4, to increase the maximum voltage alarm;
|
|
||||||
5, the newly added screen protection, enter standby interface for some time, the screen will shut itself down, or move the iron screen button will automatically light up;
|
|
||||||
6, optimizing the movement decision
|
|
||||||
|
|
||||||
v2.10 update (2015/07/14)
|
|
||||||
1, temperature calibration is not refresh bug;
|
|
||||||
2, Cancel USB-powered thermometer into the function;
|
|
||||||
|
|
||||||
---Original --
|
|
||||||
v2.11 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(20150803)
|
|
||||||
1<EFBFBD><EFBFBD> <09>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
||||||
2<EFBFBD><EFBFBD> <09>Ż<EFBFBD><C5BB><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
|
|
||||||
3<EFBFBD><EFBFBD> <09>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD>±<EFBFBD><C2B1><EFBFBD><EFBFBD><EFBFBD>
|
|
||||||
4<EFBFBD><EFBFBD> <09><><EFBFBD>߱<EFBFBD><DFB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>ѹ<EFBFBD><D1B9>
|
|
||||||
5<EFBFBD><EFBFBD> <09>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD>Լ<EFBFBD><D4BC>رգ<D8B1><D5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
||||||
6<EFBFBD><EFBFBD> <09>Ż<EFBFBD><C5BB>ƶ<EFBFBD><C6B6>ж<EFBFBD>
|
|
||||||
|
|
||||||
v2.10 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(20150714)
|
|
||||||
1<EFBFBD><EFBFBD> <09>¶<EFBFBD>Уʱû<CAB1><C3BB>ˢ<EFBFBD>µ<EFBFBD>bug<75><67>
|
|
||||||
2<EFBFBD><EFBFBD> ȡ<><C8A1>USB<53><42><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>¶ȼƵĹ<C6B5><C4B9>ܣ<EFBFBD>
|
|
||||||
|
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
</extensions>
|
</extensions>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||||
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1236130657" name="Debug" parent="fr.ac6.managedbuild.config.gnu.cross.exe.debug" postannouncebuildStep="Generating binary and Printing size information:" postbuildStep="arm-none-eabi-objcopy -O binary "${BuildArtifactFileBaseName}.elf" "${BuildArtifactFileBaseName}.bin"; arm-none-eabi-size "${BuildArtifactFileName}" ">
|
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="rm -rf" description="" id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1236130657" name="Debug" parent="fr.ac6.managedbuild.config.gnu.cross.exe.debug" postannouncebuildStep="Generating binary and Printing size information:" postbuildStep="arm-none-eabi-objcopy -O binary "${BuildArtifactFileBaseName}.elf" "${BuildArtifactFileBaseName}.bin"; arm-none-eabi-size "${BuildArtifactFileName}" ;arm-none-eabi-objcopy -O ihex "${BuildArtifactFileBaseName}.elf" "${BuildArtifactFileBaseName}.hex"">
|
||||||
<folderInfo id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1236130657." name="/" resourcePath="">
|
<folderInfo id="fr.ac6.managedbuild.config.gnu.cross.exe.debug.1236130657." name="/" resourcePath="">
|
||||||
<toolChain id="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug.2123758208" name="Ac6 STM32 MCU GCC" superClass="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug">
|
<toolChain id="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug.2123758208" name="Ac6 STM32 MCU GCC" superClass="fr.ac6.managedbuild.toolchain.gnu.cross.exe.debug">
|
||||||
<option id="fr.ac6.managedbuild.option.gnu.cross.mcu.1416828544" name="Mcu" superClass="fr.ac6.managedbuild.option.gnu.cross.mcu" value="STM32F103T8Ux" valueType="string"/>
|
<option id="fr.ac6.managedbuild.option.gnu.cross.mcu.1416828544" name="Mcu" superClass="fr.ac6.managedbuild.option.gnu.cross.mcu" value="STM32F103T8Ux" valueType="string"/>
|
||||||
@@ -69,10 +69,10 @@
|
|||||||
<tool id="fr.ac6.managedbuild.tool.gnu.archiver.1926145385" name="MCU GCC Archiver" superClass="fr.ac6.managedbuild.tool.gnu.archiver"/>
|
<tool id="fr.ac6.managedbuild.tool.gnu.archiver.1926145385" name="MCU GCC Archiver" superClass="fr.ac6.managedbuild.tool.gnu.archiver"/>
|
||||||
<tool id="fr.ac6.managedbuild.tool.gnu.cross.assembler.104990963" name="MCU GCC Assembler" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler">
|
<tool id="fr.ac6.managedbuild.tool.gnu.cross.assembler.104990963" name="MCU GCC Assembler" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler">
|
||||||
<option id="gnu.both.asm.option.include.paths.834243276" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
|
<option id="gnu.both.asm.option.include.paths.834243276" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
|
||||||
<listOptionValue builtIn="false" value="/home/ralim/Repo/ts100/workspace/ts100/inc"/>
|
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/inc}""/>
|
||||||
<listOptionValue builtIn="false" value="/home/ralim/Repo/ts100/workspace/ts100/StdPeriph_Driver/inc"/>
|
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/StdPeriph_Driver/inc}""/>
|
||||||
<listOptionValue builtIn="false" value="/home/ralim/Repo/ts100/workspace/ts100/CMSIS/core"/>
|
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/CMSIS/core}""/>
|
||||||
<listOptionValue builtIn="false" value="/home/ralim/Repo/ts100/workspace/ts100/CMSIS/device"/>
|
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/CMSIS/device}""/>
|
||||||
</option>
|
</option>
|
||||||
<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1754789872" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
|
<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1754789872" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
|
||||||
<inputType id="fr.ac6.managedbuild.tool.gnu.cross.assembler.input.610009869" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler.input"/>
|
<inputType id="fr.ac6.managedbuild.tool.gnu.cross.assembler.input.610009869" superClass="fr.ac6.managedbuild.tool.gnu.cross.assembler.input"/>
|
||||||
@@ -103,7 +103,7 @@
|
|||||||
</extensions>
|
</extensions>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||||
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="rm -rf" description="" id="fr.ac6.managedbuild.config.gnu.cross.exe.release.1113492345" name="Release" parent="fr.ac6.managedbuild.config.gnu.cross.exe.release" postannouncebuildStep="Generating binary and Printing size information:" postbuildStep="arm-none-eabi-objcopy -O binary "${BuildArtifactFileBaseName}.elf" "${BuildArtifactFileBaseName}.bin"; arm-none-eabi-size -B "${BuildArtifactFileName}"">
|
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="rm -rf" description="" id="fr.ac6.managedbuild.config.gnu.cross.exe.release.1113492345" name="Release" parent="fr.ac6.managedbuild.config.gnu.cross.exe.release" postannouncebuildStep="Generating binary and Printing size information:" postbuildStep="arm-none-eabi-objcopy -O binary "${BuildArtifactFileBaseName}.elf" "${BuildArtifactFileBaseName}.bin"; arm-none-eabi-size -B "${BuildArtifactFileName}";arm-none-eabi-objcopy -O ihex "${BuildArtifactFileBaseName}.elf" "${BuildArtifactFileBaseName}.hex"">
|
||||||
<folderInfo id="fr.ac6.managedbuild.config.gnu.cross.exe.release.1113492345." name="/" resourcePath="">
|
<folderInfo id="fr.ac6.managedbuild.config.gnu.cross.exe.release.1113492345." name="/" resourcePath="">
|
||||||
<toolChain id="fr.ac6.managedbuild.toolchain.gnu.cross.exe.release.668479481" name="Ac6 STM32 MCU GCC" superClass="fr.ac6.managedbuild.toolchain.gnu.cross.exe.release">
|
<toolChain id="fr.ac6.managedbuild.toolchain.gnu.cross.exe.release.668479481" name="Ac6 STM32 MCU GCC" superClass="fr.ac6.managedbuild.toolchain.gnu.cross.exe.release">
|
||||||
<option id="fr.ac6.managedbuild.option.gnu.cross.mcu.302274410" name="Mcu" superClass="fr.ac6.managedbuild.option.gnu.cross.mcu" value="STM32F103T8Ux" valueType="string"/>
|
<option id="fr.ac6.managedbuild.option.gnu.cross.mcu.302274410" name="Mcu" superClass="fr.ac6.managedbuild.option.gnu.cross.mcu" value="STM32F103T8Ux" valueType="string"/>
|
||||||
|
|||||||
1
workspace/ts100/.gitignore
vendored
1
workspace/ts100/.gitignore
vendored
@@ -1 +1,2 @@
|
|||||||
/Debug/
|
/Debug/
|
||||||
|
/Release/
|
||||||
|
|||||||
@@ -62,11 +62,11 @@ _Min_Stack_Size = 0x400; /* required amount of stack */
|
|||||||
MEMORY
|
MEMORY
|
||||||
{
|
{
|
||||||
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K
|
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K
|
||||||
ROM (rx) : ORIGIN = 0x08000000, LENGTH = 64K
|
ROM (rx) : ORIGIN = 0x08004000, LENGTH = 47K
|
||||||
|
|
||||||
}
|
}
|
||||||
/*ROM (rx) : ORIGIN = 0x08004000, LENGTH = 48K*/
|
/*ROM (rx) : ORIGIN = 0x08004000, LENGTH = 48K*/
|
||||||
/*^ The rom is shortened as the last ~10K is used for storing the virtual USB Disk, and the offset at the beginning in the bootloader*/
|
/*^ The offset at the beginning in the bootloader, 1K at the end for settings (actually 256 bytes, but leaving room for now)*/
|
||||||
/* Sections */
|
/* Sections */
|
||||||
SECTIONS
|
SECTIONS
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
/********************* (C) COPYRIGHT 2015 e-Design Co.,Ltd. ********************
|
|
||||||
File Name : APP_Version.h
|
|
||||||
Version : S100 APP Ver 2.11
|
|
||||||
Description:
|
|
||||||
Author : bure & Celery
|
|
||||||
Data: 2015/08/03
|
|
||||||
History:
|
|
||||||
2015/08/03 ͳһ<CDB3><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
#ifndef __VERSION_H
|
|
||||||
#define __VERSION_H
|
|
||||||
|
|
||||||
#define M_VER 'V','0'
|
|
||||||
#define S_VER '0','1'
|
|
||||||
#define OEM_TYPE "0"
|
|
||||||
#define APP_BASE 0x0800C000/*Start address of the virtual disk*/
|
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------*/
|
|
||||||
#ifdef TYPE_DS201
|
|
||||||
#define PRODUCT_INFO "DS201"
|
|
||||||
#define SCH_VER "1.7B"
|
|
||||||
#else
|
|
||||||
#ifdef TYPE_DS202
|
|
||||||
#include "DS202V1_6.h"
|
|
||||||
#define FLASH_PAGE 0x0800
|
|
||||||
#else
|
|
||||||
#ifdef TYPE_DS203
|
|
||||||
#define PRODUCT_INFO "DS203"
|
|
||||||
#define SCH_VER "2.70"
|
|
||||||
#else
|
|
||||||
#ifdef TYPE_S100
|
|
||||||
#define PRODUCT_INFO "TS100"
|
|
||||||
#include "S100V0_1.h"
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------*/
|
|
||||||
#define DFU_VER {M_VER,'.',S_VER,LCD_M, 0}
|
|
||||||
#endif /* VERSION_H */
|
|
||||||
/********************************* END OF FILE ******************************/
|
|
||||||
@@ -3,16 +3,18 @@
|
|||||||
*
|
*
|
||||||
* Created on: 20 Sep 2016
|
* Created on: 20 Sep 2016
|
||||||
* Author: ralim
|
* Author: ralim
|
||||||
|
*
|
||||||
|
* Interface to the ADC's basically
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef ANALOG_H_
|
#ifndef ANALOG_H_
|
||||||
#define ANALOG_H_
|
#define ANALOG_H_
|
||||||
#include "stm32f10x.h"
|
#include "stm32f10x.h"
|
||||||
#include "S100V0_1.h"
|
|
||||||
#include "Bios.h"
|
#include "Bios.h"
|
||||||
#include "Interrupt.h"
|
#include "Interrupt.h"
|
||||||
extern volatile uint16_t ADC1ConvertedValue[2];
|
extern volatile uint16_t ADC1ConvertedValue[2];
|
||||||
|
|
||||||
uint16_t Get_ADC1Value(uint8_t i);
|
uint16_t Get_ADC1Value(uint8_t i);
|
||||||
uint16_t readIronTemp(uint16_t calibration,uint8_t read);
|
uint16_t readIronTemp(uint16_t calibration,uint8_t read);//read the iron temp in C X10
|
||||||
|
uint16_t readDCVoltage();/*Get the system voltage X10*/
|
||||||
#endif /* ANALOG_H_ */
|
#endif /* ANALOG_H_ */
|
||||||
|
|||||||
@@ -7,7 +7,14 @@
|
|||||||
#include "stm32f10x.h"
|
#include "stm32f10x.h"
|
||||||
#include "S100V0_1.h"/*For pin definitions*/
|
#include "S100V0_1.h"/*For pin definitions*/
|
||||||
#include "Analog.h"/*So that we can attach the DMA to the output array*/
|
#include "Analog.h"/*So that we can attach the DMA to the output array*/
|
||||||
|
#include "stm32f10x_flash.h"
|
||||||
|
#include "stm32f10x_rcc.h"
|
||||||
|
#include "stm32f10x_dma.h"
|
||||||
|
#include "stm32f10x_adc.h"
|
||||||
|
#include "stm32f10x_tim.h"
|
||||||
|
#include "stm32f10x_exti.h"
|
||||||
|
#include "stm32f10x_iwdg.h"
|
||||||
|
#include "misc.h"
|
||||||
extern volatile uint32_t gHeat_cnt;
|
extern volatile uint32_t gHeat_cnt;
|
||||||
|
|
||||||
inline void setIronTimer(uint32_t time) {
|
inline void setIronTimer(uint32_t time) {
|
||||||
@@ -34,4 +41,4 @@ void Init_EXTI(void);
|
|||||||
void Start_Watchdog(uint32_t ms);
|
void Start_Watchdog(uint32_t ms);
|
||||||
void Clear_Watchdog(void);
|
void Clear_Watchdog(void);
|
||||||
#endif
|
#endif
|
||||||
/********************************* END OF FILE ********************************/
|
|
||||||
|
|||||||
@@ -3,88 +3,98 @@
|
|||||||
*
|
*
|
||||||
* Created on: 17 Sep 2016
|
* Created on: 17 Sep 2016
|
||||||
* Author: Ralim
|
* Author: Ralim
|
||||||
|
*
|
||||||
|
* ... This file contains the font...
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef FONT_H_
|
#ifndef FONT_H_
|
||||||
#define FONT_H_
|
#define FONT_H_
|
||||||
|
|
||||||
const u8 FONT[]={
|
#define FONT_WIDTH 12 /*How many pixels wide the font is*/
|
||||||
0x00,0xF0,0xFC,0x0E,0x82,0xC2,0x62,0x1E,0xFC,0xF0,0x00,0x00,0x00,0x00,
|
const uint8_t FONT[]={
|
||||||
0x00,0x03,0x0F,0x1F,0x11,0x10,0x10,0x1C,0x0F,0x03,0x00,0x00,0x00,0x00,/*0*/
|
0x00,0xF0,0xFC,0x0E,0x82,0xC2,0x62,0x1E,0xFC,0xF0,0x00,0x00,
|
||||||
0x00,0x08,0x04,0x02,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
0x00,0x03,0x0F,0x1F,0x11,0x10,0x10,0x1C,0x0F,0x03,0x00,0x00,/*0*/
|
||||||
0x00,0x10,0x10,0x10,0x1F,0x1F,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,/*1*/
|
0x00,0x08,0x04,0x02,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
0x00,0x04,0x02,0x02,0x02,0xC6,0xFC,0x78,0x00,0x00,0x00,0x00,0x00,0x00,
|
0x00,0x10,0x10,0x10,0x1F,0x1F,0x10,0x10,0x10,0x00,0x00,0x00,/*1*/
|
||||||
0x00,0x18,0x1C,0x16,0x13,0x11,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,/*2*/
|
0x00,0x04,0x02,0x02,0x02,0xC6,0xFC,0x78,0x00,0x00,0x00,0x00,
|
||||||
0x00,0x02,0x02,0x42,0x42,0x66,0xFE,0x9C,0x00,0x00,0x00,0x00,0x00,0x00,
|
0x00,0x18,0x1C,0x16,0x13,0x11,0x10,0x10,0x10,0x00,0x00,0x00,/*2*/
|
||||||
0x00,0x10,0x10,0x10,0x10,0x10,0x08,0x0F,0x07,0x00,0x00,0x00,0x00,0x00,/*3*/
|
0x00,0x02,0x02,0x42,0x42,0x66,0xFE,0x9C,0x00,0x00,0x00,0x00,
|
||||||
0x00,0x00,0x80,0xE0,0x30,0x1C,0x06,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,
|
0x00,0x10,0x10,0x10,0x10,0x10,0x08,0x0F,0x07,0x00,0x00,0x00,/*3*/
|
||||||
0x00,0x03,0x03,0x02,0x02,0x02,0x02,0x1F,0x1F,0x02,0x02,0x00,0x00,0x00,/*4*/
|
0x00,0x00,0x80,0xE0,0x30,0x1C,0x06,0xFE,0xFE,0x00,0x00,0x00,
|
||||||
0x00,0x7E,0x7E,0x42,0x42,0x42,0xC2,0x82,0x00,0x00,0x00,0x00,0x00,0x00,
|
0x00,0x03,0x03,0x02,0x02,0x02,0x02,0x1F,0x1F,0x02,0x02,0x00,/*4*/
|
||||||
0x00,0x10,0x10,0x10,0x10,0x10,0x08,0x0F,0x07,0x00,0x00,0x00,0x00,0x00,/*5*/
|
0x00,0x7E,0x7E,0x42,0x42,0x42,0xC2,0x82,0x00,0x00,0x00,0x00,
|
||||||
0x00,0xE0,0xF8,0x8C,0x44,0x42,0x42,0xC2,0x82,0x80,0x00,0x00,0x00,0x00,
|
0x00,0x10,0x10,0x10,0x10,0x10,0x08,0x0F,0x07,0x00,0x00,0x00,/*5*/
|
||||||
0x00,0x07,0x0F,0x18,0x10,0x10,0x10,0x18,0x0F,0x07,0x00,0x00,0x00,0x00,/*6*/
|
0x00,0xE0,0xF8,0x8C,0x44,0x42,0x42,0xC2,0x82,0x80,0x00,0x00,
|
||||||
0x00,0x02,0x02,0x02,0x02,0xC2,0xF2,0x1E,0x06,0x00,0x00,0x00,0x00,0x00,
|
0x00,0x07,0x0F,0x18,0x10,0x10,0x10,0x18,0x0F,0x07,0x00,0x00,/*6*/
|
||||||
0x00,0x00,0x10,0x1C,0x0F,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*7*/
|
0x00,0x02,0x02,0x02,0x02,0xC2,0xF2,0x1E,0x06,0x00,0x00,0x00,
|
||||||
0x00,0x38,0x7C,0x66,0xC2,0x82,0xC2,0x66,0x7C,0x3C,0x00,0x00,0x00,0x00,
|
0x00,0x00,0x10,0x1C,0x0F,0x03,0x00,0x00,0x00,0x00,0x00,0x00,/*7*/
|
||||||
0x00,0x0E,0x0F,0x19,0x10,0x10,0x10,0x19,0x0F,0x0E,0x00,0x00,0x00,0x00,/*8*/
|
0x00,0x38,0x7C,0x66,0xC2,0x82,0xC2,0x66,0x7C,0x3C,0x00,0x00,
|
||||||
0x00,0x78,0x7C,0xC6,0x82,0x82,0x82,0x46,0xFC,0xF8,0x00,0x00,0x00,0x00,
|
0x00,0x0E,0x0F,0x19,0x10,0x10,0x10,0x19,0x0F,0x0E,0x00,0x00,/*8*/
|
||||||
0x00,0x00,0x10,0x10,0x10,0x10,0x08,0x0C,0x07,0x03,0x00,0x00,0x00,0x00,/*9*/
|
0x00,0x78,0x7C,0xC6,0x82,0x82,0x82,0x46,0xFC,0xF8,0x00,0x00,
|
||||||
0x00,0x00,0x80,0xF0,0x1E,0x02,0x1E,0xF0,0x80,0x00,0x00,0x00,0x00,0x00,
|
0x00,0x00,0x10,0x10,0x10,0x10,0x08,0x0C,0x07,0x03,0x00,0x00,/*9*/
|
||||||
0x00,0x1C,0x0F,0x03,0x02,0x02,0x02,0x03,0x0F,0x1C,0x00,0x00,0x00,0x00,/*A*/
|
|
||||||
0x00,0xFE,0xFE,0x42,0x42,0x42,0xE6,0xBE,0x9C,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x1F,0x1F,0x10,0x10,0x10,0x18,0x0F,0x07,0x00,0x00,0x00,0x00,0x00,/*B*/
|
|
||||||
0x00,0xF0,0xF8,0x0C,0x06,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x03,0x0F,0x0C,0x18,0x10,0x10,0x10,0x08,0x00,0x00,0x00,0x00,0x00,/*C*/
|
|
||||||
0x00,0xFE,0xFE,0x02,0x02,0x02,0x06,0x0C,0xFC,0xF0,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x1F,0x1F,0x10,0x10,0x10,0x18,0x0C,0x07,0x03,0x00,0x00,0x00,0x00,/*D*/
|
|
||||||
0x00,0xFE,0xFE,0x42,0x42,0x42,0x42,0x42,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x1F,0x1F,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,/*E*/
|
|
||||||
0x00,0xFE,0xFE,0x82,0x82,0x82,0x82,0x82,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*F*/
|
|
||||||
0x00,0xF0,0xF8,0x0C,0x06,0x02,0x82,0x82,0x82,0x84,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x03,0x0F,0x0C,0x18,0x10,0x10,0x10,0x1F,0x1F,0x00,0x00,0x00,0x00,/*G*/
|
|
||||||
0x00,0xFE,0xFE,0x40,0x40,0x40,0x40,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,/*H*/
|
|
||||||
0x00,0x02,0x02,0x02,0xFE,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x10,0x10,0x10,0x1F,0x1F,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,/*I*/
|
|
||||||
0x00,0x02,0x02,0x02,0x02,0x02,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x08,0x10,0x10,0x10,0x18,0x0F,0x07,0x00,0x00,0x00,0x00,0x00,0x00,/*J*/
|
|
||||||
0x00,0xFE,0xFE,0xC0,0xE0,0x30,0x18,0x0C,0x06,0x02,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x1F,0x1F,0x00,0x01,0x03,0x06,0x0C,0x18,0x10,0x00,0x00,0x00,0x00,/*K*/
|
|
||||||
0x00,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x1F,0x1F,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,/*L*/
|
|
||||||
0x00,0x00,0xFE,0x06,0x3C,0xC0,0xC0,0x3C,0x06,0xFE,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x10,0x1F,0x00,0x00,0x01,0x01,0x00,0x00,0x1F,0x18,0x00,0x00,0x00,/*M*/
|
|
||||||
0x00,0xFE,0xFE,0x1E,0x70,0x80,0x00,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x1F,0x1F,0x00,0x00,0x03,0x1C,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,/*N*/
|
|
||||||
0x00,0xF0,0xFC,0x0C,0x02,0x02,0x02,0x0E,0xFC,0xF0,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x03,0x0F,0x1C,0x10,0x10,0x10,0x0C,0x0F,0x03,0x00,0x00,0x00,0x00,/*O*/
|
|
||||||
0x00,0xFE,0xFE,0x02,0x02,0x02,0x86,0xFC,0x78,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x1F,0x1F,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*P*/
|
|
||||||
0x00,0xF0,0xF8,0x0C,0x02,0x02,0x02,0x02,0x0C,0xFC,0xF0,0x00,0x00,0x00,
|
|
||||||
0x00,0x03,0x0F,0x1C,0x10,0x30,0x70,0xD8,0x8C,0x8F,0x83,0x40,0x00,0x00,/*Q*/
|
|
||||||
0x00,0xFE,0xFE,0x42,0x42,0xC2,0xE6,0x3C,0x1C,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x1F,0x1F,0x00,0x00,0x00,0x01,0x0F,0x1C,0x10,0x00,0x00,0x00,0x00,/*R*/
|
|
||||||
0x00,0x38,0x7C,0x66,0xC2,0xC2,0x82,0x84,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x08,0x10,0x10,0x10,0x10,0x19,0x0F,0x07,0x00,0x00,0x00,0x00,0x00,/*S*/
|
|
||||||
0x00,0x02,0x02,0x02,0x02,0xFE,0xFE,0x02,0x02,0x02,0x02,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*T*/
|
|
||||||
0x00,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x07,0x0F,0x18,0x10,0x10,0x10,0x18,0x0F,0x07,0x00,0x00,0x00,0x00,/*U*/
|
|
||||||
0x00,0x0E,0x7E,0xE0,0x00,0x00,0x00,0xE0,0x7C,0x0E,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x03,0x1F,0x18,0x1F,0x03,0x00,0x00,0x00,0x00,0x00,0x00,/*V*/
|
|
||||||
0x00,0x7E,0xFE,0x00,0x00,0xE0,0xE0,0x00,0x00,0xFE,0x7E,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x1F,0x18,0x0F,0x01,0x01,0x0F,0x18,0x1F,0x00,0x00,0x00,0x00,/*W*/
|
|
||||||
0x00,0x02,0x06,0x1C,0x38,0xE0,0xE0,0x38,0x1C,0x06,0x02,0x00,0x00,0x00,
|
|
||||||
0x00,0x10,0x18,0x0E,0x07,0x01,0x01,0x07,0x0E,0x18,0x10,0x00,0x00,0x00,/*X*/
|
|
||||||
0x00,0x02,0x0E,0x3C,0xF0,0xC0,0xC0,0xF0,0x3C,0x0E,0x02,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*Y*/
|
|
||||||
0x00,0x02,0x02,0x02,0xC2,0xE2,0x3A,0x0E,0x02,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x10,0x1C,0x17,0x11,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,/*Z*/
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/* */
|
|
||||||
|
|
||||||
|
0x00,0x00,0x80,0xF0,0x1E,0x02,0x1E,0xF0,0x80,0x00,0x00,0x00,
|
||||||
|
0x00,0x1C,0x0F,0x03,0x02,0x02,0x02,0x03,0x0F,0x1C,0x00,0x00,/*A*/
|
||||||
|
0x00,0xFE,0xFE,0x42,0x42,0x42,0xE6,0xBE,0x9C,0x00,0x00,0x00,
|
||||||
|
0x00,0x1F,0x1F,0x10,0x10,0x10,0x18,0x0F,0x07,0x00,0x00,0x00,/*B*/
|
||||||
|
0x00,0xF0,0xF8,0x0C,0x06,0x02,0x02,0x02,0x04,0x00,0x00,0x00,
|
||||||
|
0x00,0x03,0x0F,0x0C,0x18,0x10,0x10,0x10,0x08,0x00,0x00,0x00,/*C*/
|
||||||
|
0x00,0xFE,0xFE,0x02,0x02,0x02,0x06,0x0C,0xFC,0xF0,0x00,0x00,
|
||||||
|
0x00,0x1F,0x1F,0x10,0x10,0x10,0x18,0x0C,0x07,0x03,0x00,0x00,/*D*/
|
||||||
|
0x00,0xFE,0xFE,0x42,0x42,0x42,0x42,0x42,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x1F,0x1F,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,/*E*/
|
||||||
|
0x00,0xFE,0xFE,0x82,0x82,0x82,0x82,0x82,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*F*/
|
||||||
|
0x00,0xF0,0xF8,0x0C,0x06,0x02,0x82,0x82,0x82,0x84,0x00,0x00,
|
||||||
|
0x00,0x03,0x0F,0x0C,0x18,0x10,0x10,0x10,0x1F,0x1F,0x00,0x00,/*G*/
|
||||||
|
0x00,0xFE,0xFE,0x40,0x40,0x40,0x40,0xFE,0xFE,0x00,0x00,0x00,
|
||||||
|
0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x1F,0x1F,0x00,0x00,0x00,/*H*/
|
||||||
|
0x00,0x02,0x02,0x02,0xFE,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,
|
||||||
|
0x00,0x10,0x10,0x10,0x1F,0x1F,0x10,0x10,0x10,0x00,0x00,0x00,/*I*/
|
||||||
|
0x00,0x02,0x02,0x02,0x02,0x02,0xFE,0xFE,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x08,0x10,0x10,0x10,0x18,0x0F,0x07,0x00,0x00,0x00,0x00,/*J*/
|
||||||
|
0x00,0xFE,0xFE,0xC0,0xE0,0x30,0x18,0x0C,0x06,0x02,0x00,0x00,
|
||||||
|
0x00,0x1F,0x1F,0x00,0x01,0x03,0x06,0x0C,0x18,0x10,0x00,0x00,/*K*/
|
||||||
|
0x00,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x1F,0x1F,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,/*L*/
|
||||||
|
0x00,0x00,0xFE,0x06,0x3C,0xC0,0xC0,0x3C,0x06,0xFE,0x00,0x00,
|
||||||
|
0x00,0x10,0x1F,0x00,0x00,0x01,0x01,0x00,0x00,0x1F,0x18,0x00,/*M*/
|
||||||
|
0x00,0xFE,0xFE,0x1E,0x70,0x80,0x00,0xFE,0xFE,0x00,0x00,0x00,
|
||||||
|
0x00,0x1F,0x1F,0x00,0x00,0x03,0x1C,0x1F,0x1F,0x00,0x00,0x00,/*N*/
|
||||||
|
0x00,0xF0,0xFC,0x0C,0x02,0x02,0x02,0x0E,0xFC,0xF0,0x00,0x00,
|
||||||
|
0x00,0x03,0x0F,0x1C,0x10,0x10,0x10,0x0C,0x0F,0x03,0x00,0x00,/*O*/
|
||||||
|
0x00,0xFE,0xFE,0x02,0x02,0x02,0x86,0xFC,0x78,0x00,0x00,0x00,
|
||||||
|
0x00,0x1F,0x1F,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,/*P*/
|
||||||
|
0x00,0xF0,0xF8,0x0C,0x02,0x02,0x02,0x02,0x0C,0xFC,0xF0,0x00,
|
||||||
|
0x00,0x03,0x0F,0x1C,0x10,0x30,0x70,0xD8,0x8C,0x8F,0x83,0x40,/*Q*/
|
||||||
|
0x00,0xFE,0xFE,0x42,0x42,0xC2,0xE6,0x3C,0x1C,0x00,0x00,0x00,
|
||||||
|
0x00,0x1F,0x1F,0x00,0x00,0x00,0x01,0x0F,0x1C,0x10,0x00,0x00,/*R*/
|
||||||
|
0x00,0x38,0x7C,0x66,0xC2,0xC2,0x82,0x84,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x08,0x10,0x10,0x10,0x10,0x19,0x0F,0x07,0x00,0x00,0x00,/*S*/
|
||||||
|
0x00,0x02,0x02,0x02,0x02,0xFE,0xFE,0x02,0x02,0x02,0x02,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,/*T*/
|
||||||
|
0x00,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0x00,0x00,
|
||||||
|
0x00,0x07,0x0F,0x18,0x10,0x10,0x10,0x18,0x0F,0x07,0x00,0x00,/*U*/
|
||||||
|
0x00,0x0E,0x7E,0xE0,0x00,0x00,0x00,0xE0,0x7C,0x0E,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x03,0x1F,0x18,0x1F,0x03,0x00,0x00,0x00,0x00,/*V*/
|
||||||
|
0x00,0x7E,0xFE,0x00,0x00,0xE0,0xE0,0x00,0x00,0xFE,0x7E,0x00,
|
||||||
|
0x00,0x00,0x1F,0x18,0x0F,0x01,0x01,0x0F,0x18,0x1F,0x00,0x00,/*W*/
|
||||||
|
0x00,0x02,0x06,0x1C,0x38,0xE0,0xE0,0x38,0x1C,0x06,0x02,0x00,
|
||||||
|
0x00,0x10,0x18,0x0E,0x07,0x01,0x01,0x07,0x0E,0x18,0x10,0x00,/*X*/
|
||||||
|
0x00,0x02,0x0E,0x3C,0xF0,0xC0,0xC0,0xF0,0x3C,0x0E,0x02,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,/*Y*/
|
||||||
|
0x00,0x02,0x02,0x02,0xC2,0xE2,0x3A,0x0E,0x02,0x00,0x00,0x00,
|
||||||
|
0x00,0x10,0x1C,0x17,0x11,0x10,0x10,0x10,0x10,0x00,0x00,0x00,/*Z*/
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/* */
|
||||||
|
|
||||||
|
0x00,0x60,0xF0,0x98,0x0C,0x06,0x02,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x01,0x03,0x06,0x04,0x00,0x00,0x00,0x00,0x00,/*<*/
|
||||||
|
0x00,0x02,0x06,0x0C,0x98,0xF0,0x60,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x04,0x06,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*>*/
|
||||||
|
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x0F,0x0F,0x0F,0x0F,0x00,0x00,0x00,0x00,/*.*/
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* FONT_H_ */
|
#endif /* FONT_H_ */
|
||||||
|
|||||||
@@ -1,21 +1,16 @@
|
|||||||
/********************* (C) COPYRIGHT 2015 e-Design Co.,Ltd. **********************
|
/*
|
||||||
File Name : I2C.h
|
* I2C.h
|
||||||
Version : S100 APP Ver 2.11
|
* I2C wrapper for the stm32 hardware I2C port
|
||||||
Description:
|
*/
|
||||||
Author : Celery
|
|
||||||
Data: 2015/08/03
|
|
||||||
History:
|
|
||||||
2015/08/03 :
|
|
||||||
*******************************************************************************/
|
|
||||||
#ifndef __I2C_H
|
#ifndef __I2C_H
|
||||||
#define __I2C_H
|
#define __I2C_H
|
||||||
|
|
||||||
#define I2C_TX 1
|
#include "stm32f10x_i2c.h"
|
||||||
#define I2C_RX 2
|
#include "stm32f10x.h"
|
||||||
|
#include "stm32f10x_gpio.h"
|
||||||
|
|
||||||
void I2C_Configuration(void);
|
void I2C_Configuration(void);
|
||||||
void Delay_uS(u32 us);
|
void I2C_PageWrite(u8* pbuf, u8 numbyte, u8 deviceaddr);
|
||||||
void I2C_PageWrite(u8* pbuf, u8 numbyte,u8 deviceaddr );
|
void I2C_PageRead(u8* pbuf, u8 numbyte, u8 deviceaddr, u8 readaddr);
|
||||||
void I2C_PageRead(u8* pbuf, u8 numbyte,u8 deviceaddr, u8 readaddr);
|
|
||||||
#endif
|
#endif
|
||||||
/******************************** END OF FILE *********************************/
|
/******************************** END OF FILE *********************************/
|
||||||
|
|||||||
@@ -1,34 +1,11 @@
|
|||||||
/********************* (C) COPYRIGHT 2015 e-Design Co.,Ltd. *******************/
|
/*
|
||||||
/* Brief : Interrupt Service Routines Author : bure */
|
* Interrupt Service Routines
|
||||||
/******************************************************************************/
|
* This file manages all the IRQ events that can be generated
|
||||||
|
*/
|
||||||
#ifndef __INTERRUPT_H
|
#ifndef __INTERRUPT_H
|
||||||
#define __INTERRUPT_H
|
#define __INTERRUPT_H
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
//See here for refernce to this block http://embedded.kleier.selfhost.me/vector.php
|
/* Functions for access to data */
|
||||||
/*This loop is used for un assigned IRQ's so that the debugger can catch them*/
|
|
||||||
|
|
||||||
void NMI_Handler(void);
|
|
||||||
void HardFault_Handler(void);
|
|
||||||
void MemManage_Handler(void);
|
|
||||||
void BusFault_Handler(void);
|
|
||||||
void UsageFault_Handler(void);
|
|
||||||
void SVC_Handler(void);
|
|
||||||
void DebugMon_Handler(void);
|
|
||||||
void PendSV_Handler(void);
|
|
||||||
void SysTick_Handler(void);
|
|
||||||
|
|
||||||
void WWDG_IRQHandler(void);
|
|
||||||
void PVD_IRQHandler(void);
|
|
||||||
void TAMPER_STAMP_IRQHandler(void);
|
|
||||||
void RTC_WKUP_IRQHandler(void);
|
|
||||||
void FLASH_IRQHandler(void);
|
|
||||||
|
|
||||||
void USB_LP_CAN1_RX0_IRQHandler(void);
|
|
||||||
void I2C1_EV_IRQHandler(void);
|
|
||||||
void I2C1_ER_IRQHandler(void);
|
|
||||||
void TIM2_IRQHandler(void);
|
|
||||||
void TIM3_IRQHandler(void);
|
|
||||||
|
|
||||||
extern volatile uint32_t system_Ticks;
|
extern volatile uint32_t system_Ticks;
|
||||||
void delayMs(uint32_t ticks);
|
void delayMs(uint32_t ticks);
|
||||||
volatile extern uint32_t lastKeyPress;
|
volatile extern uint32_t lastKeyPress;
|
||||||
@@ -57,6 +34,30 @@ inline uint32_t getLastMovement() {
|
|||||||
inline uint16_t getButtons() {
|
inline uint16_t getButtons() {
|
||||||
return keyState;
|
return keyState;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*IRQ prototypes*/
|
||||||
|
void NMI_Handler(void);
|
||||||
|
void HardFault_Handler(void);
|
||||||
|
void MemManage_Handler(void);
|
||||||
|
void BusFault_Handler(void);
|
||||||
|
void UsageFault_Handler(void);
|
||||||
|
void SVC_Handler(void);
|
||||||
|
void DebugMon_Handler(void);
|
||||||
|
void PendSV_Handler(void);
|
||||||
|
void SysTick_Handler(void);
|
||||||
|
|
||||||
|
void WWDG_IRQHandler(void);
|
||||||
|
void PVD_IRQHandler(void);
|
||||||
|
void TAMPER_STAMP_IRQHandler(void);
|
||||||
|
void RTC_WKUP_IRQHandler(void);
|
||||||
|
void FLASH_IRQHandler(void);
|
||||||
|
|
||||||
|
void USB_LP_CAN1_RX0_IRQHandler(void);
|
||||||
|
void I2C1_EV_IRQHandler(void);
|
||||||
|
void I2C1_ER_IRQHandler(void);
|
||||||
|
void TIM2_IRQHandler(void);
|
||||||
|
void TIM3_IRQHandler(void);
|
||||||
|
|
||||||
void WWDG_IRQHandler(void);
|
void WWDG_IRQHandler(void);
|
||||||
void PVD_IRQHandler(void);
|
void PVD_IRQHandler(void);
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,8 @@
|
|||||||
*
|
*
|
||||||
* http://cache.freescale.com/files/sensors/doc/data_sheet/MMA8652FC.pdf
|
* http://cache.freescale.com/files/sensors/doc/data_sheet/MMA8652FC.pdf
|
||||||
*
|
*
|
||||||
* EXTI Motion config setup values lifted from AN4070from NXP
|
* EXTI Motion config setup values lifted from AN4070 from NXP
|
||||||
|
* #defines also taken from ^
|
||||||
*
|
*
|
||||||
* Ben V. Brown - <ralim@ralimtek.com>
|
* Ben V. Brown - <ralim@ralimtek.com>
|
||||||
*/
|
*/
|
||||||
@@ -14,7 +15,7 @@
|
|||||||
#define __MMA8652FC__H
|
#define __MMA8652FC__H
|
||||||
|
|
||||||
|
|
||||||
void StartUp_Acceleromter(void);//This is the only function we expose
|
void StartUp_Accelerometer(void);//This is the only function we expose
|
||||||
|
|
||||||
//--------------MMA8652 Device ID----------------------------------------------//
|
//--------------MMA8652 Device ID----------------------------------------------//
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,9 @@
|
|||||||
*
|
*
|
||||||
* Created on: 17 Sep 2016
|
* Created on: 17 Sep 2016
|
||||||
* Author: Ralim
|
* Author: Ralim
|
||||||
|
*
|
||||||
|
* Modes.h -> Main function for driving the application
|
||||||
|
* This processes the buttons then does the gui
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef MODES_H_
|
#ifndef MODES_H_
|
||||||
@@ -11,27 +14,24 @@
|
|||||||
#include "S100V0_1.h"
|
#include "S100V0_1.h"
|
||||||
#include "Oled.h"
|
#include "Oled.h"
|
||||||
#include "PID.h"
|
#include "PID.h"
|
||||||
|
#include "Settings.h"
|
||||||
|
#include "Analog.h"
|
||||||
enum {
|
enum {
|
||||||
STARTUP, //we are sitting on the prompt to push a button
|
STARTUP, //we are sitting on the prompt to push a button
|
||||||
SOLDERING,
|
SOLDERING,
|
||||||
TEMP_ADJ,
|
TEMP_ADJ,
|
||||||
SETTINGS,
|
SETTINGS,
|
||||||
SLEEP,
|
SLEEP,
|
||||||
|
COOLING,
|
||||||
|
UVLOWARN,
|
||||||
|
THERMOMETER,
|
||||||
} operatingMode;
|
} operatingMode;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
UVLO = 0, SLEEP_TEMP, SLEEP_TIME,
|
UVCO = 0, SLEEP_TEMP, SLEEP_TIME, MOTIONDETECT, TEMPDISPLAY, LEFTY
|
||||||
|
|
||||||
} settingsPage;
|
} settingsPage;
|
||||||
|
|
||||||
struct {
|
|
||||||
uint32_t SolderingTemp; //current setpoint for the iron
|
|
||||||
uint8_t SleepTime; //minutes to sleep
|
|
||||||
uint32_t SleepTemp; //temp to drop to in sleep
|
|
||||||
uint8_t cutoutVoltage; //X10 the voltage we cutout at for undervoltage
|
|
||||||
uint8_t movementEnabled;
|
|
||||||
} systemSettings;
|
|
||||||
|
|
||||||
void ProcessUI();
|
void ProcessUI();
|
||||||
void DrawUI();
|
void DrawUI();
|
||||||
#endif /* MODES_H_ */
|
#endif /* MODES_H_ */
|
||||||
|
|||||||
@@ -1,35 +1,27 @@
|
|||||||
/********************* (C) COPYRIGHT 2015 e-Design Co.,Ltd. **********************
|
/*
|
||||||
File Name : Oled.h
|
* Oled.h
|
||||||
Version : S100 APP Ver 2.11
|
* Functions for writing to the OLED screen
|
||||||
Description:
|
* Basically wraps drawing text and numbers to the OLED
|
||||||
Author : Celery
|
* Uses font.h -> 14 pixel wide fixed width
|
||||||
Data: 2015/07/07
|
*/
|
||||||
History:
|
|
||||||
2015/07/07 ͳһ<CDB3><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
||||||
*******************************************************************************/
|
|
||||||
#ifndef _OLED_SSD1306_H
|
#ifndef _OLED_SSD1306_H
|
||||||
#define _OLED_SSD1306_H
|
#define _OLED_SSD1306_H
|
||||||
|
|
||||||
#define DEVICEADDR_OLED 0x3c
|
#define DEVICEADDR_OLED 0x3c
|
||||||
#include "stm32f10x.h"
|
#include "stm32f10x.h"
|
||||||
#include "Interrupt.h"
|
#include "Interrupt.h"
|
||||||
void Sc_Pt(u8 Co);
|
|
||||||
void Oled_DisplayOn(void);
|
void Oled_DisplayOn(void);
|
||||||
void Oled_DisplayOff(void);
|
void Oled_DisplayOff(void);
|
||||||
|
|
||||||
u8* Oled_DrawArea(u8 x0, u8 y0, u8 wide, u8 high, u8* ptr);
|
u8* Oled_DrawArea(u8 x0, u8 y0, u8 wide, u8 high, u8* ptr);
|
||||||
void Set_ShowPos(u8 x, u8 y);
|
void Set_ShowPos(u8 x, u8 y);
|
||||||
|
void Oled_DisplayFlip();
|
||||||
u8* Show_posi(u8 posi, u8* ptr, u8 word_width);
|
|
||||||
void Clean_Char(int k, u8 wide);
|
|
||||||
void Write_Command(u8 Data);
|
|
||||||
void Write_Data(u8 Data);
|
|
||||||
void GPIO_Init_OLED(void);
|
void GPIO_Init_OLED(void);
|
||||||
void Init_Oled(void);
|
void Init_Oled(uint8_t leftHanded);
|
||||||
u8* Data_Command(u8 len, u8* ptr);
|
u8* Data_Command(u8 len, u8* ptr);
|
||||||
void Reg_Command(u8 posi, u8 flag);
|
void Clear_Screen(void);//Clear the screen
|
||||||
void Clear_Screen(void);
|
/*Functions for writing to the screen*/
|
||||||
void Write_InitCommand_data(u32 Com_len, u8* data);
|
|
||||||
void Display_BG(void);
|
|
||||||
void OLED_DrawString(char* string, uint8_t length);
|
void OLED_DrawString(char* string, uint8_t length);
|
||||||
void OLED_DrawChar(char c, uint8_t x);
|
void OLED_DrawChar(char c, uint8_t x);
|
||||||
void OLED_DrawTwoNumber(uint8_t in, uint8_t x);
|
void OLED_DrawTwoNumber(uint8_t in, uint8_t x);
|
||||||
|
|||||||
@@ -3,12 +3,15 @@
|
|||||||
*
|
*
|
||||||
* Created on: 20 Sep 2016
|
* Created on: 20 Sep 2016
|
||||||
* Author: ralim
|
* Author: ralim
|
||||||
|
*
|
||||||
|
* Functions for computing the PID for the iron temp
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef PID_H_
|
#ifndef PID_H_
|
||||||
#define PID_H_
|
#define PID_H_
|
||||||
#include "Analog.h"
|
#include "Analog.h"
|
||||||
#include "Interrupt.h"
|
#include "Interrupt.h"
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
uint32_t kp, ki, kd; //PID values
|
uint32_t kp, ki, kd; //PID values
|
||||||
} pidSettings;
|
} pidSettings;
|
||||||
|
|||||||
@@ -1,14 +1,9 @@
|
|||||||
/********************* (C) COPYRIGHT 2015 e-Design Co.,Ltd. ********************
|
/*
|
||||||
Brief : <20>ײ<EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Author : bure
|
* Defines for the device
|
||||||
Modified by Ben V. Brown into English
|
* These houses the settings for the device hardware
|
||||||
*******************************************************************************/
|
*/
|
||||||
#include "stm32f10x.h"
|
#include "stm32f10x.h"
|
||||||
|
#include "stm32f10x_gpio.h"
|
||||||
#define PRODUCT_INFO "TS100"
|
|
||||||
#define MCU_TYPE "STM32F103T8"
|
|
||||||
#define SCH_VER "2.46"
|
|
||||||
|
|
||||||
#define SPIx SPI1
|
|
||||||
//--------------------------- key Definitions ------------------------------//
|
//--------------------------- key Definitions ------------------------------//
|
||||||
#define KEY1_PIN GPIO_Pin_9 //PA8
|
#define KEY1_PIN GPIO_Pin_9 //PA8
|
||||||
#define KEY2_PIN GPIO_Pin_6 //PA6
|
#define KEY2_PIN GPIO_Pin_6 //PA6
|
||||||
@@ -17,45 +12,24 @@
|
|||||||
#define KEY_B KEY2_PIN
|
#define KEY_B KEY2_PIN
|
||||||
#define BUT_A 0x01
|
#define BUT_A 0x01
|
||||||
#define BUT_B 0x02
|
#define BUT_B 0x02
|
||||||
#define BUT_AB BUT_A|BUT_B
|
|
||||||
#define KEY_1 !(GPIOA->IDR & KEY1_PIN)
|
|
||||||
#define KEY_2 !(GPIOA->IDR & KEY2_PIN)
|
|
||||||
#define KEY_DFU KEY_1
|
|
||||||
|
|
||||||
#define I2C1_DMA_CHANNEL_TX DMA1_Channel6
|
|
||||||
#define I2C1_DMA_CHANNEL_RX DMA1_Channel7
|
|
||||||
|
|
||||||
#define I2C2_DMA_CHANNEL_TX DMA1_Channel4
|
|
||||||
#define I2C2_DMA_CHANNEL_RX DMA1_Channel5
|
|
||||||
|
|
||||||
#define I2C1_DR_Address 0x40005410
|
|
||||||
#define I2C2_DR_Address 0x40005810
|
|
||||||
|
|
||||||
//--------------------------- OLED ------------------------------//
|
//--------------------------- OLED ------------------------------//
|
||||||
#define OLED_RST_PIN GPIO_Pin_8 //PA9
|
#define OLED_RST_PIN GPIO_Pin_8 //PA9
|
||||||
#define OLED_RST() GPIO_ResetBits(GPIOA, OLED_RST_PIN)
|
#define OLED_RST() GPIO_ResetBits(GPIOA, OLED_RST_PIN)
|
||||||
#define OLED_ACT() GPIO_SetBits (GPIOA, OLED_RST_PIN)
|
#define OLED_ACT() GPIO_SetBits (GPIOA, OLED_RST_PIN)
|
||||||
|
|
||||||
//------------------------------ --------------------------------//
|
//------------------------------ Iron Heater --------------------------------//
|
||||||
#define HEAT_PIN GPIO_Pin_4
|
#define HEAT_PIN GPIO_Pin_4
|
||||||
|
|
||||||
#define HEAT_OFF() GPIOB->BRR = HEAT_PIN
|
#define HEAT_OFF() GPIOB->BRR = HEAT_PIN
|
||||||
#define HEAT_ON() GPIOB->BSRR = HEAT_PIN
|
#define HEAT_ON() GPIOB->BSRR = HEAT_PIN
|
||||||
|
|
||||||
//-----------------------VB---------------------------------------//
|
//-----------------------Battery voltage measurement---------------------------------------//
|
||||||
#define VB_PIN GPIO_Pin_1 //PB1(Ai9)
|
#define VB_PIN GPIO_Pin_1 //PB1(Ai9)
|
||||||
//----------------------------ADX345 INT1,INT2--------------------------------//
|
|
||||||
|
//----------------------------Accelerometer INT1,INT2--------------------------------//
|
||||||
#define INT1_PIN GPIO_Pin_5 //PB5
|
#define INT1_PIN GPIO_Pin_5 //PB5
|
||||||
#define INT2_PIN GPIO_Pin_3 //PB3
|
#define INT2_PIN GPIO_Pin_3 //PB3
|
||||||
//------------------------------ GPIO -------------------------------//
|
|
||||||
|
|
||||||
#define GPIOA_OUTPUT() GPIOA->ODR = 0xFFFF;
|
|
||||||
#define GPIOA_L_DEF() GPIOA->CRL = 0x08888888; /* Ai7 K2 xxx xxx xxx xxx xxx xxx */
|
|
||||||
#define GPIOA_H_DEF() GPIOA->CRH = 0x8BBBB883; /* xxx SWC SWD D+ D- xxx K1 nCR */
|
|
||||||
|
|
||||||
#define GPIOB_OUTPUT() GPIOB->ODR = 0xFFFF;
|
|
||||||
#define GPIOB_L_DEF() GPIOB->CRL = 0x44838800; /* SDA SCL It1 Po It2 xxx Ai9 Ai8 */
|
|
||||||
#define GPIOB_H_DEF() GPIOB->CRH = 0x88888888; /* xxx xxx xxx xxx xxx xxx xxx xxx */
|
|
||||||
|
|
||||||
//--------------------------------- RCC Clock Config ---------------------------------//
|
//--------------------------------- RCC Clock Config ---------------------------------//
|
||||||
|
|
||||||
@@ -72,4 +46,3 @@
|
|||||||
||+-------Bit22 = 1 USB prescaler is PLL clock
|
||+-------Bit22 = 1 USB prescaler is PLL clock
|
||||||
++--------Bits31~27 Reserved*/
|
++--------Bits31~27 Reserved*/
|
||||||
|
|
||||||
/******************************** END OF FILE *********************************/
|
|
||||||
|
|||||||
33
workspace/ts100/inc/Settings.h
Normal file
33
workspace/ts100/inc/Settings.h
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* Settings.h
|
||||||
|
*
|
||||||
|
* Created on: 29 Sep 2016
|
||||||
|
* Author: Ralim
|
||||||
|
*
|
||||||
|
* Houses the system settings and allows saving / restoring from flash
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SETTINGS_H_
|
||||||
|
#define SETTINGS_H_
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "stm32f10x_flash.h"
|
||||||
|
#define SETTINGSVERSION 0x02 /*Change this if you change the struct below to prevent people getting out of sync*/
|
||||||
|
#define SETTINGSOPTIONSCOUNT 5 /*Number of settings in the settings menu*/
|
||||||
|
/*
|
||||||
|
* This struct must be a multiple of 2 bytes as it is saved / restored from flash in uint16_t chunks
|
||||||
|
*/
|
||||||
|
struct {
|
||||||
|
uint32_t SolderingTemp; //current setpoint for the iron
|
||||||
|
uint32_t SleepTemp; //temp to drop to in sleep
|
||||||
|
uint8_t version; //Used to track if a reset is needed on firmware upgrade
|
||||||
|
uint8_t SleepTime; //minutes timeout to sleep
|
||||||
|
uint8_t cutoutVoltage; //The voltage we cutout at for undervoltage
|
||||||
|
uint8_t movementEnabled; //If movement is enabled
|
||||||
|
uint8_t displayTempInF; //If we need to convert the C reading to F
|
||||||
|
uint8_t flipDisplay; //If true we want to invert the display for lefties
|
||||||
|
} systemSettings;
|
||||||
|
|
||||||
|
void saveSettings();
|
||||||
|
void restoreSettings();
|
||||||
|
void resetSettings();
|
||||||
|
#endif /* SETTINGS_H_ */
|
||||||
@@ -1,85 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file stm32f10x_conf.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @version V4.0.0
|
|
||||||
* @date 21-January-2013
|
|
||||||
* @brief Library configuration file.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© COPYRIGHT 2013 STMicroelectronics</center></h2>
|
|
||||||
*
|
|
||||||
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
|
|
||||||
* You may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at:
|
|
||||||
*
|
|
||||||
* http://www.st.com/software_license_agreement_liberty_v2
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __STM32F10x_CONF_H
|
|
||||||
#define __STM32F10x_CONF_H
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
/* Uncomment the line below to enable peripheral header file inclusion */
|
|
||||||
#include "stm32f10x_adc.h"
|
|
||||||
#include "stm32f10x_bkp.h"
|
|
||||||
#include "stm32f10x_can.h"
|
|
||||||
#include "stm32f10x_crc.h"
|
|
||||||
#include "stm32f10x_dac.h"
|
|
||||||
#include "stm32f10x_dbgmcu.h"
|
|
||||||
#include "stm32f10x_dma.h"
|
|
||||||
#include "stm32f10x_exti.h"
|
|
||||||
#include "stm32f10x_flash.h"
|
|
||||||
#include "stm32f10x_fsmc.h"
|
|
||||||
#include "stm32f10x_gpio.h"
|
|
||||||
#include "stm32f10x_i2c.h"
|
|
||||||
#include "stm32f10x_iwdg.h"
|
|
||||||
#include "stm32f10x_pwr.h"
|
|
||||||
#include "stm32f10x_rcc.h"
|
|
||||||
#include "stm32f10x_rtc.h"
|
|
||||||
#include "stm32f10x_sdio.h"
|
|
||||||
#include "stm32f10x_spi.h"
|
|
||||||
#include "stm32f10x_tim.h"
|
|
||||||
#include "stm32f10x_usart.h"
|
|
||||||
#include "stm32f10x_wwdg.h"
|
|
||||||
#include "misc.h" /* High level functions for NVIC and SysTick (add-on to CMSIS functions) */
|
|
||||||
|
|
||||||
/* Exported types ------------------------------------------------------------*/
|
|
||||||
/* Exported constants --------------------------------------------------------*/
|
|
||||||
/* Uncomment the line below to expanse the "assert_param" macro in the
|
|
||||||
Standard Peripheral Library drivers code */
|
|
||||||
/* #define USE_FULL_ASSERT 1 */
|
|
||||||
|
|
||||||
/* Exported macro ------------------------------------------------------------*/
|
|
||||||
#ifdef USE_FULL_ASSERT
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Macro Name : assert_param
|
|
||||||
* Description : The assert_param macro is used for function's parameters check.
|
|
||||||
* Input : - expr: If expr is false, it calls assert_failed function
|
|
||||||
* which reports the name of the source file and the source
|
|
||||||
* line number of the call that failed.
|
|
||||||
* If expr is true, it returns no value.
|
|
||||||
* Return : None
|
|
||||||
*******************************************************************************/
|
|
||||||
#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
|
|
||||||
/* Exported functions ------------------------------------------------------- */
|
|
||||||
void assert_failed(uint8_t* file, uint32_t line);
|
|
||||||
#else
|
|
||||||
#define assert_param(expr) ((void)0)
|
|
||||||
#endif /* USE_FULL_ASSERT */
|
|
||||||
|
|
||||||
#endif /* __STM32F10x_CONF_H */
|
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
@@ -8,6 +8,8 @@
|
|||||||
*/
|
*/
|
||||||
#include "Analog.h"
|
#include "Analog.h"
|
||||||
|
|
||||||
|
//Reads the dc input and returns it as X10 voltage (ie 236 = 23.6V)
|
||||||
|
//Seems unstable below 9.5V input
|
||||||
uint16_t readDCVoltage() {
|
uint16_t readDCVoltage() {
|
||||||
uint16_t reading = 0;
|
uint16_t reading = 0;
|
||||||
for (u8 i = 0; i < 10; i++) {
|
for (u8 i = 0; i < 10; i++) {
|
||||||
@@ -102,6 +104,7 @@ uint16_t Get_ADC1Value(uint8_t i) {
|
|||||||
return ADC1ConvertedValue[i];
|
return ADC1ConvertedValue[i];
|
||||||
}
|
}
|
||||||
//This returns the calibrated temperature reading of the iron temp
|
//This returns the calibrated temperature reading of the iron temp
|
||||||
|
//inputs : calibration value / wether to take a new reading or not
|
||||||
uint16_t readIronTemp(uint16_t calibration_temp, uint8_t read) {
|
uint16_t readIronTemp(uint16_t calibration_temp, uint8_t read) {
|
||||||
static uint16_t calTemp = 0;
|
static uint16_t calTemp = 0;
|
||||||
static uint16_t lastVal = 0;
|
static uint16_t lastVal = 0;
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* Setup all the basic hardware in the system and handle timer3 tick
|
* Setup all the basic hardware in the system and handle timer3 tick
|
||||||
*/
|
*/
|
||||||
#include "APP_Version.h"
|
|
||||||
#include "Bios.h"
|
#include "Bios.h"
|
||||||
#include "I2C.h"
|
#include "I2C.h"
|
||||||
|
|
||||||
/******************************************************************************/
|
|
||||||
#define ADC1_DR_Address ((u32)0x4001244C)
|
#define ADC1_DR_Address ((u32)0x4001244C)
|
||||||
volatile uint32_t gHeat_cnt = 0;
|
volatile uint32_t gHeat_cnt = 0;
|
||||||
|
|
||||||
@@ -58,20 +58,6 @@ void GPIO_Config(void) {
|
|||||||
GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);
|
GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);
|
||||||
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
|
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
|
||||||
|
|
||||||
GPIOA_OUTPUT()
|
|
||||||
;
|
|
||||||
GPIOA_L_DEF()
|
|
||||||
;
|
|
||||||
GPIOA_H_DEF()
|
|
||||||
;
|
|
||||||
|
|
||||||
GPIOB_OUTPUT()
|
|
||||||
;
|
|
||||||
GPIOB_L_DEF()
|
|
||||||
;
|
|
||||||
GPIOB_H_DEF()
|
|
||||||
;
|
|
||||||
|
|
||||||
//------ PA7 TMP36 Analog input ----------------------------------------//
|
//------ PA7 TMP36 Analog input ----------------------------------------//
|
||||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
|
||||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
|
||||||
|
|||||||
@@ -1,229 +1,148 @@
|
|||||||
/********************* (C) COPYRIGHT 2015 e-Design Co.,Ltd. **********************
|
/*
|
||||||
File Name : I2C.c
|
* I2C.h hardware interface class
|
||||||
Version : S100 APP Ver 2.11
|
* Based on the STM32 app note AN2824
|
||||||
Description:
|
*/
|
||||||
Author : Celery
|
|
||||||
Data: 2015/07/20
|
|
||||||
History:
|
|
||||||
2015/07/07 ͳһ<CDB3><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
||||||
2015/07/21 I2C_DELAYTIME = 2;
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
#include "stm32f10x.h"
|
|
||||||
#include "I2C.h"
|
#include "I2C.h"
|
||||||
#include "Bios.h"
|
|
||||||
#include "Oled.h"
|
|
||||||
#include "S100V0_1.h"
|
|
||||||
|
|
||||||
// --------- <20><><EFBFBD><EFBFBD>I2C<32>ӿ<EFBFBD><D3BF><EFBFBD>ض<EFBFBD><D8B6><EFBFBD>-------- //
|
/*
|
||||||
#define SDA GPIO_Pin_7
|
* Configure the I2C port hardware
|
||||||
#define SCL GPIO_Pin_6
|
*/
|
||||||
|
void I2C_Configuration(void) {
|
||||||
|
GPIO_InitTypeDef GPIO_InitStructure;
|
||||||
|
I2C_InitTypeDef I2C_InitStructure;
|
||||||
|
|
||||||
#define HIGH 1
|
/* PB6,7 SCL and SDA */
|
||||||
#define LOW 0
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
|
||||||
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
||||||
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
|
||||||
|
GPIO_Init(GPIOB, &GPIO_InitStructure);
|
||||||
|
|
||||||
#define SDA_VAL GPIO_ReadInputDataBit(GPIOB, SDA)
|
/* I2C1 configuration ------------------------------------------------------*/
|
||||||
#define SCL_VAL GPIO_ReadInputDataBit(GPIOB, SCL)
|
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
|
||||||
|
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
|
||||||
#define I2C_MORE 1
|
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
|
||||||
#define I2C_LAST 0
|
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
|
||||||
#define I2C_TIMEOUT 255
|
I2C_InitStructure.I2C_ClockSpeed = 400000; //400k
|
||||||
|
I2C_Init(I2C1, &I2C_InitStructure);
|
||||||
#define FAILURE 0
|
I2C_Cmd(I2C1, ENABLE);
|
||||||
#define SUCCEED 1
|
|
||||||
#define I2C_DELAYTIME 2
|
|
||||||
|
|
||||||
static void Sim_I2C_Set(u8 pin, u8 status);
|
|
||||||
static void Sim_I2C_Stop(void);
|
|
||||||
static void Sim_I2C_Start(void);
|
|
||||||
static u8 Sim_I2C_RD_Byte(u8 more);
|
|
||||||
static u8 Sim_I2C_WR_Byte(u8 data);
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: Delay_uS
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD>ʱ
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:us
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD>:NULL
|
|
||||||
*******************************************************************************/
|
|
||||||
void Delay_uS(u32 us)
|
|
||||||
{
|
|
||||||
while(us) us--;
|
|
||||||
}
|
|
||||||
/*******************************************************************************
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: I2C_Configuration
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD>I2C
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:NULL
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD>:NULL
|
|
||||||
*******************************************************************************/
|
|
||||||
void I2C_Configuration(void)
|
|
||||||
{
|
|
||||||
GPIO_InitTypeDef GPIO_InitStructure;
|
|
||||||
I2C_InitTypeDef I2C_InitStructure;
|
|
||||||
|
|
||||||
GPIO_Init_OLED();
|
|
||||||
/* PB6,7 SCL and SDA */
|
|
||||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
|
|
||||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
|
||||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
|
|
||||||
GPIO_Init(GPIOB, &GPIO_InitStructure);
|
|
||||||
|
|
||||||
/* I2C1 configuration ------------------------------------------------------*/
|
|
||||||
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
|
|
||||||
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
|
|
||||||
I2C_InitStructure.I2C_OwnAddress1 = DEVICEADDR_OLED;
|
|
||||||
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
|
|
||||||
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
|
|
||||||
I2C_InitStructure.I2C_ClockSpeed = 100000;//100k
|
|
||||||
I2C_Init(I2C1, &I2C_InitStructure);
|
|
||||||
I2C_Cmd(I2C1, ENABLE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************************
|
/*
|
||||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: I2C_Configuration
|
* Writes a page of data over I2C using the I2C1 peripheral in the stm32
|
||||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD>I2C
|
*
|
||||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:NULL
|
*/
|
||||||
<EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD>:NULL
|
void I2C_PageWrite(u8* buf, u8 nbyte, u8 deviceaddr) {
|
||||||
*******************************************************************************/
|
|
||||||
void Sim_I2C_Set(u8 pin, u8 status)
|
|
||||||
{
|
|
||||||
if(status == HIGH) GPIO_SetBits (GPIOB, pin);
|
|
||||||
if(status == LOW) GPIO_ResetBits(GPIOB, pin);
|
|
||||||
}
|
|
||||||
/*******************************************************************************
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: Sim_I2C_Start
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><>ʼ
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:NULL
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD>:NULL
|
|
||||||
*******************************************************************************/
|
|
||||||
void Sim_I2C_Start(void)
|
|
||||||
{
|
|
||||||
GPIO_InitTypeDef GPIO_InitStructure;
|
|
||||||
|
|
||||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // I2C_PIN_EN();
|
while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)) {
|
||||||
GPIO_InitStructure.GPIO_Pin = SCL | SDA;
|
}
|
||||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
|
// Intiate Start Sequence
|
||||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
I2C_GenerateSTART(I2C1, ENABLE);
|
||||||
GPIO_Init (GPIOB, &GPIO_InitStructure);
|
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) {
|
||||||
|
}
|
||||||
|
// Send Address
|
||||||
|
I2C_Send7bitAddress(I2C1, deviceaddr << 1, I2C_Direction_Transmitter);
|
||||||
|
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) {
|
||||||
|
}
|
||||||
|
// Write first byte EV8_1
|
||||||
|
I2C_SendData(I2C1, *buf++);
|
||||||
|
|
||||||
Sim_I2C_Set(SCL, LOW); // SCL low
|
while (--nbyte) {
|
||||||
Sim_I2C_Set(SDA, HIGH); // SDA float, set as output high
|
// wait on BTF
|
||||||
Sim_I2C_Set(SCL, HIGH); // SCL high
|
while (!I2C_GetFlagStatus(I2C1, I2C_FLAG_BTF)) {
|
||||||
Delay_uS(I2C_DELAYTIME);
|
}
|
||||||
Sim_I2C_Set(SDA, LOW); // SDA high->low while sclk high, S state occur...
|
I2C_SendData(I2C1, *buf++);
|
||||||
Delay_uS(I2C_DELAYTIME);
|
}
|
||||||
Sim_I2C_Set(SCL, LOW); // SCL low
|
|
||||||
}
|
|
||||||
/*******************************************************************************
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: Sim_I2C_Stop
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: ֹͣ
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:NULL
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD>:NULL
|
|
||||||
*******************************************************************************/
|
|
||||||
void Sim_I2C_Stop(void)
|
|
||||||
{
|
|
||||||
Sim_I2C_Set(SCL, LOW); // SCL low
|
|
||||||
Sim_I2C_Set(SDA, LOW); // SDA low
|
|
||||||
Delay_uS(I2C_DELAYTIME);
|
|
||||||
Sim_I2C_Set(SCL, HIGH); // SCL high
|
|
||||||
Delay_uS(I2C_DELAYTIME);
|
|
||||||
Sim_I2C_Set(SDA, HIGH); // SDA low->high while sclk high, P state occur
|
|
||||||
Delay_uS(I2C_DELAYTIME);
|
|
||||||
Sim_I2C_Set(SCL, LOW); // SCL low
|
|
||||||
Delay_uS(I2C_DELAYTIME);
|
|
||||||
}
|
|
||||||
/*******************************************************************************
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: Sim_I2C_WR_Byte
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<3A><>I2Cд<43><D0B4>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:dataҪд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD>:NULL
|
|
||||||
*******************************************************************************/
|
|
||||||
u8 Sim_I2C_WR_Byte(u8 data)
|
|
||||||
{
|
|
||||||
u8 i = 8;
|
|
||||||
|
|
||||||
while(i--) { //send out a bit by sda line.
|
while (!I2C_GetFlagStatus(I2C1, I2C_FLAG_BTF)) {
|
||||||
Sim_I2C_Set(SCL, LOW); // sclk low
|
}
|
||||||
if(data & 0x80) Sim_I2C_Set(SDA, HIGH); // send bit is 1
|
I2C_GenerateSTOP(I2C1, ENABLE);
|
||||||
else Sim_I2C_Set(SDA, LOW); // send bit is 0
|
while (I2C_GetFlagStatus(I2C1, I2C_FLAG_STOPF)) {
|
||||||
Delay_uS(I2C_DELAYTIME);
|
}
|
||||||
Sim_I2C_Set(SCL, HIGH); // SCL high
|
|
||||||
Delay_uS(I2C_DELAYTIME);
|
|
||||||
data <<=1; // left shift 1 bit, MSB send first.
|
|
||||||
}
|
|
||||||
Sim_I2C_Set(SCL, LOW); // SCL low
|
|
||||||
Sim_I2C_Set(SDA, HIGH); // SDA set as input
|
|
||||||
for(i=I2C_TIMEOUT; i!=0; i--) { // wait for sda low to receive ack
|
|
||||||
Delay_uS(I2C_DELAYTIME);
|
|
||||||
if (!SDA_VAL) {
|
|
||||||
Sim_I2C_Set(SCL, HIGH); // SCL high
|
|
||||||
Delay_uS(I2C_DELAYTIME);
|
|
||||||
Sim_I2C_Set(SCL, LOW); // SCL_LOW();
|
|
||||||
Delay_uS(I2C_DELAYTIME);
|
|
||||||
return SUCCEED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return FAILURE;
|
|
||||||
}
|
|
||||||
/*******************************************************************************
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: Sim_I2C_RD_Byte
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<3A><>I2C<32><43><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:more
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD><EFBFBD>İ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
|
|
||||||
*******************************************************************************/
|
|
||||||
u8 Sim_I2C_RD_Byte(u8 more)
|
|
||||||
{
|
|
||||||
u8 i = 8, byte = 0;
|
|
||||||
|
|
||||||
Sim_I2C_Set(SDA, HIGH); // SDA set as input
|
|
||||||
while(i--) {
|
|
||||||
Sim_I2C_Set(SCL, LOW); // SCL low
|
|
||||||
Delay_uS(I2C_DELAYTIME);
|
|
||||||
Sim_I2C_Set(SCL, HIGH); // SCL high
|
|
||||||
Delay_uS(I2C_DELAYTIME);
|
|
||||||
byte <<=1; //recv a bit
|
|
||||||
if (SDA_VAL) byte |= 0x01;
|
|
||||||
}
|
|
||||||
Sim_I2C_Set(SCL, LOW);
|
|
||||||
if(!more) Sim_I2C_Set(SDA, HIGH); //last byte, send nack.
|
|
||||||
else Sim_I2C_Set(SDA, LOW); //send ack
|
|
||||||
Delay_uS(I2C_DELAYTIME);
|
|
||||||
Sim_I2C_Set(SCL, HIGH); // SCL_HIGH();
|
|
||||||
Delay_uS(I2C_DELAYTIME);
|
|
||||||
Sim_I2C_Set(SCL, LOW);
|
|
||||||
return byte;
|
|
||||||
}
|
}
|
||||||
/*******************************************************************************
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: I2C_PageWrite
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<3A><> <20><>ַ deviceaddr д<><D0B4>numbyte<74><65><EFBFBD>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD>ݣ<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>pbuf
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:pbuf д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>numbyte Ϊд<CEAA><D0B4><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>deviceaddrΪд<CEAA><D0B4>ĵ<EFBFBD>ַ
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD>:NULL
|
|
||||||
*******************************************************************************/
|
|
||||||
void I2C_PageWrite(u8* pbuf, u8 numbyte,u8 deviceaddr )
|
|
||||||
{
|
|
||||||
Sim_I2C_Start();
|
|
||||||
Sim_I2C_WR_Byte(deviceaddr<<1);
|
|
||||||
while(numbyte--) Sim_I2C_WR_Byte(*pbuf++);
|
|
||||||
Sim_I2C_Stop();
|
|
||||||
}
|
|
||||||
/*******************************************************************************
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: I2C_PageRead
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<3A><>I2C<32><43><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: pbuf <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>ŵ<EFBFBD>ַ numbyteΪ<65><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
|
|
||||||
deviceaddr<64>豸<EFBFBD><E8B1B8>ַ readaddr<64><72>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
|
|
||||||
<EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD>:<3A><><EFBFBD><EFBFBD><EFBFBD>İ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
|
|
||||||
*******************************************************************************/
|
|
||||||
void I2C_PageRead(u8* pbuf, u8 numbyte,u8 deviceaddr, u8 readaddr)
|
|
||||||
{
|
|
||||||
Sim_I2C_Start();
|
|
||||||
Sim_I2C_WR_Byte(deviceaddr<<1);
|
|
||||||
Sim_I2C_WR_Byte(readaddr);
|
|
||||||
Sim_I2C_Start();
|
|
||||||
Sim_I2C_WR_Byte((deviceaddr<<1)|1);
|
|
||||||
|
|
||||||
while(numbyte--) {
|
/*
|
||||||
if(numbyte) *pbuf++ = Sim_I2C_RD_Byte(I2C_MORE);
|
* Read Page of data using I2C1 peripheral
|
||||||
else *pbuf++ = Sim_I2C_RD_Byte(I2C_LAST);
|
*/
|
||||||
}
|
|
||||||
Sim_I2C_Stop();
|
void I2C_PageRead(u8* buf, u8 nbyte, u8 deviceaddr, u8 readaddr) {
|
||||||
|
I2C_GenerateSTART(I2C1, ENABLE);
|
||||||
|
while (I2C_GetFlagStatus(I2C1, I2C_FLAG_SB) == RESET)
|
||||||
|
;
|
||||||
|
I2C_Send7bitAddress(I2C1, deviceaddr << 1, I2C_Direction_Transmitter);
|
||||||
|
while (I2C_GetFlagStatus(I2C1, I2C_FLAG_ADDR) == RESET)
|
||||||
|
;
|
||||||
|
I2C_GetFlagStatus(I2C1, I2C_FLAG_MSL);
|
||||||
|
while (I2C_GetFlagStatus(I2C1, I2C_FLAG_TXE) == RESET)
|
||||||
|
;
|
||||||
|
// Send an 8bit byte address
|
||||||
|
I2C_SendData(I2C1, readaddr);
|
||||||
|
while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)) {
|
||||||
|
}
|
||||||
|
I2C_AcknowledgeConfig(I2C1, DISABLE);
|
||||||
|
I2C_NACKPositionConfig(I2C1, I2C_NACKPosition_Current);
|
||||||
|
I2C_GenerateSTART(I2C1, ENABLE);
|
||||||
|
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) {
|
||||||
|
}
|
||||||
|
I2C_Send7bitAddress(I2C1, deviceaddr << 1, I2C_Direction_Receiver);
|
||||||
|
while (!I2C_GetFlagStatus(I2C1, I2C_FLAG_ADDR)) {
|
||||||
|
}
|
||||||
|
if (nbyte == 1) {
|
||||||
|
// Clear Ack bit
|
||||||
|
I2C_AcknowledgeConfig(I2C1, DISABLE);
|
||||||
|
// EV6_1 -- must be atomic -- Clear ADDR, generate STOP
|
||||||
|
__disable_irq();
|
||||||
|
(void) I2C1->SR2;
|
||||||
|
I2C_GenerateSTOP(I2C1, ENABLE);
|
||||||
|
__enable_irq();
|
||||||
|
// Receive data EV7
|
||||||
|
while (!I2C_GetFlagStatus(I2C1, I2C_FLAG_RXNE)) {
|
||||||
|
}
|
||||||
|
*buf++ = I2C_ReceiveData(I2C1);
|
||||||
|
} else if (nbyte == 2) {
|
||||||
|
// Set POS flag
|
||||||
|
I2C_NACKPositionConfig(I2C1, I2C_NACKPosition_Next);
|
||||||
|
// EV6_1 -- must be atomic and in this order
|
||||||
|
__disable_irq();
|
||||||
|
(void) I2C1->SR2; // Clear ADDR flag
|
||||||
|
I2C_AcknowledgeConfig(I2C1, DISABLE); // Clear Ack bit
|
||||||
|
__enable_irq();
|
||||||
|
// EV7_3 -- Wait for BTF, program stop, read data twice
|
||||||
|
while (!I2C_GetFlagStatus(I2C1, I2C_FLAG_BTF)) {
|
||||||
|
}
|
||||||
|
__disable_irq();
|
||||||
|
I2C_GenerateSTOP(I2C1, ENABLE);
|
||||||
|
*buf++ = I2C1->DR;
|
||||||
|
__enable_irq();
|
||||||
|
*buf++ = I2C1->DR;
|
||||||
|
} else {
|
||||||
|
(void) I2C1->SR2; // Clear ADDR flag
|
||||||
|
while (nbyte-- != 3) {
|
||||||
|
// EV7 -- cannot guarantee 1 transfer completion time, wait for BTF
|
||||||
|
// instead of RXNE
|
||||||
|
while (!I2C_GetFlagStatus(I2C1, I2C_FLAG_BTF)) {
|
||||||
|
}
|
||||||
|
*buf++ = I2C_ReceiveData(I2C1);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!I2C_GetFlagStatus(I2C1, I2C_FLAG_BTF)) {
|
||||||
|
}
|
||||||
|
// EV7_2 -- Figure 1 has an error, doesn't read N-2 !
|
||||||
|
I2C_AcknowledgeConfig(I2C1, DISABLE); // clear ack bit
|
||||||
|
__disable_irq();
|
||||||
|
*buf++ = I2C_ReceiveData(I2C1); // receive byte N-2
|
||||||
|
I2C_GenerateSTOP(I2C1, ENABLE); // program stop
|
||||||
|
__enable_irq();
|
||||||
|
*buf++ = I2C_ReceiveData(I2C1); // receive byte N-1
|
||||||
|
// wait for byte N
|
||||||
|
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)) {
|
||||||
|
}
|
||||||
|
*buf++ = I2C_ReceiveData(I2C1);
|
||||||
|
nbyte = 0;
|
||||||
|
}
|
||||||
|
// Wait for stop
|
||||||
|
while (I2C_GetFlagStatus(I2C1, I2C_FLAG_STOPF)) {
|
||||||
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
/******************************** END OF FILE *********************************/
|
|
||||||
|
|||||||
@@ -205,5 +205,4 @@ void USB_LP_CAN1_RX0_IRQHandler(void) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/********************************* END OF FILE ******************************/
|
|
||||||
|
|
||||||
|
|||||||
@@ -20,28 +20,24 @@ void I2C_RegisterWrite(uint8_t reg, uint8_t data) {
|
|||||||
tx_data[0] = reg;
|
tx_data[0] = reg;
|
||||||
tx_data[1] = data;
|
tx_data[1] = data;
|
||||||
I2C_PageWrite(tx_data, 2, DEVICE_ADDR);
|
I2C_PageWrite(tx_data, 2, DEVICE_ADDR);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t I2C_RegisterRead(uint8_t reg) {
|
uint8_t I2C_RegisterRead(uint8_t reg) {
|
||||||
u8 tx_data[3];
|
u8 tx_data[3];
|
||||||
tx_data[0] = reg;
|
tx_data[0] = reg;
|
||||||
|
|
||||||
I2C_PageRead(tx_data, 1, DEVICE_ADDR, reg);
|
I2C_PageRead(tx_data, 1, DEVICE_ADDR, reg);
|
||||||
return tx_data[0];
|
return tx_data[0];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void StartUp_Acceleromter(void) {
|
void StartUp_Accelerometer(void) {
|
||||||
|
|
||||||
I2C_RegisterWrite(CTRL_REG2, 0); //Normal mode
|
I2C_RegisterWrite(CTRL_REG2, 0); //Normal mode
|
||||||
I2C_RegisterWrite( CTRL_REG2, 0x40); // Reset all registers to POR values
|
I2C_RegisterWrite( CTRL_REG2, 0x40); // Reset all registers to POR values
|
||||||
delayMs(2); // ~1ms delay
|
delayMs(2); // ~1ms delay
|
||||||
I2C_RegisterWrite(FF_MT_CFG_REG, 0x78);// Enable motion detection for X and Y axis, latch enabled
|
I2C_RegisterWrite(FF_MT_CFG_REG, 0x78); // Enable motion detection for X and Y axis, latch enabled
|
||||||
I2C_RegisterWrite(FF_MT_THS_REG, 0x0F); // Set threshold
|
I2C_RegisterWrite(FF_MT_THS_REG, 0x0F); // Set threshold
|
||||||
I2C_RegisterWrite(FF_MT_COUNT_REG, 0x01); // Set debounce to 100ms
|
I2C_RegisterWrite(FF_MT_COUNT_REG, 0x01); // Set debounce to 100ms
|
||||||
|
|
||||||
I2C_RegisterWrite( CTRL_REG4, 0x04); // Enable motion interrupt
|
I2C_RegisterWrite( CTRL_REG4, 0x04); // Enable motion interrupt
|
||||||
I2C_RegisterWrite( CTRL_REG5, 0x04); // Route motion interrupts to INT1 ->PB5 ->EXTI
|
I2C_RegisterWrite( CTRL_REG5, 0x04);// Route motion interrupts to INT1 ->PB5 ->EXTI
|
||||||
I2C_RegisterWrite( CTRL_REG1, 0x19); // ODR=100 Hz, Active mode
|
I2C_RegisterWrite( CTRL_REG1, 0x19); // ODR=100 Hz, Active mode
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,53 +1,42 @@
|
|||||||
/********************* (C) COPYRIGHT 2015 e-Design Co.,Ltd. **********************
|
/*
|
||||||
File Name : main.c
|
* Created by Ben V. Brown
|
||||||
Version : S100 APP Ver 2.11
|
*/
|
||||||
Description:
|
|
||||||
Author : Celery
|
|
||||||
Data: 2015/07/07
|
|
||||||
History:
|
|
||||||
2016/8/11 Updates by Ben V. Brown <ralim@ralimtek.com> - Cleanup and english comments
|
|
||||||
2015/07/07 ͳһ<CDB3><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
||||||
*******************************************************************************/
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include "APP_Version.h"
|
|
||||||
#include "Modes.h"
|
#include "Modes.h"
|
||||||
#include "Bios.h"
|
#include "Bios.h"
|
||||||
#include "I2C.h"
|
|
||||||
#include "MMA8652FC.h"
|
#include "MMA8652FC.h"
|
||||||
#include "PID.h"
|
#include "PID.h"
|
||||||
#include "Oled.h"
|
#include "Oled.h"
|
||||||
#include "Interrupt.h"
|
#include "Settings.h"
|
||||||
|
#include "I2C.h"
|
||||||
|
void setup();
|
||||||
|
|
||||||
int main(void) {
|
int main(void) {
|
||||||
RCC_Config(); //setup system clock
|
setup();/*Setup the system*/
|
||||||
//NVIC_Config(0x4000);//this shifts the NVIC table to be offset
|
|
||||||
NVIC_Config(0x0000);
|
|
||||||
GPIO_Config(); //setup all the GPIO pins
|
|
||||||
Init_EXTI();
|
|
||||||
//Init_Timer2(); //init the timers
|
|
||||||
|
|
||||||
Init_Timer3();
|
|
||||||
I2C_Configuration(); //init the i2c bus
|
|
||||||
|
|
||||||
Adc_Init(); //init adc and dma
|
|
||||||
StartUp_Acceleromter(); //start the accelerometer
|
|
||||||
|
|
||||||
Init_Oled(); //init the OLED display
|
|
||||||
Clear_Screen(); //clear the display buffer to black
|
|
||||||
systemSettings.SleepTemp = 900;
|
|
||||||
systemSettings.SleepTime = 1;
|
|
||||||
systemSettings.SolderingTemp = 1000;
|
|
||||||
systemSettings.movementEnabled = 1; //we use movement detection
|
|
||||||
readIronTemp(239, 0); //load the default calibration value
|
|
||||||
setupPID(); //init the PID values
|
|
||||||
|
|
||||||
Start_Watchdog(3000); //start the system watchdog as 3 seconds
|
|
||||||
while (1) {
|
while (1) {
|
||||||
Clear_Watchdog(); //reset the Watchdog
|
Clear_Watchdog(); //reset the Watchdog timer
|
||||||
ProcessUI();
|
ProcessUI();
|
||||||
DrawUI();
|
DrawUI();
|
||||||
delayMs(50);
|
delayMs(50); //Slow the system down a little bit
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/******************************** END OF FILE *********************************/
|
void setup() {
|
||||||
|
RCC_Config(); //setup system clock
|
||||||
|
NVIC_Config(0x4000); //this shifts the NVIC table to be offset, for the usb bootloader's size
|
||||||
|
GPIO_Config(); //setup all the GPIO pins
|
||||||
|
Init_EXTI(); //init the EXTI inputs
|
||||||
|
Init_Timer3(); //Used for the soldering iron tip
|
||||||
|
Adc_Init(); //init adc and dma
|
||||||
|
I2C_Configuration(); //Start the I2C hardware
|
||||||
|
GPIO_Init_OLED(); //Init the GPIO ports for the OLED
|
||||||
|
StartUp_Accelerometer(); //start the accelerometer
|
||||||
|
|
||||||
|
setupPID(); //init the PID values
|
||||||
|
readIronTemp(239, 0); //load the default calibration value
|
||||||
|
restoreSettings(); //Load settings
|
||||||
|
Init_Oled(systemSettings.flipDisplay);//init the OLED display
|
||||||
|
|
||||||
|
OLED_DrawString("VER 1.03",8);
|
||||||
|
delayMs(800);
|
||||||
|
Start_Watchdog(1000); //start the system watchdog as 1 seconds timeout
|
||||||
|
}
|
||||||
|
|||||||
@@ -8,24 +8,26 @@
|
|||||||
//This does the required processing and state changes
|
//This does the required processing and state changes
|
||||||
void ProcessUI() {
|
void ProcessUI() {
|
||||||
uint8_t Buttons = getButtons(); //read the buttons status
|
uint8_t Buttons = getButtons(); //read the buttons status
|
||||||
|
static uint32_t lastModeChange = 0;
|
||||||
if (millis() - getLastButtonPress() < 200)
|
if (millis() - getLastButtonPress() < 200)
|
||||||
Buttons = 0;
|
Buttons = 0;
|
||||||
//rough prevention for debouncing and allocates settling time
|
//rough prevention for de-bouncing and allocates settling time
|
||||||
//OLED_DrawThreeNumber(Buttons, 0);
|
|
||||||
switch (operatingMode) {
|
switch (operatingMode) {
|
||||||
case STARTUP:
|
case STARTUP:
|
||||||
if ((millis() - getLastButtonPress() > 1000)) {
|
if ((millis() - getLastButtonPress() > 1000)) {
|
||||||
if (Buttons & BUT_A) {
|
if (Buttons == (BUT_A | BUT_B)) {
|
||||||
//A key pressed so we are moving to soldering mode
|
operatingMode = THERMOMETER;
|
||||||
operatingMode = SOLDERING;
|
|
||||||
delayMs(500);
|
|
||||||
resetLastButtonPress();
|
resetLastButtonPress();
|
||||||
resetButtons();
|
resetButtons();
|
||||||
} else if (Buttons & BUT_B) {
|
} else if (Buttons == BUT_A) {
|
||||||
|
//A key pressed so we are moving to soldering mode
|
||||||
|
operatingMode = SOLDERING;
|
||||||
|
resetLastButtonPress();
|
||||||
|
resetButtons();
|
||||||
|
} else if (Buttons == BUT_B) {
|
||||||
//B Button was pressed so we are moving to the Settings menu
|
//B Button was pressed so we are moving to the Settings menu
|
||||||
operatingMode = SETTINGS;
|
operatingMode = SETTINGS;
|
||||||
delayMs(500);
|
|
||||||
resetLastButtonPress();
|
resetLastButtonPress();
|
||||||
resetButtons();
|
resetButtons();
|
||||||
}
|
}
|
||||||
@@ -34,16 +36,18 @@ void ProcessUI() {
|
|||||||
break;
|
break;
|
||||||
case SOLDERING:
|
case SOLDERING:
|
||||||
//We need to check the buttons if we need to jump out
|
//We need to check the buttons if we need to jump out
|
||||||
if (Buttons & BUT_A) {
|
if (Buttons == BUT_A || Buttons == BUT_B) {
|
||||||
//A key pressed so we are moving to temp set
|
//A or B key pressed so we are moving to temp set
|
||||||
operatingMode = TEMP_ADJ;
|
operatingMode = TEMP_ADJ;
|
||||||
resetLastButtonPress();
|
resetLastButtonPress();
|
||||||
resetButtons();
|
resetButtons();
|
||||||
} else if (Buttons & BUT_B) {
|
} else if (Buttons == (BUT_A | BUT_B)) {
|
||||||
//B Button was pressed so we are moving back to idle
|
if (millis() - getLastButtonPress() > 1000) {
|
||||||
operatingMode = STARTUP;
|
//Both buttons were pressed, exit back to the cooling screen
|
||||||
resetLastButtonPress();
|
operatingMode = COOLING;
|
||||||
resetButtons();
|
resetLastButtonPress();
|
||||||
|
resetButtons();
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
//We need to check the timer for movement in case we need to goto idle
|
//We need to check the timer for movement in case we need to goto idle
|
||||||
if (systemSettings.movementEnabled)
|
if (systemSettings.movementEnabled)
|
||||||
@@ -55,12 +59,18 @@ void ProcessUI() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
uint16_t voltage = readDCVoltage(); //get X10 voltage
|
||||||
|
if ((voltage / 10) < systemSettings.cutoutVoltage) {
|
||||||
|
operatingMode = UVLOWARN;
|
||||||
|
resetLastButtonPress();
|
||||||
|
resetButtons();
|
||||||
|
lastModeChange = millis();
|
||||||
|
}
|
||||||
//If no buttons pushed we need to perform the PID loop for the iron temp
|
//If no buttons pushed we need to perform the PID loop for the iron temp
|
||||||
int32_t newOutput = computePID(systemSettings.SolderingTemp);
|
int32_t newOutput = computePID(systemSettings.SolderingTemp);
|
||||||
if (newOutput >= 0) {
|
|
||||||
setIronTimer(newOutput);
|
setIronTimer(newOutput);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TEMP_ADJ:
|
case TEMP_ADJ:
|
||||||
@@ -77,37 +87,37 @@ void ProcessUI() {
|
|||||||
} else {
|
} else {
|
||||||
//we check the timeout for how long the buttons have not been pushed
|
//we check the timeout for how long the buttons have not been pushed
|
||||||
//if idle for > 3 seconds then we return to soldering
|
//if idle for > 3 seconds then we return to soldering
|
||||||
if (millis() - getLastButtonPress() > 3000)
|
if (millis() - getLastButtonPress() > 3000) {
|
||||||
operatingMode = SOLDERING;
|
operatingMode = SOLDERING;
|
||||||
|
saveSettings();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SETTINGS:
|
case SETTINGS:
|
||||||
//Settings is the mode with the most logic
|
//Settings is the mode with the most logic
|
||||||
//Here we are in the menu so we need to increment through the sub menus / increase the value
|
//Here we are in the menu so we need to increment through the sub menus / increase the value
|
||||||
if (millis() - getLastButtonPress() < 400)
|
if (millis() - getLastButtonPress() < 300)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (Buttons & BUT_A) {
|
if (Buttons & BUT_A) {
|
||||||
resetLastButtonPress();
|
resetLastButtonPress();
|
||||||
//A key iterates through the menu
|
//A key iterates through the menu
|
||||||
if (settingsPage == 2) {
|
if (settingsPage == SETTINGSOPTIONSCOUNT) {
|
||||||
//Roll off the end
|
//Roll off the end
|
||||||
settingsPage = 0; //reset
|
settingsPage = 0; //reset
|
||||||
operatingMode = STARTUP;
|
operatingMode = STARTUP; //reset back to the startup
|
||||||
//TODO Save settings
|
saveSettings(); //Save the settings
|
||||||
} else
|
} else
|
||||||
++settingsPage; //move to the next option
|
++settingsPage; //move to the next option
|
||||||
} else if (Buttons & BUT_B) {
|
} else if (Buttons & BUT_B) {
|
||||||
resetLastButtonPress();
|
resetLastButtonPress();
|
||||||
//B changes the value selected
|
//B changes the value selected
|
||||||
switch (settingsPage) {
|
switch (settingsPage) {
|
||||||
case UVLO:
|
case UVCO:
|
||||||
//we are incrementing the cutout voltage
|
//we are incrementing the cutout voltage
|
||||||
systemSettings.cutoutVoltage += 1; //Go up 1V at a jump
|
systemSettings.cutoutVoltage += 1; //Go up 1V at a jump
|
||||||
if (systemSettings.cutoutVoltage > 24)
|
if (systemSettings.cutoutVoltage > 24)
|
||||||
systemSettings.cutoutVoltage = 9;
|
systemSettings.cutoutVoltage = 10;
|
||||||
else if (systemSettings.cutoutVoltage < 9)
|
|
||||||
systemSettings.cutoutVoltage = 9; //cant set UVLO below 9V
|
|
||||||
break;
|
break;
|
||||||
case SLEEP_TEMP:
|
case SLEEP_TEMP:
|
||||||
systemSettings.SleepTemp += 100; //Go up 10c at a time
|
systemSettings.SleepTemp += 100; //Go up 10c at a time
|
||||||
@@ -116,10 +126,20 @@ void ProcessUI() {
|
|||||||
break;
|
break;
|
||||||
case SLEEP_TIME:
|
case SLEEP_TIME:
|
||||||
++systemSettings.SleepTime; //Go up 1 minute at a time
|
++systemSettings.SleepTime; //Go up 1 minute at a time
|
||||||
if (systemSettings.SleepTime > 60)
|
if (systemSettings.SleepTime > 30)
|
||||||
systemSettings.SleepTime = 2; //cant set time over an hour
|
systemSettings.SleepTime = 1; //cant set time over 30 mins
|
||||||
//Remember that ^ is the time of no movement
|
//Remember that ^ is the time of no movement
|
||||||
break;
|
break;
|
||||||
|
case MOTIONDETECT:
|
||||||
|
systemSettings.movementEnabled =
|
||||||
|
!systemSettings.movementEnabled;
|
||||||
|
break;
|
||||||
|
case TEMPDISPLAY:
|
||||||
|
systemSettings.displayTempInF = !systemSettings.displayTempInF;
|
||||||
|
break;
|
||||||
|
case LEFTY:
|
||||||
|
systemSettings.flipDisplay = !systemSettings.flipDisplay;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -146,16 +166,62 @@ void ProcessUI() {
|
|||||||
}
|
}
|
||||||
//else if nothing has been pushed we need to compute the PID to keep the iron at the sleep temp
|
//else if nothing has been pushed we need to compute the PID to keep the iron at the sleep temp
|
||||||
int32_t newOutput = computePID(systemSettings.SleepTemp);
|
int32_t newOutput = computePID(systemSettings.SleepTemp);
|
||||||
if (newOutput >= 0) {
|
|
||||||
setIronTimer(newOutput);
|
setIronTimer(newOutput);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case COOLING: {
|
||||||
|
setIronTimer(0); //turn off heating
|
||||||
|
//This mode warns the user the iron is still cooling down
|
||||||
|
uint16_t temp = readIronTemp(0, 1); //take a new reading as the heater code is not taking new readings
|
||||||
|
if (temp < 400) { //if the temp is < 40C then we can go back to IDLE
|
||||||
|
operatingMode = STARTUP;
|
||||||
|
resetLastButtonPress();
|
||||||
|
resetButtons();
|
||||||
|
} else if (Buttons & (BUT_A | BUT_B)) { //we check if the user has pushed a button to ack
|
||||||
|
//Either button was pushed
|
||||||
|
operatingMode = STARTUP;
|
||||||
|
resetLastButtonPress();
|
||||||
|
resetButtons();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case UVLOWARN:
|
||||||
|
//We are here if the DC voltage went too low
|
||||||
|
//We want to jump back to IDLE after a bit
|
||||||
|
if (millis() - lastModeChange > 3000) { //its been 3 seconds
|
||||||
|
operatingMode = STARTUP; //jump back to idle mode
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case THERMOMETER: {
|
||||||
|
//This lets the user check the tip temp without heating the iron.. And eventually calibration will be added here
|
||||||
|
if ((millis() - getLastButtonPress() > 1000))
|
||||||
|
if (Buttons == (BUT_A | BUT_B)) {
|
||||||
|
//If the user is holding both button, exit the temp screen
|
||||||
|
operatingMode = STARTUP;
|
||||||
|
resetLastButtonPress();
|
||||||
|
resetButtons();
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
* Draws the temp with temp conversion if needed
|
||||||
|
*/
|
||||||
|
void drawTemp(uint16_t temp, uint8_t x) {
|
||||||
|
if (systemSettings.displayTempInF)
|
||||||
|
temp = (temp * 9 + 1600) / 5;/*Convert to F -> T*(9/5)+32*/
|
||||||
|
OLED_DrawThreeNumber(temp / 10, x);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Performs all the OLED drawing for the current operating mode
|
||||||
|
*/
|
||||||
void DrawUI() {
|
void DrawUI() {
|
||||||
|
uint16_t temp = readIronTemp(0, 0);
|
||||||
switch (operatingMode) {
|
switch (operatingMode) {
|
||||||
case STARTUP:
|
case STARTUP:
|
||||||
//We are chilling in the idle mode
|
//We are chilling in the idle mode
|
||||||
@@ -166,58 +232,77 @@ void DrawUI() {
|
|||||||
Oled_DisplayOff();
|
Oled_DisplayOff();
|
||||||
} else {
|
} else {
|
||||||
Oled_DisplayOn();
|
Oled_DisplayOn();
|
||||||
OLED_DrawString("IDLE ", 7); //write the word IDLE
|
OLED_DrawString(" IDLE ", 8); //write the word IDLE
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SOLDERING:
|
case SOLDERING:
|
||||||
//The user is soldering
|
//The user is soldering
|
||||||
{
|
{
|
||||||
uint16_t temp = readIronTemp(0, 0);
|
if (getIronTimer() == 0) {
|
||||||
if (systemSettings.SolderingTemp + 2 < temp) {
|
OLED_DrawChar('C', 5);
|
||||||
OLED_DrawChar('C', 14 * 4);
|
|
||||||
} else {
|
} else {
|
||||||
if (getIronTimer() < 500) {
|
if (getIronTimer() < 900) {
|
||||||
OLED_DrawChar(' ', 14 * 4);
|
OLED_DrawChar(' ', 5);
|
||||||
} else { //we are heating
|
} else { //we are heating
|
||||||
OLED_DrawChar('H', 14 * 4);
|
OLED_DrawChar('H', 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
OLED_DrawThreeNumber(temp / 10, 0);
|
drawTemp(temp, 0);
|
||||||
OLED_DrawChar(' ', 14 * 3);
|
OLED_DrawChar(' ', 3);
|
||||||
OLED_DrawChar(' ', 14 * 5);
|
OLED_DrawChar(' ', 4);
|
||||||
OLED_DrawChar(' ', 14 * 6);
|
OLED_DrawChar(' ', 6);
|
||||||
|
OLED_DrawChar(' ', 7);
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TEMP_ADJ:
|
case TEMP_ADJ:
|
||||||
//We are prompting the user to change the temp so we draw the current setpoint temp
|
//We are prompting the user to change the temp so we draw the current setpoint temp
|
||||||
//With the nifty arrows
|
//With the nifty arrows
|
||||||
|
|
||||||
OLED_DrawChar(' ', 0);
|
OLED_DrawChar(' ', 0);
|
||||||
OLED_DrawThreeNumber(systemSettings.SolderingTemp / 10, 14 * 1);
|
OLED_DrawChar('<', 1);
|
||||||
OLED_DrawChar(' ', 14 * 4);
|
drawTemp(systemSettings.SolderingTemp, 2);
|
||||||
OLED_DrawChar(' ', 14 * 5);
|
OLED_DrawChar(' ', 5);
|
||||||
|
OLED_DrawChar(' ', 6);
|
||||||
|
OLED_DrawChar('>', 7);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case SETTINGS:
|
case SETTINGS:
|
||||||
//We are prompting the user the setting name
|
//We are prompting the user the setting name
|
||||||
|
|
||||||
switch (settingsPage) {
|
switch (settingsPage) {
|
||||||
case UVLO:
|
case UVCO:
|
||||||
OLED_DrawString("UVLO", 4);
|
OLED_DrawString("UVCO ", 5);
|
||||||
OLED_DrawTwoNumber(systemSettings.cutoutVoltage, 14 * 4);
|
OLED_DrawTwoNumber(systemSettings.cutoutVoltage, 5);
|
||||||
//OLED_DrawChar('V', 14 * 5);
|
OLED_DrawChar('V', 7);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case SLEEP_TEMP:
|
case SLEEP_TEMP:
|
||||||
OLED_DrawString("STMP", 4);
|
OLED_DrawString("STMP ", 5);
|
||||||
OLED_DrawThreeNumber(systemSettings.SleepTemp / 10, 14 * 4);
|
OLED_DrawThreeNumber(systemSettings.SleepTemp / 10, 5);
|
||||||
//OLED_DrawChar('V', 14 * 5);
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case SLEEP_TIME:
|
case SLEEP_TIME:
|
||||||
OLED_DrawString("STME ", 5);
|
OLED_DrawString("STIME ", 6);
|
||||||
OLED_DrawTwoNumber(systemSettings.SleepTime, 14 * 5);
|
OLED_DrawTwoNumber(systemSettings.SleepTime, 6);
|
||||||
|
break;
|
||||||
|
case MOTIONDETECT:/*Toggle the mode*/
|
||||||
|
if (systemSettings.movementEnabled)
|
||||||
|
OLED_DrawString("MOTION T", 8);
|
||||||
|
else
|
||||||
|
OLED_DrawString("MOTION F", 8);
|
||||||
|
break;
|
||||||
|
case TEMPDISPLAY:/*Are we showing in C or F ?*/
|
||||||
|
if (systemSettings.displayTempInF)
|
||||||
|
OLED_DrawString("TMPUNT F", 8);
|
||||||
|
else
|
||||||
|
OLED_DrawString("TMPUNT C", 8);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LEFTY:
|
||||||
|
|
||||||
|
if (systemSettings.flipDisplay)
|
||||||
|
OLED_DrawString("FLPDSP T", 8);
|
||||||
|
else
|
||||||
|
OLED_DrawString("FLPDSP F", 8);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@@ -227,9 +312,20 @@ void DrawUI() {
|
|||||||
//The iron is in sleep temp mode
|
//The iron is in sleep temp mode
|
||||||
//Draw in temp and sleep
|
//Draw in temp and sleep
|
||||||
OLED_DrawString("SLP", 3);
|
OLED_DrawString("SLP", 3);
|
||||||
uint16_t temp = readIronTemp(0, 0);
|
drawTemp(temp, 4);
|
||||||
OLED_DrawThreeNumber(temp / 10, 14 * 3);
|
break;
|
||||||
|
case COOLING:
|
||||||
|
//We are warning the user the tip is cooling
|
||||||
|
OLED_DrawString("COOL", 4);
|
||||||
|
drawTemp(temp, 5);
|
||||||
|
break;
|
||||||
|
case UVLOWARN:
|
||||||
|
OLED_DrawString("LOW VOLT", 8);
|
||||||
|
break;
|
||||||
|
case THERMOMETER:
|
||||||
|
temp = readIronTemp(0, 1);//Force a reading as heater is off
|
||||||
|
OLED_DrawString("TEMP ", 5);//extra one to it clears the leftover 'L' from IDLE
|
||||||
|
drawTemp(temp, 5);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -1,71 +1,92 @@
|
|||||||
/********************* (C) COPYRIGHT 2015 e-Design Co.,Ltd. **********************
|
/*
|
||||||
File Name : Oled.c
|
*
|
||||||
Version : S100 APP Ver 2.11
|
* OLED.c
|
||||||
Description:
|
* Functions for working with the oled screen.
|
||||||
Author : Celery
|
* Writes to the screen using I2C
|
||||||
Data: 2015/07/07
|
*/
|
||||||
History:
|
|
||||||
2015/07/07 ͳһ<CDB3><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "APP_Version.h"
|
|
||||||
#include "Oled.h"
|
#include "Oled.h"
|
||||||
#include "Bios.h"
|
#include "Bios.h"
|
||||||
#include "I2C.h"
|
#include "I2C.h"
|
||||||
|
|
||||||
#include "Font.h"
|
#include "Font.h"
|
||||||
|
int8_t displayOffset = 32;
|
||||||
|
/*Setup params for the OLED screen*/
|
||||||
|
/*http://www.displayfuture.com/Display/datasheet/controller/SSD1307.pdf*/
|
||||||
|
/*All commands are prefixed with 0x80*/
|
||||||
|
u8 OLED_Setup_Array[46] = { 0x80, 0xAE,/*Display off*/
|
||||||
|
0x80, 0xD5,/*Set display clock divide ratio / osc freq*/
|
||||||
|
0x80, 0x52,/**/
|
||||||
|
0x80, 0xA8,/*Set Multiplex Ratio*/
|
||||||
|
0x80, 0x0F, /*16 == max brightness,39==dimmest*/
|
||||||
|
0x80, 0xC0,/*Set COM Scan direction*/
|
||||||
|
0x80, 0xD3,/*Set Display offset*/
|
||||||
|
0x80, 0x00,/*0 Offset*/
|
||||||
|
0x80, 0x40,/*Set Display start line to 0*/
|
||||||
|
0x80, 0xA0,/*Set Segment remap to normal*/
|
||||||
|
0x80, 0x8D,/*Unknown*/
|
||||||
|
0x80, 0x14,/**/
|
||||||
|
0x80, 0xDA,/*Set VCOM Pins hardware config*/
|
||||||
|
0x80, 0x02,/*Combination 2*/
|
||||||
|
0x80, 0x81,/*Contrast*/
|
||||||
|
0x80, 0x33,/*51*/
|
||||||
|
0x80, 0xD9,/*Set pre-charge period*/
|
||||||
|
0x80, 0xF1,/**/
|
||||||
|
0x80, 0xDB,/*Adjust VCOMH regulator ouput*/
|
||||||
|
0x80, 0x30,/**/
|
||||||
|
0x80, 0xA4,/*Enable the display GDDR*/
|
||||||
|
0x80, 0XA6,/*Normal display*/
|
||||||
|
0x80, 0xAF /*Dispaly on*/
|
||||||
|
};
|
||||||
|
|
||||||
u8 gOled_param[46] = { 0x80, 0xAE, 0x80, 0xD5, 0x80, 0x52, 0x80, 0xA8, 0x80,
|
/*
|
||||||
0x0f, 0x80, 0xC0, 0x80, 0xD3, 0x80, 0x00, 0x80, 0x40, 0x80, 0xA0, 0x80,
|
|
||||||
0x8D, 0x80, 0x14, 0x80, 0xDA, 0x80, 0x02, 0x80, 0x81, 0x80, 0x33, 0x80,
|
|
||||||
0xD9, 0x80, 0xF1, 0x80, 0xDB, 0x80, 0x30, 0x80, 0xA4, 0x80, 0XA6, 0x80,
|
|
||||||
0xAF };
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
|
|
||||||
*******************************************************************************/
|
|
||||||
void Sc_Pt(u8 Co) {
|
|
||||||
u8 pt[4] = { 0x80, 0x81, 0x80, Co };
|
|
||||||
|
|
||||||
I2C_PageWrite(pt, 4, DEVICEADDR_OLED);
|
|
||||||
}
|
|
||||||
/*******************************************************************************
|
|
||||||
Function: Oled_DisplayOn
|
Function: Oled_DisplayOn
|
||||||
Description:Turn on the Oled display
|
Description:Turn on the Oled display
|
||||||
*******************************************************************************/
|
*/
|
||||||
void Oled_DisplayOn(void) {
|
void Oled_DisplayOn(void) {
|
||||||
u8 data[6] = { 0x80, 0X8D, 0x80, 0X14, 0x80, 0XAF };
|
u8 data[6] = { 0x80, 0X8D, 0x80, 0X14, 0x80, 0XAF };
|
||||||
|
|
||||||
I2C_PageWrite(data, 6, DEVICEADDR_OLED);
|
I2C_PageWrite(data, 6, DEVICEADDR_OLED);
|
||||||
}
|
}
|
||||||
/*******************************************************************************
|
/*
|
||||||
Function: Oled_DisplayOff
|
Function: Oled_DisplayOff
|
||||||
Description:Turn off the Oled display
|
Description:Turn off the Oled display
|
||||||
*******************************************************************************/
|
*/
|
||||||
void Oled_DisplayOff(void) {
|
void Oled_DisplayOff(void) {
|
||||||
u8 data[6] = { 0x80, 0X8D, 0x80, 0X10, 0x80, 0XAE };
|
u8 data[6] = { 0x80, 0X8D, 0x80, 0X10, 0x80, 0XAE };
|
||||||
|
|
||||||
I2C_PageWrite(data, 6, DEVICEADDR_OLED);
|
I2C_PageWrite(data, 6, DEVICEADDR_OLED);
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
* This sets the OLED screen to invert the screen (flip it vertically)
|
||||||
|
* This is used if the unit is set to left hand mode
|
||||||
|
*/
|
||||||
|
void Oled_DisplayFlip() {
|
||||||
|
u8 data[2] = { 0x80, 0XC8 };
|
||||||
|
I2C_PageWrite(data, 2, DEVICEADDR_OLED);
|
||||||
|
data[1] = 0xA1;
|
||||||
|
I2C_PageWrite(data, 2, DEVICEADDR_OLED);
|
||||||
|
displayOffset = 0;
|
||||||
|
|
||||||
/*******************************************************************************
|
}
|
||||||
Function: Data_Command
|
/*
|
||||||
Description: write a command to the Oled display
|
Description: write a command to the Oled display
|
||||||
Input: number of bytes to write, array to write
|
Input: number of bytes to write, array to write
|
||||||
Output:
|
Output:
|
||||||
*******************************************************************************/
|
*/
|
||||||
u8* Data_Command(u8 wide, u8* ptr) {
|
u8* Data_Command(u8 length, u8* data) {
|
||||||
int i;
|
int i;
|
||||||
u8 tx_data[128];
|
u8 tx_data[129];
|
||||||
//here are are inserting the data write command at the beginning
|
//here are are inserting the data write command at the beginning
|
||||||
tx_data[0] = 0x40;
|
tx_data[0] = 0x40;
|
||||||
wide += 1;
|
length++;
|
||||||
for (i = 1; i < wide; i++) //Loop through the array of data
|
for (i = 1; i < length; i++) //Loop through the array of data
|
||||||
tx_data[i] = *ptr++;
|
tx_data[i] = *data++;
|
||||||
I2C_PageWrite(tx_data, wide, DEVICEADDR_OLED); //write out the buffer
|
I2C_PageWrite(tx_data, length, DEVICEADDR_OLED); //write out the buffer
|
||||||
return ptr;
|
return data;
|
||||||
}
|
}
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
Function:Set_ShowPos
|
Function:Set_ShowPos
|
||||||
@@ -73,11 +94,10 @@ u8* Data_Command(u8 wide, u8* ptr) {
|
|||||||
Input:x,y co-ordinates
|
Input:x,y co-ordinates
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
void Set_ShowPos(u8 x, u8 y) {
|
void Set_ShowPos(u8 x, u8 y) {
|
||||||
u8 pos_param[8] = { 0x80, 0xB0, 0x80, 0x21, 0x80, 0x20, 0x80, 0x7F };
|
u8 pos_param[8] = { 0x80, 0xB0, 0x80, 0x21, 0x80, 0x00, 0x80, 0x7F };
|
||||||
|
//page 0, start add = x(below) through to 0x7F (aka 127)
|
||||||
pos_param[5] = x + 32;
|
pos_param[5] = x + displayOffset;/*Display offset ==0 for Lefty, == 32 for righty*/
|
||||||
pos_param[1] += y;
|
pos_param[1] += y;
|
||||||
|
|
||||||
I2C_PageWrite(pos_param, 8, DEVICEADDR_OLED);
|
I2C_PageWrite(pos_param, 8, DEVICEADDR_OLED);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -108,20 +128,6 @@ u8* Oled_DrawArea(u8 x0, u8 y0, u8 wide, u8 high, u8* ptr) {
|
|||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
Function:Clean_Char
|
|
||||||
Description:Overwries a square to off, used to overwrite a char
|
|
||||||
Inputs:(k) input X position char starts at, (wide) how many pixels wide the char is
|
|
||||||
*******************************************************************************/
|
|
||||||
void Clean_Char(int k, u8 wide) {
|
|
||||||
int i;
|
|
||||||
u8 tx_data[128];
|
|
||||||
|
|
||||||
memset(&tx_data[0], 0, wide);
|
|
||||||
for (i = 0; i < 2; i++) {
|
|
||||||
Oled_DrawArea(k, i * 8, wide, 8, tx_data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
Function:GPIO_Init_OLED
|
Function:GPIO_Init_OLED
|
||||||
Description:Init the outputs as needed for the OLED (in this case the RST line)
|
Description:Init the outputs as needed for the OLED (in this case the RST line)
|
||||||
@@ -138,15 +144,20 @@ void GPIO_Init_OLED(void) {
|
|||||||
Function: Init_Oled
|
Function: Init_Oled
|
||||||
Description: Initalizes the Oled screen
|
Description: Initalizes the Oled screen
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
void Init_Oled(void) {
|
void Init_Oled(uint8_t leftHanded) {
|
||||||
u8 param_len;
|
u8 param_len;
|
||||||
|
|
||||||
OLED_RST();
|
OLED_RST();
|
||||||
delayMs(2); //reset the oled
|
delayMs(5);
|
||||||
OLED_ACT();
|
OLED_ACT(); //Toggling reset to reset the oled
|
||||||
delayMs(2);
|
delayMs(5);
|
||||||
param_len = 46;
|
param_len = 46;
|
||||||
I2C_PageWrite((u8 *) gOled_param, param_len, DEVICEADDR_OLED);
|
if (leftHanded) {
|
||||||
|
OLED_Setup_Array[11] = 0xC8;
|
||||||
|
OLED_Setup_Array[19] = 0xA1;
|
||||||
|
displayOffset = 0;
|
||||||
|
}
|
||||||
|
I2C_PageWrite((u8 *) OLED_Setup_Array, param_len, DEVICEADDR_OLED);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
@@ -155,54 +166,71 @@ void Init_Oled(void) {
|
|||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
void Clear_Screen(void) {
|
void Clear_Screen(void) {
|
||||||
u8 tx_data[128];
|
u8 tx_data[128];
|
||||||
memset(&tx_data[0], 0, 128);
|
memset(tx_data, 0, 128);
|
||||||
for (u8 i = 0; i < 2; i++) {
|
for (u8 i = 0; i < 2; i++) {
|
||||||
Oled_DrawArea(0, i * 8, 128, 8, tx_data);
|
Oled_DrawArea(0, i * 8, 128, 8, tx_data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
* Draws a string onto the screen starting at the left
|
||||||
|
*/
|
||||||
void OLED_DrawString(char* string, uint8_t length) {
|
void OLED_DrawString(char* string, uint8_t length) {
|
||||||
for (uint8_t i = 0; i < length; i++) {
|
for (uint8_t i = 0; i < length; i++) {
|
||||||
OLED_DrawChar(string[i], i * 14);
|
OLED_DrawChar(string[i], i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void OLED_DrawChar(char c, uint8_t x) {
|
|
||||||
if ((x) > (128 - 14))
|
|
||||||
return; //Rudimentary clipping to not draw off screen
|
|
||||||
u8* ptr;
|
|
||||||
ptr = (u8*) FONT;
|
|
||||||
if (c >= 'A' && c <= 'Z') {
|
|
||||||
ptr += (c - 'A' + 10) * (14 * 2); //alpha is ofset 10 chars into the array
|
|
||||||
} else if (c >= '0' && c <= '9')
|
|
||||||
ptr += (c - '0') * (14 * 2);
|
|
||||||
else if (c < 10)
|
|
||||||
ptr += (c) * (14 * 2);
|
|
||||||
else if (c == ' ') {
|
|
||||||
//blank on space bar
|
|
||||||
ptr += (36) * (14 * 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
Oled_DrawArea(x, 0, 14, 16, (u8*) ptr);
|
|
||||||
}
|
|
||||||
/*
|
/*
|
||||||
* Draw a 2 digit number to the display
|
* Draw a char onscreen at letter index x
|
||||||
* */
|
*/
|
||||||
void OLED_DrawTwoNumber(uint8_t in, uint8_t x) {
|
void OLED_DrawChar(char c, uint8_t x) {
|
||||||
OLED_DrawChar((in / 10)%10, x);
|
if (x > 7)
|
||||||
OLED_DrawChar(in % 10, x + 14);
|
return; //clipping
|
||||||
|
x *= FONT_WIDTH; //convert to a x coordinate
|
||||||
|
|
||||||
|
u8* ptr = (u8*) FONT;
|
||||||
|
if (c >= 'A' && c <= 'Z') {
|
||||||
|
ptr += (c - 'A' + 10) * (FONT_WIDTH * 2); //alpha is ofset 10 chars into the array
|
||||||
|
} else if (c >= '0' && c <= '9')
|
||||||
|
ptr += (c - '0') * (FONT_WIDTH * 2);
|
||||||
|
else if (c < 10)
|
||||||
|
ptr += (c) * (FONT_WIDTH * 2);
|
||||||
|
else if (c == ' ') {
|
||||||
|
//blank on space bar
|
||||||
|
ptr += (36) * (FONT_WIDTH * 2);
|
||||||
|
} else if (c == '<') {
|
||||||
|
ptr += (37) * (FONT_WIDTH * 2);
|
||||||
|
} else if (c == '>') {
|
||||||
|
ptr += (38) * (FONT_WIDTH * 2);
|
||||||
|
} else if (c == '.') {
|
||||||
|
ptr += (39) * (FONT_WIDTH * 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
Oled_DrawArea(x, 0, FONT_WIDTH, 16, (u8*) ptr);
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
* Draw a 2 digit number to the display at letter slot x
|
||||||
|
*/
|
||||||
|
void OLED_DrawTwoNumber(uint8_t in, uint8_t x) {
|
||||||
|
|
||||||
|
OLED_DrawChar((in / 10) % 10, x);
|
||||||
|
OLED_DrawChar(in % 10, x + 1);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Draw a 3 digit number to the display at letter slot x
|
||||||
|
*/
|
||||||
void OLED_DrawThreeNumber(uint16_t in, uint8_t x) {
|
void OLED_DrawThreeNumber(uint16_t in, uint8_t x) {
|
||||||
|
|
||||||
OLED_DrawChar((in / 100)%10, x);
|
OLED_DrawChar((in / 100) % 10, x);
|
||||||
OLED_DrawChar((in / 10)%10, x + 14);
|
OLED_DrawChar((in / 10) % 10, x + 1);
|
||||||
OLED_DrawChar(in % 10, x + 28);
|
OLED_DrawChar(in % 10, x + 2);
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
* Draw a 4 digit number to the display at letter slot x
|
||||||
|
*/
|
||||||
void OLED_DrawFourNumber(uint16_t in, uint8_t x) {
|
void OLED_DrawFourNumber(uint16_t in, uint8_t x) {
|
||||||
|
|
||||||
OLED_DrawChar((in / 1000)%10, x);
|
OLED_DrawChar((in / 1000) % 10, x);
|
||||||
OLED_DrawChar((in / 100)%10, x+14);
|
OLED_DrawChar((in / 100) % 10, x + 1);
|
||||||
OLED_DrawChar((in / 10)%10, x + 28);
|
OLED_DrawChar((in / 10) % 10, x + 2);
|
||||||
OLED_DrawChar(in % 10, x + 32);
|
OLED_DrawChar(in % 10, x + 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************** END OF FILE *********************************/
|
|
||||||
|
|
||||||
|
|||||||
@@ -6,37 +6,33 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "PID.h"
|
#include "PID.h"
|
||||||
#define MAXPIDOUTPUT 500000
|
#define MAXPIDOUTPUT 50000
|
||||||
//This funtion computes the new value for the ON time of the system
|
//This function computes the new value for the ON time of the system
|
||||||
//This is the return value from this function
|
//This is the return value from this function
|
||||||
int32_t computePID(uint16_t setpoint) {
|
int32_t computePID(uint16_t setpoint) {
|
||||||
static uint32_t lastSample = 0;
|
int32_t ITerm = 0;
|
||||||
int32_t ITerm = 0;
|
|
||||||
static int16_t lastReading = 0;
|
static int16_t lastReading = 0;
|
||||||
if (millis() - lastSample > 25) {
|
uint16_t currentReading = readIronTemp(0, 1); //get the current temp of the iron
|
||||||
//only sample every 50 milliseconds
|
int16_t error = (int16_t) setpoint - (int16_t) currentReading; //calculate the error term
|
||||||
uint16_t currentReading = readIronTemp(0,1); //get the current temp of the iron
|
ITerm += (pidSettings.ki * error);
|
||||||
int16_t error = (int16_t)setpoint - (int16_t)currentReading; //calculate the error term
|
if (ITerm > MAXPIDOUTPUT)
|
||||||
ITerm += (pidSettings.ki * error);
|
ITerm = MAXPIDOUTPUT;
|
||||||
if (ITerm > MAXPIDOUTPUT)
|
else if (ITerm < 0)
|
||||||
ITerm = MAXPIDOUTPUT;
|
ITerm = 0; //cap at 0 since we cant force the iron to cool itself :)
|
||||||
else if (ITerm < 0)
|
|
||||||
ITerm = 0; //cap at 0 since we cant force the iron to cool itself :)
|
int16_t DInput = (currentReading - lastReading); //compute the input to the D term
|
||||||
|
int32_t output = (pidSettings.kp * error) + (ITerm)
|
||||||
|
- (pidSettings.kd * DInput);
|
||||||
|
if (output > MAXPIDOUTPUT)
|
||||||
|
output = MAXPIDOUTPUT;
|
||||||
|
else if (output < 0)
|
||||||
|
output = 0;
|
||||||
|
|
||||||
|
lastReading = currentReading; //storing values for next iteration of the loop
|
||||||
|
return output;
|
||||||
|
|
||||||
int16_t DInput = (currentReading - lastReading); //compute the input to the D term
|
|
||||||
int32_t output = (pidSettings.kp * error) + (ITerm)
|
|
||||||
- (pidSettings.kd * DInput);
|
|
||||||
if (output > MAXPIDOUTPUT)
|
|
||||||
output = MAXPIDOUTPUT;
|
|
||||||
else if (output < 0)
|
|
||||||
output = 0;
|
|
||||||
lastSample = millis();
|
|
||||||
lastReading = currentReading; //storing values for next iteration of the loop
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
return -1; //called too fast
|
|
||||||
}
|
}
|
||||||
|
/*Sets up the pid values*/
|
||||||
void setupPID(void) {
|
void setupPID(void) {
|
||||||
pidSettings.kp = 22;
|
pidSettings.kp = 22;
|
||||||
pidSettings.ki = 7;
|
pidSettings.ki = 7;
|
||||||
|
|||||||
53
workspace/ts100/src/Settings.c
Normal file
53
workspace/ts100/src/Settings.c
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
/*
|
||||||
|
* Settings.c
|
||||||
|
*
|
||||||
|
* Created on: 29 Sep 2016
|
||||||
|
* Author: Ralim
|
||||||
|
*
|
||||||
|
* This file holds the users settings and saves / restores them to the devices flash
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "Settings.h"
|
||||||
|
#define FLASH_ADDR (0x8000000|48896)/*Flash start OR'ed with the maximum amount of flash - 256 bytes*/
|
||||||
|
void saveSettings() {
|
||||||
|
//First we erase the flash
|
||||||
|
FLASH_Unlock(); //unlock flash writing
|
||||||
|
FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
|
||||||
|
while (FLASH_ErasePage(FLASH_ADDR) != FLASH_COMPLETE)
|
||||||
|
; //wait for it
|
||||||
|
//erased the chunk
|
||||||
|
//now we program it
|
||||||
|
uint16_t *data = (uint16_t*) &systemSettings;
|
||||||
|
for (uint8_t i = 0; i < (sizeof(systemSettings) / 2); i++) {
|
||||||
|
FLASH_ProgramHalfWord(FLASH_ADDR + (i * 2), data[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void restoreSettings() {
|
||||||
|
//We read the flash
|
||||||
|
uint16_t *data = (uint16_t*) &systemSettings;
|
||||||
|
for (uint8_t i = 0; i < (sizeof(systemSettings) / 2); i++) {
|
||||||
|
data[i] = *(uint16_t *) (FLASH_ADDR + (i * 2));
|
||||||
|
}
|
||||||
|
//if the version is correct were done
|
||||||
|
//if not we reset and save
|
||||||
|
if (systemSettings.version != SETTINGSVERSION) {
|
||||||
|
//probably not setup
|
||||||
|
resetSettings();
|
||||||
|
saveSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void resetSettings() {
|
||||||
|
|
||||||
|
systemSettings.SleepTemp = 1500; //Temperature the iron sleeps at - default 150.0 C
|
||||||
|
systemSettings.SleepTime = 1; //How many minutes we wait until going to sleep - default 1 min
|
||||||
|
systemSettings.SolderingTemp = 3200; //Default soldering temp is 320.0 C
|
||||||
|
systemSettings.movementEnabled = 1; //we use movement detection by default
|
||||||
|
systemSettings.cutoutVoltage = 10; //10V is the minium cutout voltage as the unit V measurement is unstable below 9.5V
|
||||||
|
systemSettings.version = SETTINGSVERSION; //Store the version number to allow for easier upgrades
|
||||||
|
systemSettings.displayTempInF =0; //default to C
|
||||||
|
systemSettings.flipDisplay=0; //Default to right handed mode
|
||||||
|
}
|
||||||
|
|
||||||
Reference in New Issue
Block a user