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


von A. Arndt (Gast)


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

von bascom (Gast)


Lesenswert?

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

von A. Arndt (Gast)


Lesenswert?

Hi,

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

Gruss

von AVR (Gast)


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

von Frank Z. (frankovic)


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));

von Simon K. (simon) Benutzerseite


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...

von Troll B. (blaubeer)


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

von A. Arndt (Gast)


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

von Obelix (Gast)


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

von Stephan H. (stephan-)


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ß

von Frank Z. (frankovic)


Lesenswert?

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

von David (Gast)


Lesenswert?

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

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

von David (Gast)


Lesenswert?

Correction:

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

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

von Hannes L. (hannes)


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

von Matthias L. (Gast)


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...

von Lötnix (Gast)


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

von Hannes L. (hannes)


Lesenswert?

> das ist aussem bascom-forum

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

...

von Simon K. (simon) Benutzerseite


Lesenswert?

"Schnell" und "BASCOM". Welch herrliches Paradoxum!

von Falk (Gast)


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

von Lötnix (Gast)


Lesenswert?

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

von Simon K. (simon) Benutzerseite


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

von Lötnix (Gast)


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.

von Hannes L. (hannes)


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.

...

von Lötnix (Gast)


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.

von Netbird (Gast)


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 ...

von Simon K. (simon) Benutzerseite


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).

von Lötnix (Gast)


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 ??

von Simon K. (simon) Benutzerseite


Lesenswert?

Lötnix wrote:
> sieht das nach baukasten aus ??

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

von Lötnix (Gast)


Lesenswert?

doch ist es.

von Simon K. (simon) Benutzerseite


Lesenswert?

Lötnix wrote:
> doch ist es.

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

von Lötnix (Gast)


Lesenswert?


von Matthias L. (Gast)


Lesenswert?

>Sourcevergleich

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

von Hannes L. (hannes)


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.

...

von Lötnix (Gast)


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.

von Simon K. (simon) Benutzerseite


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.

von Lötnix (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.