Hallo liebe Forum Gemeinde, ich programmiere gerade eine asynchrones System auf einem AVR Mikrocontroller. In meinem Wissen sind einige offenen Fragen und selber komme ich nicht auf die richtige Lösung. Programmablauf: Timer0 macht einen Interrupt bei 312µs und setzt ein Flagbit für die ADC Messung. Im Main Programm frage ich das Flagbit ab und mache die ADC Messung, danach wird der Kanal erhoeht und das Flagbit geloescht. Nach 8*312µs setzt mir die Interrupt Routine ein anderes Flagbit zur Regelung meiner PWM. Die Regelung wird in einer Funktion ausgeführt, wenn das Flagbit gesetzt ist, danach erhoehe ich den Kanal wieder und loesche das Flagbit. In der ISR setze ich ein weiteres Flagbit, wenn ich die Zeit von 125ms erreicht habe. In dieser Funktion messe ich eine Spannung und erhoehe den Kanalzaehler wieder und loesche das Flagbit. Mein Problem: Ich muesste einige berechnen durchführen und noch die serielle Schnittstelle abfragen bzw. mein FIFO, aber ganz ehrlich gesagt weiss ich nicht wann und wo ich diese Berechnungen machen soll. Soll ich die Berechnungen und FIFO Buffer Abfrage in der Main machen oder sollte ich die Berechnungen in meinen Funktionen machen? Mir kommt es momentan so vor das die Berechnungen zulange dauern und ich einige Flags verliere bzw. zu spaet ab arbeite. Torben
Hallo Torben es kommt darauf an, wieviel Rechenzeit deine "Berechnungen" beanspruchen. Am Einfachsten ist es, mit einem flotten Quarz die maximale Rechenleistung aus dem uC herauszuquetschen. Wenn das nicht reicht, kann man noch ein bisschen optimieren und wenn das auch nicht reicht, gibts eben ein paar features nicht oder es muss ein anderer uC rein, der das dann packt. Bestimmte Funktionen macht der uC ja hardwaremässeig, wie z.B. A/D-Wandeln oder mit UART empfangen. Ob du was im hauptprogramm erledigst oder in der ISR hat damit nichts zu tun. Gerhard
Das auslesen des ADC und neu starten sollte kaum Zeit kosten, würde ich daher direkt im Timerinterrupt machen. Denn 312µs sind für die Main-Loop schon heftig als maximale Durchlaufzeit. Peter
ich schließe mich der meinung von gerhard an. erstmal die maximale leistung des uCs nutzen und schauen ob es langt. ansonsten kann ich dir nur empfehlen : mach alle isrs so kurz wie möglich, mache alle deine berechnung von der main aus, programmiere deine berechnungen und handlers (für uart,adc,steuerung) in "scheiben" und vor allem überlege dir eine gute steuerung die schnell genug reagieren kann (im zweifelsfalle für jeden bereich einen fifo-anlegen, sprich : fifo für den uart, fifo für deine adc werte fifo für deine steuerung) mit der salami-taktik fährt man bei quasi-parallelen aufgaben immer am besten ... so ich hoffe ich habe es richtig verstanden und keinen quark geschrieben ... gruß rene
Danke erstmal für eure Tipps. @Peda: Ich hatte vergessen zuerwähnen das der AD Wandler extern am SPI Bus angeschlossen ist, somit faellt es wohl flach die Messung in der ISR zumachen oder soll ich die Interrupts in der ISR freigeben (nasted interrupts) ? Die Salami Taktik benutze ich im Moment. Ich komme langsam nur mit dem Programmablauf in schleudern, weil jetzt für ein Kanal gewartet werden muss und eine Delayschleife oder eine Whileschleife nicht benutzt werden darf. Ich hab mir die Scheduler Version von Peter Danneger angeschaut und verkleinert übernommen bzw. das Konzept übernommen. Ich bin für jeden weiteren Rat dankbar. Danke und Gruß, Torben
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.