Werbung
Zitat von Bruno Pisarek
Hehe, Peter Dannegger steht nunmal für sehr effizienten Code. Such in der Codesammlung von mikrocontroller.net mal nach "Tasten entprellen - bullet proof" (3. oder 4. Seite) dann weisst du was ich meine.
Um den größeren Code zu erklären müsste man das sehen, was Bascom aus deinen Zeilen macht (also den Assembler Output). Ich tippe aber jetzt schon mal drauf, das a) so einige überflüssiger Vergleiche und b) so einige überflüssige Speicheroperationen darin versteckt sein werden.
Ansonsten könnte es meiner Meinung nach übrigens eine gute Idee sein, derartige Funktionen via Libs selbst zu erstellen und ggf hier zu veröffentlichen.
Wie man allerdings Libs in Bascom erstellt, kann ich dir nicht verraten (ich progge nunmal lieber etwas Hardwarenäher).
PS: Respekt, das du dir die Arbeit gemacht hast diesen Gedankenanstoß nachzuvollziehen.
Nachtrag:
vom Prinzip her sollte es aber mit inlineassembler recht einfach zu realisieren sein.
1. die Register die du verwenden willst auf den Stack sichern.
2. Die Ausgangswerte in diese laden
3. Peter Dannegger Methode anwenden (muss nur etwas angepasst werden)
4. die Ergebnisse ins RAM schreiben
5. die Register wiederherstellen
6. fertig.
Vielleicht hilft dir ja das etwas weiter.
Grüße,
da Hanni.
Hallo,
Ja Peter Danneggers Programme zu verstehen ist wirklich ein Ding, ich bin jedenfalls zu doof dafür![]()
Aber so in etwa wie Dein Code Bruno hab ich mir das schon vorgestellt, warum das dann so groß wird weiß ich auch nicht.
Wenn Du möchtest kann ich in meiner Codesammlung was passendes rauskopieren (das wäre dann zwar Assembler, aber vielleicht hilfreich)
viel Erfolg noch Sebastian
Linus TorvaldSoftware is like s e x: its better when its free.
Moin Sebastian,Zitat von izaseba
das wäre prima!! Bitte mach mal.
Ich habe die Bascom Lib wieder verworfen, die ist nicht wirklich gut.
Dann habe ich Peters Routine benutzt, die Übergabe von Bascom und wieder zurück eingepflegt, aber der Compiler kann mit den High und Low´s nichts anfangen - unglaublich. FastAVR compiliert das Assemblerstück anstandslos - Bascom nicht.
Dann habe ich eine andere Routine ausprobiert - ging.
Aber... dort liegt nur das "einer"-Segment einzeln in einem Register. Die restlichen Segmente als gepacktes BCD in den Registern. Also 2x4 Bit pro Register. Konnte ich dann auch nicht weiterverarbeiten mit meinen Kenntnissen <Haare rauf>.
Viele Grüße,
Bruno
Ok, es ist zum Teil von Gerd Schmidt http://www.avr-asm-tutorial.net/index.html abgekupfert, habe nur etwas für mich angepasst, aber egal.
Alles dreht sich um Folgende Funktion:
Kurz erklärt:Code:Bin2ToDigit: clr rmp ; Zähler auf Null Bin2ToDigita: cp rBin1H,rBin2H ; Vergleiche MSBs miteinander brcs Bin2ToDigitc ; MSB Binärzahl kleiner, fertig brne Bin2ToDigitb ; MSB Binärzahl größer, subtrahiere cp rBin1L,rBin2L ; MSB gleich, vergleiche LSBs brcs Bin2ToDigitc ; LSB Binärzahl kleiner, fertig Bin2ToDigitb: sub rBin1L,rBin2L ; Subtrahiere LSB Dezimalzahl sbc rBin1H,rBin2H ; Subtrahiere Carry und MSB inc rmp ; Erhöhe den Zähler rjmp Bin2ToDigita ; Weiter vergleichen/subtrahieren Bin2ToDigitc: st z+,rmp ; Speichere das Ergebnis und erhöhe Zeiger ret ; zurück
Ich speichere das Ergebnis in SRAM, der Z Zeiger muß auf die erste Speicherzelle eingestellt werden.
In rBin1H und rBin1L liegt meine Zahl die Umgewandelt werden soll.
Jetzt ruft man die Funktion 3 Mal auf, aber bevor man sie aufruft muß man in die Register rBin2H und rBin2L die Zahl laden, die substrahiert werden soll, etwa so:
Da die einer nicht mehr abgezogen werden müßen reicht einCode:ldi rBin2H,HIGH(1000) ldi rBin2L,LOW(1000) rcall Bin2ToDigit ldi rBin2H,HIGH(100) ldi rBin2L,LOW(100) rcall Bin2ToDigit ldi rBin2H,HIGH(10) ldi rBin2L,LOW(10) rcall Bin2ToDigit
st z,rBin1L aus um die in Sram zu kriegen.
Ich hoffe, es ist verständlich und irgendwie nützlich.
Bin mal gespannt was Ihr dazu sagt .
Gruß Sebastian
Linus TorvaldSoftware is like s e x: its better when its free.
Hi Sebastian,
kenn ich doch irgendwo her? -> LINK
Sehr nützlich das ASM-Tut. Aber mir raucht Heute der Kopf![]()
Ich seh mir das Morgen mal genauer an.
Vielen Dank Sebastian!
Gut´s Nächtle,
Bruno
Danke für diesen Tip.
Heute stand ich vor dem selben Problem.
Ich habe die sehr elegante Lösung von Linux_80 verwendet.
Funktioniert wunderbar.
Noch ein Mal: Vielen herzlichen Dank!
Gruss
Ali
Lesezeichen