mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit Funktion "itoa"


Autor: MCfreak (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe einen AVR an ein Display T6963 angeschlossen. Text und Pixel
kann ich anzeigen lassen. Nur Zahlen (z.B. Int-Variable x=123) kann ich
nicht anzeigen lassen. Wenn ich das so mach wie unten, dann erscheint
der Text "Hallo Test". Was habe ich da falsch gemacht?

void main(void)
{
char test[3];
unsigned int x=82;
t6963cinit();

//sprintf(buffer,"%i",x);
itoa(x,test);

while (1)
      {
        if(PIND.6 == 1)
         {
          lcd_write_string_xy(1,5,test[2]); //Statt die Zahl zeigt er
nochmals "Hallo Test" an
         }
        if(PIND.5 == 1)
         {
          lcd_write_string_xy(1,1,"Hallo Test"); //Text erscheint auf
Display
         }
        if(PIND.4 == 1)
         {
          lcd_Clear_Text();
         }

      };
}

Autor: Andreas W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

versuch es mal mit:

lcd_write_string_xy(1,5,test);

Gruß
Andreas

Autor: MCfreak (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das geht auch nicht. Der Compiler bringt eine Fehlermeldung:
ERROR:pointer are to different memory areas.
Ich mit meinem Latein am Ende.

Autor: Steff (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hatte kuerzlich das gleiche Problem gehabt Zahlen ans Display zu
schicken. Wurde in der stdlib.h fuendig und zwar mit der gleichen
Funktion itoa die du verwendest.
Dort steht die definition:

    extern *itoa(int __val, char *__s, int __radix);

meine Interpretation:
__val:    der zu wandelnde int-Wert
*__s:     der ZEIGER!!! auf das string-Array
__radix:  Teiler fuer das Zahlensystem (2:binaer 10:dezimal ...)

in deinem Fall waere das itoa(x, &buffer, 10);
bei mir hats funktioniert.

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist definitiv Falsch!

char buffer[BUFLEN]; // buffer anlegen
[..]
    printf("buffer @%p, size %d, content %s\n", buffer,
sizeof(buffer), buffer);
[..]

Sowas schon mal ausprobiert?
BTW: RTFK&R ;)

Autor: MCfreak (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Stimmt dieser Ausdruck wirklich?
printf("buffer @%p, size %d, content %s\n", buffer,
sizeof(buffer), buffer);
Jetzt komme ich total durcheinander.

(verwendeter Compiler CodeVision AVR)

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm, was ich damit sagen wollte, ist, daß ihr euch unbedingt das
Kapitel "Pointer & Arrays" anschauen solltet.

Der Ausdruck stimmt, aber es ist möglich, daß CV %p nicht kennt.
Das wäre der Formatstring für Pointer.

Dein Problem liegt aber ganz wo anders.
Leider weis ich nicht, wie man bei CV auf Strings im Flash zugreifen
muss, bei avr-gcc benötigt man dazu "Hilfs-Funktionen" (siehe
pgmspace.h). Vielleicht gibt es ja etwas ähnliches...

Autor: Kai Markus Tegtmeier (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@OldBug

Dafür benötigt Codevision keine speziellen Funktionen. Es genügt, wenn
in der Variablendeklaration das Steuerwort flash eingefügt ist.
Zumindest bei printf regelt Codevision den Rest von selber.
Vielleicht hilft Euch ja dieser alte Thread weiter:

http://www.mikrocontroller.net/forum/read-1-113344...

Gruß
KMT

Autor: Kai Markus Tegtmeier (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@MCFreak:

es wäre sehr nützlich, die Funktion lcd_write_string_xy mal zu sehen.
Ich vermute einen Fehler in der Variablendeklaration. Codevision ist da
sehr restriktiv, was den Speicherort von Variablen angeht.

KMT

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Kai:

http://www.mikrocontroller.net/forum/read-1-118928.html

Nicht von den vielen verschiedenen Namen MCFreaks durcheinander bringen
lassen ;-)

Autor: Kai Markus Tegtmeier (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... Ah, Bäumchen, wechsle dich... machts natürlich nicht gerade
einfacher, darauf zu antworten, weil man nicht weiß, was jetzt
angekommen ist und was nicht...

Auf jeden Fall ist die Funktion lcd_write_string_xy eine
selbstgeschriebene Funktion und ohne die zu kennen, kann man da nicht
viel weiter sagen.


TMK ;-)

Autor: MCfreak (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Funktion lautet:
void lcd_write_string_xy(unsigned int x, unsigned int y, unsigned char
flash *text)    // write String an pos x, y
{
  unsigned int address;

  address = ((unsigned int)y * 22) + x + 0x1000;

  out(0x24,address & 0xff,address >> 8);
  while (*text)
   {
    out(0xC0,0,(*text++)-0x20);
   }
}

Autor: Kai Markus Tegtmeier (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ging ja mal schnell...

So, jetzt kann man da auch mehr sehen. Also: in der Funktion
lcd_write_string_xy gibst Du einen string aus, der im Flash stehen
soll. Das kann mit einer Variablen (die im SRAM steht) in der Funktion
Main nicht funktionieren. Deshalb die Fehlermeldung
"ERROR:pointer are to different memory areas".

Deklariere probeweise mal test[3] nicht innerhalb der Main-Funktion,
sondern als globale Variable am Anfang des Programms. Und dann nimm das
"Flash" aus der Funktionsdeklaration von lcd_write_string_xy.

Die aufrufende Zeile müßte dann lauten:

lcd_write_string_xy(1,5,test);

Mal sehen, was dann passiert...
Gruß
KMT

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Kai:
Sorry, ich hab da was verschwiegen:

http://www.mikrocontroller.net/forum/read-1-119022.html

:-)

Autor: MCfreak (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Kai.

Hei vielen Dank. Jetzt funktioniert es.

Autor: Kai Markus Tegtmeier (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nur kannst Du jetzt mit der modifizierten lcd_write_string_xy keinen
Text mehr ausgeben, der im Flash gespeichert ist, gell ;-)

Dir wird da wohl nix anderes übrigbleiben, als eine weitere Funktion zu
deklarieren, die sich um die Ausgabe von Strings im Flash kümmert...

Na ja, Hauptsache, es läuft. Ich habe aber auch (damals) sehr lange
gebraucht, bis ich diesen Zusammenhang verstanden hatte.

Gruß
KMT

Autor: MCfreak (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok. Das ist mir aufgefallen. Naja dann mache ich halt noch ne zweite
Funktion wo ich dann das Wort flash einsetzte.

Autor: chrissy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
????
hast du nicht in den anderen threads u.a immer behauptet, daß du deine
Funktion auf unser Anraten ohne flash Verweis deklariert hast und es
nicht funktionierte????? Hattest du wohl gar nicht - menno

Naja egal Hauptsache et lüppt jetzt. Glückwunsch

Autor: Kai Markus Tegtmeier (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Selbst diese Konstellation könnte sein. Ich bin mir nicht ganz sicher,
wie es sich auf die Speicherbelegung (memory allocation) auswirkt, wenn
die Variable innerhalb der Funktion Main deklariert wird, und nicht als
globale Variable. So könnte es vorkommen, daß Codevision auch diese
Variante zurückweist...

MfG
KMT

Autor: MCfreak (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich habe meinen C-Code abgeändert.
Jetzt kann ich Text und Zahlen ausgeben.
Nur noch ein kleines Problem habe ich.
Und zwar wenn ich eine Varibale einmal asl Hex und als Dezimalzahl
ausgebe, dann stehen beide Zahlen viel zu weit weg voneiander.
z.B. 309     777
--> lcd_printfz(2,2,"%x %i",777);

Was kann man da tun, damit nur ein Lehrzeichen dazwischen ist?

Autor: MCfreak (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir niemand dazu Helfen?

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kennst die Möglichkeit der Feldbreitenangabe bei printf?

int i;
i = 12;

printf("%2d", i);
Resultat --|12|--

printf("%4d", i);
Resultat --|  12|--

printf("%-4d", i);
Resultat --|12  |--

printf("%04d", i);
Resultat --|0012|--

Statt %d kann selbstredend auch %i verwendet werden.

Autor: MCfreak (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Rufus!

Das wird der Grund dafür sein?

Autor: MCfreak (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kann dies erst heute Abend testen.
Also die Zahlen zeigt das Display schon richtig an.
Es geht ja nur darum, dass zwischen der Zahl 123 und 456 mehrere
Leerzeichen vorhanden sind.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.