Hallo, das folgende sollte funktionieren, tut es aber nicht: 7SegListe[i] = 7SegTab[bcdListe[i]%(10**i)]; ------------------------------------^^^^^^ Das scheint irgendwie Murks zu sein. Ich habe als ZielCPU lediglich einen tiny26 und würde daher auf das Einbinden der math-lib verzichten. Aber wie dann das obige ausrechenen?? Gruss Robert
>Aber wiedann das obige ausrechenen??
Vielleicht erklärst Du mal, was Du eigentlich ausrechnen willst?
R. Freitag schrieb: > Das scheint irgendwie Murks zu sein. Da will ich dir nicht widersprechen. Was soll das den werden, wenn's mal fertig ist?
Es stellen sich Problemkreise * zum einen ist in C die Kombination ** eben kein Potenzoperator. Den gibt es in C so nicht. Man kann sich aber leicht ein entsprechende Funktion programmieren * die andere Fragestellung: was solls eigentlich werden. Denn eigentlich braucht man eine derartige Operation höchst selten. Ganz speziell kann man an deiner Anweisung (undeutlich) erkennen, dass das ganze wohl irgendwas mit 7-Segmentanzeigen zu tun hat. Und in diesem Zusammenhang macht die ganze Operation umso weniger Sinn. Vielleicht zeigst du ja auch mal etwas mehr Code, damit man mal im Zusammenhang sieht, was du eigentlich machen willst. Dann wird dir jemand zeigen, wie man das ganze simpler lösen kann.
Eine BCD Zahl soll in eine 7Segment-Darstellung gewandelt werden. Und zwar so:
1 | void transform(){ |
2 | unsigned static index = 0; |
3 | unsigned const char stellen = 6; |
4 | |
5 | for (i=0; i<= stellen; i++){ |
6 | 7SegListe[i] = 7SegTab[bcdListe[i]%(10**i)]; |
7 | }
|
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | * GccApplication1.c |
15 | *
|
16 | * Created: 29.05.2014 18:28:59 |
17 | * Author: RFr |
18 | */
|
19 | |
20 | |
21 | |
22 | #include <avr/io.h> |
23 | |
24 | int main(void) |
25 | {
|
26 | unsigned char bcdListe[6], 7SegListe[6]; // Listen der Ein- und Audgabe |
27 | unsigned const char 7SegTab[10] = // Transformatortabelle |
28 | |
29 | /* abcdefgh- */
|
30 | |
31 | 11111100b, /* 0 */ |
32 | 01100000b, |
33 | 11011010b, |
34 | 11110010b, |
35 | 01100110b, |
36 | 10110110b, |
37 | 00111110b, |
38 | 11100000b, |
39 | 11111110b, |
40 | 11100110b; /* 9 */ |
------------------8<------------8<--------------------- Es kann sein, dass mir beim C&P einige Klammern verloren gegangen sind. Grüsse Robert
R. Freitag schrieb: > Eine BCD Zahl und diese BCD Zahl ist bereits in Ziffern aufgelöst und liegt in Form von Einzelziffern in bcdListe vor? Wenn ja: Wozu brauchst du dann eine Potenzoperation? Du musst doch nichts anderes tun, als das zu jeder Ziffer der Zahl gehörende Muster für die 7-Segmentanzeige im Array 7SegListe an der zur Ziffer gehörenden Position ablegen. Also einfach nur
1 | for( ... |
2 | 7SegListe[i] = 7SegTab[ bcdListe[i] ]; |
PS: Deine Variablennamen werden so nicht funktionieren. In C kann der Name einer Variablen nicht mit einer Ziffer beginnen. 7SegListe ist also ein illegaler Name, weil er mit einer Ziffer beginnt. Und auch beim Rest deines Codes (so kurz der gepostete Ausschnitt auch ist) stimmen noch ein zwei Sachen nicht. Der Erwerb und das Durcharbeiten eines C-Buches werden dringends nahegelegt.
Ein Wert wird aus dem ADC ausgelesen und skaliert. Entweder ich wandele den in eine Darstellung wie bcdListe um. Oder ich verwende den direkt. Momentan würde ich letzteres bevorzugen, aber ohne Potenzoperator. Dazu war das Snippet gedacht.
R. Freitag schrieb: > Ein Wert wird aus dem ADC ausgelesen und skaliert. Und was hat das jetzt alles mit BCD zu tun? > Entweder ich wandele den in eine Darstellung wie bcdListe um. Wozu? > Oder ich verwende den direkt. > Momentan würde ich letzteres bevorzugen, aber ohne Potenzoperator. Dazu > war das Snippet gedacht. Ja, dann mach das doch. ALles was du tun musst ist die Zahl, zum Beispiel 867 in die einzelnen Ziffern zu zerlegen.
1 | 867 % 10 -> 7 |
2 | 867 / 10 -> 86 |
3 | |
4 | 86 % 10 -> 6 |
5 | 86 / 10 -> 8 |
6 | |
7 | 8 % 10 -> 8 |
8 | 8 / 10 -> 0 |
9 | |
10 | 0 % 10 -> 0 |
11 | 0 / 10 -> 0 |
12 | |
13 | 0 % 10 .... |
14 | |
15 | ^ |
16 | hier fallen die einzelnen Ziffern der Zahl an |
einfach sukzessive durch 10 dividieren bzw. mittels der MOdulo Operation immer die letzte Stelle bestimmen. Und mit der gehst du in die Tabelle um das Muster zu bestimmen. Kann man prima in einer Schleife machen.
1 | void output( uint16_t zahl ) |
2 | {
|
3 | uint8_t i; |
4 | |
5 | for( i = 0; i < 6; i++ ) |
6 | {
|
7 | 7SegListe[i] = 7SegTab[ zahl % 10 ]; |
8 | zahl = zahl / 10; |
9 | }
|
10 | }
|
Wenn ich das jetzt richtig verstanden habe, dann willst Du ein Integer nach ASCII wandeln, also itoa. Darüber gibt es sicher schon einiges im Forum... Guckst Du: http://www.mikrocontroller.net/articles/FAQ#Wie_kann_ich_Zahlen_auf_LCD.2FUART_ausgeben.3F und noch mal zur Wiederholung: Karl Heinz schrieb: > zum einen ist in C die Kombination ** eben kein Potenzoperator. Den > gibt es in C so nicht.
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.