mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 3-stellige Zahl in einzelnen Stellen ausgeben


Autor: A. Arndt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

hat jemand eine Idee, ich möchte gerne eine 3-stellige Zahl z.B. 123 in 
die einzelnen Stellen aufteilen, z.B. a = 1, b=2 und c =3.

Kann man natürlich mit Aufwand aufteilen, aber vielleicht gibt es da 
eine kleine Lösung mit BASCOM.

Gruss
A. Arndt

Autor: bascom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dim A As Byte
A = 65
Lcd A
Lowerline
Lcd Bcd(a)
A = Makebcd(a)
Lcd " " ; A
End

Autor: A. Arndt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

und wo sind die beiden Variablen für 6 und 5 ??

Gruss

Autor: AVR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
leider kann bascom nur zahlen bis 99 wandeln

http://bascom-forum.de/index.php/topic,10.msg462.html#msg462

ich hoffe dieser link kann dir helfen gruss AVR

Autor: Frank Zöllner (frankovic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mit einem cast zur Ganzzahl? Geht sicher auch mit ner Schleife

unsigned char a = (unsigned char) (123 / 100);
unsigned char b = (unsigned char) ((123 - a * 100) / 10);
unsigned char c = (unsigned char) ((123 - a* 100 - b * 10));

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank Zöllner wrote:
> mit einem cast zur Ganzzahl? Geht sicher auch mit ner Schleife
>
> unsigned char a = (unsigned char) (123 / 100);
> unsigned char b = (unsigned char) ((123 - a * 100) / 10);
> unsigned char c = (unsigned char) ((123 - a* 100 - b * 10));

Scherzkeks ;) Es geht um B...B..BASCOM.

Ja! Ich habs gesagt.

PS: Man merkt mal wieder, dass BASCOM Benutzer keine Ahnung haben: BCD 
ist Binary Coded Decimal. Schon klar, dass es nur bis 99 geht, wenn man 
(so wie es BASCOM anscheinend macht) nur 2Nibbles bzw. 1Byte Platz 
hat...

Autor: Troll Blaubär (blaubeer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank Zöllner wrote:
> mit einem cast zur Ganzzahl? Geht sicher auch mit ner Schleife
>
> unsigned char a = (unsigned char) (123 / 100);
> unsigned char b = (unsigned char) ((123 - a * 100) / 10);
> unsigned char c = (unsigned char) ((123 - a* 100 - b * 10));

Das ist aber komisches BASCOM.

In Assembler hätte ich auch helfen können, in C oder BASCOM aber nicht.

MfG, Blaubeer

Autor: A. Arndt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

klar mit 2 weiteren temporären Varibalen mit Minus und mal 100 usw. 
läuft es schon, ich dachte, es gibt dort z.B. den Shift-Befehl zum 
"Rauschieben von Stellen usw...

BASCOM ist schon ok, leicht erlernbar und logisch zu programmieren, wie 
gesagt, die endlosen BASCOM-Diskussionen wollen wir hier nicht wieder 
anzetteln, aber, liebe C-User, wenn jemand schreibt "unter BASCOM" 
brauchen keine Ausführen in C geposted werden mit dem Spruch " Unter C 
geht das so"...

Gruss
A. Arndt

Autor: Obelix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> klar mit 2 weiteren temporären Varibalen mit Minus und mal 100 usw.
> läuft es schon, ich dachte, es gibt dort z.B. den Shift-Befehl zum
> "Rauschieben von Stellen usw...

Das hättest du dir selbst beantworten können, wenn du mal die 
123(dezimal) in Binär umgerechnet hättest. Denn so rechnet ja eine CPU. 
Dann Probier mal mit Bitweises Schieben das hinzubekommen was du 
möchtest.
Dann hättest du gemerkt : null, nix, niente

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Läßt sich die Zahl nicht als "String" behandeln ???
Dann könnte man einfach Teile davon abschneiden, herausnehmen etc.
Nur rechnen kann man dann damit nicht mehr.
Aber für eine Darstellung wäre es o.k.

Gruß

Autor: Frank Zöllner (frankovic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ A. Arndt: ich hatte den Problem-Kern nicht auf "BASCOM" gesehen, sonst 
hätte ich natürlich nicht meinen C-Senf dazugegeben.

Autor: David (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
a=123 \ 100
b = 123 mod 100
'a = 3, b = 23

a = b \ 10
b = b mod 10
'a = 2, b = 3

Autor: David (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Correction:

a= 123 \ 100
b = 123 mod 100
'a = 1, b = 23

a = b \ 10
b = b mod 10
'a = 2, b = 3

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. Arndt wrote:
> Hallo,
>
> klar mit 2 weiteren temporären Varibalen mit Minus und mal 100 usw.
> läuft es schon, ich dachte, es gibt dort z.B. den Shift-Befehl zum
> "Rauschieben von Stellen usw...

Nunja, "Rausschieben" kann der AVR nur in 2^n-Schritten, er arbeitet 
halt binär. Wenn man ihn effizient programmieren will, sollte man 
versuchen, in seiner Sprache (die Sprache des AVRs, also MC, 
vermenschlich zu ASM) anzusprechen. Da fällt mir die Subtraktionsmethode 
mit Konstanten ein, wie sie hier überall in Verbindung mit LCDs 
angewendet wird.

In BASIC fallen mir zum Zerlegen von Zahlen in Ziffern die Befehle 
str$(), mid$() und val() ein. Inwieweit die von BASCOM unterstützt 
werden und wie verschwenderisch oder effizient die mit den (knappen) 
Ressourcen umgehen, entzieht sich meiner Kenntnis, da ich BASCOM für 
überflüssig halte.

>
> BASCOM ist schon ok, leicht erlernbar und logisch zu programmieren, wie
> gesagt,

Das ist Deine Meinung, das sehe ich anders, trotz BASIC-Erfahrung in 
mehreren Dialekten und (heute noch) Nutzung von BASIC auf anderen 
Systemen.

> die endlosen BASCOM-Diskussionen wollen wir hier nicht wieder
> anzetteln,

Stimmt, lassen wir das, soll Jeder auf seine Art programmieren.

> aber, liebe C-User, wenn jemand schreibt "unter BASCOM"
> brauchen keine Ausführen in C geposted werden mit dem Spruch " Unter C
> geht das so"...

Das kann man aber auch vermeiden, indem man seine Frage bei
http://www.bascom-forum.de stellt. Da ist man auf der sicheren Seite 
nicht mit C oder ASM belästigt zu werden.

>
> Gruss
> A. Arndt

Gruß,
Hannes

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>da ich BASCOM für überflüssig halte.

Sehr gute Formulierung ;-)

Wie wäre es denn mit ner Schleife?

(pseudo-bascom, da ich c bevorzuge):

zahl      = 123;        // umzuwandelnde zahl
string[3] = '';         // ausgabe string als array
i         = 3;          // anzahl gewollter stellen
do
{
   i         = i - 1;
   string[i] = 0x30 + zahl MOD 10;
   zahl      = zahl / 10;
}
while ( i <> 0 )

// in string steht jetzt '123'

Sowas (nur in C) verwende ich immer...

Autor: Lötnix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das ist aussem bascom-forum

Declare Sub Bcd_schneller_code(byval Code As Word)

Call Bcd_schneller_code(20)

End


'----------------------------------------------
'
Sub Bcd_schneller_code(byval Code As Word)
     Dim Einer As Byte
     Dim Zehner As Byte
     Dim Hundert As Byte
     Dim Tausend As Byte

Do
If Code => 1000 Then
Code = Code - 1000
Tausend = Tausend + 1
End If
Loop Until Code < 1000

Do
If Code => 100 Then
Code = Code - 100
Hundert = Hundert + 1
End If
Loop Until Code < 100

Do
If Code => 10 Then
Code = Code - 10
Zehner = Zehner + 1
End If
Loop Until Code < 10
Einer = Code
End Sub

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> das ist aussem bascom-forum

Verschone uns bitte damit. Wer BASCOM-Probleme hat, möge dort hingehen.

...

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Schnell" und "BASCOM". Welch herrliches Paradoxum!

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also, ich hab von Bascom keine Ahnung. Aber ein Blick in Manual (böses 
Wort ;-) verrät mir.

Die Funktion STR() wandelt eine Zahl in einen String.

Und LCD druckt Zeichen auf dem LCD (Man höre und Staune).

Somit sollte das Problem mit BASCOM Mitteln ohne Sicht auf die 
"dreckigen Details" so lösbar sein.

LCD STR(x)

Wenn man nur einzelne Auschnitte der Zahl aufs LCD bringen will dann 
wahrscheinlich mit

LCD MID(STR(x), 1, 3)

Bin mal auf die Rückkopplung gespannt. ;-)

MfG
Falk

Autor: Lötnix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schneller als C !. die neue bascom version hat jetzt einen Code 
optimierer
genauso wie C

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lötnix wrote:
> schneller als C !. die neue bascom version hat jetzt einen Code
> optimierer
> genauso wie C

Na klar ist BASCOM schneller als C, sogar schneller als Assembler!

SCNR

Autor: Lötnix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Assembler wohl nicht loool ,aber man kann auch in
Assembler spaghetti  - code erzeugen und selbst dann
wird alles lahm...in C gilt das gleiche.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lötnix wrote:
> Assembler wohl nicht loool ,aber man kann auch in
> Assembler spaghetti  - code erzeugen und selbst dann
> wird alles lahm...in C gilt das gleiche.

Stimmt. Sehe ich hier fast täglich. Die Sprache ist eigentlich egal, man 
sollte beim Programmieren eben wissen was man tut.

Ein guter C-Programmierer (auf AVR!!) kann auch ASM. Nur so ist er in 
der Lage, seinen Code in C optimal zu formulieren. Er schaut sich auch 
den erzeugten ASM-Code an um zu sehen, ob er C sinnvoll einsetzt.

...

Autor: Lötnix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Getpulse:
  'wait until the signal goes high
  Wcap = 0                                                  'clear 
variable
Getpulse_1:
  sbis pind,2      ; skip next if the bit is SET
  rjmp getpulse_1  ; not skipped so it was 0
Getpulse_2:
  Incr Wcap
  sbic pind,2      ; skip netx if the bit is 0
  rjmp getpulse_2  ; not skipped so it is high
Return
 auch in bascom kann man ASM direkt einbinden.umd zB.
schnelle portimpulse zu erfassen.

Autor: Netbird (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Simon Küppers schrieb:

>Welch herrliches Paradoxum!

Kleiner Tipp: Schau mal nach, wie man das schreibt ... Das soll ja 
griechisch sein ... Aber Du wolltest sicher testen, ob das jemand von 
denen merkt:

>Man merkt mal wieder, dass BASCOM Benutzer keine Ahnung haben

Es soll übrigens noch mehr wichtige Dinge in der Welt geben als die 
Endlosdiskussion, warum eine Programmiersprache SO TOLL und die andere 
SO MIES ist ...

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Netbird wrote:
> Simon Küppers schrieb:
>
>>Welch herrliches Paradoxum!
>
> Kleiner Tipp: Schau mal nach, wie man das schreibt ... Das soll ja
> griechisch sein ... Aber Du wolltest sicher testen, ob das jemand von
> denen merkt:

Du hast Recht, es heißt natürlich Paradoxon.

>>Man merkt mal wieder, dass BASCOM Benutzer keine Ahnung haben
>
> Es soll übrigens noch mehr wichtige Dinge in der Welt geben als die
> Endlosdiskussion, warum eine Programmiersprache SO TOLL und die andere
> SO MIES ist ...

Jou, das stimmt. Hab' ja nicht direkt darauf angespielt - Aber in der 
Regel ist es doch so, dass BASCOM Benutzer eben Baukasten-Programmierer 
sind. Und etwas derart kompliziertes (wie einen Mikrocontroller) so 
derbst zu abstrahieren (Durch eben eine Hochsprache), kann meiner 
Meinung nach nur auf Verlust von Features, Geschwindigkeit oder sonstwas 
geben. Das wissen die meisten BASCOM-Programmierer aber nicht. Für die 
ist das "Einfaches programmieren" (Was man aber eben so (denke ich mal) 
nicht wieder trifft in der Industrie).

Autor: Lötnix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Getpulse:
  'wait until the signal goes high
  Wcap = 0                                                  'clear
variable
Getpulse_1:
  sbis pind,2      ; skip next if the bit is SET
  rjmp getpulse_1  ; not skipped so it was 0
Getpulse_2:
  Incr Wcap
  sbic pind,2      ; skip netx if the bit is 0
  rjmp getpulse_2  ; not skipped so it is high
Return
 auch in bascom kann man ASM direkt einbinden.umd zB.
schnelle portimpulse zu erfassen.

sieht das nach baukasten aus ??

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lötnix wrote:
> sieht das nach baukasten aus ??

Nein, sieht es nicht. Es ist aber auch kein BASCOM.

Autor: Lötnix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
doch ist es.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lötnix wrote:
> doch ist es.

Nein, auch wenn man Assembler innerhalb von BASCOM verwendet, wird das 
Assembler nicht automatisch zu BASCOM...

Autor: Lötnix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Sourcevergleich

Und als Gegendarstellung bitte parallel dazu die Quellcodegröße und 
Abarbeitungszeit angeben ;-)

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Simon: Lass es, es bringt doch nix. Sollen sie doch einen Mega32 oder 
Mega128 mit 16 MHz Takt einsetzen wo wir mit einem Tiny2313 oder Mega48 
mit 1MHz Takt auskommen. Alles schon gesehen hier...

Wer BASCOM wirklich beherrscht (ja, die Leute gibt es, es sind aber 
nicht allzuviele), der kann damit auch schnell und halbwegs effizient 
programmieren. Vor diesen Leuten habe ich Achtung.
Doch die meisten BASCOM-User nutzen BASCOM, weil sie meinen, es sei so 
einfach, dass man weder Dokumentation noch AVR-Datenblatt lesen braucht. 
Und diese müllen dieses Forum mit sinnfreien Beiträgen zu. Klar, die 
gibt's auch in Assembler oder C, es ist also keine Frage der 
Programmiersprache, sondern eine des selbstständigen Arbeitens, des 
Fleißes und der Begabung. Programmieren (auf der Ebene des Rechners 
denken) kann nunmal nicht Jeder, so wie nicht Jeder singen oder Geige 
spielen kann.

...

Autor: Lötnix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Hannes Lux  recht haste -diese amateure bringen recht gute sachen in 
verruf.aber teure C-Compiler sind balde genauso aufgebaut mit ihren 
vielen bibliotheken .habe vor jahren den C167
in C programmiert.µVision2 hiess der compiler,war genauso einfach zu 
proggen wie bascom.
leider war die hart und software mir zu teuer.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hannes Lux wrote:
> @Simon: Lass es, es bringt doch nix. Sollen sie doch einen Mega32 oder
> Mega128 mit 16 MHz Takt einsetzen wo wir mit einem Tiny2313 oder Mega48
> mit 1MHz Takt auskommen. Alles schon gesehen hier...


Jaaajaaa, okaaay ;)

> Wer BASCOM wirklich beherrscht (ja, die Leute gibt es, es sind aber
> nicht allzuviele), der kann damit auch schnell und halbwegs effizient
> programmieren. Vor diesen Leuten habe ich Achtung.

Wer wirft sich freiwillig einen Balken zwischen die Beine? Ach, hups. 
Ich sollte ja aufhören :-)

> Doch die meisten BASCOM-User nutzen BASCOM, weil sie meinen, es sei so
> einfach, dass man weder Dokumentation noch AVR-Datenblatt lesen braucht.
> Und diese müllen dieses Forum mit sinnfreien Beiträgen zu. Klar, die
> gibt's auch in Assembler oder C, es ist also keine Frage der
> Programmiersprache, sondern eine des selbstständigen Arbeitens, des
> Fleißes und der Begabung.

Nagut, das stimmt, die gibts tatsächlich überall - auch wenn es bei den 
BASCOMern am häufigsten ist (behaupte ich jetzt einfach mal für mich).


Lötnix wrote:
> Sourcevergleich
> http://www.roboternetz.de/wissen/index.php/Sourcevergleich

Toller Link. War das eigentlich ein Beitrag in der Diskussion zwischen 
uns beiden?

PS: Der Code in C um die Befehlslänge zu messen ist aber nur so 
geschrieben, wie er dort steht, um es mit BASCOM vergleichen zu können, 
oder? So würde ich unter C geschweige denn Assembler niemals eine 
Pulslänge messen. Wenn diese PulsEin-Funktion tatsächlich so in BASCOM 
implementiert ist - Na dann aber gute Nacht.

Autor: Lötnix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die funktion taugt nix habe die schon getestet.
ohne timer wird das nichts mit der genauigkeit.

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.