- LiFePO4 Speicher Test         
Seite 4 von 5 ErsteErste ... 2345 LetzteLetzte
Ergebnis 31 bis 40 von 46

Thema: Zahl in Ziffern zerlegen

  1. #31
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    Anzeige

    Praxistest und DIY Projekte
    Zitat Zitat von Bruno Pisarek
    Hallo Hanni & Sebastian,

    ich finde die Subtraktionsmethode wunderbar!
    Im mikrocontroller.net hat ja z.B. der Peter Dannegger in diesem Thread LINK zwei schöne Beispiele in Assembler gegeben.
    Einmal für 32Bit und einmal für 16Bit - prima.

    Ich habe versucht, diese Beispiele in Bascom mit dem Inline-Assembler in bestehende Programme einzufügen. Leider meckert der Compiler an mehreren Stellen.

    Weil es in Bascom keine BIN2BCD Wandlung gibt, hab ich dann ein wenig mit Schleifen-Konstrukten gearbeitet. Geht auch wunderbar, aber bläht leider den Code im Endeffekt noch mehr auf, also die Modulo-Lösung.

    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.

  2. #32
    Erfahrener Benutzer Fleißiges Mitglied Avatar von DIYLAB
    Registriert seit
    31.10.2004
    Ort
    Berlin
    Beiträge
    156
    Zitat Zitat von Hanni
    vom Prinzip her sollte es aber mit inlineassembler recht einfach zu realisieren sein.
    Moin Hanni,

    ja - dachte ich auch.
    Die Hürden beginnen allerdings schon bei reservierten Worten des Compilers. Und High/low bei den Subtraktionsbefehlen gehören auch dazu. Tolle Sache das

    subi a0, low(10000)
    sbci a1, high(10000)

    Viele Grüße,
    Bruno

  3. #33
    Erfahrener Benutzer Fleißiges Mitglied Avatar von DIYLAB
    Registriert seit
    31.10.2004
    Ort
    Berlin
    Beiträge
    156
    Moin Hanni,

    peinlich peinlich!
    Wollte mich gerade auf die Libs stürzen und selber Hand anlegen..
    Da guck ich doch ins Lib-Verzeichnis und was sehen meine verquollenen Augen da? Eine BIN2BCD16 Lib

    Daaa muss ich doch glatt mal gucken..

    Viele Grüße,
    Bruno

  4. #34
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    Tja Dinge gibts

    Grüße,
    Hanni.

  5. #35
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    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
    Software is like s e x: its better when its free.
    Linus Torvald

  6. #36
    Erfahrener Benutzer Fleißiges Mitglied Avatar von DIYLAB
    Registriert seit
    31.10.2004
    Ort
    Berlin
    Beiträge
    156
    Zitat Zitat von izaseba
    Wenn Du möchtest kann ich in meiner Codesammlung was passendes rauskopieren (das wäre dann zwar Assembler, aber vielleicht hilfreich)
    Moin Sebastian,

    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

  7. #37
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    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:
    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
    Kurz erklärt:
    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:
    Code:
    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
    Da die einer nicht mehr abgezogen werden müßen reicht ein
    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
    Software is like s e x: its better when its free.
    Linus Torvald

  8. #38
    Erfahrener Benutzer Fleißiges Mitglied Avatar von DIYLAB
    Registriert seit
    31.10.2004
    Ort
    Berlin
    Beiträge
    156
    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

  9. #39
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    kenn ich doch irgendwo her?
    Ja ganau, die Quelle hab ich oben schon genannt, Gerds Beispiele sind sehr einfach und verständlich geschrieben

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  10. #40
    Neuer Benutzer Öfters hier
    Registriert seit
    04.08.2006
    Beiträge
    21
    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

Seite 4 von 5 ErsteErste ... 2345 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad