Merge remote-tracking branch 'origin/MB'
This commit is contained in:
commit
be4e10b063
6 changed files with 215 additions and 164 deletions
|
@ -1,2 +1,35 @@
|
|||
#include "GPIO.h"
|
||||
#include "stm32f1xx_ll_gpio.h"
|
||||
|
||||
void GPIO_conf(GPIO_TypeDef * GPIOx, uint32_t PINx, uint32_t mode, uint32_t outputType, uint32_t pullMode){
|
||||
|
||||
LL_GPIO_InitTypeDef init;
|
||||
|
||||
//Activation de l'horloge
|
||||
if (GPIOx == GPIOA) LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA);
|
||||
else if (GPIOx == GPIOB) LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOB);
|
||||
else if (GPIOx == GPIOC) LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOC);
|
||||
else if (GPIOx == GPIOD) LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOD);
|
||||
|
||||
//Configuration du PIN
|
||||
LL_GPIO_StructInit(&init);
|
||||
init.Pin = PINx;
|
||||
init.Mode = mode;
|
||||
//init.Speed = ;
|
||||
init.OutputType = outputType;
|
||||
init.Pull = pullMode;
|
||||
LL_GPIO_Init(GPIOx, &init);
|
||||
}
|
||||
|
||||
void GPIO_setPin(GPIO_TypeDef * GPIOx, uint32_t PINx, int output){
|
||||
|
||||
if (output) LL_GPIO_SetOutputPin(GPIOx, PINx);
|
||||
else LL_GPIO_ResetOutputPin(GPIOx,PINx);
|
||||
|
||||
};
|
||||
|
||||
int GPIO_readPin(GPIO_TypeDef * GPIOx, uint32_t PINx){
|
||||
|
||||
return LL_GPIO_IsOutputPinSet(GPIOx, PINx);
|
||||
|
||||
}
|
||||
|
|
|
@ -1,4 +1,23 @@
|
|||
#ifndef GPIO_H
|
||||
#define GPIO_H
|
||||
|
||||
#include "stm32f103xb.h"
|
||||
#include "stm32f1xx_ll_gpio.h"
|
||||
#include "stm32f1xx_ll_bus.h"
|
||||
|
||||
|
||||
/**
|
||||
* @brief Configure le GPIO considéré
|
||||
* @note
|
||||
* @param GPIO_TypeDef * GPIOx indique le GPIO à configurer : GPIOA, GPIOB, GPIOC ou GPIOD
|
||||
uint32_t PINx indique le PIN à configurer, sous la forme LL_GPIO_PIN_x
|
||||
Pour une liste des modes disponibles, consulter la librairie LL
|
||||
* @retval None
|
||||
*/
|
||||
void GPIO_conf(GPIO_TypeDef * GPIOx, uint32_t PINx, uint32_t mode, uint32_t outputType, uint32_t pullMode);
|
||||
|
||||
void GPIO_setPin(GPIO_TypeDef * GPIOx, uint32_t PINx, int output);
|
||||
|
||||
int GPIO_readPin(GPIO_TypeDef * GPIOx, uint32_t PINx);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
***************************************************************************/
|
||||
|
||||
|
||||
// variable pointeur de fonction permettant de mémoriser le callback à appeler depuis
|
||||
// variable pointeur de fonction permettant de m<EFBFBD>moriser le callback <20> appeler depuis
|
||||
// le handler d'IT
|
||||
void (*it_callback_TIM1)(void);
|
||||
void (*it_callback_TIM2)(void);
|
||||
|
@ -48,7 +48,7 @@ void TIM4_IRQHandler(void)
|
|||
/**
|
||||
* @brief Autorise les interruptions
|
||||
* @note
|
||||
* @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4
|
||||
* @param TIM_TypeDef Timer : indique le timer <EFBFBD> utiliser par le chronom<EFBFBD>tre, TIM1, TIM2, TIM3 ou TIM4
|
||||
* @retval None
|
||||
*/
|
||||
void Timer_IT_enable(TIM_TypeDef * timer)
|
||||
|
@ -60,7 +60,7 @@ void Timer_IT_enable(TIM_TypeDef * timer)
|
|||
/**
|
||||
* @brief Interdit les interruptions
|
||||
* @note
|
||||
* @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4
|
||||
* @param TIM_TypeDef Timer : indique le timer <EFBFBD> utiliser par le chronom<EFBFBD>tre, TIM1, TIM2, TIM3 ou TIM4
|
||||
* @retval None
|
||||
*/
|
||||
void Timer_IT_disable(TIM_TypeDef * timer)
|
||||
|
@ -69,11 +69,11 @@ void Timer_IT_disable(TIM_TypeDef * timer)
|
|||
}
|
||||
|
||||
/**
|
||||
* @brief Configure le Timer considéré en interruption sur débordement.
|
||||
* @note A ce stade, les interruptions ne sont pas validés (voir MyTimer_IT_Enable )
|
||||
* @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4
|
||||
* void (*IT_function) (void) : nom (adresse) de la fonction à lancer sur interruption
|
||||
* int Prio : priorité associée à l'interruption
|
||||
* @brief Configure le Timer consid<EFBFBD>r<EFBFBD> en interruption sur d<EFBFBD>bordement.
|
||||
* @note A ce stade, les interruptions ne sont pas valid<EFBFBD>s (voir MyTimer_IT_Enable )
|
||||
* @param TIM_TypeDef Timer : indique le timer <EFBFBD> utiliser par le chronom<EFBFBD>tre, TIM1, TIM2, TIM3 ou TIM4
|
||||
* void (*IT_function) (void) : nom (adresse) de la fonction <EFBFBD> lancer sur interruption
|
||||
* int Prio : priorit<EFBFBD> associ<EFBFBD>e <EFBFBD> l'interruption
|
||||
* @retval None
|
||||
*/
|
||||
void Timer_IT_conf(TIM_TypeDef * timer, void (*it_callback) (void), int prio)
|
||||
|
@ -85,7 +85,7 @@ void Timer_IT_conf(TIM_TypeDef * timer, void (*it_callback) (void), int prio)
|
|||
else it_callback_TIM4 = it_callback;
|
||||
|
||||
|
||||
// Blocage IT (il faudra la débloquer voir fct suivante)
|
||||
// Blocage IT (il faudra la d<EFBFBD>bloquer voir fct suivante)
|
||||
LL_TIM_DisableIT_UPDATE(timer);
|
||||
|
||||
// validation du canal NVIC
|
||||
|
@ -107,9 +107,9 @@ void Timer_IT_conf(TIM_TypeDef * timer, void (*it_callback) (void), int prio)
|
|||
***************************************************************************/
|
||||
|
||||
/**
|
||||
* @brief Démarre le timer considéré et active les interruptions
|
||||
* @brief D<EFBFBD>marre le timer consid<EFBFBD>r<EFBFBD> et active les interruptions
|
||||
* @note
|
||||
* @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4
|
||||
* @param TIM_TypeDef Timer : indique le timer <EFBFBD> utiliser par le chronom<EFBFBD>tre, TIM1, TIM2, TIM3 ou TIM4
|
||||
* @retval None
|
||||
*/
|
||||
void Timer_start(TIM_TypeDef * timer)
|
||||
|
@ -118,9 +118,9 @@ void Timer_start(TIM_TypeDef * timer)
|
|||
}
|
||||
|
||||
/**
|
||||
* @brief Arrêt le timer considéré et désactive les interruptions
|
||||
* @brief Arr<EFBFBD>t le timer consid<EFBFBD>r<EFBFBD> et d<EFBFBD>sactive les interruptions
|
||||
* @note
|
||||
* @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4
|
||||
* @param TIM_TypeDef Timer : indique le timer <EFBFBD> utiliser par le chronom<EFBFBD>tre, TIM1, TIM2, TIM3 ou TIM4
|
||||
* @retval None
|
||||
*/
|
||||
void Timer_stop(TIM_TypeDef * timer)
|
||||
|
@ -129,11 +129,11 @@ void Timer_stop(TIM_TypeDef * timer)
|
|||
}
|
||||
|
||||
/**
|
||||
* @brief Active l'horloge et règle l'ARR et le PSC du timer visé.
|
||||
* @note Fonction à lancer avant toute autre. Le timer n'est pas encore lancé (voir Timer_start)
|
||||
* @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4
|
||||
* int Arr : valeur à placer dans ARR
|
||||
* int Psc : valeur à placer dans PSC
|
||||
* @brief Active l'horloge et r<EFBFBD>gle l'ARR et le PSC du timer vis<EFBFBD>.
|
||||
* @note Fonction <EFBFBD> lancer avant toute autre. Le timer n'est pas encore lanc<EFBFBD> (voir Timer_start)
|
||||
* @param TIM_TypeDef Timer : indique le timer <EFBFBD> utiliser par le chronom<EFBFBD>tre, TIM1, TIM2, TIM3 ou TIM4
|
||||
* int Arr : valeur <EFBFBD> placer dans ARR
|
||||
* int Psc : valeur <EFBFBD> placer dans PSC
|
||||
* @retval None
|
||||
*/
|
||||
void Timer_conf(TIM_TypeDef * timer, int arr, int psc)
|
||||
|
|
|
@ -27,29 +27,29 @@ void Timer_IT_conf(TIM_TypeDef * timer, void (*it_callback) (void), int prio);
|
|||
|
||||
|
||||
/**
|
||||
* @brief Active l'horloge et règle l'ARR et le PSC du timer visé
|
||||
* @note Fonction à lancer avant toute autre. Le timer n'est pas encore lancé (voir MyTimerStart)
|
||||
* @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4
|
||||
* int Arr : valeur à placer dans ARR
|
||||
* int Psc : valeur à placer dans PSC
|
||||
* @brief Active l'horloge et r<EFBFBD>gle l'ARR et le PSC du timer vis<EFBFBD>
|
||||
* @note Fonction <EFBFBD> lancer avant toute autre. Le timer n'est pas encore lanc<EFBFBD> (voir MyTimerStart)
|
||||
* @param TIM_TypeDef Timer : indique le timer <EFBFBD> utiliser par le chronom<EFBFBD>tre, TIM1, TIM2, TIM3 ou TIM4
|
||||
* int Arr : valeur <EFBFBD> placer dans ARR
|
||||
* int Psc : valeur <EFBFBD> placer dans PSC
|
||||
* @retval None
|
||||
*/
|
||||
void Timer_conf(TIM_TypeDef * timer, int arr, int psc);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Démarre le timer considéré
|
||||
* @brief D<EFBFBD>marre le timer consid<EFBFBD>r<EFBFBD>
|
||||
* @note
|
||||
* @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4
|
||||
* @param TIM_TypeDef Timer : indique le timer <EFBFBD> utiliser par le chronom<EFBFBD>tre, TIM1, TIM2, TIM3 ou TIM4
|
||||
* @retval None
|
||||
*/
|
||||
void Timer_start(TIM_TypeDef * timer);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Arrêt le timer considéré
|
||||
* @brief Arr<EFBFBD>t le timer consid<EFBFBD>r<EFBFBD>
|
||||
* @note
|
||||
* @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4
|
||||
* @param TIM_TypeDef Timer : indique le timer <EFBFBD> utiliser par le chronom<EFBFBD>tre, TIM1, TIM2, TIM3 ou TIM4
|
||||
* @retval None
|
||||
*/
|
||||
void Timer_stop(TIM_TypeDef * timer);
|
||||
|
@ -68,21 +68,21 @@ int PWMi_getDutyCycle(TIM_TypeDef * timer, int channel);
|
|||
***************************************************************************/
|
||||
|
||||
/**
|
||||
* @brief Configure le timer en mode PWM output à la fréquence donnée
|
||||
* @brief Configure le timer en mode PWM output <EFBFBD> la fr<EFBFBD>quence donn<EFBFBD>e
|
||||
* @note
|
||||
* @param TIM_TypeDef Timer : indique le timer à utiliser : TIM1, TIM2, TIM3 ou TIM4
|
||||
* int channel : Le channel utilisé par la PWM
|
||||
* float freq : Fréquence en Hz (entre 2Hz et pas trop grand svp)
|
||||
* @param TIM_TypeDef Timer : indique le timer <EFBFBD> utiliser : TIM1, TIM2, TIM3 ou TIM4
|
||||
* int channel : Le channel utilis<EFBFBD> par la PWM
|
||||
* float freq : Fr<EFBFBD>quence en Hz (entre 2Hz et pas trop grand svp)
|
||||
* float dutyCycle : Valeur entre 0 et 1
|
||||
* @retval None
|
||||
*/
|
||||
void Timer_pwmo_conf(TIM_TypeDef * timer, int channel, float freq, float dutyCycle);
|
||||
|
||||
/**
|
||||
* @brief Modifie la fréquence des PWMs associées au timer donné
|
||||
* @brief Modifie la fr<EFBFBD>quence des PWMs associ<EFBFBD>es au timer donn<EFBFBD>
|
||||
* @note
|
||||
* @param TIM_TypeDef Timer : indique le timer à utiliser : TIM1, TIM2, TIM3 ou TIM4
|
||||
* float freq : Fréquence en Hz (entre 2Hz et pas trop grand svp)
|
||||
* @param TIM_TypeDef Timer : indique le timer <EFBFBD> utiliser : TIM1, TIM2, TIM3 ou TIM4
|
||||
* float freq : Fr<EFBFBD>quence en Hz (entre 2Hz et pas trop grand svp)
|
||||
* @retval None
|
||||
*/
|
||||
void Timer_pwmo_setFreq(TIM_TypeDef * timer, float freq);
|
||||
|
@ -90,18 +90,18 @@ void Timer_pwmo_setFreq(TIM_TypeDef * timer, float freq);
|
|||
/**
|
||||
* @brief Modifie le duty cycle de la PWM
|
||||
* @note
|
||||
* @param TIM_TypeDef Timer : indique le timer à utiliser : TIM1, TIM2, TIM3 ou TIM4
|
||||
* int channel : Le channel utilisé par la PWM
|
||||
* @param TIM_TypeDef Timer : indique le timer <EFBFBD> utiliser : TIM1, TIM2, TIM3 ou TIM4
|
||||
* int channel : Le channel utilis<EFBFBD> par la PWM
|
||||
* float dutyCycle : Valeur entre 0 et 1
|
||||
* @retval None
|
||||
*/
|
||||
void Timer_pwmo_setDutyCycle(TIM_TypeDef * timer, int channel, float dutyCycle);
|
||||
|
||||
/**
|
||||
* @brief Récupère le duty cycle de la PWM
|
||||
* @brief R<EFBFBD>cup<EFBFBD>re le duty cycle de la PWM
|
||||
* @note
|
||||
* @param TIM_TypeDef Timer : indique le timer à utiliser : TIM1, TIM2, TIM3 ou TIM4
|
||||
* int channel : Le channel utilisé par la PWM
|
||||
* @param TIM_TypeDef Timer : indique le timer <EFBFBD> utiliser : TIM1, TIM2, TIM3 ou TIM4
|
||||
* int channel : Le channel utilis<EFBFBD> par la PWM
|
||||
* @retval float dutyCycle
|
||||
*/
|
||||
float Timer_pwmo_getDutyCycle(TIM_TypeDef * timer, int channel);
|
||||
|
@ -113,23 +113,23 @@ float Timer_pwmo_getDutyCycle(TIM_TypeDef * timer, int channel);
|
|||
/**
|
||||
* @brief Configure le timer en mode encoder
|
||||
* @note
|
||||
* @param TIM_TypeDef Timer : indique le timer à utiliser : TIM1, TIM2, TIM3 ou TIM4
|
||||
* @param TIM_TypeDef Timer : indique le timer <EFBFBD> utiliser : TIM1, TIM2, TIM3 ou TIM4
|
||||
* @retval None
|
||||
*/
|
||||
void Timer_encoder_conf(TIM_TypeDef * timer);
|
||||
|
||||
/**
|
||||
* @brief Récupère l'angle, en degrès
|
||||
* @brief R<EFBFBD>cup<EFBFBD>re l'angle, en degr<EFBFBD>s
|
||||
* @note
|
||||
* @param TIM_TypeDef Timer : indique le timer à utiliser : TIM1, TIM2, TIM3 ou TIM4
|
||||
* @param TIM_TypeDef Timer : indique le timer <EFBFBD> utiliser : TIM1, TIM2, TIM3 ou TIM4
|
||||
* @retval None
|
||||
*/
|
||||
int Timer_encoder_getAngle(TIM_TypeDef * timer);
|
||||
|
||||
/**
|
||||
* @brief Récupère la direction
|
||||
* @brief R<EFBFBD>cup<EFBFBD>re la direction
|
||||
* @note
|
||||
* @param TIM_TypeDef Timer : indique le timer à utiliser : TIM1, TIM2, TIM3 ou TIM4
|
||||
* @param TIM_TypeDef Timer : indique le timer <EFBFBD> utiliser : TIM1, TIM2, TIM3 ou TIM4
|
||||
* @retval None
|
||||
*/
|
||||
enum CounterDirection Timer_encoder_getDirection(TIM_TypeDef * timer);
|
||||
|
|
|
@ -21,110 +21,109 @@ static TIM_TypeDef * Chrono_Timer=TIM1; // init par d
|
|||
void Chrono_Task_10ms(void);
|
||||
|
||||
/**
|
||||
* @brief Configure le chronomètre.
|
||||
* @note A lancer avant toute autre fonction.
|
||||
* @param Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4
|
||||
* @retval None
|
||||
*/
|
||||
* @brief Configure le chronomètre.
|
||||
* @note A lancer avant toute autre fonction.
|
||||
* @param Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4
|
||||
* @retval None
|
||||
*/
|
||||
void Chrono_Conf(TIM_TypeDef * Timer)
|
||||
{
|
||||
// Reset Time
|
||||
Chrono_Time.Hund = 0;
|
||||
Chrono_Time.Sec = 0;
|
||||
Chrono_Time.Min = 0;
|
||||
// Reset Time
|
||||
Chrono_Time.Hund = 0;
|
||||
Chrono_Time.Sec = 0;
|
||||
Chrono_Time.Min = 0;
|
||||
|
||||
// Fixation du Timer
|
||||
Chrono_Timer = Timer;
|
||||
// Fixation du Timer
|
||||
Chrono_Timer = Timer;
|
||||
|
||||
// Réglage Timer pour un débordement à 10ms
|
||||
Timer_conf(Chrono_Timer, 999, 719);
|
||||
// Réglage Timer pour un débordement à 10ms
|
||||
Timer_conf(Chrono_Timer, 999, 719);
|
||||
|
||||
// Réglage des interruptions
|
||||
Timer_IT_conf(Chrono_Timer, Chrono_Task_10ms, 3);
|
||||
Timer_IT_enable(Chrono_Timer);
|
||||
// Réglage des interruptions
|
||||
Timer_IT_conf(Chrono_Timer, Chrono_Task_10ms, 3);
|
||||
Timer_IT_enable(Chrono_Timer);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Démarre le chronomètre.
|
||||
* @note si la durée dépasse 59mn 59sec 99 Hund, elle est remise à zéro et repart
|
||||
* @param Aucun
|
||||
* @retval Aucun
|
||||
*/
|
||||
* @brief Démarre le chronomètre.
|
||||
* @note si la durée dépasse 59mn 59sec 99 Hund, elle est remise à zéro et repart
|
||||
* @param Aucun
|
||||
* @retval Aucun
|
||||
*/
|
||||
void Chrono_Start(void)
|
||||
{
|
||||
Timer_start(Chrono_Timer);
|
||||
Timer_start(Chrono_Timer);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Arrête le chronomètre.
|
||||
* @note
|
||||
* @param Aucun
|
||||
* @retval Aucun
|
||||
*/
|
||||
* @brief Arrête le chronomètre.
|
||||
* @note
|
||||
* @param Aucun
|
||||
* @retval Aucun
|
||||
*/
|
||||
void Chrono_Stop(void)
|
||||
{
|
||||
Timer_stop(Chrono_Timer);
|
||||
Timer_stop(Chrono_Timer);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Remet le chronomètre à 0
|
||||
* @note
|
||||
* @param Aucun
|
||||
* @retval Aucun
|
||||
*/
|
||||
* @brief Remet le chronomètre à 0
|
||||
* @note
|
||||
* @param Aucun
|
||||
* @retval Aucun
|
||||
*/
|
||||
void Chrono_Reset(void)
|
||||
{
|
||||
// Arrêt Chrono
|
||||
Timer_stop(Chrono_Timer);
|
||||
// Arrêt Chrono
|
||||
Timer_stop(Chrono_Timer);
|
||||
|
||||
// Reset Time
|
||||
Chrono_Time.Hund=0;
|
||||
Chrono_Time.Sec=0;
|
||||
Chrono_Time.Min=0;
|
||||
// Reset Time
|
||||
Chrono_Time.Hund=0;
|
||||
Chrono_Time.Sec=0;
|
||||
Chrono_Time.Min=0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Renvoie l'adresse de la variable Time privée gérée dans le module Chrono.c
|
||||
* @note
|
||||
* @param Aucun
|
||||
* @retval adresse de la variable Time
|
||||
*/
|
||||
* @brief Renvoie l'adresse de la variable Time privée gérée dans le module Chrono.c
|
||||
* @note
|
||||
* @param Aucun
|
||||
* @retval adresse de la variable Time
|
||||
*/
|
||||
Time * Chrono_Read(void)
|
||||
{
|
||||
return &Chrono_Time;
|
||||
return &Chrono_Time;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @brief incrémente la variable privée Chron_Time modulo 60mn
|
||||
* @note
|
||||
* @param Aucun
|
||||
* @retval Aucun
|
||||
*/
|
||||
* @brief incrémente la variable privée Chron_Time modulo 60mn
|
||||
* @note
|
||||
* @param Aucun
|
||||
* @retval Aucun
|
||||
*/
|
||||
void Chrono_Task_10ms(void)
|
||||
{
|
||||
Chrono_Time.Hund++;
|
||||
if (Chrono_Time.Hund==100)
|
||||
{
|
||||
Chrono_Time.Sec++;
|
||||
Chrono_Time.Hund=0;
|
||||
}
|
||||
if (Chrono_Time.Sec==60)
|
||||
{
|
||||
Chrono_Time.Min++;
|
||||
Chrono_Time.Sec=0;
|
||||
}
|
||||
if (Chrono_Time.Min==60)
|
||||
{
|
||||
Chrono_Time.Hund=0;
|
||||
}
|
||||
Chrono_Time.Hund++;
|
||||
if (Chrono_Time.Hund==100)
|
||||
{
|
||||
Chrono_Time.Sec++;
|
||||
Chrono_Time.Hund=0;
|
||||
}
|
||||
if (Chrono_Time.Sec==60)
|
||||
{
|
||||
Chrono_Time.Min++;
|
||||
Chrono_Time.Sec=0;
|
||||
}
|
||||
if (Chrono_Time.Min==60)
|
||||
{
|
||||
Chrono_Time.Hund=0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue