Forum: Mikrocontroller und Digitale Elektronik Bascom: Timer vs single=datenmüll


von Konrad (Gast)


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?

von Bernd Schmidt (Gast)


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

von Konrad (Gast)


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?

von Hans Kneissl (Gast)


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

von Konrad (Gast)


Lesenswert?

okay, während der interruptroutine? asm is für mich neu....

von Felix (Gast)


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.

von Konrad (Gast)


Lesenswert?

naja,mag ja alles sein,aber wie soll ich sonst zb
prozent/durchschnittsberechnungen auf die 2te teilweise 3te kommastelle
genau machen?

bin für überlegungen jeder art offen

von Hans Kneissl (Gast)


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

von Bernd Schmidt (Gast)


Lesenswert?

@Konrad
Die Werte z.B. mit 1000 Multiplizieren und ohne Komma Rechnen. Bei der
Ausgabe einfach das Komma an die richtige Stelle einbauen.

Bernd

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.