Antworten

Der Beitrag verursachte die folgenden Fehler, die behoben werden müssen:
Achtung: In diesem Thema wurde seit 120 Tagen nichts mehr geschrieben.
Wenn Sie nicht absolut sicher sind, dass Sie hier antworten möchten, starten Sie ein neues Thema.
Einschränkungen: 8 pro Beitrag (8 verbleibend), maximale Gesamtgröße 8,79 MB, maximale Individualgröße 1 MB
Entfernen Sie den Haken der Dateianhänge, die gelöscht werden sollen
Klicken Sie hier oder ziehen Sie Dateien hierher, um sie anzuhängen.
Anhänge und andere Optionen
Tastenkürzel: Alt+S Beitrag schreiben oder Alt+P für Vorschau

Zusammenfassung

Autor picass
 - 26.05.2022, 09:49:44 CEST
Hallo pic18
Als Beispiel: gebraucht wird der Logarythmus von 2,381 zur Basis 10. Mit dem Taschenrechner nur einen Tastendruck entfernt: 0,3770
Für die Berechnung des L hatte ich - wie in einem anderen Fred beschrieben - eine Anleitung gefunden, welche ursprünglich für das händische Berechnen gedacht war. Die ist zwecks des Händischen einfach gehalten und besteht zum einen Teil aus dem Vorausberechnen der L-Werte aller 10 Ganzzahlen (im Bereich von 0 bis 10) mittels Taschenrechner. Zum anderen wird dann etwas interpoliert, und die erreichte Genauigkeit ist überraschend groß, jedenfalls mehr als ausreichend für meine Zwecke.

Die drei Tabellen liegen ja im Programmspeicher. Nur für die noch nicht erstellte Tabelle der Verarbeitung der eingelesenen Temperaturwerte ist vorgesehen, die in das EEprom zu legen. So hatte ich es in dem direkt vergleichbarem Programm für meine Öltemperaturanzeige auch getan und dort klappt es problemlos, weswegen ich diesen Programmteil gerne einfach übernehmen würde.

Der Umgang mit Fließkommazahlen ist etwas, was ich noch nie mit einem PIC zu bearbeiten hatte. Da hatte ich zu einem Trick gegriffen, weiß nicht, ob das so zulässig ist. Weiß nur, dass es im ersten Anlauf funktioniert.

Welchen Programmteil möchtest du denn begutachten? Das Rechen-Gestrampel im Zusammenhang mit dem Logarytmus ist eine recht lange Übung geworden. Die funktioniert zwar, ist aber noch derart ins Unreine geschrieben, dass ich mich geniere, die so raus zu geben. Da würde ich die gerne erst "optisch" optimieren wollen, bevor du aus dem Wundern nicht rauskommst. Im Moment bin ich kurz vor dem Ende der Rechenroutine und würde das auch gerne erst beenden wollen. Zudem steht gleich zwecks Vatertages wieder ein üblicher, langer Spaziergang an. Und dann fahre ich in den nächsten Tagen in Urlaub.
Das soll keine Ausrede sein, um deinem Wunsch nicht nachzukommen, es kneift einfach die Zeit. Falls es doch noch passen sollte, melde ich mich. Falls es nicht mehr passt, dann bitte ich um Geduld bis ggf. nach dem Kurzurlaub. Dann soll ja alles in Betrieb gehen, also die Entfeuchtungs-/Lüftungsanalge installiert werden. Bis zu diesem Zeitpunkt muss natürlich auch das Prog einsatzbereit poliert sein, und spätestens dann...
Siehst du denn noch eine andere Art, den Logarythmus zu berechnen als über das Auslesen von Werten, die per Taschenrechner vorab ermittelt wurden? Wohlgemerkt: ohne eine Hochsprache zu benutzen.
Grüße, picass
Autor pic18
 - 26.05.2022, 09:22:04 CEST
ZitatDa wird für alle Zahlen von 0 bis 10 der L mit dem Taschenrechner berechnet
Sind das nur Integerzahlen von 0-10 oder auch Fließkommazahlen? Wenn Du Fließkommanzahlen hast, wie viele Stellen sind das hinterm Komma? Ist die Frage, ob man den Log. bei größere Auflösung nicht vom Pic ausrechnen läßt. Die Frage ist auch, ob man die Tabelle besser im Flash -Speicher also Programmspeicher ablegt. Da ist wesentlich mehr Platz. Magst Du mal das Prog. hochladen, ich würde es mir gerne anschauen.
Autor picass
 - 25.05.2022, 10:14:36 CEST
@pic18 Weil weder der 8-bit-PIC noch die Assembler-Sprache die direkte Berechnung eines Logarythmus's zulässt, muss halt versucht werden, auf anderen Wegen zum Ziel zu kommen. Eine Möglichkeit - das ist meine genutzte - ist das Erstellen einer Tabelle mit vorausberechneten Werten. Da wird für alle Zahlen von 0 bis 10 der L mit dem Taschenrechner berechnet und die Ergebnisse in der Tabelle aneinander gereiht.

@PICkel Gestern hatte ich ordentlich "in Tabelle gemacht". Nach einer Tabelle mit 8-bit-Werten wurde die von dir zuerst genannte Möglichkeit versucht, und weil das irgendwie zu klappen schien, wurde ganz mutig noch einen Schritt weiter gegangen - weil nämlich insgesamt dreimal je 8-bit-Daten gebraucht werden - und je noch dritte Zeilen eingefügt. Aber das ging in die Hose, obgleich eine orig Vorlage von Microchip für das Verwalten einer 8-bit-Tabelle verwendet wurde. Es gelang mir einfach nicht, die passenden Voreinstellungen zu finden, um das sequentielle Auslesen zu erreichen. Irgendwann hatte ich dann den Kaffee mal wieder auf und habe zu der einfachen Lösung gegriffen, welche du als zweite genannt hattest. Räusper.... immerhin ist mir das gestern Nachmittag noch allein eingefallen, eure Statements - danke dafür - habe ich erst heute morgen gelesen! :)

Es sind also drei Tabellen entstanden, die nacheinander abgearbeitet werden.
Ist klar, ich war mal wieder komplett außer Übung in diesem Tabellen-Themenbereich. Interessant finde ich, dass es quasi drei verschiedene Arten gibt.
- eine ist eigentlich gar keine, jedenfalls kommt man gänzlich ohne spezielle Tabellenbefehle aus. Die Werte werden einfach hintereinander abgelegt mit vorangestellten retlw-Anweisungen, dann der Programmcounter mit dem passenden Wert geladen und wenn dieser Programmteil mit einer call-Anforderung aufgerufen wird, dann gibts beim Rücksprung den gewünschten Wert;
- die übliche Tabelle im Programmteil mit den dafür vorgesehenen Befehlen und dem definierten Tabellenanfang;
- Gleiches wie vor, aber im EEprom
Naja, es klappt nun mit dem Auslesen der gewünschten Werte, aber es ist für mich immer erst ein Wühlen in den Grundlagen. :(
Immerhin kann der PIC nun Logarythmus und das sogar mit Assembler.
Grüße, picass 
Autor PICkel
 - 24.05.2022, 18:31:55 CEST
Abgesehen davon, dass ich so eine Tabelle möglichst immer im EEPROM ablegen würde:

Du hast 2 Möglichkeiten:
- Lege High- und Low- Byte in aufeinanderfolgende Speicherstellen und lese diese sequentiell aus.
Berechne die Leseadresse in 2-Byte-Schritten.

- Lege 2 Tabellen an, eine mit Low- und eine mit High-Bytes.
Nimm die Leseadresse für das Low-Byte. Addiere den Offset zur Adresse des Low-Bytes und lies das High-Byte aus.

Gruß
PICkel 
Autor pic18
 - 24.05.2022, 16:03:32 CEST
kannst Du mal ein Beispiel geben, was Du vorhast. Ich verstehe nicht welche Tabelle Du erstellen möchtest.
Autor picass
 - 24.05.2022, 13:19:39 CEST
Da die 8 bit PICs in ihren Rechenmöglichkeiten hardwaremäßig auf 8 bit beschränkt sind und in Assembler auch nur die 4 Grundrechenarten zur Verfügung stehen, ist z.B. die Berechnung eines Logarythmus zur Basis 10 so nicht möglich. Also Kunstgriffe! Dazu könnte gehören, die vorausberechneten Werte der ganzzahligen Logarithmen (Basis 10) in einer Tabelle abzulegen. Eine Tabelle mit 8 bit Werten ist vergleichsweise einfach und ein Beispiel - auch wenn das ohne Anpassungen nicht funktioniert - ist bei Sprut zu bewundern. Aber was ist mit 16 bit Werten, die zwecks ausreichender Genauigkeit benötigt werden? Wie bekommt man die mithilfe dieser 8 bit Tabellen bewältigt? Natürlich könnte man die 16 bit Werte auch im EEprom ablegen, möglicherweise gehts nicht anders.

Aber ich wäre doch neugierig, ob das auch mit 8 bit Tabellen möglich wäre, zumal es zum Auslesen der Tabelle ja auch einen fertigen Hardware-Befehl gibt und das Auslesen dieser Tabelle um einiges einfacher ist als das Auslesen eines EEproms. Wären zwei solcher Tabellen drin? Im Moment schecke ich das nicht, also noch nicht.
Über Anregungen würde ich mich freuen.
Grüße, picass

Similar topics (5)