PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Nicht die beste Lösung, float-Berechnung beim ASURO!



Ronny10
24.05.2006, 11:31
Hallo ASURO's

1. Ich habe versucht meine Internetadresse zu aktualisieren, was total fehlschlug. Danach konnte ich mich unter meinem Nickname "peli51" nicht mehr einloggen und war gezwungen eine Neuanmeldung vorzunehmen. Jetzt bin ich also der "Ronny10".

2. Der von mir programmierte neue ASURO-Boot-Loader (siehe Beitrag Boot Loader) funktioniert auch beim Henk (Arexx) ausgezeichnet und wird als Beta-Version von seiner und der Arexx Homepage downloadbar sein! Für die Leute, die keine Möglichkeit haben sich einen M8 mit dem neuen Boot-Loader zu brennen, überlegen wir uns gerade eine Lösung.

Anregungen für Funktionen die in den Boot Loader aufgenommen werden sollten? Bitte melden!

3. Henk hatte mir mal geschrieben, dass er Probleme mit den 8KB Flash bei größeren Programmen hat. Ich habe mir mal die Initialisierung und Tasterabfrage in der C-Datei "asuro.c" angesehen und musste mich doch sehr wundern. Da wird doch tatsächlich in der Funktion PollSwitch(void) eine Float-Berechnung für die Schalter eingesetzt! Ich habe mal hier im Forum gesucht, aber anscheinend hat sich bisher niemand dieser Sache angenommen (oder gibt es da schon eine andere Lösung?). Falls nicht, werde ich mir mal was anderes einfallen lassen. Diese kleine Zeile:
return((unsigned char) ((( 1024.0/(float)i - 1.0)) * 63.0 + 0.5));
bewirkt nämlich, dass vom GCC-Linker die float-library mit eingebunden wird. Das hat zur Folge, dass ein Programm um 3364Byte also fast 3,5KB grösser wird (nur durch diese eine Zeile). Bei einer Speichergröße des M8 vom 8KB ein unmöglicher Zustand! Wer's nicht glaubt, kann ja mal die Zeile durch ein return(0); ersetzen (nur so zum Test).

Gruß, Peter (Ronny10 ehemals peli51)

waste
24.05.2006, 12:05
Hallo Ronny10,

dafür gibt es schon lange eine Lösung (siehe Codefenster). Die ist auch hier im Forum bestimmt schon genannt worden.

return ((10240000L / (long) i - 10000L) * 63L + 5000L) / 10000;


Gruß Waste

ogni42
24.05.2006, 13:58
Eine Division ließe sich sogar noch sparen, indem man einfach mit 1024 (=2^10) arbeitet. 1024 reicht, da i nur im Intervall ]0; 1024] liegen kann.
(2048 geht natürlich auch, dann ist der Shift eben 11)

((1024L<<10)/(long)i-1024)*63+512)>>10;
((1024L<<11)/(long)i-2048)*63+1024)>>10;

Wenn man jetzt noch die Multiplikation mit 64 statt mit 63 durchführt:
((1024L<<10)/(long)i-1024)<<6+512)>>10;

wird es noch etwas kompakter (und schneller). Der Fehler, der durch die Ersetzung von 63 durch 64 entsteht bleibt immer unter 1.59%, was weniger als die Toleranz der Widerstände ist