Forum: Mikrocontroller und Digitale Elektronik Modulo STM32


von Ma B. (drumstick)


Lesenswert?

Hallo!

Ich arbeite mit dem STM32F103VDT6 und dem uVision von Keil.

Ich möchte alle 2 Minuten eine Variable setzten.
OpTimeHr wird immer nach 60 Sekunden um 1 erhöht per Systick.
Mein Codeausschnitt:
1
uint32_t            OpTimeHr  = 0;
1
if((OpTimeHr % 2) == 0)
2
      {
3
        SetGlobal.SetFlash = 1;
4
      }

SetGlobal.SetFlash wird dauernd gesetzt!

Anderes Beispiel funktioniert!
1
int dlycnt = 0;
2
3
if((dlycnt % 5) == 0)     // every 50ms    
4
    {
5
      Voltage_Measure();
6
    }

Der einzige Unterschied, der ich sehe ist der Datentyp der Variable.
Sonst fällt mir nichts auf!

Danke und Gruss!

M.B.

von (prx) A. K. (prx)


Lesenswert?

M. B. schrieb:
> SetGlobal.SetFlash wird dauernd gesetzt!

Dass die Bedingung irgendwann einmal nicht zutrifft, oder SetFlash 
irgendwann einmal wieder zurück gesetzt wird, das müssen wir dir also 
einfach mal glauben. Ebenso, dass nirgendwo ein volatile-Problem spukt.

Es bringt nichts, exakt nur jenen Quellcode zu posten, der garantiert 
nichts mit dem Problem zu tun hat.

von hp-freund (Gast)


Lesenswert?

M. B. schrieb:
> OpTimeHr wird immer nach 60 Sekunden um 1 erhöht

M. B. schrieb:
> SetGlobal.SetFlash wird dauernd gesetzt!

Dann warte mal 60 Sekunden.

von Ma B. (drumstick)


Lesenswert?

Variable Rücksetzen
1
if(SetGlobal.SetFlash == 1)
2
{
3
  set_in_Flash_Data(&SetData);
4
  SetGlobal.SetFlash = 0;
5
}

von Ma B. (drumstick)


Lesenswert?

Habe schon länger als 60 Sekunden gewartet....

von Ma B. (drumstick)


Lesenswert?

Das ganze sieht so aus:
1
int cntss = 0;
1
while(true)
2
  {
3
    os_itv_wait();
4
    
5
    OpTimeSec ++;
6
    if(OpTimeSec >= 30)
7
    {
8
      OpTimeHr++;
9
      OpTimeSec = 0;
10
    }
11
    if(OpTimeHr > 2)
12
    {
13
      if((OpTimeHr % 2) == 0)
14
      {
15
        //set_in_Flash_Data(&SetData);
16
        SetGlobal.SetFlash = 1;
17
        cntss++;
18
      }
19
    }    
20
     set_OpTime(OpTimeHr);
21
22
    if(LEDrun)
23
    {
24
      LED_On (LED_RES);  // set the LED on
25
    }
26
    else
27
    {
28
    LED_Off(LED_RES);    // set the LED off                        
29
    }
30
    LEDrun = !LEDrun;    // inverse the LED status, the LED flashes
31
  }
1
 if(SetGlobal.SetFlash == 1)
2
 {
3
  set_in_Flash_Data(&SetData);
4
  SetGlobal.SetFlash = 0;
5
  TESt++;
6
 }


ist OpTimeHr > 2 wird cntss ständig incrementiert!

Danke und Gruss

M.B.

von Ma B. (drumstick)


Lesenswert?

Habs gefunden..

Das Task-Timing wurde durcheinander gebracht und zählte sehr schnelle 
Sekunden!

Danke!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.