Forum: Mikrocontroller und Digitale Elektronik Multiplikation von Single-Zahle [BASCOM]


von Bo G. (boge-ro)


Angehängte Dateien:

Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Bo G. (boge-ro)


Lesenswert?

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

von MWS (Gast)


Lesenswert?

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.

von Bo G. (boge-ro)


Lesenswert?

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
Noch kein Account? Hier anmelden.