mirror of
https://github.com/Ralim/IronOS.git
synced 2025-02-26 07:53:55 +00:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0bbdda5b55 | ||
|
|
acb97f1d46 | ||
|
|
0b26e669af |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -27,7 +27,7 @@
|
||||
*.app
|
||||
*.i*86
|
||||
*.x86_64
|
||||
*.hex
|
||||
workspace/*.hex
|
||||
|
||||
# Debug files
|
||||
*.dSYM/
|
||||
@@ -36,3 +36,4 @@ workspace/ts100/Debug/*
|
||||
workspace/.metadata/*
|
||||
|
||||
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
31
README.md
31
README.md
@@ -1,21 +1,38 @@
|
||||
# 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.
|
||||
|
||||
# Features Working
|
||||
## Features Working
|
||||
* Soldering / Temperature control
|
||||
* Full PID Iron Temp
|
||||
* Adjusting temperature
|
||||
* Automatic sleep
|
||||
* Motion wake support
|
||||
* Basic settings menu
|
||||
|
||||
# Features still to be implimented
|
||||
* Input voltage UVLO measurement
|
||||
* Saving settings to flash for persistance
|
||||
* Saving settings to flash for persistence
|
||||
* Improved GUI
|
||||
* Use hardware I2C for communications
|
||||
* Can disable movement detection if desired
|
||||
## Features still to be implemented
|
||||
* 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.
|
||||
|
||||
|
||||
# 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.
|
||||

|
||||
|
||||
@@ -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>
|
||||
</storageModule>
|
||||
<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="">
|
||||
<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"/>
|
||||
@@ -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.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">
|
||||
<listOptionValue builtIn="false" value="/home/ralim/Repo/ts100/workspace/ts100/inc"/>
|
||||
<listOptionValue builtIn="false" value="/home/ralim/Repo/ts100/workspace/ts100/StdPeriph_Driver/inc"/>
|
||||
<listOptionValue builtIn="false" value="/home/ralim/Repo/ts100/workspace/ts100/CMSIS/core"/>
|
||||
<listOptionValue builtIn="false" value="/home/ralim/Repo/ts100/workspace/ts100/CMSIS/device"/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/inc}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/StdPeriph_Driver/inc}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/CMSIS/core}""/>
|
||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/CMSIS/device}""/>
|
||||
</option>
|
||||
<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"/>
|
||||
|
||||
@@ -62,11 +62,11 @@ _Min_Stack_Size = 0x400; /* required amount of stack */
|
||||
MEMORY
|
||||
{
|
||||
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K
|
||||
ROM (rx) : ORIGIN = 0x08000000, LENGTH = 64K
|
||||
ROM (rx) : ORIGIN = 0x08004000, LENGTH = 47K
|
||||
|
||||
}
|
||||
/*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
|
||||
{
|
||||
|
||||
@@ -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
|
||||
* Author: ralim
|
||||
*
|
||||
* Interface to the ADC's basically
|
||||
*/
|
||||
|
||||
#ifndef ANALOG_H_
|
||||
#define ANALOG_H_
|
||||
#include "stm32f10x.h"
|
||||
#include "S100V0_1.h"
|
||||
#include "Bios.h"
|
||||
#include "Interrupt.h"
|
||||
extern volatile uint16_t ADC1ConvertedValue[2];
|
||||
|
||||
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_ */
|
||||
|
||||
@@ -7,7 +7,14 @@
|
||||
#include "stm32f10x.h"
|
||||
#include "S100V0_1.h"/*For pin definitions*/
|
||||
#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;
|
||||
|
||||
inline void setIronTimer(uint32_t time) {
|
||||
@@ -34,4 +41,4 @@ void Init_EXTI(void);
|
||||
void Start_Watchdog(uint32_t ms);
|
||||
void Clear_Watchdog(void);
|
||||
#endif
|
||||
/********************************* END OF FILE ********************************/
|
||||
|
||||
|
||||
@@ -3,88 +3,98 @@
|
||||
*
|
||||
* Created on: 17 Sep 2016
|
||||
* Author: Ralim
|
||||
*
|
||||
* ... This file contains the font...
|
||||
*/
|
||||
|
||||
#ifndef FONT_H_
|
||||
#define FONT_H_
|
||||
|
||||
const u8 FONT[]={
|
||||
0x00,0xF0,0xFC,0x0E,0x82,0xC2,0x62,0x1E,0xFC,0xF0,0x00,0x00,0x00,0x00,
|
||||
0x00,0x03,0x0F,0x1F,0x11,0x10,0x10,0x1C,0x0F,0x03,0x00,0x00,0x00,0x00,/*0*/
|
||||
0x00,0x08,0x04,0x02,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x10,0x10,0x10,0x1F,0x1F,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,/*1*/
|
||||
0x00,0x04,0x02,0x02,0x02,0xC6,0xFC,0x78,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x18,0x1C,0x16,0x13,0x11,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,/*2*/
|
||||
0x00,0x02,0x02,0x42,0x42,0x66,0xFE,0x9C,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x10,0x10,0x10,0x10,0x10,0x08,0x0F,0x07,0x00,0x00,0x00,0x00,0x00,/*3*/
|
||||
0x00,0x00,0x80,0xE0,0x30,0x1C,0x06,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x03,0x03,0x02,0x02,0x02,0x02,0x1F,0x1F,0x02,0x02,0x00,0x00,0x00,/*4*/
|
||||
0x00,0x7E,0x7E,0x42,0x42,0x42,0xC2,0x82,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x10,0x10,0x10,0x10,0x10,0x08,0x0F,0x07,0x00,0x00,0x00,0x00,0x00,/*5*/
|
||||
0x00,0xE0,0xF8,0x8C,0x44,0x42,0x42,0xC2,0x82,0x80,0x00,0x00,0x00,0x00,
|
||||
0x00,0x07,0x0F,0x18,0x10,0x10,0x10,0x18,0x0F,0x07,0x00,0x00,0x00,0x00,/*6*/
|
||||
0x00,0x02,0x02,0x02,0x02,0xC2,0xF2,0x1E,0x06,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x10,0x1C,0x0F,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*7*/
|
||||
0x00,0x38,0x7C,0x66,0xC2,0x82,0xC2,0x66,0x7C,0x3C,0x00,0x00,0x00,0x00,
|
||||
0x00,0x0E,0x0F,0x19,0x10,0x10,0x10,0x19,0x0F,0x0E,0x00,0x00,0x00,0x00,/*8*/
|
||||
0x00,0x78,0x7C,0xC6,0x82,0x82,0x82,0x46,0xFC,0xF8,0x00,0x00,0x00,0x00,
|
||||
0x00,0x00,0x10,0x10,0x10,0x10,0x08,0x0C,0x07,0x03,0x00,0x00,0x00,0x00,/*9*/
|
||||
0x00,0x00,0x80,0xF0,0x1E,0x02,0x1E,0xF0,0x80,0x00,0x00,0x00,0x00,0x00,
|
||||
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,/* */
|
||||
#define FONT_WIDTH 12 /*How many pixels wide the font is*/
|
||||
const uint8_t FONT[]={
|
||||
0x00,0xF0,0xFC,0x0E,0x82,0xC2,0x62,0x1E,0xFC,0xF0,0x00,0x00,
|
||||
0x00,0x03,0x0F,0x1F,0x11,0x10,0x10,0x1C,0x0F,0x03,0x00,0x00,/*0*/
|
||||
0x00,0x08,0x04,0x02,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||
0x00,0x10,0x10,0x10,0x1F,0x1F,0x10,0x10,0x10,0x00,0x00,0x00,/*1*/
|
||||
0x00,0x04,0x02,0x02,0x02,0xC6,0xFC,0x78,0x00,0x00,0x00,0x00,
|
||||
0x00,0x18,0x1C,0x16,0x13,0x11,0x10,0x10,0x10,0x00,0x00,0x00,/*2*/
|
||||
0x00,0x02,0x02,0x42,0x42,0x66,0xFE,0x9C,0x00,0x00,0x00,0x00,
|
||||
0x00,0x10,0x10,0x10,0x10,0x10,0x08,0x0F,0x07,0x00,0x00,0x00,/*3*/
|
||||
0x00,0x00,0x80,0xE0,0x30,0x1C,0x06,0xFE,0xFE,0x00,0x00,0x00,
|
||||
0x00,0x03,0x03,0x02,0x02,0x02,0x02,0x1F,0x1F,0x02,0x02,0x00,/*4*/
|
||||
0x00,0x7E,0x7E,0x42,0x42,0x42,0xC2,0x82,0x00,0x00,0x00,0x00,
|
||||
0x00,0x10,0x10,0x10,0x10,0x10,0x08,0x0F,0x07,0x00,0x00,0x00,/*5*/
|
||||
0x00,0xE0,0xF8,0x8C,0x44,0x42,0x42,0xC2,0x82,0x80,0x00,0x00,
|
||||
0x00,0x07,0x0F,0x18,0x10,0x10,0x10,0x18,0x0F,0x07,0x00,0x00,/*6*/
|
||||
0x00,0x02,0x02,0x02,0x02,0xC2,0xF2,0x1E,0x06,0x00,0x00,0x00,
|
||||
0x00,0x00,0x10,0x1C,0x0F,0x03,0x00,0x00,0x00,0x00,0x00,0x00,/*7*/
|
||||
0x00,0x38,0x7C,0x66,0xC2,0x82,0xC2,0x66,0x7C,0x3C,0x00,0x00,
|
||||
0x00,0x0E,0x0F,0x19,0x10,0x10,0x10,0x19,0x0F,0x0E,0x00,0x00,/*8*/
|
||||
0x00,0x78,0x7C,0xC6,0x82,0x82,0x82,0x46,0xFC,0xF8,0x00,0x00,
|
||||
0x00,0x00,0x10,0x10,0x10,0x10,0x08,0x0C,0x07,0x03,0x00,0x00,/*9*/
|
||||
|
||||
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_ */
|
||||
|
||||
@@ -1,21 +1,16 @@
|
||||
/********************* (C) COPYRIGHT 2015 e-Design Co.,Ltd. **********************
|
||||
File Name : I2C.h
|
||||
Version : S100 APP Ver 2.11
|
||||
Description:
|
||||
Author : Celery
|
||||
Data: 2015/08/03
|
||||
History:
|
||||
2015/08/03 :
|
||||
*******************************************************************************/
|
||||
/*
|
||||
* I2C.h
|
||||
* I2C wrapper for the stm32 hardware I2C port
|
||||
*/
|
||||
#ifndef __I2C_H
|
||||
#define __I2C_H
|
||||
|
||||
#define I2C_TX 1
|
||||
#define I2C_RX 2
|
||||
#include "stm32f10x_i2c.h"
|
||||
#include "stm32f10x.h"
|
||||
#include "stm32f10x_gpio.h"
|
||||
|
||||
void I2C_Configuration(void);
|
||||
void Delay_uS(u32 us);
|
||||
void I2C_PageWrite(u8* pbuf, u8 numbyte,u8 deviceaddr );
|
||||
void I2C_PageRead(u8* pbuf, u8 numbyte,u8 deviceaddr, u8 readaddr);
|
||||
void I2C_PageWrite(u8* pbuf, u8 numbyte, u8 deviceaddr);
|
||||
void I2C_PageRead(u8* pbuf, u8 numbyte, u8 deviceaddr, u8 readaddr);
|
||||
#endif
|
||||
/******************************** 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
|
||||
#define __INTERRUPT_H
|
||||
#include <stdint.h>
|
||||
//See here for refernce to this block http://embedded.kleier.selfhost.me/vector.php
|
||||
/*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);
|
||||
|
||||
/* Functions for access to data */
|
||||
extern volatile uint32_t system_Ticks;
|
||||
void delayMs(uint32_t ticks);
|
||||
volatile extern uint32_t lastKeyPress;
|
||||
@@ -57,6 +34,30 @@ inline uint32_t getLastMovement() {
|
||||
inline uint16_t getButtons() {
|
||||
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 PVD_IRQHandler(void);
|
||||
|
||||
|
||||
@@ -6,7 +6,8 @@
|
||||
*
|
||||
* 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>
|
||||
*/
|
||||
@@ -14,7 +15,7 @@
|
||||
#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----------------------------------------------//
|
||||
|
||||
|
||||
@@ -3,6 +3,9 @@
|
||||
*
|
||||
* Created on: 17 Sep 2016
|
||||
* Author: Ralim
|
||||
*
|
||||
* Modes.h -> Main function for driving the application
|
||||
* This processes the buttons then does the gui
|
||||
*/
|
||||
|
||||
#ifndef MODES_H_
|
||||
@@ -11,27 +14,23 @@
|
||||
#include "S100V0_1.h"
|
||||
#include "Oled.h"
|
||||
#include "PID.h"
|
||||
#include "Settings.h"
|
||||
#include "Analog.h"
|
||||
enum {
|
||||
STARTUP, //we are sitting on the prompt to push a button
|
||||
SOLDERING,
|
||||
TEMP_ADJ,
|
||||
SETTINGS,
|
||||
SLEEP,
|
||||
COOLING,
|
||||
UVLOWARN,
|
||||
} operatingMode;
|
||||
|
||||
enum {
|
||||
UVLO = 0, SLEEP_TEMP, SLEEP_TIME,
|
||||
UVCO = 0, SLEEP_TEMP, SLEEP_TIME, MOTIONDETECT, TEMPDISPLAY,LEFTY
|
||||
|
||||
} 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 DrawUI();
|
||||
#endif /* MODES_H_ */
|
||||
|
||||
@@ -1,35 +1,27 @@
|
||||
/********************* (C) COPYRIGHT 2015 e-Design Co.,Ltd. **********************
|
||||
File Name : Oled.h
|
||||
Version : S100 APP Ver 2.11
|
||||
Description:
|
||||
Author : Celery
|
||||
Data: 2015/07/07
|
||||
History:
|
||||
2015/07/07 ͳһ<CDB3><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*******************************************************************************/
|
||||
/*
|
||||
* Oled.h
|
||||
* Functions for writing to the OLED screen
|
||||
* Basically wraps drawing text and numbers to the OLED
|
||||
* Uses font.h -> 14 pixel wide fixed width
|
||||
*/
|
||||
#ifndef _OLED_SSD1306_H
|
||||
#define _OLED_SSD1306_H
|
||||
|
||||
#define DEVICEADDR_OLED 0x3c
|
||||
#include "stm32f10x.h"
|
||||
#include "Interrupt.h"
|
||||
void Sc_Pt(u8 Co);
|
||||
|
||||
void Oled_DisplayOn(void);
|
||||
void Oled_DisplayOff(void);
|
||||
|
||||
u8* Oled_DrawArea(u8 x0, u8 y0, u8 wide, u8 high, u8* ptr);
|
||||
void Set_ShowPos(u8 x, u8 y);
|
||||
|
||||
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 Oled_DisplayFlip();
|
||||
void GPIO_Init_OLED(void);
|
||||
void Init_Oled(void);
|
||||
u8* Data_Command(u8 len, u8* ptr);
|
||||
void Reg_Command(u8 posi, u8 flag);
|
||||
void Clear_Screen(void);
|
||||
void Write_InitCommand_data(u32 Com_len, u8* data);
|
||||
void Display_BG(void);
|
||||
void Clear_Screen(void);//Clear the screen
|
||||
/*Functions for writing to the screen*/
|
||||
void OLED_DrawString(char* string, uint8_t length);
|
||||
void OLED_DrawChar(char c, uint8_t x);
|
||||
void OLED_DrawTwoNumber(uint8_t in, uint8_t x);
|
||||
|
||||
@@ -3,12 +3,15 @@
|
||||
*
|
||||
* Created on: 20 Sep 2016
|
||||
* Author: ralim
|
||||
*
|
||||
* Functions for computing the PID for the iron temp
|
||||
*/
|
||||
|
||||
#ifndef PID_H_
|
||||
#define PID_H_
|
||||
#include "Analog.h"
|
||||
#include "Interrupt.h"
|
||||
|
||||
struct {
|
||||
uint32_t kp, ki, kd; //PID values
|
||||
} pidSettings;
|
||||
|
||||
@@ -1,14 +1,9 @@
|
||||
/********************* (C) COPYRIGHT 2015 e-Design Co.,Ltd. ********************
|
||||
Brief : <20>ײ<EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Author : bure
|
||||
Modified by Ben V. Brown into English
|
||||
*******************************************************************************/
|
||||
/*
|
||||
* Defines for the device
|
||||
* These houses the settings for the device hardware
|
||||
*/
|
||||
#include "stm32f10x.h"
|
||||
|
||||
#define PRODUCT_INFO "TS100"
|
||||
#define MCU_TYPE "STM32F103T8"
|
||||
#define SCH_VER "2.46"
|
||||
|
||||
#define SPIx SPI1
|
||||
#include "stm32f10x_gpio.h"
|
||||
//--------------------------- key Definitions ------------------------------//
|
||||
#define KEY1_PIN GPIO_Pin_9 //PA8
|
||||
#define KEY2_PIN GPIO_Pin_6 //PA6
|
||||
@@ -17,45 +12,24 @@
|
||||
#define KEY_B KEY2_PIN
|
||||
#define BUT_A 0x01
|
||||
#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 ------------------------------//
|
||||
#define OLED_RST_PIN GPIO_Pin_8 //PA9
|
||||
#define OLED_RST() GPIO_ResetBits(GPIOA, OLED_RST_PIN)
|
||||
#define OLED_ACT() GPIO_SetBits (GPIOA, OLED_RST_PIN)
|
||||
|
||||
//------------------------------ --------------------------------//
|
||||
//------------------------------ Iron Heater --------------------------------//
|
||||
#define HEAT_PIN GPIO_Pin_4
|
||||
|
||||
#define HEAT_OFF() GPIOB->BRR = HEAT_PIN
|
||||
#define HEAT_ON() GPIOB->BSRR = HEAT_PIN
|
||||
|
||||
//-----------------------VB---------------------------------------//
|
||||
//-----------------------Battery voltage measurement---------------------------------------//
|
||||
#define VB_PIN GPIO_Pin_1 //PB1(Ai9)
|
||||
//----------------------------ADX345 INT1,INT2--------------------------------//
|
||||
|
||||
//----------------------------Accelerometer INT1,INT2--------------------------------//
|
||||
#define INT1_PIN GPIO_Pin_5 //PB5
|
||||
#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 ---------------------------------//
|
||||
|
||||
@@ -72,4 +46,3 @@
|
||||
||+-------Bit22 = 1 USB prescaler is PLL clock
|
||||
++--------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"
|
||||
|
||||
//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 reading = 0;
|
||||
for (u8 i = 0; i < 10; i++) {
|
||||
@@ -102,6 +104,7 @@ uint16_t Get_ADC1Value(uint8_t i) {
|
||||
return ADC1ConvertedValue[i];
|
||||
}
|
||||
//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) {
|
||||
static uint16_t calTemp = 0;
|
||||
static uint16_t lastVal = 0;
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
/*
|
||||
* Setup all the basic hardware in the system and handle timer3 tick
|
||||
*/
|
||||
#include "APP_Version.h"
|
||||
|
||||
#include "Bios.h"
|
||||
#include "I2C.h"
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
#define ADC1_DR_Address ((u32)0x4001244C)
|
||||
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_JTAGDisable, ENABLE);
|
||||
|
||||
GPIOA_OUTPUT()
|
||||
;
|
||||
GPIOA_L_DEF()
|
||||
;
|
||||
GPIOA_H_DEF()
|
||||
;
|
||||
|
||||
GPIOB_OUTPUT()
|
||||
;
|
||||
GPIOB_L_DEF()
|
||||
;
|
||||
GPIOB_H_DEF()
|
||||
;
|
||||
|
||||
//------ PA7 TMP36 Analog input ----------------------------------------//
|
||||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
|
||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
|
||||
|
||||
@@ -1,229 +1,148 @@
|
||||
/********************* (C) COPYRIGHT 2015 e-Design Co.,Ltd. **********************
|
||||
File Name : I2C.c
|
||||
Version : S100 APP Ver 2.11
|
||||
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"
|
||||
/*
|
||||
* I2C.h hardware interface class
|
||||
* Based on the STM32 app note AN2824
|
||||
*/
|
||||
#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
|
||||
#define SCL GPIO_Pin_6
|
||||
/*
|
||||
* Configure the I2C port hardware
|
||||
*/
|
||||
void I2C_Configuration(void) {
|
||||
GPIO_InitTypeDef GPIO_InitStructure;
|
||||
I2C_InitTypeDef I2C_InitStructure;
|
||||
|
||||
#define HIGH 1
|
||||
#define LOW 0
|
||||
/* 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);
|
||||
|
||||
#define SDA_VAL GPIO_ReadInputDataBit(GPIOB, SDA)
|
||||
#define SCL_VAL GPIO_ReadInputDataBit(GPIOB, SCL)
|
||||
|
||||
#define I2C_MORE 1
|
||||
#define I2C_LAST 0
|
||||
#define I2C_TIMEOUT 255
|
||||
|
||||
#define FAILURE 0
|
||||
#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);
|
||||
/* I2C1 configuration ------------------------------------------------------*/
|
||||
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
|
||||
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
|
||||
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
|
||||
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
|
||||
I2C_InitStructure.I2C_ClockSpeed = 400000; //400k
|
||||
I2C_Init(I2C1, &I2C_InitStructure);
|
||||
I2C_Cmd(I2C1, ENABLE);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
<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 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;
|
||||
/*
|
||||
* Writes a page of data over I2C using the I2C1 peripheral in the stm32
|
||||
*
|
||||
*/
|
||||
void I2C_PageWrite(u8* buf, u8 nbyte, u8 deviceaddr) {
|
||||
|
||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // I2C_PIN_EN();
|
||||
GPIO_InitStructure.GPIO_Pin = SCL | SDA;
|
||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
|
||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
||||
GPIO_Init (GPIOB, &GPIO_InitStructure);
|
||||
while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)) {
|
||||
}
|
||||
// Intiate Start Sequence
|
||||
I2C_GenerateSTART(I2C1, ENABLE);
|
||||
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
|
||||
Sim_I2C_Set(SDA, HIGH); // SDA float, set as output high
|
||||
Sim_I2C_Set(SCL, HIGH); // SCL high
|
||||
Delay_uS(I2C_DELAYTIME);
|
||||
Sim_I2C_Set(SDA, LOW); // SDA high->low while sclk high, S state occur...
|
||||
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 (--nbyte) {
|
||||
// wait on BTF
|
||||
while (!I2C_GetFlagStatus(I2C1, I2C_FLAG_BTF)) {
|
||||
}
|
||||
I2C_SendData(I2C1, *buf++);
|
||||
}
|
||||
|
||||
while(i--) { //send out a bit by sda line.
|
||||
Sim_I2C_Set(SCL, LOW); // sclk low
|
||||
if(data & 0x80) Sim_I2C_Set(SDA, HIGH); // send bit is 1
|
||||
else Sim_I2C_Set(SDA, LOW); // send bit is 0
|
||||
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;
|
||||
while (!I2C_GetFlagStatus(I2C1, I2C_FLAG_BTF)) {
|
||||
}
|
||||
I2C_GenerateSTOP(I2C1, ENABLE);
|
||||
while (I2C_GetFlagStatus(I2C1, I2C_FLAG_STOPF)) {
|
||||
}
|
||||
|
||||
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);
|
||||
else *pbuf++ = Sim_I2C_RD_Byte(I2C_LAST);
|
||||
}
|
||||
Sim_I2C_Stop();
|
||||
/*
|
||||
* Read Page of data using I2C1 peripheral
|
||||
*/
|
||||
|
||||
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[1] = data;
|
||||
I2C_PageWrite(tx_data, 2, DEVICE_ADDR);
|
||||
|
||||
}
|
||||
|
||||
uint8_t I2C_RegisterRead(uint8_t reg) {
|
||||
u8 tx_data[3];
|
||||
tx_data[0] = reg;
|
||||
|
||||
I2C_PageRead(tx_data, 1, DEVICE_ADDR, reg);
|
||||
return tx_data[0];
|
||||
|
||||
}
|
||||
|
||||
void StartUp_Acceleromter(void) {
|
||||
|
||||
void StartUp_Accelerometer(void) {
|
||||
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
|
||||
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_COUNT_REG, 0x01); // Set debounce to 100ms
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
@@ -1,53 +1,42 @@
|
||||
/********************* (C) COPYRIGHT 2015 e-Design Co.,Ltd. **********************
|
||||
File Name : main.c
|
||||
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"
|
||||
/*
|
||||
* Created by Ben V. Brown
|
||||
*/
|
||||
|
||||
#include "Modes.h"
|
||||
#include "Bios.h"
|
||||
#include "I2C.h"
|
||||
#include "MMA8652FC.h"
|
||||
#include "PID.h"
|
||||
#include "Oled.h"
|
||||
#include "Interrupt.h"
|
||||
#include "Settings.h"
|
||||
#include "I2C.h"
|
||||
void setup();
|
||||
|
||||
int main(void) {
|
||||
RCC_Config(); //setup system clock
|
||||
//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
|
||||
setup();/*Setup the system*/
|
||||
while (1) {
|
||||
Clear_Watchdog(); //reset the Watchdog
|
||||
Clear_Watchdog(); //reset the Watchdog timer
|
||||
ProcessUI();
|
||||
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
|
||||
Init_Oled(); //init the OLED display
|
||||
setupPID(); //init the PID values
|
||||
readIronTemp(239, 0); //load the default calibration value
|
||||
restoreSettings(); //Load settings
|
||||
if (systemSettings.flipDisplay)
|
||||
Oled_DisplayFlip();
|
||||
OLED_DrawString("VER 1.01",8);
|
||||
delayMs(800);
|
||||
Start_Watchdog(1000); //start the system watchdog as 1 seconds timeout
|
||||
}
|
||||
|
||||
@@ -8,24 +8,22 @@
|
||||
//This does the required processing and state changes
|
||||
void ProcessUI() {
|
||||
uint8_t Buttons = getButtons(); //read the buttons status
|
||||
|
||||
static uint32_t lastModeChange = 0;
|
||||
if (millis() - getLastButtonPress() < 200)
|
||||
Buttons = 0;
|
||||
//rough prevention for debouncing and allocates settling time
|
||||
//OLED_DrawThreeNumber(Buttons, 0);
|
||||
//rough prevention for de-bouncing and allocates settling time
|
||||
|
||||
switch (operatingMode) {
|
||||
case STARTUP:
|
||||
if ((millis() - getLastButtonPress() > 1000)) {
|
||||
if (Buttons & BUT_A) {
|
||||
//A key pressed so we are moving to soldering mode
|
||||
operatingMode = SOLDERING;
|
||||
delayMs(500);
|
||||
resetLastButtonPress();
|
||||
resetButtons();
|
||||
} else if (Buttons & BUT_B) {
|
||||
//B Button was pressed so we are moving to the Settings menu
|
||||
operatingMode = SETTINGS;
|
||||
delayMs(500);
|
||||
resetLastButtonPress();
|
||||
resetButtons();
|
||||
}
|
||||
@@ -41,7 +39,7 @@ void ProcessUI() {
|
||||
resetButtons();
|
||||
} else if (Buttons & BUT_B) {
|
||||
//B Button was pressed so we are moving back to idle
|
||||
operatingMode = STARTUP;
|
||||
operatingMode = COOLING;
|
||||
resetLastButtonPress();
|
||||
resetButtons();
|
||||
} else {
|
||||
@@ -55,12 +53,18 @@ void ProcessUI() {
|
||||
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
|
||||
int32_t newOutput = computePID(systemSettings.SolderingTemp);
|
||||
if (newOutput >= 0) {
|
||||
setIronTimer(newOutput);
|
||||
}
|
||||
|
||||
setIronTimer(newOutput);
|
||||
|
||||
}
|
||||
break;
|
||||
case TEMP_ADJ:
|
||||
@@ -77,37 +81,37 @@ void ProcessUI() {
|
||||
} else {
|
||||
//we check the timeout for how long the buttons have not been pushed
|
||||
//if idle for > 3 seconds then we return to soldering
|
||||
if (millis() - getLastButtonPress() > 3000)
|
||||
if (millis() - getLastButtonPress() > 3000) {
|
||||
operatingMode = SOLDERING;
|
||||
saveSettings();
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SETTINGS:
|
||||
//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
|
||||
if (millis() - getLastButtonPress() < 400)
|
||||
if (millis() - getLastButtonPress() < 300)
|
||||
return;
|
||||
|
||||
if (Buttons & BUT_A) {
|
||||
resetLastButtonPress();
|
||||
//A key iterates through the menu
|
||||
if (settingsPage == 2) {
|
||||
if (settingsPage == SETTINGSOPTIONSCOUNT) {
|
||||
//Roll off the end
|
||||
settingsPage = 0; //reset
|
||||
operatingMode = STARTUP;
|
||||
//TODO Save settings
|
||||
settingsPage = 0; //reset
|
||||
operatingMode = STARTUP; //reset back to the startup
|
||||
saveSettings(); //Save the settings
|
||||
} else
|
||||
++settingsPage; //move to the next option
|
||||
++settingsPage; //move to the next option
|
||||
} else if (Buttons & BUT_B) {
|
||||
resetLastButtonPress();
|
||||
//B changes the value selected
|
||||
switch (settingsPage) {
|
||||
case UVLO:
|
||||
case UVCO:
|
||||
//we are incrementing the cutout voltage
|
||||
systemSettings.cutoutVoltage += 1; //Go up 1V at a jump
|
||||
if (systemSettings.cutoutVoltage > 24)
|
||||
systemSettings.cutoutVoltage = 9;
|
||||
else if (systemSettings.cutoutVoltage < 9)
|
||||
systemSettings.cutoutVoltage = 9; //cant set UVLO below 9V
|
||||
systemSettings.cutoutVoltage = 10;
|
||||
break;
|
||||
case SLEEP_TEMP:
|
||||
systemSettings.SleepTemp += 100; //Go up 10c at a time
|
||||
@@ -116,10 +120,20 @@ void ProcessUI() {
|
||||
break;
|
||||
case SLEEP_TIME:
|
||||
++systemSettings.SleepTime; //Go up 1 minute at a time
|
||||
if (systemSettings.SleepTime > 60)
|
||||
systemSettings.SleepTime = 2; //cant set time over an hour
|
||||
if (systemSettings.SleepTime > 30)
|
||||
systemSettings.SleepTime = 1; //cant set time over 30 mins
|
||||
//Remember that ^ is the time of no movement
|
||||
break;
|
||||
case MOTIONDETECT:
|
||||
systemSettings.movementEnabled =
|
||||
!systemSettings.movementEnabled;
|
||||
break;
|
||||
case TEMPDISPLAY:
|
||||
systemSettings.displayTempInF = !systemSettings.displayTempInF;
|
||||
break;
|
||||
case LEFTY:
|
||||
systemSettings.flipDisplay = !systemSettings.flipDisplay;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -146,16 +160,56 @@ void ProcessUI() {
|
||||
}
|
||||
//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);
|
||||
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 < 500) { //if the temp is < 50C then we can go back to IDLE
|
||||
operatingMode = STARTUP;
|
||||
resetLastButtonPress();
|
||||
resetButtons();
|
||||
} else { //we check if the user has pushed a button to ack
|
||||
if ((millis() - getLastButtonPress() > 200)
|
||||
&& (millis() - getLastButtonPress() < 2000)) {
|
||||
if (getButtons() && (BUT_A | BUT_B)) {
|
||||
//A 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;
|
||||
default:
|
||||
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() {
|
||||
uint16_t temp = readIronTemp(0, 0);
|
||||
switch (operatingMode) {
|
||||
case STARTUP:
|
||||
//We are chilling in the idle mode
|
||||
@@ -166,58 +220,77 @@ void DrawUI() {
|
||||
Oled_DisplayOff();
|
||||
} else {
|
||||
Oled_DisplayOn();
|
||||
OLED_DrawString("IDLE ", 7); //write the word IDLE
|
||||
OLED_DrawString(" IDLE ", 8); //write the word IDLE
|
||||
}
|
||||
break;
|
||||
case SOLDERING:
|
||||
//The user is soldering
|
||||
{
|
||||
uint16_t temp = readIronTemp(0, 0);
|
||||
if (systemSettings.SolderingTemp + 2 < temp) {
|
||||
OLED_DrawChar('C', 14 * 4);
|
||||
if (getIronTimer() == 0) {
|
||||
OLED_DrawChar('C', 5);
|
||||
} else {
|
||||
if (getIronTimer() < 500) {
|
||||
OLED_DrawChar(' ', 14 * 4);
|
||||
OLED_DrawChar(' ', 5);
|
||||
} else { //we are heating
|
||||
OLED_DrawChar('H', 14 * 4);
|
||||
OLED_DrawChar('H', 5);
|
||||
}
|
||||
|
||||
}
|
||||
OLED_DrawThreeNumber(temp / 10, 0);
|
||||
OLED_DrawChar(' ', 14 * 3);
|
||||
OLED_DrawChar(' ', 14 * 5);
|
||||
OLED_DrawChar(' ', 14 * 6);
|
||||
drawTemp(temp, 0);
|
||||
OLED_DrawChar(' ', 3);
|
||||
OLED_DrawChar(' ', 4);
|
||||
OLED_DrawChar(' ', 6);
|
||||
OLED_DrawChar(' ', 7);
|
||||
|
||||
}
|
||||
break;
|
||||
case TEMP_ADJ:
|
||||
//We are prompting the user to change the temp so we draw the current setpoint temp
|
||||
//With the nifty arrows
|
||||
|
||||
OLED_DrawChar(' ', 0);
|
||||
OLED_DrawThreeNumber(systemSettings.SolderingTemp / 10, 14 * 1);
|
||||
OLED_DrawChar(' ', 14 * 4);
|
||||
OLED_DrawChar(' ', 14 * 5);
|
||||
OLED_DrawChar('<', 1);
|
||||
drawTemp(systemSettings.SolderingTemp, 2);
|
||||
OLED_DrawChar(' ', 5);
|
||||
OLED_DrawChar(' ', 6);
|
||||
OLED_DrawChar('>', 7);
|
||||
|
||||
break;
|
||||
case SETTINGS:
|
||||
//We are prompting the user the setting name
|
||||
|
||||
switch (settingsPage) {
|
||||
case UVLO:
|
||||
OLED_DrawString("UVLO", 4);
|
||||
OLED_DrawTwoNumber(systemSettings.cutoutVoltage, 14 * 4);
|
||||
//OLED_DrawChar('V', 14 * 5);
|
||||
|
||||
case UVCO:
|
||||
OLED_DrawString("UVCO ", 5);
|
||||
OLED_DrawTwoNumber(systemSettings.cutoutVoltage, 5);
|
||||
OLED_DrawChar('V', 7);
|
||||
break;
|
||||
case SLEEP_TEMP:
|
||||
OLED_DrawString("STMP", 4);
|
||||
OLED_DrawThreeNumber(systemSettings.SleepTemp / 10, 14 * 4);
|
||||
//OLED_DrawChar('V', 14 * 5);
|
||||
|
||||
OLED_DrawString("STMP ", 5);
|
||||
OLED_DrawThreeNumber(systemSettings.SleepTemp / 10, 5);
|
||||
break;
|
||||
case SLEEP_TIME:
|
||||
OLED_DrawString("STME ", 5);
|
||||
OLED_DrawTwoNumber(systemSettings.SleepTime, 14 * 5);
|
||||
OLED_DrawString("STIME ", 6);
|
||||
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;
|
||||
default:
|
||||
break;
|
||||
@@ -227,9 +300,15 @@ void DrawUI() {
|
||||
//The iron is in sleep temp mode
|
||||
//Draw in temp and sleep
|
||||
OLED_DrawString("SLP", 3);
|
||||
uint16_t temp = readIronTemp(0, 0);
|
||||
OLED_DrawThreeNumber(temp / 10, 14 * 3);
|
||||
|
||||
drawTemp(temp, 3);
|
||||
break;
|
||||
case COOLING:
|
||||
//We are warning the user the tip is cooling
|
||||
OLED_DrawString("COOL", 3);
|
||||
drawTemp(temp, 4);
|
||||
break;
|
||||
case UVLOWARN:
|
||||
OLED_DrawString("LOW VOLT", 8);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
@@ -1,71 +1,92 @@
|
||||
/********************* (C) COPYRIGHT 2015 e-Design Co.,Ltd. **********************
|
||||
File Name : Oled.c
|
||||
Version : S100 APP Ver 2.11
|
||||
Description:
|
||||
Author : Celery
|
||||
Data: 2015/07/07
|
||||
History:
|
||||
2015/07/07 ͳһ<CDB3><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*******************************************************************************/
|
||||
/*
|
||||
*
|
||||
* OLED.c
|
||||
* Functions for working with the oled screen.
|
||||
* Writes to the screen using I2C
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "APP_Version.h"
|
||||
|
||||
#include "Oled.h"
|
||||
#include "Bios.h"
|
||||
#include "I2C.h"
|
||||
|
||||
#include "Font.h"
|
||||
u8 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, 0b01010001,/**/
|
||||
0x80, 0xA8,/*Set Multiplex Ratio*/
|
||||
0x80, 16, /*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
|
||||
Description:Turn on the Oled display
|
||||
*******************************************************************************/
|
||||
*/
|
||||
void Oled_DisplayOn(void) {
|
||||
u8 data[6] = { 0x80, 0X8D, 0x80, 0X14, 0x80, 0XAF };
|
||||
|
||||
I2C_PageWrite(data, 6, DEVICEADDR_OLED);
|
||||
}
|
||||
/*******************************************************************************
|
||||
/*
|
||||
Function: Oled_DisplayOff
|
||||
Description:Turn off the Oled display
|
||||
*******************************************************************************/
|
||||
*/
|
||||
void Oled_DisplayOff(void) {
|
||||
u8 data[6] = { 0x80, 0X8D, 0x80, 0X10, 0x80, 0XAE };
|
||||
|
||||
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
|
||||
Input: number of bytes to write, array to write
|
||||
Output:
|
||||
*******************************************************************************/
|
||||
u8* Data_Command(u8 wide, u8* ptr) {
|
||||
*/
|
||||
u8* Data_Command(u8 length, u8* data) {
|
||||
int i;
|
||||
u8 tx_data[128];
|
||||
//here are are inserting the data write command at the beginning
|
||||
tx_data[0] = 0x40;
|
||||
wide += 1;
|
||||
for (i = 1; i < wide; i++) //Loop through the array of data
|
||||
tx_data[i] = *ptr++;
|
||||
I2C_PageWrite(tx_data, wide, DEVICEADDR_OLED); //write out the buffer
|
||||
return ptr;
|
||||
length += 1;
|
||||
for (i = 1; i < length; i++) //Loop through the array of data
|
||||
tx_data[i] = *data++;
|
||||
I2C_PageWrite(tx_data, length, DEVICEADDR_OLED); //write out the buffer
|
||||
return data;
|
||||
}
|
||||
/*******************************************************************************
|
||||
Function:Set_ShowPos
|
||||
@@ -73,11 +94,10 @@ u8* Data_Command(u8 wide, u8* ptr) {
|
||||
Input:x,y co-ordinates
|
||||
*******************************************************************************/
|
||||
void Set_ShowPos(u8 x, u8 y) {
|
||||
u8 pos_param[8] = { 0x80, 0xB0, 0x80, 0x21, 0x80, 0x20, 0x80, 0x7F };
|
||||
|
||||
pos_param[5] = x + 32;
|
||||
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 + displayOffset;/*Display offset ==0 for Lefty, == 32 fo righty*/
|
||||
pos_param[1] += y;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
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
|
||||
Description:Init the outputs as needed for the OLED (in this case the RST line)
|
||||
@@ -142,11 +148,11 @@ void Init_Oled(void) {
|
||||
u8 param_len;
|
||||
|
||||
OLED_RST();
|
||||
delayMs(2); //reset the oled
|
||||
OLED_ACT();
|
||||
delayMs(2);
|
||||
OLED_ACT(); //Toggling reset to reset the oled
|
||||
delayMs(2);
|
||||
param_len = 46;
|
||||
I2C_PageWrite((u8 *) gOled_param, param_len, DEVICEADDR_OLED);
|
||||
I2C_PageWrite((u8 *) OLED_Setup_Array, param_len, DEVICEADDR_OLED);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
@@ -160,49 +166,67 @@ void Clear_Screen(void) {
|
||||
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) {
|
||||
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
|
||||
* */
|
||||
void OLED_DrawTwoNumber(uint8_t in, uint8_t x) {
|
||||
OLED_DrawChar((in / 10)%10, x);
|
||||
OLED_DrawChar(in % 10, x + 14);
|
||||
* Draw a char onscreen at letter index x
|
||||
*/
|
||||
void OLED_DrawChar(char c, uint8_t x) {
|
||||
if (x > 7)
|
||||
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) {
|
||||
|
||||
OLED_DrawChar((in / 100)%10, x);
|
||||
OLED_DrawChar((in / 10)%10, x + 14);
|
||||
OLED_DrawChar(in % 10, x + 28);
|
||||
OLED_DrawChar((in / 100) % 10, x);
|
||||
OLED_DrawChar((in / 10) % 10, x + 1);
|
||||
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) {
|
||||
|
||||
OLED_DrawChar((in / 1000)%10, x);
|
||||
OLED_DrawChar((in / 100)%10, x+14);
|
||||
OLED_DrawChar((in / 10)%10, x + 28);
|
||||
OLED_DrawChar(in % 10, x + 32);
|
||||
OLED_DrawChar((in / 1000) % 10, x);
|
||||
OLED_DrawChar((in / 100) % 10, x + 1);
|
||||
OLED_DrawChar((in / 10) % 10, x + 2);
|
||||
OLED_DrawChar(in % 10, x + 3);
|
||||
}
|
||||
|
||||
/******************************** END OF FILE *********************************/
|
||||
|
||||
|
||||
@@ -6,37 +6,33 @@
|
||||
*/
|
||||
|
||||
#include "PID.h"
|
||||
#define MAXPIDOUTPUT 500000
|
||||
//This funtion computes the new value for the ON time of the system
|
||||
#define MAXPIDOUTPUT 50000
|
||||
//This function computes the new value for the ON time of the system
|
||||
//This is the return value from this function
|
||||
int32_t computePID(uint16_t setpoint) {
|
||||
static uint32_t lastSample = 0;
|
||||
int32_t ITerm = 0;
|
||||
int32_t ITerm = 0;
|
||||
static int16_t lastReading = 0;
|
||||
if (millis() - lastSample > 25) {
|
||||
//only sample every 50 milliseconds
|
||||
uint16_t currentReading = readIronTemp(0,1); //get the current temp of the iron
|
||||
int16_t error = (int16_t)setpoint - (int16_t)currentReading; //calculate the error term
|
||||
ITerm += (pidSettings.ki * error);
|
||||
if (ITerm > MAXPIDOUTPUT)
|
||||
ITerm = MAXPIDOUTPUT;
|
||||
else if (ITerm < 0)
|
||||
ITerm = 0; //cap at 0 since we cant force the iron to cool itself :)
|
||||
uint16_t currentReading = readIronTemp(0, 1); //get the current temp of the iron
|
||||
int16_t error = (int16_t) setpoint - (int16_t) currentReading; //calculate the error term
|
||||
ITerm += (pidSettings.ki * error);
|
||||
if (ITerm > MAXPIDOUTPUT)
|
||||
ITerm = MAXPIDOUTPUT;
|
||||
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) {
|
||||
pidSettings.kp = 22;
|
||||
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