mikrocontroller.net

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


Autor: Konrad (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Bernd Schmidt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Konrad (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Hans Kneissl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Konrad (Gast)
Datum:

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

Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Konrad (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hans Kneissl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bernd Schmidt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.