diff --git a/Makefile b/Makefile index 635993f..a6913fd 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ # --- control global project settings # RELEASE=1 -> enable optimisation, then disable debug # RELEASE=0 -> disbale optimisation, then enable debug -RELEASE=0 +RELEASE=1 # --- project architecture # program name diff --git a/docs/Graphs.ods b/docs/Graphs.ods index 16918a1..ab7beed 100644 Binary files a/docs/Graphs.ods and b/docs/Graphs.ods differ diff --git a/src/drivers/lcd.c b/src/drivers/lcd.c index 0fcfffb..c784193 100644 --- a/src/drivers/lcd.c +++ b/src/drivers/lcd.c @@ -6,7 +6,11 @@ enum mode { UNDEFINED }; -static int mode = UNDEFINED; +//TODO make the driver dynamic ? +static TIM_TypeDef* timer = 0; +static uint8_t mode = UNDEFINED; +static uint8_t rows = 0; +static uint8_t columns = 0; //------------------------------------------------------------------------------ // internal functions @@ -39,18 +43,19 @@ int set_mode_write(void) { } void wait_for_ready(void) { - // configure the lcd - if(mode != READ) if(set_mode_read()) return; - - // read D7 pin - for(;;) { - io_set(GPIOA, PIN_11); - for(int i=0; i<1000; ++i); //timer_wait is overkill here - if(!io_read(GPIOB, PIN_4)) break; - io_clear(GPIOA, PIN_11); - for(int i=0; i<1000; ++i); //same - } - io_clear(GPIOA, PIN_11); + //TODO debug that +// // configure the lcd +// if(mode != READ) if(set_mode_read()) return; +// +// // read D7 pin +// for(;;) { +// io_set(GPIOA, PIN_11); +// for(int i=0; i<1000; ++i); //timer_wait is overkill here +// if(!io_read(GPIOB, PIN_4)) break; +// io_clear(GPIOA, PIN_11); +// for(int i=0; i<1000; ++i); //same +// } + timer_wait_ms(timer, 2, 0); //wait max delay } void write_byte(uint8_t byte) { @@ -59,7 +64,7 @@ void write_byte(uint8_t byte) { // start tranfert io_set(GPIOA, PIN_11); - timer_wait_us(TIM1, 1, 0); + timer_wait_us(timer, 1, 0); // send the data io_write(GPIOA, (byte >> 0) & 0x1, PIN_8); @@ -76,8 +81,12 @@ void write_byte(uint8_t byte) { } //------------------------------------------------------------------------------ -// API functions -int lcd_init(TIM_TypeDef* tim) { +int lcd_init(TIM_TypeDef* tim, uint8_t col, uint8_t row) { + + timer = tim; + columns = col; + rows = row; + // disable JTAG, as it utilise needed pins, SWD remains usable in // synchronous mode RCC->APB2ENR |= 0x1; @@ -91,17 +100,17 @@ int lcd_init(TIM_TypeDef* tim) { if(set_mode_write()) return -1; //no check in case the pins were used //somewhere else - // select instrution register + // select instruction register io_write(GPIOA, LCD_MODE_CMD, PIN_10); // begin initialisation sequence - timer_wait_ms(tim, 15, 0); + timer_wait_ms(timer, 15, 0); write_byte(LCD_FUNC_SET | LCD_FUNC_8BIT | LCD_FUNC_2LINE | LCD_FUNC_5x8DOTS); - timer_wait_ms(tim, 5, 0); + timer_wait_ms(timer, 5, 0); write_byte(LCD_FUNC_SET | LCD_FUNC_8BIT | LCD_FUNC_2LINE | LCD_FUNC_5x8DOTS); - timer_wait_us(tim, 150, 0); + timer_wait_us(timer, 150, 0); write_byte(LCD_FUNC_SET | LCD_FUNC_8BIT | LCD_FUNC_2LINE | LCD_FUNC_5x8DOTS); wait_for_ready(); @@ -121,7 +130,39 @@ int lcd_init(TIM_TypeDef* tim) { LCD_CTRL_BLINK_ON); wait_for_ready(); write_byte(LCD_CLEAR); - wait_for_ready(); return 0; } + +void lcd_send_cmd(uint8_t cmd) { + // wait for the screen + wait_for_ready(); + + // select instruction register + io_write(GPIOA, LCD_MODE_CMD, PIN_10); + + // send the command + write_byte(cmd); +} + +void lcd_print(const char* txt) { + // prepare data + const char* c = txt; + + // wait for the screen + wait_for_ready(); + + // select data register + io_write(GPIOA, LCD_MODE_DATA, PIN_10); + + // send the caracters until end of string + while(*c != '\0') { + wait_for_ready(); + write_byte(*c); + c++; + } +} + +void lcd_set_cursor(uint8_t col, uint8_t row) { + lcd_send_cmd(LCD_DDRAM_ADDR | col); +} diff --git a/src/drivers/lcd.h b/src/drivers/lcd.h index d7086be..5eba6e1 100644 --- a/src/drivers/lcd.h +++ b/src/drivers/lcd.h @@ -5,6 +5,7 @@ #include "../config.h" #include "timer.h" #include "io.h" +#include //------------------------------------------------------------------------------ /* LCD mode selection */ @@ -17,7 +18,7 @@ enum lcd_register { /* LCD commands */ enum lcd_command { LCD_CLEAR = 0x01, - LCD_CR = 0x02, + LCD_CUR_HOME = 0x02, LCD_ENTRY = 0x04, LCD_DISP_CTRL = 0x08, LCD_SHIFT = 0x10, @@ -67,11 +68,24 @@ enum lcd_func_option { }; //------------------------------------------------------------------------------ -int lcd_init(TIM_TypeDef* tim); +/** lcd_init + * initialise the lcd, needed before anything else can be done + * the timer is used for delays and can't be in use when lcd functions are + * called + */ +int lcd_init(TIM_TypeDef* tim, uint8_t col, uint8_t row); -void lcd_write(uint8_t byte); +/** lcd_send_cmd + * send the specified command to the lcd + */ +void lcd_send_cmd(uint8_t cmd); -uint8_t lcd_read(void); +/** lcd_print + * print a null-terminated string on the lcd + */ +void lcd_print(const char* txt); + +void lcd_set_cursor(uint8_t col, uint8_t row); #endif diff --git a/src/main.c b/src/main.c index 5933cbb..6349e2c 100644 --- a/src/main.c +++ b/src/main.c @@ -1,9 +1,9 @@ #include "drivers/rcc.h" #include "drivers/io.h" +#include "drivers/lcd.h" #include "drivers/adc.h" Clock_t sysclks; - #include "drivers/timer.h" int val = 0; @@ -12,6 +12,8 @@ uint16_t data = 0; static void timeout_cb(void) { io_write(GPIOC, val, PIN_13); val = !val; + data = adc_read(ADC1, 2); + data -= adc_read(ADC1, 3); } int main(void) { @@ -22,16 +24,31 @@ int main(void) { return 0; io_write(GPIOC, 1, PIN_13); - timer_tick_init(TIM2, 1000, timeout_cb); - timer_start(TIM2); - - if(io_configure(GPIOA, PIN_4 | PIN_5, IO_MODE_INPUT | IO_IN_ANALOG, 0)) + if(io_configure(GPIOA, PIN_2 | PIN_3, IO_MODE_INPUT | IO_IN_ANALOG, 0)) return 0; if(adc_init(ADC1)) return 0; - for(;;){ - data = adc_read(ADC1, 5); - data -= adc_read(ADC1, 4); + //int test = 0; + + timer_tick_init(TIM2, 1000, timeout_cb); + timer_start(TIM2); + + lcd_init(TIM1); + lcd_print(" et paf"); + lcd_print("Hello world!"); + lcd_send_cmd(LCD_CUR_HOME); + lcd_send_cmd(LCD_CUR_HOME); + lcd_set_cursor(5, 1); + + + while(1){ + lcd_print("loop"); + lcd_print("loop2"); + lcd_print("loop3"); + lcd_print("loop4"); + //voltage = data*4.0f/4095.0f; + //temp = (voltage-0.45)/0.04f; + timer_wait_ms(TIM1, 200, 0); } return 0; diff --git a/src/target/STM32F103XB.ld b/src/target/STM32F103XB.ld index 9d1604b..5c80b6a 100644 --- a/src/target/STM32F103XB.ld +++ b/src/target/STM32F103XB.ld @@ -6,8 +6,8 @@ STACK_SIZE = 0x400; MEMORY { - FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 64K - RAM (rwx) : ORIGIN = 0x200000F0, LENGTH = 20K - (0xEC+0x4) + FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 32K + RAM (rwx) : ORIGIN = 0x200000F0, LENGTH = 10K - (0xEC+0x4) } /* Linker script to place sections and symbol values. Should be used together