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
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));
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...
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
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
> 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
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ß
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
>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...
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
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
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
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.
...
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.
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 ...
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).
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 ??
@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.
...
@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.
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.