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.
wollt ich, aber ich kam einfach nicht klar. wie gesagt, absolut blutiger anfänger :-(
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 ?
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.