Bascom: Timer vs single=datenmüll

Gast #90509
Lesenswert?

hallo leute, nach dem ich nun seit tagen immer mit ärgerlichen problemen

zwecks division von zahlen rumschlagen mußte, habe ich mal einen test
gemacht.

mein atmega16 bord mit 20x4 lcd.
ergebnis: um so schneller der timer läuft,um so schlimmer gehts den
single-variablen
bsp (code stark vereinfacht)
dim x as word
dim s1 as single
dim s2 as single
dim s3 as single
dim s4 as single

setze counter auf 0,001sek

if x=500 then 'alle 500ms soll er anzeigen
 x=0          ' wieder auf 0, für die nächsten 500ms
 Locate 1,1
 Lcd S1
 Locate 2,1
 Lcd S2
 Locate 3,1
 Lcd S3
 Locate 4,1
 Lcd S4
 end if

counter: ' alle 0,001 sek wird der wert um 1 erhöht
incr x
incr s1, s2,s3,s4


wer jetzt denkt, daß nun alle 500ms die 4 zahlen jeweils um 500 erhöht
angezeigt werden, der irrt. ca 4 sek nach start sieht das lcd wie von
viren befallen aus, nur wirre zeichen. ändere ich in der variablen
deklaration single in long um, klappt alles wie gewollt. schönes
syncrones zahlenballett

setze ich den timer auf 0,01 (also nur noch ein zehntel so schnell)
dann kann ich sehen, daß die single-zahlen hochgezählt werden. wenn
auch nicht als ganze zahlen, sondern mit teilweise 2-5werten nach dem
komma.
nach einiger zeit sehe ich, daß besonders bei den zeilen 2-4 die zahlen
 plötzlich 8 stellig werden und wie wild in ihrer wertigkeit hin und
herspringen.
nur die erste zeile/zahl macht schön normal weiter.

das problem das ich habe, daß ich verschiedene berechnungen durchführe.
und dabei sind single-zahlen  ein muß, da ich kommastellen brauche.
diese ergebnisse fangen aber nach einiger zeit an "rumzuspinnen" und
haben nicht den wert, den sie haben müßten.

dim a as single
dim b as word
b=10
a= b/500
macht schon mal probleme



woran kann das liegen?
wenn ich mit ganzen zahlen arbeite, geht es alles prima. nur ich hab j
a dann keine genauigkeit mehr

wer kann mir da helfen?
Gast #90510
Lesenswert?

Genau da hat Bascom so seine Macken.


1. Der Typwechsel macht schon mal Probleme.
Abstellen lässt sich das nur durch verwenden gleicher Var.Typen.
Also statt "incr" eine Single-Variable mit Inhalt 1 addieren.

2. Stackprobleme. Kann man ausprobieren indem die Werte erhöht werden.

3. Zeitprobleme im Interrupt. Single Var sind nicht die schnellsten.
Wie sieht es aus wenn der Interrupt am Anfang der Interruptroutine
gesperrt wird ?

Bernd
Gast #90511
Lesenswert?

das mit dem sperren habe ich noch nicht probiert.

wie ist das mit dem stack, da kann man doch bei bascom die werte
erhöhen bzw vermindern. kennst du dich damit aus?

wie sieht das mit variablenzuweisungen aus?

dim x as single
dim y as byte

x=100
y=x

wertebereich stimmt, aber kommt auch auf dauer das richtige raus?
Gast #90512
Lesenswert?

Hallo Konrad,

wenn du in einer Interrupt-Routine mit Sinlge rechnets, mußt du
die Register R12 bis R15 von Hand retten und von Hand wieder
zurückschreiben, dann funktionierts.

Push R12                         ' save registers
Push R13
Push R14
Push R15

Pop R15                         ' restore registers
Pop R14
Pop R13
Pop R12



Gruß Hans
Gast #90514
Lesenswert?

Bist du dir überhaupt bewusst, was Fließkommazahlen für einen
Rechenaufwand erfordern? Mach das zum Spaß mal in Assembler.

Irgendwie tut das weh, zu sehen, wie verschwenderisch mit den
Ressourcen umgegangen wird, ein AVR ist doch kein WINDOWS-PC.
Gast #90516
Lesenswert?

Hallo Konrad,

hier ein Auszug aus der Bascom-Hilfe, wie man mit Single in Interupts
umgeht. Ich hatte den selben Fehler wie du ihn hier beschreibst. Nach
einfügen dieser 8 Zeilen war meine Display-Ausgabe vollkommen in
Ordnung

R12 – R15 are not saved. When you use floating point math in the
ISR(not recommended) you must save and restore R12-R15 yourself in the
ISR.
My_Isr:
Push R12  ‘ save registers
Push R13
Push R14
Push R15
Single = single + 1 ‘ we use FP
Pop R15   ‘ restore registers
Pop  R14
Pop R13
Pop R12
RETURN

Gruß Hans

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren