Hi, ich arbeit mich gerade in µC ein. Dabei möchte ich die serielle Schnittstelle für die Datenübertragung benützen. Im µC läuft ein binärer Zähler von 8 Bit. Dessen Werte möchte ich am PC abfagen und in leicht abzulesbare Dezimalzahlen umwandeln. 00000001 soll als "1" erscheinen 00000010 soll als "2" erscheinen ... Was macht mehr Sinn und weniger Arbeit? Das umwandeln am PC oder im µC?
am PC isses einfacher. Im µC mußt dus erst in die passenden Zahlen zerlegen, als ASCII umwandeln ausgeben. Die meisten hochsprachen am PC könne das "automatisch"
Der PC hat doch etwas mehr Ressourcen. Kommt drauf an wieviel Speicherplatz du frei hast um eine Umwandlungsroutine im µC einzubinden, Prozessorzeit, ob du im PC die Daten aufbereiten musst.... Gruß, olfi
Wenn du am PC nur ein vorhandenes Terminalprogramm nutzen willst, dann solltest Du es auf dem Controller tun. Ist ja eigentlich kein Akt, bei LCD-Ansteuerung musst Du es ja auch tun. ...
@Daniel N.: Ich glaub, das ist wirklich ne Psychose oder so... Spar Dir solche Postings doch einfach.
>00000001 soll als "1" erscheinen >00000010 soll als "2" erscheinen ... Interessant wird es erst bei Zahlen grösser 0b00001001. Wie sollen die dann aussehen? Dreistellig? Divisionsroutinen wurden hier letzte Woche diskuttiert... Eigentlich (in C) sehr simpel, wenn man sprintf etc umgehen will: unsigned char n; // umzucodierende Zahl (0..255) unsigned char einer, zehner, hunderter; einer = 0; zehner = 0; hunderter = 0; while (n>10) { n -= 10; zehner++; if (zehner>9) { zehner = 0; hunderter++; } } einer = n; Fertig... Mich würde jetzt interessieren, wie man das mit float macht.
Für signierte Zahlen muß man halt noch das Komplement bilden und sich das Vorzeichen merken...
...Oder wenn mans schön einfach will, Bibliotheksfunktionen aus der stdlib.h nehmen (itoa, dtostr(e)...). Die machen auch wesentlich weniger Code als printf und sind einfach in der Anwendung. Da der OP sich bisher allerdings darüber ausschweigt, was für einen µC er eigentlich verwenden will, ist es schwer, da irgendwelche präziseren Empfehlungen zu geben.
>Bibliotheksfunktionen aus der stdlib.h nehmen (itoa, dtostr(e
Komisch: Ich mach mir bei solchen Sachen immer nen Kopp, und dann hat
das schon jemand vor mir gemacht...
Ich geh dann mal die stdlib.h filzen...
Die Funktionen sind an sich ganz Nett und haben, da sie sehr spezialisiert sind, v.a. gegenüber den printf-Abkömmlingen gegenüber den großen Vorteil, dass sie weit weniger Overhead erzeugen...
AVR-IAR hat kein dtostr...(und dann ist das Ding sooooo teuer!) sprintf kann er, will ich aber nicht. Soll ja nur eine float oder double anzeigen. Muß ich wohl "händisch" machen.
@Rahul: Die Funktionen mit double-Werten (also dtostr und dtostre, double to string [exponential]) heißen da u.U. anders, da viele kommerzielle Embedded-Compiler eh nur mit float arbeiten (float und double sind bei solchen Anwendungen eh identisch, da i.d.R. kein 64-Bit-Fließkommatyp unterstützt wird). Bei CodeVision heißt es z.B. ftoa (float to ASCII). Möglicherweise gibts die Funktion gar beim IAR...
Danke für den Hinweis. IAR besitzt aber scheinbar wirklich nichts derartiges ausser sprintf. Dafür kann man dessen Umfang mit Hilfe von Compiler-/Linker-Einstellungen (weiß jetzt nicht wo das war [eher Compiler]...) einstellen. Ich hab mir meine jetzt nach dem obigen Schema selber gebastelt. Für positive Zahlen gar kein Problem. Negative sind jetzt dran ( "if (zahl<0.0) zahl = -zahl;" und Vorzeichen merken...). Vielleicht mach ich mir noch eine struct, wird sich aber nicht lohnen es sind insgesamt 5 Bytes: hunderter bis hunderstel. Wenn ich noch etwas rechnen lasse, spare ich mir noch eine Schleife...
Ich habe ein paar Umwandlungsfunktionen programmiert, vielleicht hilft das ja jemandem: http://www.mikrocontroller.net/forum/read-4-278748.html
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.