Forum: Mikrocontroller und Digitale Elektronik Komisches Verhalten Delay


von pete (Gast)


Lesenswert?

Hallo Leute ich habe hier ein Problem, welches mich fast verzweifeln 
lässt.

Wenn ich folgenes Blink Beispiel auf den Chip flashe, funktioniert alles 
super. Wenn ich lediglich den Wert in der ersten Delay in 450 oder 
größer ändere wird der Code danach nicht mehr ausgeführt. Wenn ich mit 
dem Debugger Schaue und beim Rücksetzen des Pins einen Breakepoint 
setze, wird dieser auch erreicht. Ein Breakepoint beim Setzen wird nicht 
erreicht. Der Chip hängt aber nirgendwo sondern erricht nur immer wieder 
den ersten Breakepiont... Wie gesagt mit Delay(400) läuft alles wie 
geplant...

1
#include "stm32f4xx.h"
2
#include "stm32f4xx_rcc.h"
3
#include "misc.h"
4
#include "stm32f4xx_gpio.h"
5
#include "stm32f4xx_spi.h"
6
#include "stm32f4xx_tim.h"
7
#include "ADXL345.h"
8
9
/*Prototypen*/
10
11
12
void Systick_Handler(void);
13
void Delay(uint32_t cycles);
14
15
16
17
/* globale Variablen*/
18
19
uint32_t Ticks=0;
20
21
22
23
24
int main(void)
25
{
26
27
    SystemInit();
28
    SysTick_Config(SystemCoreClock/ 1000);
29
30
31
    GPIO_InitTypeDef GPIO_InitStruct;
32
33
   RCC_AHB1PeriphClockCmd(ADXL345_GPIO_Clock, ENABLE);
34
35
36
37
   GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
38
   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
39
   GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
40
   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
41
   GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
42
   GPIO_Init(ADXL345_SPI_Port, &GPIO_InitStruct);
43
44
   GPIO_WriteBit(ADXL345_SPI_Port, AXDL345_CS_Pin,SET);
45
46
    while(1)
47
    {
48
      GPIO_WriteBit(ADXL345_SPI_Port, GPIO_Pin_9, RESET);
49
        Delay(400);
50
        GPIO_WriteBit(ADXL345_SPI_Port, GPIO_Pin_9, SET);
51
        Delay(400);
52
53
    }
54
}
55
56
57
58
59
60
61
void SysTick_Handler(void){
62
63
  if (Ticks != 0)
64
    Ticks--;
65
66
  }
67
68
69
70
void Delay(uint32_t cycles ){
71
72
  Ticks = cycles;
73
  while (Ticks>0);
74
}

von troll (Gast)


Lesenswert?

volatile?

von Pete (Gast)


Lesenswert?

troll schrieb:
> volatile?

Auch schon probiert... Selbes phänomen

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

also ich kenne zwar den STM32 nicht, aber ich denke mal das ein uint32 
nicht mit einem Befehl vom RAM in (ein oder mehrere Reg.?) tranferiert 
werden kann?
Wenn dem so ist, dann sind

  Ticks = cycles;
  while (Ticks>0);

nicht atomar, also könnte dir hier die ISR SysTick_Handler() 
dazwischenfunken und einen Teil des uint32 noch beim Beschreiben ändern.

Sascha

von Pete (Gast)


Lesenswert?

Das wars auch nicht... Jetzt wirds immer komischer: ich habe mal ein 
anderes Board probiert und es läuft!!! Woran kann das liegen es sind 2 
identische Stm32 Discovery Boards......

von Michi (Gast)


Lesenswert?

@Pete
Versuch mal mikroC ARM. Für dein LED-Geblinke reicht das LED-Demo 
Sample.
http://www.mikroe.com/mikroc/arm/

von Pete (Gast)


Lesenswert?

Danke für den Tip... Aber klingt das gerade nicht eher nachveinem 
hardwareproblem?

von Michi (Gast)


Lesenswert?

Pete schrieb:
> es sind 2
> identische Stm32 Discovery Boards......
Wenn das stimmt, was du schreibst, eher nicht. Kannst du sicherstellen, 
dass es immer das selbe Hex-File ist, welches du in beide Boards flasht? 
Du könntest ja auch beide Boards auslesen und ein Compare über die 
Hexfiles machen.

von Dr. Sommer (Gast)


Lesenswert?

Sascha Weber schrieb:
> also ich kenne zwar den STM32 nicht, aber ich denke mal das ein uint32
> nicht mit einem Befehl vom RAM in (ein oder mehrere Reg.?) tranferiert
> werden kann?
Falsch; beim ARMv7 sind uint32-Zugriffe per Spezifikation immer atomar 
(und werden dank 32bit-Bus auch in einem Zyklus durchgeführt). Siehe S. 
101,102 im ARMv7M-Architecture Reference Manual.
Warum das nicht funktioniert weiß ich aber auch nicht ("Ticks" sollte 
natürlich volatile sein)... Vielleicht mal überprüfen ob der Controller 
aus ominösen Gründen ständig resettet? (Breakpoint auf Reset_Handler)

von Pete (Gast)


Lesenswert?

Genau das!!! Kann das vom watchdog kommen?? Ist der hardwaremäßig 
implementiert? Sprich muss ich den expliziet wieder rücksetzen wenn ich 
den in nem anderen projekt mal benutzt habe?

von Karl H. (kbuchegg)


Lesenswert?

Pete schrieb:
> Genau das!!! Kann das vom watchdog kommen?? Ist der hardwaremäßig
> implementiert?

Dein Prozessor-Datenblatt sollte darüber Auskunft geben.

Aber im Normalfall ist der hardwaremässig implementiert. Muss auch so 
sein, denn der Watchdog muss auch dann noch funktionieren, wenn sich 
dein Programm bzw. der Prozessor haushoch verfranst hat und nur noch vor 
sich hindümpelt.
Dann kommt die möglichst unabhängige Hardware-Einheit "Watchdog" und 
resettet den Prozessor in einen gültigen Zustand.

von Michael (Gast)


Lesenswert?

#include "stm32f4xx.h"
#include "stm32f4xx_rcc.h"
#include "misc.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_spi.h"
#include "stm32f4xx_tim.h"
#include "ADXL345.h"


Da wären doch einige gute Kandidaten dabei. Z.B die RTCC !

von me (Gast)


Lesenswert?

pete schrieb:
> Der Chip hängt aber nirgendwo sondern erricht nur immer wieder
> den ersten Breakepiont..

Und was sagt der Debugger über den Weg dort hin?
Ein Break Point vor der while-Schleife könnte verraten, ob er dazu über 
"Los" geht.

von Peter P. (peter---p)


Lesenswert?

Es war/ist der Watchdog. Wenn ich diesen so verstelle dass der Prescaler 
der Reload größer sind, denn blinkt es..  Anscheinend gibt es aber keine 
Möglichkeit den IWDG ganz abzustellen, wenn er einmal aktiv ist... Das 
Board ist also "hin"

von Michael (Gast)


Lesenswert?

Peter Pan schrieb:
> Anscheinend gibt es aber keine Möglichkeit den IWDG ganz abzustellen
Du könntest aber dein Gesamt-Delay in handliche Brocken aufteilen und 
zwischendurch das arme Tier ein bisschen streicheln.
Besser wäre natürlich, wenn du die unsäglichen Delays ganz rausschmeißt 
und durch eine vernünftige Timersteuerung ersetzt. Spätestens wenn 
wesentlich mehr als eine LED blinken soll, brauchst du das sowieso.

von pete (Gast)


Lesenswert?

Michael schrieb:
> Peter Pan schrieb:
>> Anscheinend gibt es aber keine Möglichkeit den IWDG ganz abzustellen
> Du könntest aber dein Gesamt-Delay in handliche Brocken aufteilen und
> zwischendurch das arme Tier ein bisschen streicheln.
> Besser wäre natürlich, wenn du die unsäglichen Delays ganz rausschmeißt
> und durch eine vernünftige Timersteuerung ersetzt. Spätestens wenn
> wesentlich mehr als eine LED blinken soll, brauchst du das sowieso.

Das weiß ich... Das Blinkn ist nur ein Testprogramm um den Bootloader zu 
testen, den ich gerade schreibe... Ich wollte halt ein Program, bei dem 
ich nach dem flashen gleich sehe obs geht....

von Dr. Sommer (Gast)


Lesenswert?

Peter Pan schrieb:
> Anscheinend gibt es aber keine
> Möglichkeit den IWDG ganz abzustellen, wenn er einmal aktiv ist...
Wieso das? Die Option Bytes kann man beliebig umprogrammieren (Seite 71 
im RM), wenn du nicht gerade die Lockbits gesetzt hast.

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.