PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Char mit array verbinden ?



AsuroPhilip
05.09.2011, 23:14
Hallo

Ich habe einen Char, wo "Ziffer" drin steht und ein array, wo z.b. in array[0] eine Zahl steht, die sich immer ändert!

Und am Ende soll z.b. Ziffer3 rauskommen, geht das?


MfG
Philip ;)

Che Guevara
06.09.2011, 01:35
Hallo,

was heißt den "soll rauskommen"? Möchtest du diesen Text ausgeben? Das wäre ziemlich einfach, du müsstest einfach nur erst das Char printen und anschließend ohne Trennzeichen dein Array.
Wenn du allerdings den Array-Inhalt in dein Char hineinschreiben willst, könntest du folgendes Probieren:


Char = Char + ToString(array(x))

Schreib bitte etwas genauer, was du haben möchtest.

Gruß
Chris

danimath
06.09.2011, 07:52
Ich glaube, ich verstehe. Du hast bestimmt kein char, in dem "Ziffer" drinsteht, sonder ein char [] oder char *. Schaut Dir mal die sprintf-Funktion an:


char line [128];
sprintf (line, "Ziffer%d", array [0]);

oder so ähnlich.

viele Grüße
Andreas

AsuroPhilip
06.09.2011, 11:20
Hm....



Led_Dimmer.c:44: warning: implicit declaration of function 'sprintf'
Led_Dimmer.c:44: warning: incompatible implicit declaration of built-in function 'sprintf'


Ich möchte einfach nur das Ziffer mit array[0] zusammen sind, und das dann in eine neue Variable gespeichert wird.


mfG
Philip

danimath
06.09.2011, 11:35
Du brauchst noch die Include-Datei mit der Deklaration:


#include <stdio.h>


(In google "man sprintf" liefert die eine Auswahl vom man-pages dazu ;-))

Eine der ersten Sachen, die ich in C lernen musste (harte Tour, da Projekt im Zeitdruck :()
wenn "implicit declaration", dann Include-Datei vergessen, also "man Funktionsname".

viele Grüße
Andreas

AsuroPhilip
06.09.2011, 13:02
Okay, allerdings kann ich den Wert nicht weiter-benutzen :confused:




char line [128];
sprintf (line, "Ziffer%d", array[0]);

I2CTWI_transmitByte(pcf2, line); // also machen soll der dann das, Ziffer1 ist oben definiert I2CTWI_transmitByte(pcf2, Ziffer1);


noch ne Idee?



mfG
Philip ;)

Ceos
06.09.2011, 14:14
es scheint mir so als solltest du dich nochmal mit den Grundlagen beschäftigen: was ist ein Array, was ist ein Byte, wie sieht ein String aus!

Dann formulier es nochmal genau was du hast und was du brauchst:

woher hast du den Char, was beinhaltet das Array (eine einzelne zahl ist es sicher nicht das würde den Sinn eines Array zerstören es sei denn du brauchst nur ein Element aus dem Array!) und wie genau möchtest du es verbinden(es geht binär addieren, den char in das array einfügen, das array als string und die zahl dann als text, ...)!

AsuroPhilip
06.09.2011, 15:20
Ich brauche nur das erste Element des Arrays mit Ziffer zu verbinden und das dann als text senden I2CTWI_transmitByte(pcf2, Hier soll dann "Ziffer1" stehen).

danimath
06.09.2011, 15:37
Mit I2CTWI_transmitByte überträgst Du genau ein Byte auf dem Bus an die Adresse pf2c. Wenn Du mehrere Bytes (so wie die Zeichenkette line) übertragen willst, dann musst Du eine andere Funktion aufrufen. So aus dem Gedächtnis (also schau da lieber nochmal in die Doku):



I2CTWI_transmitBytes(pf2c, line, strlen (line));


Schau genau hin: das sind zwei unterschiedliche Funktionen!

ACHTUNG: evtl. musst Du noch strings.h includen (für strlen). Schau auch hier bitte sicherheitshalber nach - ich habe gerade keine Möglichkeit das zu tun.

viele Grüße
Andreas

AsuroPhilip
06.09.2011, 17:03
Also eigentlich übertrage ich ja
0b01111101 weil ichs ja oben definiert hab
#define Ziffer1 0b01111101.

Ceos
06.09.2011, 22:16
diese info hast du uns vorenthalten! dennoch hast du nicht klar gestellt was du mit deinem 0b01111101 und dem char-wert machen willst

AsuroPhilip
07.09.2011, 01:20
diese info hast du uns vorenthalten!
Mir war nicht bewusst, dass das wichtig ist.



dennoch hast du nicht klar gestellt was du mit deinem 0b01111101 und dem char-wert machen willst
Okay, ich habe einen Temperatursensor, der mir die aktuelle Temperatur in °C gibt. Dies wird in der Variable sTemp gespeichert und ändert sich, wenn die Temperatur sich ändert. Dieses sTemp hab ich getrennt, sodass wenns z.b. 23° währe, in array[0] die 2 stehen wird und in array[1] die 3 (die Werte Aktualisieren sich auch). So jetzt wollte ich die Temperatur auf der Siebensegmentanzeige anzeigen.

Der Code funktioniert! Nur möchte ich, dass sich die ersten beiden zahlen, halt die richtige Temperatur anzeigt und sich auch ständig aktualisiert.

I2CTWI_transmitByte(pcf, Anzeige1);
I2CTWI_transmitByte(pcf2, Ziffer2); //zeige 2 auf erstem Display
I2CTWI_transmitByte(pcf2, Aus);

I2CTWI_transmitByte(pcf, Anzeige2);
I2CTWI_transmitByte(pcf2, Ziffer3); //zeige 3 auf zweiten Display
I2CTWI_transmitByte(pcf2, Aus);

I2CTWI_transmitByte(pcf, Anzeige3);
I2CTWI_transmitByte(pcf2, ZifferGr); //zeige ° auf dritten Display
I2CTWI_transmitByte(pcf2, Aus);

I2CTWI_transmitByte(pcf, Anzeige4);
I2CTWI_transmitByte(pcf2, ZifferC); //zeige 4 auf vierten Display
I2CTWI_transmitByte(pcf2, Aus);


So ich hoffe das waren genug infos.



mfG
Philip ;)

Ceos
07.09.2011, 11:46
ich geh mal davon aus, dass das Auswerten des Sensor irgendwo ständig wiederholt wird, nun brauchst du die oberen beiden transmit-Blöcke nur ein eine Funktion packen, die wir z.B. "updateDisplay(char temperatur)" nennen, in welcher du die Zerlegung bewerkstelligst und anschließend mit deinen beiden transmit-tripeln auf die Segmente legst

diese Funktion rufst du nach dem auslesen der Temperatur einfach mit auf.

Oder brauchst du Hilfe beim zerlegen ?

ausgehend davon dass die temperatur IMMER 2stellig ist würd ich quick n dirty folgendes vorschlagen:




char toDisplay[] = {'0','0','°','C'};
char temp;

while(messen)
{
temp = getTemp();
updateDisplay(temp);
}

updateDisplay(char some_temp)
{
toDisplay[0] = some_temp/10; //nachkommastellen werden abgetrennt
toDisplay[1] = some_temp- (toDisplay[0] * 10);

I2CTWI_transmitByte(pcf, Anzeige1);
I2CTWI_transmitByte(pcf2, toDisplay[0]); //zeige 2 auf erstem Display
I2CTWI_transmitByte(pcf2, Aus);
I2CTWI_transmitByte(pcf, Anzeige2);
I2CTWI_transmitByte(pcf2, toDisplay[1]); //zeige 3 auf zweiten Display
I2CTWI_transmitByte(pcf2, Aus);
I2CTWI_transmitByte(pcf, Anzeige3);
I2CTWI_transmitByte(pcf2, toDisplay[2]); //zeige ° auf dritten Display
I2CTWI_transmitByte(pcf2, Aus);
I2CTWI_transmitByte(pcf, Anzeige4);
I2CTWI_transmitByte(pcf2, toDisplay[3]); //zeige 4 auf vierten Display
I2CTWI_transmitByte(pcf2, Aus);
}



wenn deine definition von Anzeige1 - 4 nun auch noch der zahl 1-4 entspricht, kannst du auch getrost das ganze in eine Schleife packen ums schöner zu machen

PS: irgendwie mag das Forum (oder der Editor des Forum) es nicht wenn ich Text aus einem Code-Block kopiere um es in meiner Antwort zu verwenden

AsuroPhilip
07.09.2011, 13:19
Kann das funktionieren? Ich muss doch "0b01111101" übertragen, und nicht "2"?



#define Ziffer0 0b01000100
#define Ziffer1 0b01111101
#define Ziffer2 0b10100100
#define Ziffer3 0b00110100
#define Ziffer4 0b00011101
#define Ziffer5 0b00010110
#define Ziffer6 0b00000110
#define Ziffer7 0b01111100
#define Ziffer8 0b00000100
#define Ziffer9 0b00010100

und
#define 2 0b10100100 klappt nicht. So aktualisiere ich die Temp:

uint16_t adc3 = readADC(ADC_3);
uint16_t sTemp = (adc3 - 316+28) / 11;

Ceos
07.09.2011, 15:49
achsoooooooooooo ^_^

jetzt ist alles klar

das geht am einfachsten mit einem const char[] array



const char[] Bitcodes = {
0b01000100,
0b01111101,
0b10100100,
0b00110100,
0b00011101,
0b00010110,
0b00000110,
0b01111100,
0b00000100,
0b00010100}

...
Bitcodes[2] liefert den wert 0b10100100 zurück!





damit kannst du einfach über den index des array auf das entsprechende bitmuster zugreifen!
THEORETISCH kannst du Bitmuster für alle ASCII Zeichen anlegen, aber lückenlos!!! damit z.b. das kleine 'a' auch an der 97ten stelle steht! Du brauchst halt mind. 265 Bytes Programmcode mehr!

danimath
07.09.2011, 16:02
Mist - zu spät - gerade hatte ich fast genau das fertig getippt ;)

AsuroPhilip
07.09.2011, 20:34
Fehlermeldung: SiebenSegment.c:39: error: expected identifier or '(' before '[' token

Code Z.39:


const char[] Bitcodes = {
0b01000100,
0b01111101,
0b10100100,
0b00110100,
0b00011101,
0b00010110,
0b00000110,
0b01111100,
0b00000100,
0b00010100
}

Leider klappts noch nicht so richtig ;-<


mfG
Philip

danimath
08.09.2011, 08:25
Wo ist denn da die Zeile 39? Und was kommt danach? Hast Du das ";" bei copy&paste vergessen? Oder im Quelltext?

viele Grüße
Andreas

Ceos
08.09.2011, 08:58
Zeile 39 hört sich so an als hätte er versucht es innerhalb einer Methode zu definieren, versuchs mal ganz oben bei den Variablen-Deklarationen

EDIT: ahja und semikolon dahinter .... ich schussel gern wenn ich nur nachdenke und nicht direkt programmiere, normalerweise sagt es mir mein eclipse wenn ich was vergessen hab ^^

AsuroPhilip
08.09.2011, 09:41
Okay, habs schon....



const char Zahl[] = {
0b01000100,
0b01111101,
0b10100100,
0b00110100,
0b00011101,
0b00010110,
0b00000110,
0b01111100,
0b00000100,
0b00010100
};



danke nochmal an alles

mfG
Philip

danimath
08.09.2011, 12:32
EDIT: ahja und semikolon dahinter .... ich schussel gern wenn ich nur nachdenke und nicht direkt programmiere, normalerweise sagt es mir mein eclipse wenn ich was vergessen hab ^^

Mir ist kürzlich passiert:



while (true);
{
...
}


Argh! :mrgreen: Andersrum geht's als auch ;)

viele Grüße
Andreas

AsuroPhilip
08.09.2011, 13:30
Okay, also funktioniert alles wunderbar *juhuu* Was kann man wohl noch alles aus alten Geräten benutzen ?


mfG
Philip

danimath
08.09.2011, 13:37
Das hängt vom Gerät ab. Besonders schön: Mobiltelefone (http://www.cellphonethrow.com/) :).

viele Grüße
Andreas