Hallo Forum, für einen Druckregler soll der Regelalgorithmus jede Milisekunde aufgerufen werden. Hierbei ist mir aufgefallen, dass es, sobald ich mit Single-Zahlen multipliziere, die Ergebnisse abhängig von der Dauer der Maindurchläufe abhängen. In nachfolgendem Code ändern sich die Ergebnisse sowohl im Terminal-Programm als auch auf dem LCD, wenn ich die Pausenzeit verändere, andere Ausgaben im Code hinzufüge oder die Ausgaben anders formatiere. Wo ist der Angriffspunkt um diesen Fehler in den Griff zu bekommen? ATMega 32 , BASCOM 1.11.9.3 Danke Bodo Geue
Man mag mich engstirnig nennen, aber sollte deine AUsgabe nicht eigentlich 6.0, und zwar ausschliesslich 6.0 (also alle ev. Kommastellen sind 0) sein? Schliesslich machst in der ISR nichts anderes als 2.0 mit 3.0 zu multiplizeren. Das du da nicht 6.0 stehen hast, und zwar in keinem der beiden Fälle, ist für mich schon mal ein Hinweis, dass da noch was ganz anderes faul ist. Auch wenn ich es im Code momentan nicht sehen kann.
Bei sowas zucke ich zusammen Sreg.7 = 0 : S_temp = Single_ergebnis : Sreg.7 = 1 In C gilt die Regel: Das SREG gehört dem Compiler Warum nicht Disable Interrupts S_temp = Single_ergebnis Enable Interrupts Wer weiß, was BASCOM da sonst noch so alles macht, daher wäre es klüger nach seinen Regeln zu spielen.
Hallo Karl Heinz Buchegger, ich habe es gleich mal probiert - es ergibt keine Änderungen. Sogar im Bascom-Simulator werden falsche Ergebnisse ausgespuckt. Dabei unterscheiden sich die Ergebnisse sogar zwischen Terminal-Ausgabe und LCD-Ausgabe. Was mir ausserdem aufgefallen ist: tausche ich die Ausgabezeilen (also Hallo in die erste Zeile, und Ergebnis in die zweite) dann konvergiert mein Ergebnis zu 6.221225472. Meiner Meinung nach eine ganz wichtige Erkentnis die überhaupt nichts nützt ;-) Ich hoffe hier sind noch einige Leute mehr ähnlich engstirnig. Toleranz ist ja was feines, aber bei 2 x 3 möchte ich doch nur 6 akzeptieren. Gruß Bodo Geue
Abgesehen davon daß Singlerechnungen in Timer-ISRs aufgrund der Menge der verbrauchten Takte keine gute Idee sind, so sind für Single die verwendeten Register R12-R15 in der ISR selbst zu sichern. Ist in der Hilfe unter "On Interrupt" zu finden, dort steht auch die Abhilfe dazu.
Hallo MWS, du hast recht - das wars! Ich finde die Bascom-Hilfe an der Stelle zwar leicht widersprüchlich "all used registers will be saved" - aber zu Ende lesen hätte es wohl gebracht. Wenn der Regler und das restliche Programm dann läuft, versuch ich die Berechnungen in Festkommaarithmetik abzuändern. Mal schauen ob das dann gelingt. Besten Dank an alle Bodo Geue
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.