From: Robin Krens Date: Tue, 13 Aug 2019 16:49:37 +0000 (+0800) Subject: Merge branch 'tm1637' X-Git-Url: https://robinkrens.nl/gitweb/?a=commitdiff_plain;h=8b8d6edcd57f69b40f430bc172e1c290a629a6a9;p=cortex-from-scratch Merge branch 'tm1637' --- 8b8d6edcd57f69b40f430bc172e1c290a629a6a9 diff --cc drivers/tm1637.c index a2889fd,485d81d..8c8ce5b --- a/drivers/tm1637.c +++ b/drivers/tm1637.c @@@ -28,14 -28,24 +28,24 @@@ #include -#define TIMEOUT 1000 +#define TIMEOUT 5000 - #define DATASET 0x40 - #define CONTROL 0x80 - #define SETADDR 0xC0 - - #define DISPLAY_ON 0x8F - #define DISPLAY_OFF 0x11 + #define DOT true + #define NODOT false + + + /* + 0 = 0x00 + 1 = 0x60 + 2 = 0xDA + 3 = 0xF2 + 4 = 0x66 + 5 = 0xB6 + 6 = 0xBE + 7 = 0xE0 + 8 = 0xFF + 9 = 0xF6 + */ /* STM32F1 microcontrollers do not provide the ability to pull-up SDA and SCL lines. Their GPIOs must be configured as open-drain. So, you have to add two additional resistors to @@@ -107,82 -162,86 +162,85 @@@ int delay() a++; } - void tm1637_start() { + void set_display(bool on, uint8_t degree) { + + start_condition(); + + regw_u32(I2C_DR, 0xF1, 0, OWRITE); + if(!ack_recv()) + cputs("Can't switch on display!"); + stop_condition(); + + // reset bus + regw_u32(I2C_CR1, 0x1, 15, SETBIT); - // regw_u32(I2C_CR1, 0x1, 8, SETBIT); - // uint32_t read_status = *I2C_SR1; + } + + + void set_segment(int offset, char value, bool dot) { + + int (*ack)() = ack_recv; /* Scary function pointer :D */ - // regw_u32(I2C_DR, DATASET, 0, OWRITE); - // conform DATA - // read_status = *I2C_SR1; - // read_status = *I2C_SR2; - uint32_t statusr; + if (offset > 3) { + cputs("Offset incorrect"); + } + + if (dot) { + value = value | 0x1; + } + int start_pos_cmd = 0x03 | (offset & 0x01) << 7 | (offset & 0x2) << 5 ; start_condition(); - //uint32_t statusr = *I2C_SR1; // clear start_signal - regw_u32(I2C_DR, 0x40, 0, OWRITE); // write to address CMD + regw_u32(I2C_DR, 0x20, 0, OWRITE); if(!ack_recv()) - cputs("TIMEOUT!"); - //statusr = *I2C_SR1; - //statusr = *I2C_SR2; + cputs("Error: initiating write for start segment \n"); + stop_condition(); + + if(!idle()) + cputs("Error: timeout"); - //delay(); start_condition(); - //statusr = *I2C_SR1; // clear start_signal - regw_u32(I2C_DR, 0xC1, 0, OWRITE); - if(!ack_recv()) - cputs("TIMEOUT2!"); - //statusr = *I2C_SR1; - //statusr = *I2C_SR2; - regw_u32(I2C_DR, 0x7D, 0, OWRITE); - if(!buf_empty()) - cputs("TIMEOUT3!"); + regw_u32(I2C_DR, start_pos_cmd, 0, OWRITE); + if(!ack()) + cputs("Error: Can't set start segment \n"); + stop_condition(); + regw_u32(I2C_CR1, 0x1, 15, SETBIT); + + tm1637_reset(); - /* delay(); + // if (value & 0xF0) + // ack = &ack10_recv; start_condition(); - statusr = *I2C_SR1; - regw_u32(I2C_DR, DISPLAY_ON, 0, OWRITE); + regw_u32(I2C_DR, value, 0, OWRITE); // use ack10 if higher if(!ack_recv()) - cputs("TIMEOUT4!"); - stop_condition(); */ + cputs("Error: can't set location\n"); + stop_condition(); - + regw_u32(I2C_CR1, 0x1, 15, SETBIT); - /* regw_u32(I2C_CR1, 0x1, 8, SETBIT); //start - uint32_t read_status = *I2C_SR1; - regw_u32(I2C_DR, 0x40, 0, OWRITE); // write to address CMD - read_status = *I2C_SR1; - read_status = *I2C_SR2; - regw_u32(I2C_CR1, 0x1, 9, SETBIT); //stop - read_status = *I2C_SR1; + tm1637_reset(); + } - regw_u32(I2C_CR1, 0x1, 8, SETBIT); //start - read_status = *I2C_SR1; - regw_u32(I2C_DR, 0xC1, 0, OWRITE); // segment address - read_status = *I2C_SR1; - read_status = *I2C_SR2; - regw_u32(I2C_DR, 0x7D, 0, OWRITE); // write a six - regw_u32(I2C_CR1, 0x1, 9, SETBIT); //stop - read_status = *I2C_SR1; - regw_u32(I2C_CR1, 0x1, 8, SETBIT); //start - read_status = *I2C_SR1; + void tm1637_start() { - regw_u32(I2C_DR, DISPLAY_ON, 0, OWRITE); - read_status = *I2C_SR1; - regw_u32(I2C_CR1, 0x1, 9, SETBIT); //stop */ + unsigned char display_number[10] = {0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE0, 0xFE, 0xF6}; - } - void tm1637_stop() { + char love[4] = { 0x1C, 0xFC, 0x7C, 0x9E }; + + for (int i = 0; i < 4; i++) { + set_segment(i, love[i], NODOT); + } - //regw_u32(I2C_CR1, 0x0, 9, SETBIT); - } + set_display(true, 0); + } diff --cc include/sys/robsys.h index 78aedef,e02eded..9a19a47 --- a/include/sys/robsys.h +++ b/include/sys/robsys.h @@@ -1,23 -1,8 +1,23 @@@ #ifndef __SYSTEM_H #define __SYSTEM_H -/* CLOCK.C */ + +/* CLOCK.C + * Board specific clock settings. These boards often come with two + * external oscillators: one high speed (8MHz) and one low speed (~30kHz). + * These values are used throughout the code to calculator desired baud + * rates etc. + */ - #define ENABLE_HSE ++//#define ENABLE_HSE +//efine CRYSTAL_MHZ 8 +//efine CLKSPEED_MHZ 72 extern void clock_init(); +// extern int clock_test(); +// extern void clock_reset(); + +/* RTC.C */ +#define ENABLE_RTC +extern void rtc_init(); /* IVT.C */ extern void ivt_init(); diff --cc main.c index 51c2b10,342059e..8455b46 --- a/main.c +++ b/main.c @@@ -39,40 -29,12 +39,40 @@@ void main( ivt_init(); uart_init(); // cputs("ROBSYS LOADING...\n"); - systick_init(); - led_init(); + //systick_init(); +// tsensor_output(0xFFFF, 0x7FFF); + + init_printf(NULL, putc); + // SPEED_TEST +/* cputs("START TEST (8MHz) \n"); + int a; + for (int i = 0; i < 20000000; i++) { + a + 2; + } + a = 0; + cputs("END TEST\n"); + + //! + clock_init(); + + cputs("START TEST (??MHz) \n"); + for (int i = 0; i < 20000000; i++) { + a + 2; + } + cputs("END TEST\n"); */ sysinfo(); + +// tsensor_input(5000); +// run(); + + led_init(); - eeprom_at24c_init(); - eeprom_test(); ++// eeprom_at24c_init(); ++// eeprom_test(); +// rtc_init(); + - // tm1637_init(); - // tm1637_start(); + tm1637_init(); + tm1637_start(); //uint32_t test = hextoreg("12345678");