Forum: Compiler & IDEs Funktion erwartet flash unsigned char*


von Asker (Gast)


Lesenswert?

Hallo,
ich habe eine Int-Variable.

Diese möchte ich mit einer Funktion auf ein Display ausgeben.

Normalerweise gebe ich strings damit wie folgt aus:

Displayausgabe("Testausgabe");

Wenn ich

Displayausgabe(intvar);

schreibe, so erhalte ich folgende Fehlermeldung:

function argument #1 of type 'int' is incompatible with required 
parameter of type 'flash unsigned char *'


Wie kann ich nun die int-Variable ausgeben?

von Oliver (Gast)


Lesenswert?

In dem du dir als allererstes mal ein C-Buch besorgst, und zumindest mal 
die allereinfachsten basics der Sprache (wie z.B. Typen) verstehen 
lernst.

Wenn du das gemacht hast (und nicht vorher), schau dir mal die Funktion 
itoa an.

Oliver

von Asker (Gast)


Lesenswert?

Danke für den Tipp, ich habs gefunden:

http://www.mikrocontroller.net/articles/FAQ

von Asker (Gast)


Lesenswert?

OK,
wenn ich es wie folgt mit dem Codevision Compiler mache:

char Buffer[3];
itoa(intvar,Buffer);
Displayausgabe(intvar);

So erhalte ich folgende Fehlermeldung:
"function argument #1 of type 'unsigned char [3]' is incompatible with 
required parameter of type 'flash unsigned char *' "

Muss ich nun explitzit angeben, das das Bufferarray im Flash erzeugt 
werden muss?

von Oliver (Gast)


Lesenswert?

Asker schrieb:
> Muss ich nun explitzit angeben, das das Bufferarray im Flash erzeugt
> werden muss?

Müsstest du. Ob das bei deinem Prozessor allerdings überhaupt möglich 
ist, ist offen. Was für einen Prozessor verwendest du denn?

Nun ist die Funktion "Displayausgabe" ja kein Bestandteil irgend einer 
Standardbibliothek, die hat ja mal jemand geschrieben. Vielleicht gibt 
es davon auch eine Varianten, die Daten aus dem Ram akzeptiert.

Aber bevor du das machst, besorgts du dir ein C-Buch, und versuchst 
zumindest mal die allereinfachsten basics der Sprache (wie z.B. Chars 
und Strings, und wie groß char-Arrays für Strings sein sollten) zu 
verstehen (und das, was passiert, wenn man char Arrays zu klein 
dimensioniert)

Oliver

von Asker (Gast)


Lesenswert?

Meine Integervariable muss nur Werte von 0...100 annehmen.

Ich verwende einen Atmega128 und habe die Funktion

Displayausgabe(flash char* string);

als Vorgabe.

von LEEESEN! (Gast)


Lesenswert?


von Oliver (Gast)


Lesenswert?

Asker schrieb:
> Meine Integervariable muss nur Werte von 0...100 annehmen

Und genau deshalb kam mein Tpp mit dem C-Buch. Mach das, wirklich. Sonst 
wird das nichts.

Asker schrieb:
> Ich verwende einen Atmega128 und habe die Funktion
> Displayausgabe(flash char* string);
> als Vorgabe.

Tja, dann wirt du dir wohl eine passende Ausgabe-Funktion selber 
schreiben müssen. Beim AVR bekommst du keine Daten während der Laufzeit 
ins FLASH, "Displayausgabe" ist damit für deine Aufgabe nicht geeignet 
(wobei, zugebenermaßen stimmt das nicht ganz, man bekommt auch Daten ins 
FLASH, aber das ist was für jemanden mit richtig Programmiererfahrung). 
Ich kann mir aber nicht vorstellen, daß es da wirklich eine andere 
Ausgabefunktion geben soll, die den String aus dem SRAM als Parameter 
nimmt.

Zjm Selberschreiben soclh einer Funktion gilt erst recht mein Tipp: 
Besorg die ein C-Buch...

Oliver

von Mitleser (Gast)


Lesenswert?

Anscheinend hat keiner mitbekommen, dass Asker mit CodevisionAVR 
programiert und nicht mit GCC. In CodevisionAVR gibt es fertige 
Funktionen, mit denen Konstanten direkt aus dem Flash während der 
Laufzeit ausgelesen werden können.

@Asker:

>Ich verwende einen Atmega128 und habe die Funktion

>Displayausgabe(flash char* string);

Die Fehlermeldung sagt dir doch ganz eindeutig, was du falsch machst. Du 
willst Daten aus dem RAM mit einer Funktion verwenden, die einen Pointer 
auf Daten im Flash verlangt. Das kann nicht funktionieren und deshalb 
weigert sich der Compiler auch zu recht, deinen Code zu kompilieren.

Wenn du ein normales alphanumerisches Display (HD44780-kompatibel) 
verwendest, gibt es in CodevisionAVR übrigens fix und fertige Funktionen 
zur Stringausgabe, siehe CVAVR-Hilfe:

void lcd_puts(char *str)
displays at the current display position the string str, located in RAM.

void lcd_putsf(char flash *str)
displays at the current display position the string str, located in 
FLASH.

Alles klar?

von Oliver (Gast)


Lesenswert?

Mitleser schrieb:
> In CodevisionAVR gibt es fertige
> Funktionen, mit denen Konstanten direkt aus dem Flash während der
> Laufzeit ausgelesen werden können.

Das mag ja so sein, aber manchmal ist es hifreich, einen Thread ganz zu 
lesen. Von der Ausgangsfrage bis zum Ende. Denn eine Antwort auf eine 
Frage, die man gar nicht kennt, geht häufig in die Hose.

Asker schrieb:
> Wenn ich
> Displayausgabe(intvar);
> schreibe, so erhalte ich folgende Fehlermeldung:

Oliver

von Asker (Gast)


Lesenswert?

So, nun bin ich fertig mit lesen ;-)

Ich möchte kurz zusammenfassen, was ich "verstanden" habe um sicher zu 
gehen, dass ich nichts falsch interpretiert habe.

Wenn ich schreibe
Displayausgabe("Testausgabe");
dann ist der String "Testausgabe" im Flash gespeichert.

Ich brauche aber eine Ausgabefunktion, die Daten aus dem RAM (Speicher 
für meine Variablen, die sich während des Programmablaufs ändern) aufs 
Display ausgibt.

Diese Ausgabefunktion brauche ich eigentlich nur für Float-Variable, die 
sich während des Programms ändern (hier reicht mir meine anfangs 
angenommene intvar von oben doch nicht) und diese Funktion muss ich nun 
noch selbst schreiben.

So schreibe ich eine Ausgabefunktion, die einen "char *str" als 
Parameter besitzt und wandle meine Floatvariable vor der Ausgabe mit 
ftoa um.
Ich könnte mit dieser Funktion auch den String "Testausgabe" ausgeben, 
wenn ich ihn z.B. einen Char-Pointer, bei der Deklaration innerhalb 
einer Funktion zuweise, oder?

Ist dies der effizienteste Weg, da ich in meinem Programm häufig meine 
Float-Variable ausgeben möchte?

von Rolf Magnus (Gast)


Lesenswert?

Asker schrieb:
> Ist dies der effizienteste Weg, da ich in meinem Programm häufig meine
> Float-Variable ausgeben möchte?

Wenn du auf einem AVR mit float arbeitest, hat sich das mit der 
Effizienz sowieso schon erledigt.

von Asker (Gast)


Lesenswert?

Wie soll ich sonst eine Variable um 0.2 oder 0.1 erhöhen?

Bin ja für jede Anregung dankbar und möchte dazulernen

von Rolf Magnus (Gast)


Lesenswert?

Asker schrieb:
> Wie soll ich sonst eine Variable um 0.2 oder 0.1 erhöhen?

Naja, ich hab nicht gesagt, daß du float nicht verwenden darfst, sondern 
nur, daß es ziemlich langsam ist. Da bringt es nicht mehr viel, noch ein 
paar Takte aus der Ausgabefunktion rauszukitzeln.

Aber um die Frage zu beantworten: Festkommaarithmetik verwenden.

von Oliver (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Naja, ich hab nicht gesagt, daß du float nicht verwenden darfst, sondern
> nur, daß es ziemlich langsam ist.

Wobei "langsam" auch relativ ist. Schneller, als man kucken kann, ist 
float allemal.

Oliver

von us73 (Gast)


Lesenswert?

Das hier:

> "function argument #1 of type 'unsigned char [3]' is incompatible with
> required parameter of type 'flash unsigned char *' "

und das hier:

> Meine Integervariable muss nur Werte von 0...100 annehmen.

stinkt zum Himmel, wenn Du das so:

> ftoa um.

verarbeitest.

Lies dir durch, wie Strings in C beschrieben sind, welche Eigenschaften 
sie haben, insbesondere wie sie terminiert werden.
Und dann was ftoa macht, um den String zu terminieren.

Überlege, wieviel Platz Du bereitstellen musst, wenn Du ftoa verwendest.
Passen deine Daten, also der String, den ftoa schreiben will, da rein ?

Ob Du das dann mit Floats machst oder mit einem anderen Typ hängt davon 
ab, wie es mit der Performance etc. ausschaut.
Evtl. kannst Du dir ja Gedanken machen, deine Werte nicht in einer 
einzigen Variablen abzulegen - nur Du weisst, wie genau die Auflösung 
deines Wertes sein soll.

von Tom M. (tomm) Benutzerseite


Lesenswert?

Asker schrieb:

> Meine Integervariable muss nur Werte von 0...100 annehmen.
...
> Wie soll ich sonst eine Variable um 0.2 oder 0.1 erhöhen?

Du könntest statt der Festkomma-Arithmetik auch die Programm-interne 
Konvention verwenden, dass diese Variable Zehntel repräsentiert.

Wertebereiche der Datentypen beachten! Ich deklariere meine ganzzahligen 
Datentypen meistens als [u]int_{8,16,32}, da weiss ich genau, was ich 
habe/kriege. :) Kenne deine Compiler/libc Kombination nicht, wird aber 
sicher auch was in der Richtung haben.

von Rolf Magnus (Gast)


Lesenswert?

Oliver schrieb:
> Rolf Magnus schrieb:
>> Naja, ich hab nicht gesagt, daß du float nicht verwenden darfst,
>> sondern nur, daß es ziemlich langsam ist.
>
> Wobei "langsam" auch relativ ist. Schneller, als man kucken kann, ist
> float allemal.

Das war ja auch bezogen auf "Da bringt es nicht mehr viel, noch ein
paar Takte aus der Ausgabefunktion rauszukitzeln" und nicht darauf, wie 
schnell man "kucken" kann.

Tom M. schrieb:
> Du könntest statt der Festkomma-Arithmetik auch die Programm-interne
> Konvention verwenden, dass diese Variable Zehntel repräsentiert.

Das ist Festkommaarithmetik.

von Oliver (Gast)


Lesenswert?

Oliver schrieb:
> Wobei "langsam" auch relativ ist. Schneller, als man kucken kann, ist
> float allemal.

Das bezog sich ja auch auf

Asker schrieb:
> Ist dies der effizienteste Weg, da ich in meinem Programm häufig meine
> Float-Variable ausgeben möchte?

und nicht, ob man irgendwo noch ein paar Takte herauskitzeln kann (oder 
muß).

Oliver

von Asker (Gast)


Lesenswert?

Hi

nun habe ich folgende Zeilen programmiert:
char Buffer[20];
itoa(intvar,Buffer);
Displayausgabe_RAM(intvar);

wobei die Displayausgabe_RAM wie folgt definiert ist:
char len;
char i;
len = strlen(me->string);
"Display_Senden-Kopf über die SPI "
for (i = 0; i < len; i++)
{
  spi(me->string[i]);
}
  spi(0x00);


Ich hoffe, ihr könnt verstehen, was ich meine. Ausgegeben wird leider 
nichts.

von Karl H. (kbuchegg)


Lesenswert?

Asker schrieb:

> Ich hoffe, ihr könnt verstehen,

Das einzige was ich nicht verstehe ist, warum sich deine String 
Ausgabefunktion nicht auf eine Zeichenausgabefunktion stützt. In deinem 
Fundus an Funktionen existiert mit Sicherheit eine Funktion die das 
kann. Oder wie gibt Displayausgabe den gelesenen char aus?

(Übrigens ein saublöder Name für eine Funktion. Der Name 
"Displayausgabe" erzählt mir nichts darüber was die Funktion macht. OK, 
sie gibt offenbar irgendetwas auf einem Display aus. Aber was ist dieses 
irgendetwas? Ist das ein String, ein int, ein float oder vielleicht ganz 
was anderes? Man weiß es nicht)
1
void Displayausgabe_RAM( char * text )
2
{
3
  while( *text != '\0' ) {
4
    lcd_putc( *text );
5
    text++;
6
  }
7
}

lcd_putc ist eine Funktion, die ein einzelnes Zeichen ausgeben kann, 
einen einzelnen char. Wenn du die hast, dann kannst du sie benutzen um 
damit eine Funktion zu bauen, die einen String ausgeben kann.

Und wenn du die String Funktion wiederrum hast, kannst du mit ihrer 
Hilfe eine Funktion bauen, die einen int ausgeben kann
1
void lcd_puti( int wert )
2
{
3
  char buffer[20];
4
5
  itoa( wert, buffer, 10 );
6
  Displayausgabe_RAM( buffer );
7
}

und so baut man sich aus einfachen Funktionen, mit einfacher 
Funktionalität (in diesem Fall: lcd_putc) komplexere Funktionen 
zusammen, die mehr und schwierigere Dinge können. Aber es steht und 
fällt alles mit den einfachen Funktionen. Also fang mit denen an. Die 
lassen sich auch leicht schreiben.

Und kauf dir ein C-Buch

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.