Hallo!


Vielen Dank für eure Antworten.

Zitat Zitat von dl1akp Beitrag anzeigen
Is doch Wurscht...

Passt rein in den Controller und funktioniert...
Also wozu noch Lebenszeit vernichten und abändern??
Schaltung aufbauen, Glücklichsein und ab zum nächsten Projekt.
Diese Einstellung will ich nicht teilen. Ich möchte nicht nur ein Projekt nach dem anderen machen, sondern ich möchte auch meine Programmierkenntnisse verbessern sowie auch verstehen, warum und wieso etwas funktioniert, gut funktioniert, schlecht funktioniert oder überhaupt nicht funktioniert. Für mich gehört dies genauso zum Prozess des Lernens. Es bedeutet einen Ansporn, gute und ressourcensparende Programme zu entwicklen und ich gebe mich nicht mit einem "funktioniert, ab in die Schublade" zufrieden.

Zitat Zitat von Kampi Beitrag anzeigen
Und für Modus = 1 ersetzt du die ganzen If-Abfragen ebenfalls durch Select-Case. Ob es das Programm nun wirklich kleiner macht weiß ich nicht aber auf jedenfall wird es übersichtlicher.
Den Rest wüsste ich nun nicht wie man den noch optimieren kann. Das Hauptprogramm beinhaltet nicht soviel Code, wobei ich die ISR vom Timer noch schlanker machen würde. Dies machst du aus dem Grund, weil man eine ISR möglichst kurz halten sollte (gut in deinem Programm macht das nun nichts aus, weil du nur eine ISR hast). [...]
Ob das Ersetzen der If-Abfragen durch Select-Case Flash spart, werde ich sofort testen. Aber eines stimmt mit Sicherheit, es macht den Code übersichtlicher. Danke für den Hinweis!

Zitat Zitat von Kampi Beitrag anzeigen
Weil wenn du mehrere Interruptquellen in einem Programm hast können eventuell Interrupts verschluckt werden, weil deine ISRs zu lang sind.
Deswegen mach ich das immer so das ich in den ISRs (wenn möglich) nur ein Bit setze, weil das schön schnell geht.
Wenn du in ISRs sowas wie "Print" Befehle o.ä. reinknallst kann es gut sein, dass der Controller beim ausführen der ISR einen anderen Interrupt ignoriert, weil so ein "Print" Befehl richtig viel Zeit braucht.
Ich dachte, der Controller speichert Interrupts ab und führt sie direkt im Anschluss aus, wenn er noch in der Abarbeitung eines Interrupts steckt?

Zitat Zitat von for_ro Beitrag anzeigen
Hallo Thomas,
Ich würde das auch so sehen, dass wenn es funktioniert es doch ok ist.
Wenn du beim nächsten Mal etwas verbessern möchtest, dann würde ich das gar nicht mal so sehr in deinen IF-Abfragen sehen, obwohl die Variante von Kampi sicherlich besser zu lesen ist.
Vielmehr würde ich die SoftPWM mal überdenken.
Dein µC läuft mit 9,6MHz, dein Timer ist 8-bit, läuft also 9.600.000 / 256 = 37500 mal pro Sekunde über. Das ist viel mehr als nötig. Es führt dazu, dass dein µC fast nichts anderes mehr tut, als andauernd die ISR aufzurufen. Hätte er jetzt noch andere Aufgaben, würde dies sicherlich schiefgehen.
Ich bin sicher, dass du für den Timer einen Prescaler von 8 oder 64 angeben könntest, ohne die Funktion zu verschlechtern. Dann müsstest du allerdings auch den Div-Wert von 10000 entsprechend auf 1250 bzw. 160 ändern.
Damit würde dein µC auf einen Schlag nur noch etwa 1% seiner Leistung in die PWM stecken.
Vielleicht probierst du es mal aus.
Eine interessante Idee. Das werde ich versuchen. Danke!

Zitat Zitat von Searcher Beitrag anzeigen
Es gibt eine ISR und von der ISR wird nochmal ein Unterprogramm aufgerufen. Nach der Berechnung von dieser Seite: http://halvar.at/elektronik/kleiner_...swstack_frame/ oder auch nach der englischen mcs Seite wäre der $hwstack bei Dir viel zu klein bemessen.
Also bei mir reicht der Stack aus, aber ich werde trotzdem den Sprung von der ISR in die Sub ändern. Danke für den Hinweis!