From dc99dcf6e87ea3c28106c82548f7756b1ed8a2ad Mon Sep 17 00:00:00 2001 From: Andreas Mieke Date: Sun, 18 Mar 2018 23:43:59 +0100 Subject: [PATCH] Software --- .vscode/settings.json | 5 + Diplomarbeit.tex | 12 +- Mieke/Mieke.tex | 14 +-- Mieke/Nextion/editor.png | Bin 0 -> 92519 bytes Mieke/Nextion/settings.png | Bin 0 -> 57223 bytes Mieke/SW/MT/bma.c | 83 +++++++++++++ Mieke/SW/MT/bma.h | 18 +++ Mieke/SW/MT/display.c | 67 ++++++++++ Mieke/SW/MT/display.h | 15 +++ Mieke/SW/MT/eeprom.c | 123 ++++++++++++++++++ Mieke/SW/MT/eeprom.h | 18 +++ Mieke/SW/MT/esp.c | 76 ++++++++++++ Mieke/SW/MT/esp.h | 13 ++ Mieke/SW/MT/interface_uart.c | 139 +++++++++++++++++++++ Mieke/SW/MT/interface_uart.h | 16 +++ Mieke/SW/MT/ledswitch.c | 31 +++++ Mieke/SW/MT/ledswitch.h | 12 ++ Mieke/SW/MT/main.c | 234 +++++++++++++++++++++++++++++++++++ Mieke/SW/MT/main.h | 30 +++++ Mieke/SW/MT/ne555.c | 42 +++++++ Mieke/SW/MT/ne555.h | 12 ++ Mieke/SW/MT/piezo.c | 42 +++++++ Mieke/SW/MT/piezo.h | 12 ++ Mieke/SW/MT/rgb.c | 89 +++++++++++++ Mieke/SW/MT/rgb.h | 18 +++ Mieke/SW/ODD/bluetooth.c | 14 +++ Mieke/SW/ODD/bluetooth.h | 11 ++ Mieke/SW/ODD/bma.c | 61 +++++++++ Mieke/SW/ODD/bma.h | 11 ++ Mieke/SW/ODD/display.c | 59 +++++++++ Mieke/SW/ODD/display.h | 24 ++++ Mieke/SW/ODD/eeprom.c | 72 +++++++++++ Mieke/SW/ODD/eeprom.h | 13 ++ Mieke/SW/ODD/io.c | 111 +++++++++++++++++ Mieke/SW/ODD/io.h | 16 +++ Mieke/SW/ODD/main.c | 56 +++++++++ Mieke/SW/ODD/systick.c | 23 ++++ Mieke/SW/ODD/systick.h | 12 ++ Mieke/Software.tex | 136 ++++++++++++++++++++ Mieke/Theorie.tex | 46 +++++++ Schuh/Basisplatine.tex | 8 +- 41 files changed, 1775 insertions(+), 19 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 Mieke/Nextion/editor.png create mode 100644 Mieke/Nextion/settings.png create mode 100644 Mieke/SW/MT/bma.c create mode 100644 Mieke/SW/MT/bma.h create mode 100644 Mieke/SW/MT/display.c create mode 100644 Mieke/SW/MT/display.h create mode 100644 Mieke/SW/MT/eeprom.c create mode 100644 Mieke/SW/MT/eeprom.h create mode 100644 Mieke/SW/MT/esp.c create mode 100644 Mieke/SW/MT/esp.h create mode 100644 Mieke/SW/MT/interface_uart.c create mode 100644 Mieke/SW/MT/interface_uart.h create mode 100644 Mieke/SW/MT/ledswitch.c create mode 100644 Mieke/SW/MT/ledswitch.h create mode 100644 Mieke/SW/MT/main.c create mode 100644 Mieke/SW/MT/main.h create mode 100644 Mieke/SW/MT/ne555.c create mode 100644 Mieke/SW/MT/ne555.h create mode 100644 Mieke/SW/MT/piezo.c create mode 100644 Mieke/SW/MT/piezo.h create mode 100644 Mieke/SW/MT/rgb.c create mode 100644 Mieke/SW/MT/rgb.h create mode 100644 Mieke/SW/ODD/bluetooth.c create mode 100644 Mieke/SW/ODD/bluetooth.h create mode 100644 Mieke/SW/ODD/bma.c create mode 100644 Mieke/SW/ODD/bma.h create mode 100644 Mieke/SW/ODD/display.c create mode 100644 Mieke/SW/ODD/display.h create mode 100644 Mieke/SW/ODD/eeprom.c create mode 100644 Mieke/SW/ODD/eeprom.h create mode 100644 Mieke/SW/ODD/io.c create mode 100644 Mieke/SW/ODD/io.h create mode 100644 Mieke/SW/ODD/main.c create mode 100644 Mieke/SW/ODD/systick.c create mode 100644 Mieke/SW/ODD/systick.h create mode 100644 Mieke/Software.tex create mode 100644 Mieke/Theorie.tex diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..0590580 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.associations": { + "ne555.h": "c" + } +} \ No newline at end of file diff --git a/Diplomarbeit.tex b/Diplomarbeit.tex index a30f7a8..e8ad4f3 100644 --- a/Diplomarbeit.tex +++ b/Diplomarbeit.tex @@ -31,7 +31,7 @@ \usepackage{htlDT} % HTBL Diplomarbeitsstyle -\usepackage{todonotes} +%\usepackage{todonotes} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% General Settings, like Title, Students and supporters \title{Advanced Microcontroller Training System} @@ -112,6 +112,10 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% First real page \input{Allgemein/Allgemein} +\clearpage +\pageauthor{Mieke} +\input{Mieke/Theorie} + \clearpage \pageauthor{Schuh} \input{Schuh/Core-Modul} @@ -120,6 +124,10 @@ \input{Schuh/Audio} \input{Schuh/Kosten} +\clearpage +\pageauthor{Mieke} +\input{Mieke/Software} + \clearpage \pageauthor{Mieke} \input{Mieke/Mieke} @@ -136,7 +144,7 @@ \listoffigures \listoftables \printglossary[title=Begriffsverzeichnis,toctitle=Begriffsverzeichnis] -\listoftodos[To-Dos] +%\listoftodos[To-Dos] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% End Document \end{document} diff --git a/Mieke/Mieke.tex b/Mieke/Mieke.tex index 848d2a6..26b71d6 100644 --- a/Mieke/Mieke.tex +++ b/Mieke/Mieke.tex @@ -7,16 +7,4 @@ Zur Programmierung des neuen \gls{Minimalsystem}s wurde die \gls{IDE} Keil \uVis In den nun folgenden Kapiteln wurde dieses Tutorial, in leicht abgewandelter Form, übernommen, das Originaldokument kann unter \cite{doku:tutorial} gefunden werden. \input{Mieke/Tutorial/Tutorial} - -\input{Mieke/CMSISPacks} - -\section{Missing} -Theorie: -Versionierung -Git -Nextion GUI Desiger -LaTeX - -SW: -Tag der offenen Tür -Testprogramm \ No newline at end of file +\input{Mieke/CMSISPacks} \ No newline at end of file diff --git a/Mieke/Nextion/editor.png b/Mieke/Nextion/editor.png new file mode 100644 index 0000000000000000000000000000000000000000..d502e0d9165c131b47e83fb1c016e5458f73ff44 GIT binary patch literal 92519 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 lf4nsxATV_2X59&y}505`|H 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 XvhkZt!fye8AeX_@)z4*}Q$iB}SgvCf literal 0 HcmV?d00001 diff --git a/Mieke/SW/MT/bma.c b/Mieke/SW/MT/bma.c new file mode 100644 index 0000000..61016b7 --- /dev/null +++ b/Mieke/SW/MT/bma.c @@ -0,0 +1,83 @@ +#include "bma.h" + +void init_bma(void) +{ + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); + RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); + + GPIO_InitTypeDef gpio; + GPIO_StructInit(&gpio); + + // SCL + gpio.GPIO_Mode = GPIO_Mode_AF_PP; + gpio.GPIO_Pin = GPIO_Pin_6; + GPIO_Init(GPIOB, &gpio); + + // SDA + gpio.GPIO_Mode = GPIO_Mode_AF_OD; + gpio.GPIO_Pin = GPIO_Pin_7; + GPIO_Init(GPIOB, &gpio); + + I2C_InitTypeDef i2c; + I2C_StructInit(&i2c); + i2c.I2C_ClockSpeed = 400000; + I2C_Init(I2C1, &i2c); + + I2C_Cmd(I2C1, ENABLE); +} + +void run_bma(float acc_f[3]) +{ + int16_t acc[3]; + // Select first register address to read + I2C_GenerateSTART(I2C1, ENABLE); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); + I2C_Send7bitAddress(I2C1, BMA_ADDR, I2C_Direction_Transmitter); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); + I2C_SendData(I2C1, 0x02); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); + I2C_GenerateSTOP(I2C1, ENABLE); + + I2C_GenerateSTART(I2C1, ENABLE); + I2C_AcknowledgeConfig(I2C1, ENABLE); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); + I2C_Send7bitAddress(I2C1, BMA_ADDR, I2C_Direction_Receiver); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); + + // X LSB + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); + acc[0] = (I2C_ReceiveData(I2C1) & 0xC0) >> 6; + // X MSB + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); + acc[0] = (I2C_ReceiveData(I2C1) & 0xFF) << 2 | (acc[0] & 0x0003); + if(acc[0] & 0x0200) acc[0] |= 0xFC00; + + // Y LSB + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); + acc[1] = (I2C_ReceiveData(I2C1) & 0xC0) >> 6; + // Y MSB + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); + acc[1] = (I2C_ReceiveData(I2C1) & 0xFF) << 2 | (acc[1] & 0x0003); + if(acc[1] & 0x0200) acc[1] |= 0xFC00; + + // Z LSB + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); + acc[2] = (I2C_ReceiveData(I2C1) & 0xC0) >> 6; + // Z MSB + I2C_AcknowledgeConfig(I2C1, DISABLE); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); + acc[2] = (I2C_ReceiveData(I2C1) & 0xFF) << 2 | (acc[2] & 0x0003); + if(acc[2] & 0x0200) acc[2] |= 0xFC00; + + I2C_GenerateSTOP(I2C1, ENABLE); + + acc_f[0] = 2.0f * ((float)acc[0]/512); + acc_f[1] = 2.0f * ((float)acc[1]/512); + acc_f[2] = 2.0f * ((float)acc[2]/512); +} + +void deinit_bma(void) +{ + I2C_Cmd(I2C1, DISABLE); + I2C_DeInit(I2C1); +} diff --git a/Mieke/SW/MT/bma.h b/Mieke/SW/MT/bma.h new file mode 100644 index 0000000..ee610f3 --- /dev/null +++ b/Mieke/SW/MT/bma.h @@ -0,0 +1,18 @@ +#ifndef BMA_H +#define BMA_H + +#include "stm32f10x.h" // Device header +#include "stm32f10x_rcc.h" // Keil::Device:StdPeriph Drivers:RCC +#include "stm32f10x_gpio.h" // Keil::Device:StdPeriph Drivers:GPIO +#include "stm32f10x_i2c.h" // Keil::Device:StdPeriph Drivers:I2C + +#define BMA_ADDR (uint8_t)0x70 // 0b01110000 + // ---- Vendor address part + // --- User address part + // - Keep free for R/W bit (set by I2C_Send7bitAddress()) + +void init_bma(void); +void run_bma(float acc_f[3]); +void deinit_bma(void); + +#endif diff --git a/Mieke/SW/MT/display.c b/Mieke/SW/MT/display.c new file mode 100644 index 0000000..803f023 --- /dev/null +++ b/Mieke/SW/MT/display.c @@ -0,0 +1,67 @@ +#include "display.h" + +#define COLORS 8 + +uint8_t i = 0; +char colors[COLORS][7] = { + "RED", + "BLUE", + "GRAY", + "BLACK", + "WHITE", + "GREEN", + "BROWN", + "YELLOW" +}; + +void init_display(void) +{ + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); + RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); + + GPIO_InitTypeDef gpio; + GPIO_StructInit(&gpio); + + gpio.GPIO_Mode = GPIO_Mode_AF_PP; + gpio.GPIO_Pin = GPIO_Pin_10; + GPIO_Init(GPIOB, &gpio); + + gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING; + gpio.GPIO_Pin = GPIO_Pin_11; + GPIO_Init(GPIOB, &gpio); + + USART_InitTypeDef usart; + USART_StructInit(&usart); + usart.USART_BaudRate = 9600; + USART_Init(USART3, &usart); + + USART_ClockInitTypeDef usartclock; + USART_ClockStructInit(&usartclock); + USART_ClockInit(USART3, &usartclock); + + USART_Cmd(USART3, ENABLE); +} + +void run_display(void) +{ + char cmd[16], *cptr; + cptr = cmd; + sprintf(cmd, "cls %s\xFF\xFF\xFF", colors[i++]); + if (i == COLORS) i = 0; + while(*cptr) { + while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET); + USART_SendData(USART3, *cptr++); + } +} + +void deinit_display(void) +{ + char *cmd = "rest\xFF\xFF\xFF"; + while(*cmd) { + while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET); + USART_SendData(USART3, *cmd++); + } + while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET); + USART_Cmd(USART3, DISABLE); + USART_DeInit(USART3); +} diff --git a/Mieke/SW/MT/display.h b/Mieke/SW/MT/display.h new file mode 100644 index 0000000..d78f5cc --- /dev/null +++ b/Mieke/SW/MT/display.h @@ -0,0 +1,15 @@ +#ifndef DISPLAY_H +#define DISPLAY_H + +#include "stm32f10x.h" // Device header +#include "stm32f10x_rcc.h" // Keil::Device:StdPeriph Drivers:RCC +#include "stm32f10x_gpio.h" // Keil::Device:StdPeriph Drivers:GPIO +#include "stm32f10x_usart.h" // Keil::Device:StdPeriph Drivers:USART + +#include + +void init_display(void); +void run_display(void); +void deinit_display(void); + +#endif diff --git a/Mieke/SW/MT/eeprom.c b/Mieke/SW/MT/eeprom.c new file mode 100644 index 0000000..ed9b259 --- /dev/null +++ b/Mieke/SW/MT/eeprom.c @@ -0,0 +1,123 @@ +#include "eeprom.h" + +volatile uint32_t *EEPROMSTick, EEPROMSTickCur; + +uint8_t load_byte(uint16_t eeprom_addr) +{ + uint8_t data; + I2C_GenerateSTART(I2C1, ENABLE); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); + I2C_Send7bitAddress(I2C1, EEPROM_ADDR, I2C_Direction_Transmitter); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); + I2C_SendData(I2C1, (eeprom_addr & 0xFF00) >> 8); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); + I2C_SendData(I2C1, (eeprom_addr & 0x00FF)); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); + + I2C_GenerateSTART(I2C1, ENABLE); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); + I2C_Send7bitAddress(I2C1, EEPROM_ADDR, I2C_Direction_Receiver); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); + + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); + data = I2C_ReceiveData(I2C1); + I2C_GenerateSTOP(I2C1, ENABLE); + + return data; +} + +void write_byte(uint16_t eeprom_addr, uint8_t data) +{ + I2C_GenerateSTART(I2C1, ENABLE); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); + I2C_Send7bitAddress(I2C1, EEPROM_ADDR, I2C_Direction_Transmitter); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); + I2C_SendData(I2C1, (eeprom_addr & 0xFF00) >> 8); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); + I2C_SendData(I2C1, (eeprom_addr & 0x00FF)); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); + + I2C_SendData(I2C1, data); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); + + I2C_GenerateSTOP(I2C1, ENABLE); + + EEPROMSTickCur = *EEPROMSTick; + while((*EEPROMSTick - EEPROMSTickCur) <= 50); // 5ms write cycle, see datasheet param 17 + return; +} + +void init_eeprom(volatile uint32_t *SysTickCnt) +{ + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); + RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); + + GPIO_InitTypeDef gpio; + GPIO_StructInit(&gpio); + + // SCL + gpio.GPIO_Mode = GPIO_Mode_AF_PP; + gpio.GPIO_Pin = GPIO_Pin_6; + GPIO_Init(GPIOB, &gpio); + + // SDA + gpio.GPIO_Mode = GPIO_Mode_AF_OD; + gpio.GPIO_Pin = GPIO_Pin_7; + GPIO_Init(GPIOB, &gpio); + + I2C_InitTypeDef i2c; + I2C_StructInit(&i2c); + i2c.I2C_ClockSpeed = 400000; + I2C_Init(I2C1, &i2c); + + I2C_Cmd(I2C1, ENABLE); + EEPROMSTick = SysTickCnt; + return; +} + +void run_eeprom(uint8_t *success) +{ + uint8_t set, read; + *success = 0; + set = 0xAA; + write_byte(0x0000, set); + read = load_byte(0x0000); + if (set != read) return; + set = 0xBA; + write_byte(0x0010, set); + read = load_byte(0x0010); + if (set != read) return; + set = 0xAD; + write_byte(0x0001, set); + read = load_byte(0x0001); + if (set != read) return; + set = 0x00; + write_byte(0x0000, set); + read = load_byte(0x0000); + if (set != read) return; + set = 0x88; + write_byte(0x0002, set); + read = load_byte(0x0002); + if (set != read) return; + set = 0x01; + write_byte(0x0000, set); + read = load_byte(0x0000); + if (set != read) return; + set = 0x55; + write_byte(0x00005, set); + read = load_byte(0x0005); + if (set != read) return; + set = 0xAA; + write_byte(0x0005, set); + read = load_byte(0x0005); + if (set != read) return; + *success = 1; + return; +} + +void deinit_eeprom(void) +{ + I2C_Cmd(I2C1, DISABLE); + I2C_DeInit(I2C1); + return; +} diff --git a/Mieke/SW/MT/eeprom.h b/Mieke/SW/MT/eeprom.h new file mode 100644 index 0000000..c66c469 --- /dev/null +++ b/Mieke/SW/MT/eeprom.h @@ -0,0 +1,18 @@ +#ifndef EEPROM_H +#define EEPROM_H + +#include "stm32f10x.h" // Device header +#include "stm32f10x_rcc.h" // Keil::Device:StdPeriph Drivers:RCC +#include "stm32f10x_gpio.h" // Keil::Device:StdPeriph Drivers:GPIO +#include "stm32f10x_i2c.h" // Keil::Device:StdPeriph Drivers:I2C + +#define EEPROM_ADDR (uint8_t)0xA0 // 0b10100000 + // ---- Vendor address part + // --- User address part + // - Keep free for R/W bit (set by I2C_Send7bitAddress()) + +void init_eeprom(volatile uint32_t *SysTickCnt); +void run_eeprom(uint8_t *success); +void deinit_eeprom(void); + +#endif diff --git a/Mieke/SW/MT/esp.c b/Mieke/SW/MT/esp.c new file mode 100644 index 0000000..004d811 --- /dev/null +++ b/Mieke/SW/MT/esp.c @@ -0,0 +1,76 @@ +#include "esp.h" + +void init_esp(void) +{ + RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); + + GPIO_InitTypeDef gpio; + GPIO_StructInit(&gpio); + + gpio.GPIO_Mode = GPIO_Mode_AF_PP; + gpio.GPIO_Pin = GPIO_Pin_2; + GPIO_Init(GPIOA, &gpio); + + gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING; + gpio.GPIO_Pin = GPIO_Pin_3; + GPIO_Init(GPIOA, &gpio); + + USART_InitTypeDef usart; + USART_StructInit(&usart); + usart.USART_BaudRate = 115200; + USART_Init(USART2, &usart); + + USART_ClockInitTypeDef usartclock; + USART_ClockStructInit(&usartclock); + USART_ClockInit(USART2, &usartclock); + + NVIC_InitTypeDef nvic; + nvic.NVIC_IRQChannel = USART2_IRQn; + nvic.NVIC_IRQChannelCmd = ENABLE; + nvic.NVIC_IRQChannelPreemptionPriority = 0; + nvic.NVIC_IRQChannelSubPriority = 2; + NVIC_Init(&nvic); + USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); + + USART_Cmd(USART2, ENABLE); +} + +void esp_wait() +{ + int i, j; + for(j=0;j<500;j++) { + for(i=0;i<65536;i++); + } +} + +void send_str(char *str) { + while(*str) { + while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET); + USART_SendData(USART2, *str++); + } +} + +void run_esp(void) +{ + send_str("AT+RESTORE\r\n"); + esp_wait(); + send_str("AT+CWMODE?\r\n"); + esp_wait(); + send_str("AT+CWMODE=2\r\n"); + esp_wait(); + send_str("AT+RST\r\n"); + esp_wait(); + send_str("AT+CIPMUX=1\r\n"); + esp_wait(); + send_str("AT+CIPSERVER=1,2526\r\n"); + esp_wait(); + send_str("AT+CIPAP_CUR?\r\n"); +} + +void deinit_esp(void) +{ + USART_ITConfig(USART2, USART_IT_RXNE, DISABLE); + USART_Cmd(USART2, DISABLE); + USART_DeInit(USART2); +} diff --git a/Mieke/SW/MT/esp.h b/Mieke/SW/MT/esp.h new file mode 100644 index 0000000..f067e4d --- /dev/null +++ b/Mieke/SW/MT/esp.h @@ -0,0 +1,13 @@ +#ifndef ESP_H +#define ESP_H + +#include "stm32f10x.h" // Device header +#include "stm32f10x_rcc.h" // Keil::Device:StdPeriph Drivers:RCC +#include "stm32f10x_gpio.h" // Keil::Device:StdPeriph Drivers:GPIO +#include "stm32f10x_usart.h" // Keil::Device:StdPeriph Drivers:USART + +void init_esp(void); +void run_esp(void); +void deinit_esp(void); + +#endif diff --git a/Mieke/SW/MT/interface_uart.c b/Mieke/SW/MT/interface_uart.c new file mode 100644 index 0000000..3781ae6 --- /dev/null +++ b/Mieke/SW/MT/interface_uart.c @@ -0,0 +1,139 @@ +#include "interface_uart.h" + +void USART_SendString(USART_TypeDef *USARTx, char *str) +{ + while (*str) { + while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET); + USART_SendData(USARTx, *str++); + } +} + +void init_all(void) +{ + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); + RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); + RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); + + GPIO_InitTypeDef gpio; + GPIO_StructInit(&gpio); + + gpio.GPIO_Mode = GPIO_Mode_AF_PP; + gpio.GPIO_Pin = GPIO_Pin_9; + GPIO_Init(GPIOA, &gpio); + + gpio.GPIO_Pin = GPIO_Pin_2; + GPIO_Init(GPIOA, &gpio); + + gpio.GPIO_Pin = GPIO_Pin_10; + GPIO_Init(GPIOB, &gpio); + + gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING; + gpio.GPIO_Pin = GPIO_Pin_10; + GPIO_Init(GPIOA, &gpio); + + gpio.GPIO_Pin = GPIO_Pin_3; + GPIO_Init(GPIOA, &gpio); + + gpio.GPIO_Pin = GPIO_Pin_11; + GPIO_Init(GPIOB, &gpio); + + USART_InitTypeDef usart; + USART_StructInit(&usart); + usart.USART_BaudRate = 115200; + USART_Init(USART1, &usart); + USART_Init(USART2, &usart); + USART_Init(USART3, &usart); + + USART_ClockInitTypeDef usartclock; + USART_ClockStructInit(&usartclock); + USART_ClockInit(USART1, &usartclock); + USART_ClockInit(USART2, &usartclock); + USART_ClockInit(USART3, &usartclock); + + USART_Cmd(USART1, ENABLE); + USART_Cmd(USART2, ENABLE); + USART_Cmd(USART3, ENABLE); + + RCC_ClocksTypeDef clocks; + RCC_GetClocksFreq(&clocks); + SysTick_Config(clocks.HCLK_Frequency/1000 - 1); // SysTick T=1ms +} + +void send_welcome(void) +{ + USART_SendString(USART1, "\x1B[2J\x1B[0;0HManufacturing test software, press space...\r\n"); + USART_SendString(USART2, "\x1B[2J\x1B[0;0HManufacturing test software, press space...\r\n"); + USART_SendString(USART3, "\x1B[2J\x1B[0;0HManufacturing test software, press space...\r\n"); +} + +unsigned int wait_for_start(void) +{ + uint8_t data; + for(;;) { + if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET) { + data = USART_ReceiveData(USART1); + if (data == ' ') { + USART_Cmd(USART2, DISABLE); + USART_Cmd(USART3, DISABLE); + USART_DeInit(USART2); + USART_DeInit(USART3); + return 1; + } else { + USART_Cmd(USART1, DISABLE); + USART_DeInit(USART1); + } + } + if (USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == SET) { + data = USART_ReceiveData(USART2); + if (data == ' ') { + USART_Cmd(USART1, DISABLE); + USART_Cmd(USART3, DISABLE); + USART_DeInit(USART1); + USART_DeInit(USART3); + return 2; + } else { + USART_Cmd(USART2, DISABLE); + USART_DeInit(USART2); + } + } + if (USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == SET) { + data = USART_ReceiveData(USART3); + if (data == ' ') { + USART_Cmd(USART1, DISABLE); + USART_Cmd(USART2, DISABLE); + USART_DeInit(USART1); + USART_DeInit(USART2); + return 3; + } else { + USART_Cmd(USART3, DISABLE); + USART_DeInit(USART3); + } + } + } +} + +unsigned int wait_for_test(USART_TypeDef *USARTx) +{ + int data; + for(;;) + { + if (USART_GetFlagStatus(USARTx, USART_FLAG_RXNE) == SET) { + data = (int)USART_ReceiveData(USARTx); + if ((data > 0x09 && data <= 0x30) || data > 0x39) return 1; + return (data >= 0x30) ? data - 0x30 : data; + } + } +} + +unsigned int get_test(USART_TypeDef *USARTx) +{ + int data; + if (USART_GetFlagStatus(USARTx, USART_FLAG_RXNE) == SET) { + data = (int)USART_ReceiveData(USARTx); + if ((data > 0x09 && data <= 0x30) || data > 0x39) return 1; + return (data >= 0x30) ? data - 0x30 : data; + } + return 0; +} diff --git a/Mieke/SW/MT/interface_uart.h b/Mieke/SW/MT/interface_uart.h new file mode 100644 index 0000000..f2e6970 --- /dev/null +++ b/Mieke/SW/MT/interface_uart.h @@ -0,0 +1,16 @@ +#ifndef INTERFACE_UART_H +#define INTERFACE_UART_H + +#include "stm32f10x.h" // Device header +#include "stm32f10x_rcc.h" // Keil::Device:StdPeriph Drivers:RCC +#include "stm32f10x_gpio.h" // Keil::Device:StdPeriph Drivers:GPIO +#include "stm32f10x_usart.h" // Keil::Device:StdPeriph Drivers:USART + +void USART_SendString(USART_TypeDef *USARTx, char *str); +void init_all(void); +void send_welcome(void); +unsigned int wait_for_start(void); +unsigned int wait_for_test(USART_TypeDef *USARTx); +unsigned int get_test(USART_TypeDef *USARTx); + +#endif diff --git a/Mieke/SW/MT/ledswitch.c b/Mieke/SW/MT/ledswitch.c new file mode 100644 index 0000000..80989f4 --- /dev/null +++ b/Mieke/SW/MT/ledswitch.c @@ -0,0 +1,31 @@ +#include "ledswitch.h" + +void init_ledswitch(void) +{ + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); + + GPIO_InitTypeDef gpio; + GPIO_StructInit(&gpio); + + gpio.GPIO_Mode = GPIO_Mode_Out_PP; + gpio.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9; + GPIO_Init(GPIOC, &gpio); + + gpio.GPIO_Mode = GPIO_Mode_IPU; + gpio.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8; + GPIO_Init(GPIOA, &gpio); + return; +} + +void run_ledswitch(uint8_t *switches) +{ + *switches = (GPIO_ReadInputData(GPIOA) & 0x000F) | ((GPIO_ReadInputData(GPIOA) & 0x01E0) >> 1); + GPIO_Write(GPIOC, ((*switches & 0xE0) << 2) | ((*switches & 0x1F) << 1)); + return; +} + +void deinit_ledswitch(void) +{ + return; +} diff --git a/Mieke/SW/MT/ledswitch.h b/Mieke/SW/MT/ledswitch.h new file mode 100644 index 0000000..4ed365c --- /dev/null +++ b/Mieke/SW/MT/ledswitch.h @@ -0,0 +1,12 @@ +#ifndef LEDSWITCH_H +#define LEDSWITCH_H + +#include "stm32f10x.h" // Device header +#include "stm32f10x_rcc.h" // Keil::Device:StdPeriph Drivers:RCC +#include "stm32f10x_gpio.h" // Keil::Device:StdPeriph Drivers:GPIO + +void init_ledswitch(void); +void run_ledswitch(uint8_t *switches); +void deinit_ledswitch(void); + +#endif diff --git a/Mieke/SW/MT/main.c b/Mieke/SW/MT/main.c new file mode 100644 index 0000000..5856547 --- /dev/null +++ b/Mieke/SW/MT/main.c @@ -0,0 +1,234 @@ +#include +#include "interface_uart.h" + +#include "main.h" + +#include "bma.h" +#include "ne555.h" +#include "ledswitch.h" +#include "eeprom.h" +#include "esp.h" +#include "rgb.h" +#include "piezo.h" +#include "display.h" + +volatile uint32_t SysTickCnt = 0; +USART_TypeDef *used_usart; + +void SysTick_Handler() +{ + SysTickCnt++; +} + +void USART2_IRQHandler() +{ + USART_SendData(used_usart, USART_ReceiveData(USART2)); +} + +void wait(uint32_t ms) +{ + uint32_t SysTickCntHold = SysTickCnt; + while((SysTickCnt - SysTickCntHold) <= ms); +} + +int main() +{ + char buffer[1024]; + enum test_t current_test = test_not_init, next_test = test_not_init; + enum iface_t control_interface = interface_none; + + for (;;) { + switch (control_interface) { + case interface_none: + init_all(); + send_welcome(); + control_interface = (enum iface_t)wait_for_start(); + switch (control_interface) { + case interface_usart1: + used_usart = USART1; + break; + case interface_usart2: + used_usart = USART2; + break; + case interface_usart3: + used_usart = USART3; + break; + default: + control_interface = interface_none; + break; + } + break; + case interface_usart1: + case interface_usart2: + case interface_usart3: + switch(current_test) { + case test_not_init: + current_test = test_none; + break; + case test_none: + USART_SendString(used_usart, "\x1B[2J\x1B[0;0HManufacturing test software, Version " VERSION "\r\n\r\n\ +\tTo run tests, enter one of the following numbers:\r\n\t\t[2]\tBMA\r\n\t\t[3]\tNE555/LFU/IR\r\n\ +\t\t[4]\tLEDs and Switches\r\n\t\t[5]\tESP\r\n\t\t[6]\tEEPROM\r\n\t\t[7]\tRGB LED\r\n\t\t[8]\tPiezo\r\n\t\t[9]\tDisplay\r\n\r\nWaiting for your selection... "); + current_test = (enum test_t)wait_for_test(used_usart); + break; + case test_bma: + USART_SendString(used_usart, "\x1B[2J\x1B[0;0HBMA Test\r\n\r\nThis tests the correct function\ + of the used BMA gyroscope as well as I2C port 1. Below you should see the current acceleration values printed\ + for the X, Y and Z axis. Where the Z axis should show something around 1g, as this is the gravitational\ + acceleration on the Earth, of course this value is lower if you run this program on the moon!\r\n\r\n\ +To return to the main menu press a button.\r\n\r\n\r\n"); + init_bma(); + float accs[3]; + for(;;) { + run_bma(accs); + sprintf(buffer, "\x1B[K\rX: % 02.5f, Y: % 02.5f, Z: % 02.5f", accs[0], accs[1], accs[2]); + USART_SendString(used_usart, buffer); + next_test = (enum test_t)get_test(used_usart); + if (next_test != test_not_init) { + current_test = next_test; + deinit_bma(); + break; + } + wait(50); + } + break; + case test_ne555: + USART_SendString(used_usart, "\x1B[2J\x1B[0;0HNE555/LFU/IR Test\r\n\r\nThis tests the correct function\ + of the NE555/LFU/IR on the board. The currently selected frequency should be printed below!\r\n\r\n\ +To return to the main menu press a button.\r\n\r\n\r\n"); + init_ne555(&SysTickCnt); + float freq; + for(;;) { + run_ne555(&freq); + sprintf(buffer, "\x1B[K\r% 05.1fHz", freq); + USART_SendString(used_usart, buffer); + next_test = (enum test_t)get_test(used_usart); + if (next_test != test_not_init) { + current_test = next_test; + deinit_ne555(); + break; + } + wait(50); + } + break; + case test_led: + USART_SendString(used_usart, "\x1B[2J\x1B[0;0HLED/Switch Test\r\n\r\nThis tests the correct function\ + of the switches and the leds on the board. The currently selected leds are shown hexadecimal below!\r\n\r\n\ +To return to the main menu press a button.\r\n\r\n\r\n"); + init_ledswitch(); + uint8_t switches; + for(;;) { + run_ledswitch(&switches); + sprintf(buffer, "\x1B[K\rSelected: 0x%02x", switches); + USART_SendString(used_usart, buffer); + next_test = (enum test_t)get_test(used_usart); + if (next_test != test_not_init) { + current_test = next_test; + deinit_ledswitch(); + break; + } + wait(50); + } + break; + case test_esp: + USART_SendString(used_usart, "\x1B[2J\x1B[0;0HESP Test\r\n\r\nThis tests the correct function\ + of the ESP module on the board. The ESP should open a WLAN AP!\r\n\r\n\ +To return to the main menu press a button.\r\n\r\n\r\n"); + init_esp(); + sprintf(buffer, "\x1B[K\rRunning test...\r\n\r\n"); + USART_SendString(used_usart, buffer); + run_esp(); + for(;;) { + next_test = (enum test_t)get_test(used_usart); + if (next_test != test_not_init) { + current_test = next_test; + deinit_esp(); + break; + } + wait(50); + } + break; + case test_eeprom: + USART_SendString(used_usart, "\x1B[2J\x1B[0;0HEEPROM Test\r\n\r\nThis tests the correct function\ + of the EEPROM on the board. The test will run and show an OK or NOK below!\r\n\r\n\ +To return to the main menu press a button.\r\n\r\n\r\n"); + init_eeprom(&SysTickCnt); + uint8_t success; + sprintf(buffer, "\x1B[K\rRunning test..."); + USART_SendString(used_usart, buffer); + run_eeprom(&success); + if(success == 1) sprintf(buffer, "OK"); + else sprintf(buffer, "NOK"); + USART_SendString(used_usart, buffer); + for(;;) { + next_test = (enum test_t)get_test(used_usart); + if (next_test != test_not_init) { + current_test = next_test; + deinit_eeprom(); + break; + } + wait(50); + } + break; + case test_rgb: + USART_SendString(used_usart, "\x1B[2J\x1B[0;0HRGB LED Test\r\n\r\nThis tests the correct function\ + of the RGB LED and it's I2C driver on the board!\r\n\r\n\ +To return to the main menu press a button.\r\n\r\n\r\n"); + init_rgb(); + for(;;) { + run_rgb(); + next_test = (enum test_t)get_test(used_usart); + if (next_test != test_not_init) { + current_test = next_test; + deinit_rgb(); + break; + } + wait(50); + } + break; + case test_piezo: + USART_SendString(used_usart, "\x1B[2J\x1B[0;0HPiezo Test\r\n\r\nThis tests the correct function\ + of the Piezo on the board. You should hear the frequency printed below!\r\n\r\n\ +To return to the main menu press a button.\r\n\r\n\r\n"); + init_piezo(&SysTickCnt); + for(;;) { + run_piezo(); + sprintf(buffer, "\x1B[K\r500Hz"); + USART_SendString(used_usart, buffer); + next_test = (enum test_t)get_test(used_usart); + if (next_test != test_not_init) { + current_test = next_test; + deinit_piezo(); + break; + } + wait(50); + } + break; + case test_display: + USART_SendString(used_usart, "\x1B[2J\x1B[0;0HDisplay Test\r\n\r\nThis tests the correct function\ + of the Display on the board. You should see text printed on the display!\r\n\r\n\ +To return to the main menu press a button.\r\n\r\n\r\n"); + init_display(); + for(;;) { + run_display(); + sprintf(buffer, "OK"); + USART_SendString(used_usart, buffer); + next_test = (enum test_t)get_test(used_usart); + if (next_test != test_not_init) { + current_test = next_test; + deinit_display(); + break; + } + wait(50); + } + break; + default: + current_test = test_none; + break; + } + break; + default: + break; + } + } +} diff --git a/Mieke/SW/MT/main.h b/Mieke/SW/MT/main.h new file mode 100644 index 0000000..2cb91e1 --- /dev/null +++ b/Mieke/SW/MT/main.h @@ -0,0 +1,30 @@ +#ifndef MAIN_H +#define MAIN_H + +#define VERSION "0.1.0" + +enum iface_t { + interface_none = 0, + interface_usart1, + interface_usart2, + interface_usart3 +}; + +enum test_t { + test_not_init = 0, + test_none = 1, + test_bma, + test_ne555, + test_led, + test_esp, + test_eeprom, + test_rgb, + test_piezo, + test_display +}; + +void SysTick_Handler(void); +void USART2_IRQHandler(void); +void wait(uint32_t ms); + +#endif diff --git a/Mieke/SW/MT/ne555.c b/Mieke/SW/MT/ne555.c new file mode 100644 index 0000000..9438257 --- /dev/null +++ b/Mieke/SW/MT/ne555.c @@ -0,0 +1,42 @@ +#include "ne555.h" + +volatile uint32_t *NE555STick, NE555STickCur; +uint8_t old_state; + +void init_ne555(volatile uint32_t *SysTickCnt) +{ + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); + + GPIO_InitTypeDef gpio; + GPIO_StructInit(&gpio); + + gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING; + gpio.GPIO_Pin = GPIO_Pin_0; + GPIO_Init(GPIOB, &gpio); + + NE555STick = SysTickCnt; + return; +} + +void run_ne555(float *freq) +{ + uint8_t state; + *freq = 0.0f; + NE555STickCur = *NE555STick; + while((*NE555STick - NE555STickCur) <= 1000) + { + state = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0); + if (state != old_state) + { + (*freq)++; + old_state = state; + } + } + *freq /= 2; + return; +} + +void deinit_ne555(void) +{ + return; +} diff --git a/Mieke/SW/MT/ne555.h b/Mieke/SW/MT/ne555.h new file mode 100644 index 0000000..6b96eae --- /dev/null +++ b/Mieke/SW/MT/ne555.h @@ -0,0 +1,12 @@ +#ifndef NE555_H +#define NE555_H + +#include "stm32f10x.h" // Device header +#include "stm32f10x_rcc.h" // Keil::Device:StdPeriph Drivers:RCC +#include "stm32f10x_gpio.h" // Keil::Device:StdPeriph Drivers:GPIO + +void init_ne555(volatile uint32_t *SysTickCnt); +void run_ne555(float *freq); +void deinit_ne555(void); + +#endif diff --git a/Mieke/SW/MT/piezo.c b/Mieke/SW/MT/piezo.c new file mode 100644 index 0000000..9db8898 --- /dev/null +++ b/Mieke/SW/MT/piezo.c @@ -0,0 +1,42 @@ +#include "piezo.h" + +volatile uint32_t *PiezoSTick, PiezoSTickCur, Freq; + +void init_piezo(volatile uint32_t *SysTickCnt) +{ + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); + + GPIO_InitTypeDef gpio; + GPIO_StructInit(&gpio); + + gpio.GPIO_Mode = GPIO_Mode_Out_PP; + gpio.GPIO_Pin = GPIO_Pin_0; + GPIO_Init(GPIOB, &gpio); + + PiezoSTick = SysTickCnt; + return; +} + +void run_piezo() +{ + uint8_t pstate = 0x0; + PiezoSTickCur = *PiezoSTick; + while((*PiezoSTick - PiezoSTickCur) <= 1000) + { + Freq = *PiezoSTick; + while((*PiezoSTick - Freq) <= 1); + if (pstate) { + pstate = ~pstate; + GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_SET); + } else { + pstate = ~pstate; + GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_RESET); + } + } + return; +} + +void deinit_piezo(void) +{ + return; +} diff --git a/Mieke/SW/MT/piezo.h b/Mieke/SW/MT/piezo.h new file mode 100644 index 0000000..7ba309c --- /dev/null +++ b/Mieke/SW/MT/piezo.h @@ -0,0 +1,12 @@ +#ifndef PIEZO_H +#define PIEZO_H + +#include "stm32f10x.h" // Device header +#include "stm32f10x_rcc.h" // Keil::Device:StdPeriph Drivers:RCC +#include "stm32f10x_gpio.h" // Keil::Device:StdPeriph Drivers:GPIO + +void init_piezo(volatile uint32_t *SysTickCnt); +void run_piezo(void); +void deinit_piezo(void); + +#endif diff --git a/Mieke/SW/MT/rgb.c b/Mieke/SW/MT/rgb.c new file mode 100644 index 0000000..0329e42 --- /dev/null +++ b/Mieke/SW/MT/rgb.c @@ -0,0 +1,89 @@ +#include "rgb.h" +#include "main.h" + +typedef enum { + RGB_SHUTDOWN = 0x00, + RGB_MAXCUR, + RGB_RED, + RGB_GREEN, + RGB_BLUE, + RGB_UPLEND, + RGB_DOWNLEND, + RGB_DIMSTEP +} RGB_T; + + +void rgb_send_command(uint8_t data) +{ + I2C_GenerateSTART(I2C1, ENABLE); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); + I2C_Send7bitAddress(I2C1, RGB_ADDR, I2C_Direction_Transmitter); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); + + I2C_SendData(I2C1, data); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); + + I2C_GenerateSTOP(I2C1, ENABLE); + + return; +} + +void init_rgb(void) +{ + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); + RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); + + GPIO_InitTypeDef gpio; + GPIO_StructInit(&gpio); + + // SCL + gpio.GPIO_Mode = GPIO_Mode_AF_PP; + gpio.GPIO_Pin = GPIO_Pin_6; + GPIO_Init(GPIOB, &gpio); + + // SDA + gpio.GPIO_Mode = GPIO_Mode_AF_OD; + gpio.GPIO_Pin = GPIO_Pin_7; + GPIO_Init(GPIOB, &gpio); + + I2C_InitTypeDef i2c; + I2C_StructInit(&i2c); + i2c.I2C_ClockSpeed = 400000; + I2C_Init(I2C1, &i2c); + + I2C_Cmd(I2C1, ENABLE); + + // LED actually allows 40mA, but driver only hanbdles around 30 + rgb_send_command(0x3F); + return; +} + +void run_rgb(void) +{ + rgb_send_command(0x5F); + wait(100); + rgb_send_command(0x7F); + wait(100); + rgb_send_command(0x9F); + wait(100); + rgb_send_command(0x50); + wait(100); + rgb_send_command(0x70); + wait(100); + rgb_send_command(0x90); + wait(100); + rgb_send_command(0x40); + wait(100); + rgb_send_command(0x60); + wait(100); + rgb_send_command(0x80); + wait(100); + return; +} + +void deinit_rgb(void) +{ + I2C_Cmd(I2C1, DISABLE); + I2C_DeInit(I2C1); + return; +} diff --git a/Mieke/SW/MT/rgb.h b/Mieke/SW/MT/rgb.h new file mode 100644 index 0000000..846a643 --- /dev/null +++ b/Mieke/SW/MT/rgb.h @@ -0,0 +1,18 @@ +#ifndef RGB_H +#define RGB_H + +#include "stm32f10x.h" // Device header +#include "stm32f10x_rcc.h" // Keil::Device:StdPeriph Drivers:RCC +#include "stm32f10x_gpio.h" // Keil::Device:StdPeriph Drivers:GPIO +#include "stm32f10x_i2c.h" // Keil::Device:StdPeriph Drivers:I2C + +#define RGB_ADDR (uint8_t)0x70 // 0b01110000 + // ---- Vendor address part + // --- User address part + // - Keep free for R/W bit (set by I2C_Send7bitAddress()) + +void init_rgb(void); +void run_rgb(void); +void deinit_rgb(void); + +#endif diff --git a/Mieke/SW/ODD/bluetooth.c b/Mieke/SW/ODD/bluetooth.c new file mode 100644 index 0000000..5e08560 --- /dev/null +++ b/Mieke/SW/ODD/bluetooth.c @@ -0,0 +1,14 @@ +#include "bluetooth.h" + +void bluetooth_init(void) +{ + usart1_init(); +} + +void bluetooth_send_gyro_data(uint8_t X, uint8_t Y, uint8_t Z) +{ + char __str[128] = {0}; + char *str = __str; + sprintf(str, "%d,%d,%d\r\n", X, Y, Z); + USART_SendString(USART1, str); +} diff --git a/Mieke/SW/ODD/bluetooth.h b/Mieke/SW/ODD/bluetooth.h new file mode 100644 index 0000000..6540939 --- /dev/null +++ b/Mieke/SW/ODD/bluetooth.h @@ -0,0 +1,11 @@ +#ifndef BLUETOOTH_H +#define BLUETOOTH_H + +#include "stm32f10x.h" // Device header + +#include "io.h" +#include "stdio.h" + +void bluetooth_init(void); +void bluetooth_send_gyro_data(uint8_t X, uint8_t Y, uint8_t Z); +#endif diff --git a/Mieke/SW/ODD/bma.c b/Mieke/SW/ODD/bma.c new file mode 100644 index 0000000..49baca5 --- /dev/null +++ b/Mieke/SW/ODD/bma.c @@ -0,0 +1,61 @@ +#include "bma.h" + +#define BMA_ADDR (uint8_t)0x70 // 0b01110000 + // ---- Vendor address part + // --- User address part + // - Keep free for R/W bit (set by I2C_Send7bitAddress()) + +void bma_init(void) +{ + i2c1_init(); +} + +void bma_get_acc(uint8_t *X, uint8_t *Y, uint8_t *Z) +{ + int16_t acc[3]; + // Select first register address to read + I2C_GenerateSTART(I2C1, ENABLE); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); + I2C_Send7bitAddress(I2C1, BMA_ADDR, I2C_Direction_Transmitter); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); + I2C_SendData(I2C1, 0x02); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); + I2C_GenerateSTOP(I2C1, ENABLE); + + I2C_GenerateSTART(I2C1, ENABLE); + I2C_AcknowledgeConfig(I2C1, ENABLE); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); + I2C_Send7bitAddress(I2C1, BMA_ADDR, I2C_Direction_Receiver); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); + + // X LSB + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); + acc[0] = (I2C_ReceiveData(I2C1) & 0xC0) >> 6; + // X MSB + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); + acc[0] = (I2C_ReceiveData(I2C1) & 0xFF) << 2 | (acc[0] & 0x0003); + if(acc[0] & 0x0200) acc[0] |= 0xFC00; + + // Y LSB + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); + acc[1] = (I2C_ReceiveData(I2C1) & 0xC0) >> 6; + // Y MSB + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); + acc[1] = (I2C_ReceiveData(I2C1) & 0xFF) << 2 | (acc[1] & 0x0003); + if(acc[1] & 0x0200) acc[1] |= 0xFC00; + + // Z LSB + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); + acc[2] = (I2C_ReceiveData(I2C1) & 0xC0) >> 6; + // Z MSB + I2C_AcknowledgeConfig(I2C1, DISABLE); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); + acc[2] = (I2C_ReceiveData(I2C1) & 0xFF) << 2 | (acc[2] & 0x0003); + if(acc[2] & 0x0200) acc[2] |= 0xFC00; + + I2C_GenerateSTOP(I2C1, ENABLE); + + *X = (acc[0]/4) + 128; + *Y = (acc[1]/4) + 128; + *Z = (acc[2]/4) + 128; +} diff --git a/Mieke/SW/ODD/bma.h b/Mieke/SW/ODD/bma.h new file mode 100644 index 0000000..2c55887 --- /dev/null +++ b/Mieke/SW/ODD/bma.h @@ -0,0 +1,11 @@ +#ifndef BMA_H +#define BMA_H + +#include "stm32f10x.h" // Device header + +#include "io.h" + +void bma_init(void); +void bma_get_acc(uint8_t *X, uint8_t *Y, uint8_t *Z); + +#endif diff --git a/Mieke/SW/ODD/display.c b/Mieke/SW/ODD/display.c new file mode 100644 index 0000000..c842cb9 --- /dev/null +++ b/Mieke/SW/ODD/display.c @@ -0,0 +1,59 @@ +#include "display.h" + +disp_state_t state = DISP_STATE_NONE; +uint8_t running = 0; + +void USART3_IRQHandler(void) +{ + if (USART_GetITStatus(USART3, USART_IT_RXNE) == SET) { + state = (disp_state_t)((USART_ReceiveData(USART3) & 0x00FF) - '0'); + if (state > 4) { + state = DISP_STATE_NONE; + } + } + if (state == DISP_STATE_START) { + running = 1; + } else if (state == DISP_STATE_PAUSE) { + running = 0; + } +} + +void disp_init(void) +{ + usart3_init(); + + NVIC_InitTypeDef nvic; + nvic.NVIC_IRQChannel = USART3_IRQn; + nvic.NVIC_IRQChannelCmd = ENABLE; + nvic.NVIC_IRQChannelPreemptionPriority = 0; + nvic.NVIC_IRQChannelSubPriority = 2; + NVIC_Init(&nvic); + USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); + + disp_disable(); +} + +disp_state_t disp_get_last_state(void) +{ + disp_state_t tmp = state; + state = DISP_STATE_NONE; + return tmp; +} + +void disp_send_gyro_data(uint8_t X, uint8_t Y, uint8_t Z) +{ + char __str[128] = {0}; + char *str = __str; + sprintf(str, "add 1,0,%d\xFF\xFF\xFF" "add 1,1,%d\xFF\xFF\xFF" "add 1,2,%d\xFF\xFF\xFF", X, Y, Z); + USART_SendString(USART3, str); +} + +void disp_disable(void) +{ + USART_SendString(USART3, "dim=0\xFF\xFF\xFF"); +} + +void disp_enable(void) +{ + USART_SendString(USART3, "dim=100\xFF\xFF\xFF"); +} diff --git a/Mieke/SW/ODD/display.h b/Mieke/SW/ODD/display.h new file mode 100644 index 0000000..b592d33 --- /dev/null +++ b/Mieke/SW/ODD/display.h @@ -0,0 +1,24 @@ +#ifndef DISPLAY_H +#define DISPLAY_H + +#include "stm32f10x.h" // Device header + +#include "io.h" +#include "stdio.h" + +typedef enum uint8_t { + DISP_STATE_NONE = 0x00, + DISP_STATE_PAUSE, + DISP_STATE_START, + DISP_STATE_SAVE, + DISP_STATE_RECALL, + DISP_STATE_ERROR = 0xFF - '0' +} disp_state_t; + +void disp_init(void); +disp_state_t disp_get_last_state(void); +void disp_send_gyro_data(uint8_t X, uint8_t Y, uint8_t Z); +void disp_disable(void); +void disp_enable(void); + +#endif diff --git a/Mieke/SW/ODD/eeprom.c b/Mieke/SW/ODD/eeprom.c new file mode 100644 index 0000000..231f7d8 --- /dev/null +++ b/Mieke/SW/ODD/eeprom.c @@ -0,0 +1,72 @@ +#include "eeprom.h" + +extern volatile uint32_t SysTickCnt; + +#define EEPROM_ADDR (uint8_t)0xA0 // 0b10100000 + // ---- Vendor address part + // --- User address part + // - Keep free for R/W bit (set by I2C_Send7bitAddress()) + +uint32_t last_write_tick = 0; + +void eeprom_init(void) +{ + i2c1_init(); +} + +void eeprom_read(uint16_t address, uint8_t *data, uint16_t length) +{ + uint16_t cur_pos; + I2C_GenerateSTART(I2C1, ENABLE); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); + I2C_Send7bitAddress(I2C1, EEPROM_ADDR, I2C_Direction_Transmitter); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); + I2C_SendData(I2C1, (address & 0xFF00) >> 8); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); + I2C_SendData(I2C1, (address & 0x00FF)); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); + + I2C_GenerateSTART(I2C1, ENABLE); + I2C_AcknowledgeConfig(I2C1, ENABLE); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); + I2C_Send7bitAddress(I2C1, EEPROM_ADDR, I2C_Direction_Receiver); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); + + for(cur_pos = 0; cur_pos < length; cur_pos++) { + if(cur_pos == length - 1) { + I2C_AcknowledgeConfig(I2C1, DISABLE); + } + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); + data[cur_pos] = I2C_ReceiveData(I2C1); + } + + I2C_GenerateSTOP(I2C1, ENABLE); +} + +void eeprom_write(uint16_t address, uint8_t *data, uint16_t length) +{ + uint8_t cur_page = 0; + uint16_t cur_pos = 0; + address = address & 0xFFA0; + + for(cur_page = 0; cur_page <= ((length-1)/64); cur_page++) { + while((SysTickCnt - last_write_tick) <= 5); + I2C_GenerateSTART(I2C1, ENABLE); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); + I2C_Send7bitAddress(I2C1, EEPROM_ADDR, I2C_Direction_Transmitter); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); + I2C_SendData(I2C1, (address & 0xFF00) >> 8); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); + I2C_SendData(I2C1, (address & 0x00FF)); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); + + for(; (cur_pos < length) && (cur_pos%64 <= 63); cur_pos++) { + I2C_SendData(I2C1, data[cur_pos]); + while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); + } + + I2C_GenerateSTOP(I2C1, ENABLE); + address += 0x0040; + last_write_tick = SysTickCnt; + } +} diff --git a/Mieke/SW/ODD/eeprom.h b/Mieke/SW/ODD/eeprom.h new file mode 100644 index 0000000..33ad9fd --- /dev/null +++ b/Mieke/SW/ODD/eeprom.h @@ -0,0 +1,13 @@ +#ifndef EEPROM_H +#define EEPROM_H + +#include "stm32f10x.h" // Device header + +#include "io.h" +#include "systick.h" + +void eeprom_init(void); +void eeprom_read(uint16_t address, uint8_t *data, uint16_t length); +void eeprom_write(uint16_t address, uint8_t *data, uint16_t length); + +#endif diff --git a/Mieke/SW/ODD/io.c b/Mieke/SW/ODD/io.c new file mode 100644 index 0000000..3499c50 --- /dev/null +++ b/Mieke/SW/ODD/io.c @@ -0,0 +1,111 @@ +#include "io.h" + +uint8_t i2c1_inited = 0; +uint8_t usart1_inited = 0; +uint8_t usart3_inited = 0; + +void i2c1_init(void) +{ + if (i2c1_inited == 1) { + return; + } + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); + RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); + + GPIO_InitTypeDef gpio; + GPIO_StructInit(&gpio); + + // SCL + gpio.GPIO_Mode = GPIO_Mode_AF_PP; + gpio.GPIO_Pin = GPIO_Pin_6; + GPIO_Init(GPIOB, &gpio); + + // SDA + gpio.GPIO_Mode = GPIO_Mode_AF_OD; + gpio.GPIO_Pin = GPIO_Pin_7; + GPIO_Init(GPIOB, &gpio); + + I2C_InitTypeDef i2c; + I2C_StructInit(&i2c); + i2c.I2C_ClockSpeed = 400000; + I2C_Init(I2C1, &i2c); + + I2C_Cmd(I2C1, ENABLE); + i2c1_inited = 1; +} + +void usart1_init(void) +{ + if (usart1_inited == 1) { + return; + } + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); + + GPIO_InitTypeDef gpio; + GPIO_StructInit(&gpio); + + // TxD + gpio.GPIO_Mode = GPIO_Mode_AF_PP; + gpio.GPIO_Pin = GPIO_Pin_9; + GPIO_Init(GPIOA, &gpio); + + // RxD + gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING; + gpio.GPIO_Pin = GPIO_Pin_10; + GPIO_Init(GPIOA, &gpio); + + USART_InitTypeDef usart; + USART_StructInit(&usart); + usart.USART_BaudRate = 115200; + USART_Init(USART1, &usart); + + USART_ClockInitTypeDef usartclock; + USART_ClockStructInit(&usartclock); + USART_ClockInit(USART1, &usartclock); + + USART_Cmd(USART1, ENABLE); + usart1_inited = 1; +} + +void usart3_init(void) +{ + if (usart3_inited == 1) { + return; + } + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); + RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); + + GPIO_InitTypeDef gpio; + GPIO_StructInit(&gpio); + + // TxD + gpio.GPIO_Mode = GPIO_Mode_AF_PP; + gpio.GPIO_Pin = GPIO_Pin_10; + GPIO_Init(GPIOB, &gpio); + + // RxD + gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING; + gpio.GPIO_Pin = GPIO_Pin_11; + GPIO_Init(GPIOB, &gpio); + + USART_InitTypeDef usart; + USART_StructInit(&usart); + usart.USART_BaudRate = 115200; + USART_Init(USART3, &usart); + + USART_ClockInitTypeDef usartclock; + USART_ClockStructInit(&usartclock); + USART_ClockInit(USART3, &usartclock); + + USART_Cmd(USART3, ENABLE); + usart3_inited = 1; +} + +void USART_SendString(USART_TypeDef *USARTx, char *str) +{ + while (*str) { + while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET); + USART_SendData(USARTx, *str++); + } +} diff --git a/Mieke/SW/ODD/io.h b/Mieke/SW/ODD/io.h new file mode 100644 index 0000000..22b37fd --- /dev/null +++ b/Mieke/SW/ODD/io.h @@ -0,0 +1,16 @@ +#ifndef IO_H +#define IO_H + +#include "stm32f10x.h" // Device header +#include "stm32f10x_rcc.h" // Keil::Device:StdPeriph Drivers:RCC +#include "stm32f10x_gpio.h" // Keil::Device:StdPeriph Drivers:GPIO +#include "stm32f10x_usart.h" // Keil::Device:StdPeriph Drivers:USART +#include "stm32f10x_i2c.h" // Keil::Device:StdPeriph Drivers:I2C + +void i2c1_init(void); + +void usart1_init(void); +void usart3_init(void); +void USART_SendString(USART_TypeDef *USARTx, char *str); + +#endif diff --git a/Mieke/SW/ODD/main.c b/Mieke/SW/ODD/main.c new file mode 100644 index 0000000..c55a119 --- /dev/null +++ b/Mieke/SW/ODD/main.c @@ -0,0 +1,56 @@ +#include "display.h" +#include "bma.h" +#include "eeprom.h" +#include "bluetooth.h" + +#define BUFFER_SIZE 256 + +int main() +{ + disp_state_t current_state = DISP_STATE_NONE; + uint8_t X, Y, Z, running = 0; + uint8_t bX[BUFFER_SIZE] = {128}, bY[BUFFER_SIZE] = {128}, bZ[BUFFER_SIZE] = {128}; + uint16_t buffer_pos = 0; + disp_init(); + systick_init(); + bma_init(); + eeprom_init(); + bluetooth_init(); + disp_enable(); + + // Main loop + for (;;) { + current_state = disp_get_last_state(); + if(current_state == DISP_STATE_START) { + running = 1; + } else if(current_state == DISP_STATE_PAUSE) { + running = 0; + } + if(running == 1) { + bma_get_acc(&X, &Y, &Z); + bX[buffer_pos] = X; + bY[buffer_pos] = Y; + bZ[buffer_pos] = Z; + disp_send_gyro_data(X, Y, Z); + bluetooth_send_gyro_data(X, Y, Z); + buffer_pos++; + if(buffer_pos == BUFFER_SIZE) { + buffer_pos = 0; + } + } + if(current_state == DISP_STATE_SAVE) { + eeprom_write(0x0000, bX, BUFFER_SIZE); + eeprom_write(0x0400, bY, BUFFER_SIZE); + eeprom_write(0x0800, bZ, BUFFER_SIZE); + } + if(current_state == DISP_STATE_RECALL) { + eeprom_read(0x0000, bX, BUFFER_SIZE); + eeprom_read(0x0400, bY, BUFFER_SIZE); + eeprom_read(0x0800, bZ, BUFFER_SIZE); + for(uint16_t i = 0; i < BUFFER_SIZE; i++) { + disp_send_gyro_data(bX[i], bY[i], bZ[i]); + bluetooth_send_gyro_data(bX[i], bY[i], bZ[i]); + } + } + } +} diff --git a/Mieke/SW/ODD/systick.c b/Mieke/SW/ODD/systick.c new file mode 100644 index 0000000..2ec23af --- /dev/null +++ b/Mieke/SW/ODD/systick.c @@ -0,0 +1,23 @@ +#include "systick.h" + +volatile uint32_t SysTickCnt; + +void SysTick_Handler() +{ + SysTickCnt++; +} + +void systick_init(void) +{ + RCC_ClocksTypeDef clocks; + RCC_GetClocksFreq(&clocks); + SysTick_Config(clocks.HCLK_Frequency/1000 - 1); + + SysTickCnt = 0; +} + +void Wait(uint32_t ms) +{ + uint32_t SysTickCntHold = SysTickCnt; + while((SysTickCnt - SysTickCntHold) <= ms); +} diff --git a/Mieke/SW/ODD/systick.h b/Mieke/SW/ODD/systick.h new file mode 100644 index 0000000..47cc89f --- /dev/null +++ b/Mieke/SW/ODD/systick.h @@ -0,0 +1,12 @@ +#ifndef SYSTICK_H +#define SYSTICK_H + +#include "stm32f10x.h" // Device header +#include "stm32f10x_rcc.h" // Keil::Device:StdPeriph Drivers:RCC + +extern volatile uint32_t SysTickCnt; + +void systick_init(void); +void Wait(uint32_t ms); + +#endif diff --git a/Mieke/Software.tex b/Mieke/Software.tex new file mode 100644 index 0000000..507e3b3 --- /dev/null +++ b/Mieke/Software.tex @@ -0,0 +1,136 @@ +\section{Software} +\label{sec:software} +Im Zuge dieser Diplomarbeit entstanden zwei größere Softwareprojekte für das \gls{ARM} Cortex-M3 \gls{Minimalsystem}. + +\subsection{Tag der offenen Tür} +Für die Tage der offenen Tür der HTBL Hollabrunn im Jahr 2017/18 entstand ein Testprogramm, welches die neuen Features des Minimalsystems demonstrieren sollte. Hierzu wurde ein einfaches \gls{GUI} für das NEXTION-Display programmiert, welche die X, Y und Z Werte der Beschleunigung vom über SPI angesteuerten Gyroskop ausliest, und in Form eines Graphen anzeigt. Des weiteren wurde eine -- nicht 100\% funktinierenden -- Funktion zum Speichern des Graphen (auf dem verbauten EEPROM) programmiert. + +\subsubsection{main.c} +Das Hauptprogramm in \texttt{main.c} initsialisiert alle Ports sowie den SysTick Interrupt. Die einzelnen Komponenten wurden für die Übersichtlichkeit in extra Files ausgelagert. Im Hauptprogramm ist außerdem der Main-Loop, welcher die Werte vom BMA einliest und am Display ausgibt. Der Main-Loop fragt auch Displayeingaben ab und reagiert auf diese (Start/Stopp, Speichern und Laden). +\lstinputlisting[language={[ANSI]C}, caption=Tag der offenen Tür: Hauptprogramm, label=lst:sw-odd-main]{Mieke/SW/ODD/main.c} + +\subsubsection{io.h} +Dieses Headerfile enthält alle Deklarationen, welche für I/O-Aufgaben des Demoprogramms wichtig sind. +\lstinputlisting[language={[ANSI]C}, caption=Tag der offenen Tür: I/O Headerfile, label=lst:sw-odd-ioh]{Mieke/SW/ODD/io.h} + +\subsubsection{io.c} +Dieses C-File enthält die Implementation der I/O Funktionen des Demoprogramms. +\lstinputlisting[language={[ANSI]C}, caption=Tag der offenen Tür: I/O Implementation, label=lst:sw-odd-ioc]{Mieke/SW/ODD/io.c} + +\subsubsection{display.h} +Dieses Headerfile enthält alle Deklarationen, welche für das Display des Demoprogramms wichtig sind. +\lstinputlisting[language={[ANSI]C}, caption=Tag der offenen Tür: Display Headerfile, label=lst:sw-odd-displayh]{Mieke/SW/ODD/display.h} + +\subsubsection{display.c} +Dieses C-File enthält die Implementation der Display Funktionen des Demoprogramms. +\lstinputlisting[language={[ANSI]C}, caption=Tag der offenen Tür: Display Implementation, label=lst:sw-odd-displayc]{Mieke/SW/ODD/display.c} + +\subsubsection{bma.h} +Dieses Headerfile enthält alle Deklarationen, welche für das Gyroskop des Demoprogramms wichtig sind. +\lstinputlisting[language={[ANSI]C}, caption=Tag der offenen Tür: BMA Headerfile, label=lst:sw-odd-bmah]{Mieke/SW/ODD/bma.h} + +\subsubsection{bma.c} +Dieses C-File enthält die Implementation der BMA Funktionen des Demoprogramms. +\lstinputlisting[language={[ANSI]C}, caption=Tag der offenen Tür: BMA Implementation, label=lst:sw-odd-bmac]{Mieke/SW/ODD/bma.c} + +\subsubsection{eeprom.h} +Dieses Headerfile enthält alle Deklarationen, welche für das EEPROM des Demoprogramms wichtig sind. +\lstinputlisting[language={[ANSI]C}, caption=Tag der offenen Tür: EEPROM Headerfile, label=lst:sw-odd-eepromh]{Mieke/SW/ODD/eeprom.h} + +\subsubsection{eeprom.c} +Dieses C-File enthält die Implementation der EEPROM Funktionen des Demoprogramms. +\lstinputlisting[language={[ANSI]C}, caption=Tag der offenen Tür: EEPROM Implementation, label=lst:sw-odd-eepromc]{Mieke/SW/ODD/eeprom.c} + +\subsubsection{bluetooth.h} +Dieses Headerfile enthält alle Deklarationen, welche für die Bluetooth-Signalübertragung des Demoprogramms wichtig sind. +\begin{warning} + Im finalen Programm wurde das Senden der Werte über Bluetooth weggelassen, da es die Main-Loop zu sehr verlangsamte, und somit die Displayausgabe nicht mehr flüssig genug war. +\end{warning} +\lstinputlisting[language={[ANSI]C}, caption=Tag der offenen Tür: Bluetooth Headerfile, label=lst:sw-odd-bluetoothh]{Mieke/SW/ODD/bluetooth.h} + +\subsubsection{bluetooth.c} +Dieses C-File enthält die Implementation der Bluetooth Funktionen des Demoprogramms. +\lstinputlisting[language={[ANSI]C}, caption=Tag der offenen Tür: Bluetooth Implementation, label=lst:sw-odd-bluetoothc]{Mieke/SW/ODD/bluetooth.c} + +\subsection{Testprogramm} +Um die im Unterricht hergestellten Einheiten des \gls{Minimalsystem}s testen zu können, musste ein Testpgrogramm geschrieben werden, welches alle verwendeten Peripherieeinheiten ansteuern kann. Dabei war es nicht das Ziel eine bestimmte Funktion zu erreichen, sondenr zu testen, ob die Busse komplett durchverbunden sind, oder ob sich irgendwo auf der Leiterkarte kalte Lötstellen oder andere Fehler befinden. Dementsprechend testen diese Tests nur ob generell eine Kommunikation mit einer Peripherieeinheit möglich ist, und nicht ob diese auch korrekt funktioniert. + +\subsubsection{main.h} +Einige globale Definitionen. +\lstinputlisting[language={[ANSI]C}, caption=Tests: Hauptprogramm Headerfile, label=lst:sw-mt-mainh]{Mieke/SW/MT/main.h} + +\subsubsection{main.c} +Im Hauptprogramm werden die UARTs für das anzeigen der Menüs konfiguriert, die Menüs angezeigt und auf Eingaben auf eben diese reagiert. Die einzelnen Tests wurden möglichst kompakt und modular geschrieben. Ein Test stellt dabei immer ein Interface bestehend aus Init-, Run- und DeInit-Funktion. +\lstinputlisting[language={[ANSI]C}, caption=Tests: Hauptprogramm, label=lst:sw-mt-main]{Mieke/SW/MT/main.c} + +\subsubsection{interface\_uart.h} +Dieses Headerfile enthält alle Deklarationen, welche für das UART Interface des Testpgrogramms wichtig sind. +\lstinputlisting[language={[ANSI]C}, caption=Tests: UART Headerfile, label=lst:sw-mt-uarth]{Mieke/SW/MT/interface_uart.h} + +\subsubsection{interface\_uart.c} +Dieses C-File enthält die Implementation der UART Funktionen des Testpgrogramms. +\lstinputlisting[language={[ANSI]C}, caption=Tests: UART Implementation, label=lst:sw-mt-uartc]{Mieke/SW/MT/interface_uart.c} + +\subsubsection{bma.h} +Dieses Headerfile enthält alle Deklarationen, welche für den BMA Test des Testpgrogramms wichtig sind. +\lstinputlisting[language={[ANSI]C}, caption=Tests: BMA Headerfile, label=lst:sw-mt-bmah]{Mieke/SW/MT/bma.h} + +\subsubsection{bma.c} +Dieses C-File enthält die Implementation der BMA Test Funktionen des Testpgrogramms. +\lstinputlisting[language={[ANSI]C}, caption=Tests: BMA Implementation, label=lst:sw-mt-bmac]{Mieke/SW/MT/bma.c} + +\subsubsection{ne555.h} +Dieses Headerfile enthält alle Deklarationen, welche für den NE555 Test des Testpgrogramms wichtig sind. +\lstinputlisting[language={[ANSI]C}, caption=Tests: NE555 Headerfile, label=lst:sw-mt-ne555h]{Mieke/SW/MT/ne555.h} + +\subsubsection{ne555.c} +Dieses C-File enthält die Implementation der NE555 Test Funktionen des Testpgrogramms. +\lstinputlisting[language={[ANSI]C}, caption=Tests: NE555 Implementation, label=lst:sw-mt-ne555c]{Mieke/SW/MT/ne555.c} + +\subsubsection{ledswitch.h} +Dieses Headerfile enthält alle Deklarationen, welche für den LED/Switch Test des Testpgrogramms wichtig sind. +\lstinputlisting[language={[ANSI]C}, caption=Tests: LED/Switch Headerfile, label=lst:sw-mt-ledswitchh]{Mieke/SW/MT/ledswitch.h} + +\subsubsection{ledswitch.c} +Dieses C-File enthält die Implementation der LED/Switch Test Funktionen des Testpgrogramms. +\lstinputlisting[language={[ANSI]C}, caption=Tests: LED/Switch Implementation, label=lst:sw-mt-ledswitchc]{Mieke/SW/MT/ledswitch.c} + +\subsubsection{eeprom.h} +Dieses Headerfile enthält alle Deklarationen, welche für den EEPROM Test des Testpgrogramms wichtig sind. +\lstinputlisting[language={[ANSI]C}, caption=Tests: EEPROM Headerfile, label=lst:sw-mt-eepromh]{Mieke/SW/MT/eeprom.h} + +\subsubsection{eeprom.c} +Dieses C-File enthält die Implementation der EEPROM Test Funktionen des Testpgrogramms. +\lstinputlisting[language={[ANSI]C}, caption=Tests: EEPROM Implementation, label=lst:sw-mt-eepromc]{Mieke/SW/MT/eeprom.c} + +\subsubsection{esp.h} +Dieses Headerfile enthält alle Deklarationen, welche für den ESP Test des Testpgrogramms wichtig sind. +\lstinputlisting[language={[ANSI]C}, caption=Tests: ESP Headerfile, label=lst:sw-mt-esph]{Mieke/SW/MT/esp.h} + +\subsubsection{esp.c} +Dieses C-File enthält die Implementation der ESP Test Funktionen des Testpgrogramms. +\lstinputlisting[language={[ANSI]C}, caption=Tests: ESP Implementation, label=lst:sw-mt-espc]{Mieke/SW/MT/esp.c} + +\subsubsection{rgb.h} +Dieses Headerfile enthält alle Deklarationen, welche für den RGB LED Test des Testpgrogramms wichtig sind. +\lstinputlisting[language={[ANSI]C}, caption=Tests: RGB LED Headerfile, label=lst:sw-mt-rgbh]{Mieke/SW/MT/rgb.h} + +\subsubsection{rgb.c} +Dieses C-File enthält die Implementation der RGB LED Test Funktionen des Testpgrogramms. +\lstinputlisting[language={[ANSI]C}, caption=Tests: RGB LED Implementation, label=lst:sw-mt-rgbc]{Mieke/SW/MT/rgb.c} + +\subsubsection{piezo.h} +Dieses Headerfile enthält alle Deklarationen, welche für den Piezo Test des Testpgrogramms wichtig sind. +\lstinputlisting[language={[ANSI]C}, caption=Tests: Piezo Headerfile, label=lst:sw-mt-piezoh]{Mieke/SW/MT/piezo.h} + +\subsubsection{piezo.c} +Dieses C-File enthält die Implementation der Piezo Test Funktionen des Testpgrogramms. +\lstinputlisting[language={[ANSI]C}, caption=Tests: Piezo Implementation, label=lst:sw-mt-piezoc]{Mieke/SW/MT/piezo.c} + +\subsubsection{display.h} +Dieses Headerfile enthält alle Deklarationen, welche für den Display Test des Testpgrogramms wichtig sind. +\lstinputlisting[language={[ANSI]C}, caption=Tests: Display Headerfile, label=lst:sw-mt-displayh]{Mieke/SW/MT/display.h} + +\subsubsection{display.c} +Dieses C-File enthält die Implementation der Display Test Funktionen des Testpgrogramms. +\lstinputlisting[language={[ANSI]C}, caption=Tests: Display Implementation, label=lst:sw-mt-displayc]{Mieke/SW/MT/display.c} \ No newline at end of file diff --git a/Mieke/Theorie.tex b/Mieke/Theorie.tex new file mode 100644 index 0000000..04ed1bb --- /dev/null +++ b/Mieke/Theorie.tex @@ -0,0 +1,46 @@ +\section{Theorie} +\label{sec:theorie} +\subsection{Versionierung} +Das Kapitel Versionierung teilt sich in zwei große Teile auf, Semantic Versioning, was die Vergabe der Versionsnummer an sich behandelt und Git, was im generellen Workflow zur Versionskontrolle benutzt wurde. + +\subsubsection{Semantic Versioning} +Semantic Versioning, oder auch semantische Versionierung bezeichnet ein Verfahren zur Vergabe von Versionsnummern welches sich als sehr praktisch zum Versionieren von Softwarekomponenten herausgestellt hat. Heute benutzen sehr viele große Softwareprojekte, vor allem im Open Source Bereich, Semantic Versioning für die Versionierung von Releases. + +Bei Semantic Versioning setzt sich die Versionsnummer aus drei Hauptgruppen welche aus Ziffern bestehen und durch einen Punkt getrennt sind zusammen. Jede dieser Gruppen hat eine festgelegte Bedeutung, von links nach rechts heißen die Gruppen \enquote{Major}, \enquote{Minor} und \enquote{Patch}. + +Ein Produkt mit der Versionsnummer \textbf{2.5.15} hat also die Major-Version \textbf{2}, Minor-Version \textbf{5} und Patch-Level \textbf{15}. + +Will man nun eine neue Version der Software (oder des Produkts) veröffentlichen, so muss man, je nach Änderung, die Versionsnummer erhöhen. Hierbei wird meist nach \fref{tab:versionierung} vorgegangen. + +\tab{versionierung}{Semantic Versioning Zifferngruppen}{Zifferngruppen}{|c|p{10cm}|}{ + \hline + \textbf{Gruppe} & \textbf{Bedeutung}\\ + \hline + Patch & wird erhöht wenn Fehler in der Software ausgebessert werden, jedoch keine neuen Funktionen hinzugefügt werden. Binäre Bibliotheken bleiben untereinander komplett kompatibel.\\ + \hline + Minor & wird erhöht wenn neue Funktinen hinzugefügt werden, nebenbei können auch Fehler ausgebessert werden, ohne eine Erhöhung des Patch Levels zu erfordern. Binäre Bibliotheken sind abwärtskompatibel, das heißt Bibliotheken mit Version \textbf{2.15.6} können anstatt Version \textbf{2.10.0} verwendet werden. Umgekehrt ist das aber nur so lange möglich, so lange mein keine erweiterten Funktionen aus der Bibliothek mit der höheren Minor-Version verwendet.\\ + \hline + Major & wird erhöht wenn einerseits neue Funktionen hinzugefügt werden, allerdings gleichzeit auch alte gelöscht oder sonst irgendwie inkompatibel gemacht (Umbennenung, Änderung der Übergabeparameter) werden. Binäre Bibliotheken sind, bis auf wenige Ausnahmen, normalerweise nicht kompatibel.\\ + \hline +} + +Für die Softwareprodukte, welche im Rahmen dieser Diplomarbeit entstanden sind, wurde Semantic Versioning angewendet, um zukünftigen Nutzern oder Bearbeitern ein solides Fundament in Sachen Kompatibilität zu gewähren. + +\subsubsection{Git} +Git ist ein dezentrales Versionskontrollsystem, welches erlaubt Zeitpunkte in der Softwareentwicklung (mit Kommentaren versehen) festzuhalten, zwischen diesen zu springen und Teile von oder komplette Änderungen rückgängig zu machen, wenn dies nötig sein sollte. Git legt hierbei für jedes Projekt ein dezentrales Repository an, welches, je nach belieben auch quasi-zentral auf einem Server liegen kann. In einem Repository kann man dann entweder alleine, oder zusammen mit einer oder mehreren Personen am selben Projekt arbeiten. Git übernimmt dabei die Versionskontrolle und in den meisten Fällen auch erfolgreich die Konflktlösung. + +\subsubsubsection{Repository anlegen} +Um die Arbeit an einem Projekt beginnen zu können, muss erstmal ein leeres Git-Repository erstellt werden, dies geschieht mit dem Befehl \texttt{git init}. Dieser Befehl legt im Verzeichnis, in dem man sich gerade befindet, einen \texttt{.git}-Ordner an, in welchem Git seine internen Daten speichert. + +\subsubsubsection{Der erste Commit} +Nun, da ein Repository angelgt ist, kann die eigentliche Arbeit am Projekt beginnen, so wie man das gewöhnt ist. Wenn man nun vorzeigbare Ergebnisse hat, oder seinen Fortschritt vor größeren Änderungen sichern will, muss man einen Commit erstellen, dieser bildet dann den aktuellen Zustand des Projekts (mit Dateiberechtigungen) und kompletten Inhalt ab. Wenn man später zu diesem Zustand zurückkehren will, kann man einfach auf den Commit zurückkehren. Weiters speichert Git die Änderungen von einem zum nächsten Commit in einem Diff-Format, was bedeutet, dass nicht immer die ganze Datei, sondern nur die Änderungen zur letzten Version, gespeichert werden. Dies ist für ASCII-Dateien (wie zum Beispiel auch Source-Code) sehr effizient, da nicht geänderte Zeilen nicht immer abgespeichert werden müssen. + +Um nun die gemachten Änderungen in den Staging-Bereich hinzuzufügen führt man nun entweder \texttt{git add -A} (für alle Dateien und Verzeichnisse) oder \texttt{git add } für genau eine (oder mehrere angegebene) Datei(en). Nun können entweder noch weitere Dateien hinzugefügt, Dateien wieder aus dem Staging-Bereich entfernt (\texttt{git reset HEAD }) oder ein Commit erstellt werden. Letzteres wird mit dem Befehl \texttt{git commit} gemacht, dieser öffnet den Standard-Texteditor, in welchem man eine Nachricht (meistens die Änderungen, die man gemacht hat) eingibt. Wird der Befehl mit dem Flag \texttt{-m "Nachricht"} ausgeführt, so geht kein Editor auf und der Commit wird direkt mit der angegebenen Nachricht erstellt. + +\subsubsubsection{Zurück zu einer alten Version} +Wenn man nun feststellt, dass das, was man programmiert hat nicht zielführend ist oder sich gar negativ auf das Projekt ausgewirkt hat, kann man relativ einfach wieder auf eine funktionierende Version zurück kehren. Hierzu führt man zuerst \texttt{git log} aus, was dann die IDs aller Commits und die erste Zeile der Commit-Nachricht anzeigt, hier sucht man sich nun die ID heraus, zu der man zurück kehren will, und gibt diese bei \texttt{git checkout } ein. Nun stellt Git wieder die Version her, wie sie zum Zeitpunkt des Commits existierte. + +\subsection{Nextion Editor} + +\subsection{\LaTeX{}} +Zum setzen der Dokumentation und anderer aus dieser Diplomarbeit resultierenden Dokument wurde \LaTeX{} verwendet. Die Verwendung von \LaTeX{} bietet im Gegensatz zu anderer Software einige Vorteile, wie zum Beispiel die einfacher Literaturverwaltung mittels BiB\LaTeX{} und das einfache erstellen von Tabellen und ähnlichem direkt in einem handelsüblichen Texteditor. Des weiteren ist es möglich ganze Dokumente in quasi unendlich kleine Teile aufzuteilen, sodass mehrere Leute parallel an einem Gesamtdokument arbeiten können. \ No newline at end of file diff --git a/Schuh/Basisplatine.tex b/Schuh/Basisplatine.tex index c6658c8..162b0d2 100644 --- a/Schuh/Basisplatine.tex +++ b/Schuh/Basisplatine.tex @@ -194,7 +194,7 @@ Um das Messen mit einem Oszilloskop oder anderen Messgeräten zu vereinfachen wu \label{fig:basisplatine-masse} \end{figure} -\subsubsection{Powerswitch STMPS2141}\todo{Quelle?} +\subsubsection{Powerswitch STMPS2141} Um USB-Geräte zu betreiben, welche selbst keine eigene Spannungsversorgung besitzen (z.B. USB-Sticks) wurde ein Powerswitch (\fref{fig:basisplatine-power}, D3) verbaut. Dieser ermöglicht es die interne \unit{5}{\volt}-Versorgung auf die USB-Buchsen zu legen, damit diese Geräte mit Spannung versorgt werden können. Sollte das Gerät zu viel Strom verbrauchen beginnt die LED (\fref{fig:basisplatine-power}, V9) zu leuchten. Durch Jumpern der Stiftleiste (\fref{fig:basisplatine-power}, X4) an den Port-Pin PC9 kann die Versorgung von externen Geräten gesteuert werden. \begin{figure}[htb] @@ -334,7 +334,7 @@ Um die Platine auch mit einer Fernbedienung oder einem Mobiltelefon steuern zu k \end{figure} \subsubsection{Temperatursensor} -Um die Umgebungstemperatur feststellen zu können wurde auf der Basisplatine der Temperaturfühler DS18B20 verbaut, welcher mit Hilfe des 1-Wire Protokolls angesprochen werden kann. Die maximale Mesfehler dieses Temperatursensors beträgt ±0,5°C laut Datenblattangabe\todo{Quelle?}. Um den Temperaturfühler verwenden zu können muss lediglich der Pin9 mit dem Pin10, der Stiftleiste (\fref{fig:basisplatine-ssel}, X9), gejumpert werden. +Um die Umgebungstemperatur feststellen zu können wurde auf der Basisplatine der Temperaturfühler DS18B20 verbaut, welcher mit Hilfe des 1-Wire Protokolls angesprochen werden kann. Die maximale Mesfehler dieses Temperatursensors beträgt ±0,5°C laut Datenblattangabe. Um den Temperaturfühler verwenden zu können muss lediglich der Pin9 mit dem Pin10, der Stiftleiste (\fref{fig:basisplatine-ssel}, X9), gejumpert werden. \begin{figure}[htb] \centering @@ -345,7 +345,7 @@ Um die Umgebungstemperatur feststellen zu können wurde auf der Basisplatine der \end{figure} \subsubsection{Lichtwandler LFU} -Der auf der \gls{Basisplatine} realisierte LFU (Licht-Frequenz-Wandler), wandeltet wie der Name bereits sagt Licht in eine bestimmte Frequenz um. Je höher die Bestrahlungsstärke des Lichts, desto höher wird die über den Output des LFUs ausgegebene Frequenz. Den linearen Zusammenhang zwischen der Bestrahlungsstärke und der ausgegebenen Frequenz kann aus \fref{fig:basisplatine-lfu-freq} entnommen werden.\todo{Quelle?} Um den LFU verwenden zu können muss lediglich der Pin5 mit dem Pin6, der Stiftleiste (\fref{fig:basisplatine-ssel}, X9), gejumpert werden. +Der auf der \gls{Basisplatine} realisierte LFU (Licht-Frequenz-Wandler), wandeltet wie der Name bereits sagt Licht in eine bestimmte Frequenz um. Je höher die Bestrahlungsstärke des Lichts, desto höher wird die über den Output des LFUs ausgegebene Frequenz. Den linearen Zusammenhang zwischen der Bestrahlungsstärke und der ausgegebenen Frequenz kann aus \fref{fig:basisplatine-lfu-freq} entnommen werden. Um den LFU verwenden zu können muss lediglich der Pin5 mit dem Pin6, der Stiftleiste (\fref{fig:basisplatine-ssel}, X9), gejumpert werden. \begin{figure}[htb] \centering @@ -357,7 +357,7 @@ Der auf der \gls{Basisplatine} realisierte LFU (Licht-Frequenz-Wandler), wandelt \fig{basisplatine-lfu-freq}{Frequenzgang des LFUs}{Frequenzgang des LFUs}{0.5\textwidth}{Schuh/Pictures/Basis-lfu-freq} \subsubsection{RGB-LED} -Auf der Hardware der \gls{Basisplatine} wurde eine RGB-LED \cite{basis:rgbled} verbaut, welche mit Hilfe des LED-Divers (\fref{fig:basisplatine-rgbled}, D4) \cite{basis:rgbdriver}, welcher mit dem \IIC{}-Bus angesteuert werden kann. Dieser LED-Driver hat den Vorteil, dass er eine interne Stromüberwachung besitzt. Dadurch benötigen die einzelnen Anoden der RGB-LED keine Vorwiderstände, da sich der Strom automatisch entsprechend der gewünschten Farbe reguliert. +Auf der Hardware der \gls{Basisplatine} wurde eine RGB-LED \cite{basis:rgbled} verbaut, welche mit Hilfe des LED-Drivers (\fref{fig:basisplatine-rgbled}, D4) \cite{basis:rgbdriver}, welcher mit dem \IIC{}-Bus angesteuert werden kann. Dieser LED-Driver hat den Vorteil, dass er eine interne Stromüberwachung besitzt. Dadurch benötigen die einzelnen Anoden der RGB-LED keine Vorwiderstände, da sich der Strom automatisch entsprechend der gewünschten Farbe reguliert. \begin{figure}[htb] \centering