Forum: Mikrocontroller und Digitale Elektronik STM32F4: Debugmode: Unterschiede Stepbystep und Run


von Daniel V. (voda) Benutzerseite


Lesenswert?

Guten Abend liebes Forum,

Keil verhält sich im Debugmodus unterschiedlich. Führe ich mein Programm 
Step by Step aus, funktioniert es wie es soll, lass ich es normal 
laufen, passiert gar nichts.

Das Programm liest über SPI den optischen Sensor ADNS3090 das Register 
0x00 (ADNS_3090_PRODUCT_ID) aus. Wenn die SPI-Schnittstelle richtig 
arbeitet (was sie tut) bekomme ich den Wert 0x07 zurück. Dieses frage 
ich nun über eine if-Anweisung ab:

adns3090.c:
1
void adns3090_STATUS (void)
2
{
3
 ADNS3090_NPD_ON;  /*Schalte Control_LED an*/
4
 ADNS3090_NSS_LOW; /*Chip-Select auf LOW*/
5
  status_result = adns3090_Read(SPI2, ADNS3090_PRODUCT_ID); 
6
 ADNS3090_NSS_HIGH; /*Chip-Select auf HIGH*/
7
  
8
  if (status_result == 0x07)
9
  {
10
    DEBUG_LED_ON;
11
  }
12
delay_ns(500); 
13
}

main.c
1
int main (void)
2
{
3
  startUp(); /*Alles was der uC braucht*/     
4
  adns3090_STARTUP(); /*GPIO, RCC, SPI für den Betrieb des ADNS3090*/
5
  adns3090_STATUS();  /*Prüfe den Status*/
6
7
  while(1)
8
    {
9
       /*hier kommt die FIFO für die Bilddaten hin*/      
10
    }
11
}

Wenn ich dieses Programm Step-by-Step durchlaufe funktioniert alles 
wunderbar, in der Variable status_result steht 0x07 und die Debug-LED 
geht an. Dies trifft ebenfalls auch zu, wenn ich diese Funktion in die 
while-Schleife stecke.

Lass ich es so laufen (mit F5) steht in der Variable 0x00 und die LED 
geht nicht an.

Wie kann das sein?

Vielen Dank im voraus und Gruß
Daniel

: Bearbeitet durch User
von g457 (Gast)


Lesenswert?

> Wie kann das sein?

Timing.

von Daniel V. (voda) Benutzerseite


Lesenswert?

g457 schrieb:
> Timing.

d.h.?

Hatte auch mal bis zu 5 Sekunden gewartet, also 5000 ms:
1
void adns3090_STATUS (void)
2
{
3
 ADNS3090_NPD_ON;  /*Schalte Control_LED an*/
4
 ADNS3090_NSS_LOW; /*Chip-Select auf LOW*/
5
  status_result = adns3090_Read(SPI2, ADNS3090_PRODUCT_ID); 
6
 ADNS3090_NSS_HIGH; /*Chip-Select auf HIGH*/
7
  delay_nms(5000); /*Warte 5s*/
8
9
  if (status_result == 0x07)
10
  {
11
    DEBUG_LED_ON;
12
  }
13
14
}

: Bearbeitet durch User
von g457 (Gast)


Lesenswert?

> Hatte auch mal bis zu 5 Sekunden gewartet,

Laut Datenplatt an der falschen Stelle.

von Daniel V. (voda) Benutzerseite


Lesenswert?

Gelöst!

Hier der Fix:
1
void adns3090_STATUS (void)
2
{
3
 ADNS3090_NPD_ON;
4
 delay_nms(500); /*warte 500 ms*/
5
 ADNS3090_NSS_LOW;
6
   status_result = adns3090_Read(SPI2, ADNS3090_PRODUCT_ID);
7
 ADNS3090_NSS_HIGH;
8
9
  if (status_result == 0x07)
10
  {
11
   DEBUG_LED_ON;
12
  }
13
}

Gruß
Daniel

: Bearbeitet durch User
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.