Guten morgen zusammen,
leider funktioniert es immer noch nicht. Das Ziel ist, ein Taster soll
mindestens 2 Sekunden gedrückt sein, erst dann soll eine LED geschaltet
werden.
Ich habe mir nochmal die Timereinstellungen vorgenommen. M.E. soll das
stimmen. Dieser sollte 1 ms betragen:
1 | void MX_TIM3_Init(void){
|
2 | /*Timer auf 1 ms eingestellt
|
3 |
|
4 | Tick = PSC+1/f_APB1 = 89999+1/90000 kHz -> 1 ms
|
5 |
|
6 | */
|
7 |
|
8 | TIM_ClockConfigTypeDef sClockSourceConfig = {0};
|
9 | TIM_MasterConfigTypeDef sMasterConfig = {0};
|
10 | htim3.Instance = TIM3;
|
11 | htim3.Init.Prescaler = 90000-1; //TIM3->APB1 = 90 MHz
|
12 | htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
|
13 | htim3.Init.Period = 1000;
|
14 | htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
|
15 | htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
|
16 | if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
|
17 | {
|
18 | Error_Handler();
|
19 | }
|
20 | sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
|
21 | if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
|
22 | {
|
23 | Error_Handler();
|
24 | }
|
25 | sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
|
26 | sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
|
27 | if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
|
28 | {
|
29 | Error_Handler();
|
30 | }
|
31 | }
|
Dann in die Main:
1 | if((OK_BUTTON==ON)) {
|
2 | if(timer_up()<2000) { // Warte bis CNT mindestens(!!) 2000 ms ist
|
3 | debug_LED(ON);
|
4 | }
|
5 | }
|
6 | else{ // Button = off --> LED aus und Zähler zurücksetzen
|
7 | debug_LED(OFF);
|
8 | set_tim3_zero(); // Timeout für Taster zurücksetzen
|
9 | }
|
und die Funktionen
1 | uint16_t timer_up(void){
|
2 | volatile uint16_t count;
|
3 | assert_param(IS_TIM_ALL_PERIPH(TIM3));
|
4 | uint16_t cnt = TIM3->CNT;
|
5 | if (cnt==1000){
|
6 | count++;
|
7 | }
|
8 | return count;
|
9 | }
|
10 |
|
11 | // zur besseren Zuordung unbenannt
|
12 | void set_tim3_zero(void){
|
13 | TIM3->CNT = 0;
|
14 | }
|
15 |
|
16 | // wird in der Main vor der Schleife initialisiert
|
17 | void start_clock_tim3(void){
|
18 | HAL_TIM_Base_Start(&htim3);
|
19 | }
|
Wo liegt der Fehler? Mein Gedanke ist, das Register CNT zählt bis 1000
(Periodeneinstellung) hoch, das in einer ms und setzt sich zurück. Das
zurücksetzen zähle ich.
Oder bin ich komplett auf dem Holzweg?
Allgemein gefragt: Wie bekomme ich es hin, das wenn der Taster 2 s
gedrückt wird, erst dann die LED schaltet?
Danke euch :-)