Forum: Mikrocontroller und Digitale Elektronik C-Problem: Exponenten


von R. F. (rfr)


Lesenswert?

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

von Matthias L. (Gast)


Lesenswert?

>Aber wiedann das obige ausrechenen??

Vielleicht erklärst Du mal, was Du eigentlich ausrechnen willst?

von Mike (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von R. F. (rfr)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von R. F. (rfr)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
}

von mar IO (Gast)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?


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.