Guten Morgen µC-Profis, ich habe eine Verständnisfrage zum Programmablauf von C-Programmen: Ich habe eine Anwendung programmiert, in der von einem µC ein Messvorgang gesteuert wird. Dieser Programmteil dauert ca. 10s. Wie programmiert man es, dass parallel zu dieser Anwendung noch eine LED blinkt? Danke Helmut
das sind ein wenig infos. Warum dauert das 10s. Wartest du die ganze Zeit oder laufen da so viele Berechnungen ab. Läuft das Programm nun auf einen µC oder auf einem PC? Welchen µC hast du, wenn er ein Timer oder PWM hat sollte sich damit die LED fast ohne C zum blinken bringen lassen.
Mit den wenigen Infos fällt mir nur der Timer ein. http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Die_Timer.2FCounter_des_AVR http://www.mikrocontroller.net/articles/AVR-Tutorial:_Timer
OK. Mehr Infos: Ich verwende einen ATmega644. Das dauert so lange, weil ich mehrere Warteschleifen eingebunden habe. Es wird nicht viel berechnet, sondern nur Ausgänge geschaltet. Und dabei sollte eben die LED blinken. Diese hängt aber nicht an einem PWM-Ausgang, sondern an PA7.
Entweder Du programmierst das Blinken der LED in die Warteschleifen mit ein (das hat den Vorteil, dass Du siehst dass dein Programm arbeitet) oder du verwendest ein klitzekleines Multitasking Betriebsystem, z.B, AvrX. AvrX wird von mir am Atmega32 eingesetzt, funktioniert ohne Probleme.
Da hilft nicht viel, als vernünftig programmieren lernen. Zum einen lies dir mal das Tutorial hier durch, zum andern lies im Forum und in der Codesammlung ein wenig rum, und kupfere dir Ideen ab, wie man mehrere Sachen gleichzeitig machen kann. In Kürze: Es ist sehr schlecht, wenn dein Programmablauf nur "geradeaus" geht und dort länger wartet. Mach dir eine Hauptschleife und einen Timerinterrupt. Der Timer steuert sozusagen deinen ganzen Programmablauf, indem kurze Sachen dort direkt ausgeführt werden und alles was länger dauert durch ein im Interrupt gesetztes Flag dann in der Hauptschleife ausgeführt wird. Dann ist es kein Problem, jede Menge Sachen quasi "parallel" ablaufen zu lassen. Matthias
na dann: * PA7 auf Ausgang schalten * Beliebigen Timer aufziehen, Ablaufzeit = Hälfte der gewünschten Blinkperiode, Interrupt bei Ablauf. * Interrupt-Service-Routine (ISR) schreiben: PA7 umschalten und Timer-Interrupt quittieren. Für den Eintrag in die Interrupt-Vektortabelle haben die AVR-Tools üblicherweise C-Makros, soweit ich weiß. * Globale Interrupt-Freigabe geben und Timer laufenlassen.
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.