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?
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
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?
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
Meine Integervariable muss nur Werte von 0...100 annehmen. Ich verwende einen Atmega128 und habe die Funktion Displayausgabe(flash char* string); als Vorgabe.
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
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?
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
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?
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.
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
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.
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
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.
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.
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.