Forum: Mikrocontroller und Digitale Elektronik Funktionsaufruf ARM


von Jan (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

ich bin mit meinem Programm soweit zufrieden. Es ist halt sehr 
unprofessionell. Aber was will man von einem Anfänger erwarten.
Ich frage mich nur, warum ich die delayLoop nicht nur einmal abarbeiten 
kann, sondern ich immer darin hängen bleibe. Ich habe die fkt doch nur 
einmal aufgerufen und nach ablauf der ca. 10sek sollte der 
Programmablauf doch ungehindert weitergehen. Aber es geht eben nicht 
weiter. Kann mir einer ein einfaches Bsp. für eine andere möglichkeit 
eines 30sek timers geben? Ich habe mich durch zig Beispiele gewühlt, 
aber nichts hinbekommen.

von holger (Gast)


Lesenswert?

Mein Gott nimm einen Timer;)

von Jan (Gast)


Lesenswert?

wollt ich, aber ich kam einfach nicht klar. wie gesagt, absolut blutiger 
anfänger :-(

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

Was soll denn dein Programm machen ? Kaffee kochen ?

So ein Timer (der STM32 hat einige) läßt sich auch im Polling betreiben,
30 Sekunden einstellen und while .

Hast du den STM32F103 ?

von Jan (Gast)


Lesenswert?

Hast du den STM32F103 ?
ja, hab ich

So ein Timer (der STM32 hat einige) läßt sich auch im Polling betreiben,
30 Sekunden einstellen und while .
sorry, aber wie geht das? tut mir leid, wenn das blöde fragen sind.

von Turbo J (Gast)


Lesenswert?

Wenn deine Core Taktfrequenz konstant ist und nicht viel Zeit in 
Intterupts verbraten wird, ist diese Art der Delay-Loop schon zu 
gebrauchen.

Aaber: Man muß die kalibieren! Eine oberflächliche Rechnung ergibt bei 
Deinem Startwert für delayCount über 1 Minute Ausführungszeit - und die 
ist eventuell auch noch abhängig von der gewählten Compiler-Optimierung.

Die Timer-Methode ist meistens genauer - da dann die Zeit in Interrupts 
berücksichtigt wird - und auch relativ einfach zu realisieren. Man muss 
dann allerdings aufpassen dass die delayLoop() Funktion nur im 
Hauptprogramm und nicht in Interrupts verwendet wird.

Übrigens gibt es auch noch die Methode, mit einen Timer eine 
(Uhr-)"Zeit" Variable hochzählen zu lassen, sich die aktuelle Zeit als 
Startzeit zu merken und dann solange zu warten bis aktuellee Zeit minus 
der Startzeit die gewünschte Wartezeit ergibt.

von Gebhard R. (Firma: Raich Gerätebau & Entwicklung) (geb)


Lesenswert?

Es ist nicht ungefährlich, die Pins eines Ports über das ODR zu setzen. 
Das ergibt, wenn Interrupts im Spiel sind, grausame Effekte => Portpin 
falsch gesetzt. Besser ist es über die BSRR zu setzen wie zb:

#define ASW1_ON  GPIOE->BSRR = 0x00000001
#define ASW1_OFF  GPIOE->BSRR = 0x00010000

Grüsse

von (prx) A. K. (prx)


Lesenswert?

Turbo J schrieb:

> Aaber: Man muß die kalibieren! Eine oberflächliche Rechnung ergibt bei
> Deinem Startwert für delayCount über 1 Minute Ausführungszeit - und die
> ist eventuell auch noch abhängig von der gewählten Compiler-Optimierung.

Und ausserdem davon, ob der Code in RAM und ROM liegt, abhängig von der 
taktfrequenzabhängigen Anzahl Waitstates im ROM und davon, an welcher 
Stelle im Fetchbuffer das Label der Schleife liegt, ... Ist daher nicht 
einmal gewährleistet, das der exakt gleiche Code an zwei Stellen im 
Programm die gleiche Wartezeit implementiert oder dass der einmal 
kalibirierte Code bei Neucompilation zum gleichen Ergebnis führt.

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.