PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Dezimal Wandlung



Import-Script
12.01.2002, 15:47
Ich suche eine Routine in C um einen Hex-Wert von einem A/D Wandler dezimal auf einem LCD-Display darzustellen.

Import-Script
12.01.2002, 16:52
Hi! <BR>Ich habe mal eine Funktion mit Fixkommadarstellung geschrieben. <BR>Der Wert vom AD-Wandler 0-5V wird der Funktion als Integer-Wert &uuml;bergeben,die zerteilt den Wert dann in ASCII-Zeichen und schreibt die dann in einen String,der dann aufs Display geschrieben wird. <BR> <BR>void LCD_vADC_PutValue&#40;unsigned int value&#41; // 5343 = 5.343 <BR>{ <BR> char i ; <BR> char help_str&#91;6&#93; ; <BR> char str&#91;8&#93; ; <BR> <BR> for &#40; i = 0x04; i &#62;= 0x00; i-- &#41; <BR> { <BR> help_str&#91;i&#93; = &#39;0&#39; &#43; &#40; value % 10 &#41; ; <BR> <BR> value/= 10 ; <BR> } <BR> <BR> help_str&#91;5&#93; = 0x00 ; <BR> <BR> str&#91;0&#93; = help_str&#91;0&#93; ; <BR> <BR> str&#91;1&#93; = &#39;.&#39; ; <BR> <BR> for &#40; i = 1; i &#60; 6; i&#43;&#43; &#41; <BR> str&#91;i&#43;1&#93; = help_str&#91;i&#93; ; <BR> <BR> str&#91;7&#93; = 0x00 ; <BR> <BR> LCD_vLCD_putstr &#40; &amp;str&#91;0&#93; &#41; ; <BR>} <BR> <BR>mfg mike

Import-Script
12.01.2002, 17:20
Sieht zwar gut aus, aber da blicke ich nich so ganz durch. Fang ja gerade erst mit C an. <BR>K&ouml;nntest du mal ein paar Kommentare einf&uuml;gen?

Import-Script
12.01.2002, 19:29
Hi <BR> <BR>wenn du SDCC verwendest und genug Programmspeicher zur Verf&uuml;gung hast kannst du auch mit printf oder printf_small arbeiten. Du mu&szlig;t dann noch irgendwo eine putc Funktion zur Ausgabe von ASCII-Zeichen an das Display schreiben. Diese PUTC wird dann von printf aufgerufen. <BR> <BR>Matthias

Import-Script
12.01.2002, 20:21
Ok! <BR> <BR>Der &Uuml;bergabewert ist eine &#34;nicht vorzeichenbehaftete Integerzahl&#34;,d.h.der Wertebereich geht von 0-65535.Bei meinem Programm entspricht das dann einer Spannung von 0-6.5535V. <BR>Der Grundgedanke dabei war,den Integerwert in eine Zeichenkette umzuwandeln,ein Komma einzuf&uuml;gen und diese Zeichenkette am Display anzeigen. <BR> <BR>Der Integerwert wird mit der 1.For-Schleife in seine Ziffern zerlegt &#40;mit der Modulo-Division -&#62; z.B. 5343%10 ergibt 3&#41;. Das Ergebnis wird zum ASCII-Code von 0 dazuaddiert-&#62; man erh&auml;lt den ASCII-Code der Ziffer.Anschlie&szlig;end wird der Wert durch 10 dividiert,um an die n&auml;chste Stelle zu kommen -&#62; Ergebnis: 534 <BR> <BR>Dann wird die 1. Stelle des Hilfsstings in den endg&uuml;ltigen String geschrieben,dann das Komma und schlie&szlig;lich die restlichen Stellen des Hilfsfeldes. <BR>Die Anweisung str&#91;7&#93;=0x00 f&uuml;gt die bin&auml;re 0 ein &#40;Abschlusszeichen f&uuml;r einen String&#41;. <BR> <BR>Sorry,hab grad ne zeile zuviel entdeckt: Die Anweisung help_str&#91;5&#93;=0x00 kann weggelassen werden, und bei der Variablendeklaration help_str&#91;5&#93; anstatt help_str&#91;6&#93; &#40;etwas platzsparender :-&#41; &#41; <BR> <BR>mike

Import-Script
13.01.2002, 14:23
Danke erstmal. <BR>Hab es ausprobiert. Fehlt ev. bei der 2. for Schleife die Klammern? <BR>Der Controller bleibt in der ersten Schleife h&auml;ngen. <BR> <BR>Gruss Sascha

Import-Script
14.01.2002, 15:26
Also, irgendwo ist der wurm drin. <BR>krieg es einfach nicht zum laufen. <BR>hat jemand noch ne idee??????????? <BR> <BR>mfg sascha

Import-Script
14.01.2002, 16:11
Hallo Sascha, <BR> <BR>evtl. ist der RAM-Speicher voll??? Wenn Du zu viele Variablen in Deinem Programm definiert hast, koennte da ein Problem liegen. Ich bin nicht sicher, ob der Compiler meckert. Der weiss ja nicht zwangslaeufig, wie gross Dein RAM ist. <BR> <BR>Vielleicht erst mal ein Schmalspurprogramm machen oder Programm/Routine auf &#39;nem PC vortesten &#40;geht die Routine, liegt&#39;s eher am RAM, geht die Routine auf dem PC nicht =&#62; andere Probleme!&#41;. <BR> <BR>Gruss, <BR>Thomas

Import-Script
14.01.2002, 19:11
Hi! <BR>Wenn nur 1 Anweisungszeile nach einer For-Schleife, While-Schleife, If-Anweisung steht, braucht man keine {},z.B. <BR>if &#40; j &#41; <BR> c = 1 ; <BR> <BR>Dass das Prog. in der 1.For-Schleife h&auml;ngenbleibt,ist mir unerkl&auml;rlich!Welchen Controller hast du denn? <BR>Mike

Import-Script
14.01.2002, 19:22
hab nen M16C62 M30624 Controller. Halt nen 16Bitter. Hat 256kb Flash und 20kb Ram. also kann es an zuwenig Ram nicht liegen. und der Overhead den der Compiler erzeugt is auch nicht riesig. <BR> <BR>Wenn ich in der ersten schleife hinschreibe: <BR>&#40; i = 0x04; i &#60;= 0x00; i-- &#41; <BR> <BR>l&auml;uft das Programm weiter und es erscheint auf dem Display: <BR>ein Leerzeichen, der Punkt, ein Leerzeichen, ein kleines e, zwei Leerzeichen und dann ein Wert zwischen 0-F, je nach Wert des AD-Wandlers.

Import-Script
15.01.2002, 08:54
Sascha: <BR> <BR>Deine For-Schleife wird gar nicht durchlaufen!!! <BR> <BR>Verbal gesagt steht bei Dir: &#39;i&#39; ist gleich vier. Durchlaufe schleife so lange, wie &#39;i&#39; kleiner oder gleich null ist, erniedrige i bei jedem Durchlauf um eins. <BR> <BR>Entscheidend ist, dass die Bedingung i &#60;= 0 von Anfang an nicht erfuellt ist und damit die Schleife gar nicht durchlaufen wird. Damit laeuft das Programm ueber die Schleife hinweg weiter. Und Du siehst die fest definierten Zeichen! <BR> <BR>Gruss, <BR>Thomas

Import-Script
15.01.2002, 17:07
Hi! <BR>Du hast dich verschrieben! Es geh&ouml;rt <BR>for &#40; i=0x04; i&#62;=0x00; i-- &#41; <BR> <BR>Mike

Import-Script
16.01.2002, 13:34
Wenn ich es so eingebe, bleibt der Controller in der Schleife stehen. <BR> <BR>Warum????????????????

Import-Script
16.01.2002, 17:50
Liegt es vieleicht daran, dass i eine 8-Bit Variabele ist? Dann wird die doch wenn sie 0 ist und um eins erniederigt wird&#40;i--&#41; den Wert 255 annehmen. Und die Schleife wird weiter durchlaufen. Ich bin kein C Fan. Daher wei&szlig; ich nicht ob das stimmt.

Import-Script
16.01.2002, 19:31
Du schreibst eine 4 in i, und dann wird sie solange dekremntiert bis sie 0 ist. <BR>Sollte normalerweise so sein.

Import-Script
16.01.2002, 23:24
Ich wei&szlig; jetzt wirklich nicht, was das Problem ist. Bei 20kB RAM nimm doch sprintf&#40;&#41;. <BR> <BR>Ich nehms ja auch und das auf einem AT89C2051 mit 128 Byte RAM. <BR> <BR>So m&uuml;&szlig;te es klappen: <BR> <BR>sprintf&#40; buffer, &#34;%d.%03d&#34;, val / 100, val % 100 &#41;; <BR> <BR>Aber bei 20kB kannst Du Dir doch sogar float leisten. <BR> <BR> <BR>Peter

Import-Script
17.01.2002, 13:25
Wie schon mal getippert, hab ich von C so gut wie keine Ahnung. Also nochmal: <BR>Ich habe einen 16Bit Hex-Wert, am besten in 2 8Bit Variablen. Diese will ich dann Dezimal auf einen Display anzeigen. Dazu will ich sie als BCD-Wert im Ram stehen haben. Wie z.b. BCD0 = 1Stelle -&#62; BCD4 = 5. Stelle. <BR> <BR>z.B.: <BR>unsigned char BCD0; <BR>unsigned char BCD1; <BR>unsigned char BCD2; <BR>unsigned char BCD3; <BR>unsigned char BCD4; <BR>unsigned char HEXWERT_LB; <BR>unsigned char HEXWERT_HB; <BR> <BR>HEXWERT_LB = 0x43 // Lowbyte Hexwert dez. = 13123 <BR>HEXWERT_HB = 0x33 // Highbyte <BR>hex_to_dez&#40;&#41;; // Wandlung aufrufen <BR> // BCD0 = 3 <BR> // BCD1 = 2 <BR> // BCD2 = 1 <BR> // BCD3 = 3 <BR> // BCD4 = 1

Import-Script
17.01.2002, 13:48
schneidertobi hat &uuml;brigens recht: <BR> <BR>Da steht: <BR> <BR>for &#40;i=4; i &#62;= 0; i--&#41; ... <BR> <BR>d.h. wenn i == 0, wird i nochmal dekrementiert, es kommt 0xFF dabei raus, das ist &#62; 0, deshalb l&auml;uft die Schleife bis in alle Ewigkeit. <BR> <BR>Abhilfe: <BR>char i, j; <BR>for &#40;i = 0, j = 4; i &#60;= 4; i&#43;&#43;, j--&#41; { <BR> help_str&#91;j&#93; = &#39;0&#39; &#43; &#40; value % 10 &#41; ; <BR> value /= 10; <BR>} <BR> <BR>oder -- falls der Compiler das unterst&uuml;tzt -- <BR>einfach i nicht als ``char&#39;&#39; sondern als ``signed char&#39;&#39; deklarieren &#40;int ginge auch, aber das ist 1 Byte Verschwendung&#41;. <BR> <BR>Gr&uuml;&szlig;e

Import-Script
17.01.2002, 16:18
Hallo Sascha, <BR> <BR>dann empfehle ich dir dringend, Dich mit den Parametern von printf&#40;&#41;, sprintf&#40;&#41;, scanf&#40;&#41;, sscanf&#40;&#41; zu besch&auml;ftigen. <BR>Das sind sozusagen die Grundfunktionen f&uuml;r alle Arten der textuellen Ein- und Ausgabe &#40;Brot und Butter des C-Programmierers&#41;. <BR> <BR>Das geht am besten direkt am PC, z.B. mit TC oder Borland-C. <BR> <BR>Das, was Bernd geschrieben hat m&uuml;&szlig;te so gehen. <BR>Aber Du wirst von C-Profis nur ver&auml;chtliche Blicke ernten, wenn Du Funktionen der Standardbibliotheken nachentwickelst. <BR>&Uuml;blicherweise steckt in den Bibliotheken das Knowhow von Generationen von Programmierern, d.h. sie sind meistens effizienter und schneller als &#34;zu Fu&szlig;&#34;. <BR> <BR> <BR>Peter

Import-Script
17.01.2002, 23:22
Wenn mir jemand mal die Parametern und Funktion von printf&#40;&#41;, sprintf&#40;&#41;, scanf&#40;&#41;, sscanf&#40;&#41; mal auf deutsch erkl&auml;rt, w&uuml;rde ich sie auch wohl nutzen. <BR> <BR> <BR>mfg sascha

Import-Script
18.01.2002, 01:14
Hallo Sascha, <BR> <BR>ich schreibe meine 8051 Programme vorzugsweise unter der deutschen Version von Borland C&#43;&#43; 3.1. <BR>Da ist dann auch eine deutschsprachige Hilfe dabei. <BR>Hab ich mir mal f&uuml;r 69,-DM gekauft. <BR> <BR> <BR>Peter

Import-Script
18.01.2002, 17:44
hab ja mehrere Compiler, darunter auch ne vollversion f&uuml;r den M16C62. aber halt alles in englisch. hab mir auch das C-Compiler Buch f&uuml;r &micro;Controller von franzis gekauft. und da blicke ich halt nich so ganz durch.

Import-Script
22.01.2002, 10:25
Hallo Sascha, <BR> <BR>ich hab mal aus der BC&#43;&#43; Hilfe alles &uuml;ber printf&#40;&#41; kopiert. <BR>Nur kann man das ja im Forum nicht leserlich darstellen. <BR>Wenn Du mir also Deine E-Mail Adresse gibst, kann ich es Dir schicken. Ist alles in Deutsch. <BR> <BR> <BR>Hallo Andre, <BR> <BR>warum kann man Bilder ins Forum stellen, ASCII-Textdateien jedoch nicht ? <BR> <BR>Z.B. im AVR-Forum hab ich gesehen, man kann Textdateien als Attachment anf&uuml;gen. <BR> <BR>Peter

Import-Script
22.01.2002, 13:00
Hier hast du sie. <BR>danke schon mal...... <BR> <BR>mfg sascha