From c6e8347d232e9c298d3430c0d1bee6f446ce818f Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Tue, 5 Mar 2024 15:35:34 +0300 Subject: [PATCH] nothing works, 2 mosfets died... --- F1:F103/CAR_CANbus/WindShield/buttons.c | 21 ++++---- F1:F103/CAR_CANbus/WindShield/buttons.h | 9 ++++ F1:F103/CAR_CANbus/WindShield/hardware.c | 20 ++++---- F1:F103/CAR_CANbus/WindShield/hardware.h | 3 +- F1:F103/CAR_CANbus/WindShield/proto.c | 45 ++++++++++++++++++ F1:F103/CAR_CANbus/WindShield/version.inc | 4 +- F1:F103/CAR_CANbus/WindShield/windshield.bin | Bin 10944 -> 11492 bytes .../WindShield/windshield.creator.user | 2 +- 8 files changed, 84 insertions(+), 20 deletions(-) diff --git a/F1:F103/CAR_CANbus/WindShield/buttons.c b/F1:F103/CAR_CANbus/WindShield/buttons.c index 68b0667..278397c 100644 --- a/F1:F103/CAR_CANbus/WindShield/buttons.c +++ b/F1:F103/CAR_CANbus/WindShield/buttons.c @@ -20,6 +20,9 @@ #include "buttons.h" #include "hardware.h" +#ifdef EBUG +#include "usart.h" +#endif extern volatile uint32_t Tms; //uint32_t lastUnsleep = 0; @@ -28,22 +31,24 @@ extern volatile uint32_t Tms; #define PRESSTHRESHOLD (29) // HOLDTHRESHOLD = PRESSTHRESHOLD + hold time #define HOLDTHRESHOLD (329) - +/* typedef struct{ keyevent event; // current key event int16_t counter; // press/release milliseconds counter GPIO_TypeDef *port; // key port uint16_t pin; // key pin - uint8_t changed; // the event have been changed + uint8_t changed : 1; // the event have been changed + uint8_t inverted : 1; // button inverted: 0 - passive, 1 - active } keybase; - +*/ +// HALLs are inverted as disconnected when active keybase allkeys[KEY_AMOUNT] = { - [HALL_D] = {.port = HALL_PORT, .pin = HALL_D_PIN}, - [HALL_U] = {.port = HALL_PORT, .pin = HALL_U_PIN}, + [HALL_D] = {.port = HALL_PORT, .pin = HALL_D_PIN, .inverted = 1}, + [HALL_U] = {.port = HALL_PORT, .pin = HALL_U_PIN, .inverted = 1}, [KEY_D] = {.port = BUTTON_PORT, .pin = BUTTON_D_PIN}, [KEY_U] = {.port = BUTTON_PORT, .pin = BUTTON_U_PIN}, - [DIR_D] = {.port = DIR_PORT, .pin = DIR_U_PIN}, - [DIR_U] = {.port = DIR_PORT, .pin = DIR_U_PIN} + [DIR_D] = {.port = DIR_PORT, .pin = DIR_D_PIN, .inverted = 1}, + [DIR_U] = {.port = DIR_PORT, .pin = DIR_U_PIN, .inverted = 1} }; // return 1 if something was changed @@ -56,7 +61,7 @@ int process_keys(){ for(int i = 0; i < KEY_AMOUNT; ++i){ keybase *k = &allkeys[i]; keyevent e = k->event; - if(PRESSED(k->port, k->pin)){ // key is in pressed state + if(PRESSED(k->port, k->pin) != k->inverted){ // key is in pressed state //lastUnsleep = Tms; // update activity time (any key is in pressed state) switch(e){ case EVT_NONE: // just pressed diff --git a/F1:F103/CAR_CANbus/WindShield/buttons.h b/F1:F103/CAR_CANbus/WindShield/buttons.h index e31f256..87e3254 100644 --- a/F1:F103/CAR_CANbus/WindShield/buttons.h +++ b/F1:F103/CAR_CANbus/WindShield/buttons.h @@ -42,6 +42,15 @@ typedef enum{ EVT_RELEASE // released } keyevent; +typedef struct{ + keyevent event; // current key event + int16_t counter; // press/release milliseconds counter + GPIO_TypeDef *port; // key port + uint16_t pin; // key pin + uint8_t changed : 1; // the event have been changed + uint8_t inverted : 1; // button inverted: 0 - passive, 1 - active +} keybase; + //extern uint32_t lastUnsleep; // last keys activity time int process_keys(); diff --git a/F1:F103/CAR_CANbus/WindShield/hardware.c b/F1:F103/CAR_CANbus/WindShield/hardware.c index c1029be..faa2d07 100644 --- a/F1:F103/CAR_CANbus/WindShield/hardware.c +++ b/F1:F103/CAR_CANbus/WindShield/hardware.c @@ -96,10 +96,13 @@ int motor_ctl(int32_t dir){ } accel = 1; direction = dir; + keyevent uh = keyevt(HALL_U), dh = keyevt(HALL_D); if(dir == MOTDIR_UP){ // start in positive direction (move UP) + if(uh == EVT_PRESS || uh == EVT_HOLD) return FALSE; // can't move in given direction set_up(UP_LEFT); set_pwm(PWM_RIGHT, 1); }else{ // negative (move DOWN) + if(dh == EVT_PRESS || dh == EVT_HOLD) return FALSE; set_up(UP_RIGHT); set_pwm(PWM_LEFT, 1); } @@ -134,29 +137,30 @@ void motor_process(){ } } } - keyevent uh = keyevt(HALL_U), dh = keyevt(HALL_D); // current hall states - if we cannot move upper or lower - // short key pressed - full open/close; long - move with stop after release + // short key pressed - full open/close (or stop while moving); long - move with stop after release if(MOTDIR_BREAK != newdir){ // process keys if don't need to break evt = EVT_NONE; if(keystate(KEY_U, &evt)){ - if(evt == EVT_PRESS){ // move up (don't mind EVT_HOLD - it's already moving) - if(uh != EVT_HOLD && uh != EVT_PRESS) newdir = MOTDIR_UP; + if(evt == EVT_PRESS){ + if(direction == MOTDIR_UP || direction == MOTDIR_DOWN) newdir = MOTDIR_STOP; + else newdir = MOTDIR_UP; } }else if(keystate(KEY_D, &evt)){ if(evt == EVT_PRESS){ - if(dh != EVT_HOLD && dh != EVT_PRESS) newdir = MOTDIR_DOWN; + if(direction == MOTDIR_UP || direction == MOTDIR_DOWN) newdir = MOTDIR_STOP; + else newdir = MOTDIR_DOWN; } } - if(evt == EVT_RELEASE) newdir = MOTDIR_STOP; + if(evt == EVT_RELEASE) newdir = MOTDIR_STOP; // stop after long press evt = EVT_NONE; int extsig = FALSE; // now chech external signals, they have an advantage over local keys if(keystate(DIR_U, &evt)){ // react on PRESS and both NONE/RELEASE extsig = TRUE; - if(evt == EVT_PRESS && uh != EVT_PRESS && uh != EVT_HOLD) newdir = MOTDIR_UP; + if(evt == EVT_PRESS) newdir = MOTDIR_UP; }else if(keystate(DIR_D, &evt)){ extsig = TRUE; - if(evt == EVT_PRESS && dh != EVT_PRESS && dh != EVT_HOLD) newdir = MOTDIR_DOWN; + if(evt == EVT_PRESS) newdir = MOTDIR_DOWN; } if(evt == EVT_RELEASE || (extsig && evt == EVT_NONE)){ // EVT_NONE - released after short press - do nothing; EVT_RELEASE - after hold, stop newdir = MOTDIR_STOP; diff --git a/F1:F103/CAR_CANbus/WindShield/hardware.h b/F1:F103/CAR_CANbus/WindShield/hardware.h index aa4a194..3179c6b 100644 --- a/F1:F103/CAR_CANbus/WindShield/hardware.h +++ b/F1:F103/CAR_CANbus/WindShield/hardware.h @@ -64,7 +64,8 @@ #define DIR_U_PIN (1<12) #define DIR_D_PIN (1<13) -// define BUTTONS_NEGATIVE if button pressed when ==1 +// define BUTTONS_NEGATIVE if ALL button pressed when ==1 +// (inversion of common buttons - by flag `inverted`) #ifdef BUTTONS_NEGATIVE #define PRESSED(port, pin) ((port->IDR & pin) == pin) #else diff --git a/F1:F103/CAR_CANbus/WindShield/proto.c b/F1:F103/CAR_CANbus/WindShield/proto.c index 8da9318..e96b2e8 100644 --- a/F1:F103/CAR_CANbus/WindShield/proto.c +++ b/F1:F103/CAR_CANbus/WindShield/proto.c @@ -17,6 +17,7 @@ */ #include "adc.h" +#include "buttons.h" #include "can.h" #include "hardware.h" #include "proto.h" @@ -42,6 +43,7 @@ const char *helpmsg = "'t' - get MCU temperature (*10)\n" "'u y xx' - turn on (xx==1) or off (xx==0) y (l/r) MOSFET\n" "'v' - get Vdd (*100)\n" + "'B' - current buttons state\n" "'M' - CAN bus monitoring on/off\n" "'R' - software reset\n" "'T' - get time from start (ms)\n" @@ -111,6 +113,46 @@ static int startPWM(){ return TRUE; } +static const char* keyz[KEY_AMOUNT] = { + [HALL_D] = "Hall down", + [HALL_U] = "Hall up", + [KEY_D] = "Key down", + [KEY_U] = "Key up", + [DIR_D] = "Ext down", + [DIR_U] = "Ext up" +}; + + +extern keybase allkeys[]; +TRUE_INLINE void showbtnstate(){ + for(int i = 0; i < KEY_AMOUNT; ++i){ + usart_send(keyz[i]); usart_send(": "); + switch(keyevt(i)){ + case EVT_PRESS: + usart_send("pressed"); + break; + case EVT_HOLD: + usart_send("holded"); + break; + case EVT_RELEASE: + usart_send("released after hold"); + break; + default: + usart_send("none"); + } + newline(); + } + for(int i = 0; i < KEY_AMOUNT; ++i){ + usart_send(keyz[i]); usart_send(": "); + keybase *k = &allkeys[i]; + if(!PRESSED(k->port, k->pin)) usart_send("not "); + usart_send("pressed, "); + if(!k->inverted) usart_send("not "); + usart_send("inverted"); + newline(); + } +} + /** * @brief cmd_parser - command parsing * @param txt - buffer with commands & data @@ -185,6 +227,9 @@ void cmd_parser(char *txt){ case 'v': usart_send("VDD="); usart_send(u2str(getVdd())); break; + case 'B': + showbtnstate(); + break; case 'M': flags.can_monitor = !flags.can_monitor; usart_send("CAN monitoring "); diff --git a/F1:F103/CAR_CANbus/WindShield/version.inc b/F1:F103/CAR_CANbus/WindShield/version.inc index 76ac59d..97041b9 100644 --- a/F1:F103/CAR_CANbus/WindShield/version.inc +++ b/F1:F103/CAR_CANbus/WindShield/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "21" -#define BUILD_DATE "2024-03-04" +#define BUILD_NUMBER "27" +#define BUILD_DATE "2024-03-05" diff --git a/F1:F103/CAR_CANbus/WindShield/windshield.bin b/F1:F103/CAR_CANbus/WindShield/windshield.bin index 3cffb78cc16c7b929a539a619271bd0c1ce6c43c..fa3e89028c9894c4b5fa9570717e6a5af81714ba 100755 GIT binary patch delta 4035 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 O18smkz>EfdO!t34V*kYe delta 3420 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 - + EnvironmentId