PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : string an lcd senden, string in pointer speichern



andi.studi
24.07.2008, 18:37
hallo mic,
und alle anderen microcontroller freunde.

weiß einer von euch wieso ich zwar folgendermassen einen string ans lcd senden kann:




.
void LCD_WriteString(unsigned char *string)
{
while(*string)
{
LCD_WriteZeichen(*string++); // zeichen am LC-Display ausgeben
}

void main (void)
{
unsigned char buffer[]="hallo";

LCD_Init();

LCD_WriteString(buffer);

while(1);
}


aber in der folgenden form:


void main (void)
{

LCD_Init();

LCD_WriteString("hallo..");

while(1);
}


diese compiler fehlermeldungen bekomme?
196:Warning [2054] suspicious pointer conversion

sie bezieht sich auf "LCD_WriteString("hallo..");"



LCD_WriteZeichen('H'); klappt doch auch.
ich ich müsste einem pointer wie *string ja auch in folgender vorm was zuweisen können:

string="hallo"; oder liege ich da falsch und er schickt <hallo> ins nirvana???


hoffe jemand kann mir helfen

Lif79
24.07.2008, 23:13
Naja, wenn ich das richtig sehe (mein C is nich das beste...):

Beim ersten beispiel wird LCD_WriteString ein "Pointer to String" übergeben, beim zweiten Beispiel wird aber ein String übergeben obwohl ein "Pointer to String" erwartet wird.

BlackDevil
25.07.2008, 10:03
Sieht auch so aus als wenner einen Pointer erwartet. Aber: Es ist auch ein Unterschied ob man 'H' oder "H" übergibt!

p_mork
25.07.2008, 10:07
Die Fehlermeldung kommt daher, dass eine konstante Zeichenkette aus chars besteht, die Funktion LCD_WriteString() aber einen Zeiger auf unsigned char erwartet. Wenn man mit Strings arbeitet, sollte man immer nur chars verwenden, auch wenn es auf dem benutzten System dasselbe ist wie unsigned char.

MfG Mark

andi.studi
25.07.2008, 19:09
hallo pic freunde, danke für die schnellen antworten,

leider bekomme ich wenn ich in der funktion LCD_WriteString() char statt unsigned char verwende folgende fehlermeldung:

197:Warning [2066] type qualifier mismatch in assignment

p_mork
25.07.2008, 22:42
Was genau steht in Zeile 197?

andi.studi
26.07.2008, 00:08
in zeile 197 stand: LCD_WriteString(" ,wie geht's");

hab es etwas abgeändert, jetzt bezieht sich der fehler zwar auf eine andere zeile, aber das ist ja unwichtig, es geht um die gleiche funktion.




/** D E F I N I T I O N S ************************************************** **/

#define PORTLCD LATB
#define TRIS_LCD TRISB
#define LCD_E PORTBbits.RB0
#define LCD_RS PORTBbits.RB2
#define LCD_RW PORTBbits.RB3
#define nop _asm nop _endasm

/************************************************** **************************
/************************************************** ***************************/
//#pragma udata glob_point

/************************************************** ***************************/

#pragma code

/**delay for PicLSBK (16MHz Taktzyklus = 4 MHz Befehlszyklus)*****************/
void delay100us(unsigned char multiplikator)
{
while(multiplikator--) Delay10TCYx(40); //40*10*0,25µs = 100 µs
}
/************************************************** **************************/


void enable(void)
{
nop;
LCD_E = 1; // Daten übernehmen
delay100us(1);
LCD_E = 0;
nop;
}


/**LCD_BUSY**************************************** *************************/
void LCD_BUSY(void)
{
unsigned char temp1;
do
{
TRIS_LCD = 0xF0; // LCD-PORT = high nibbles:eingang; low nibbles:ausgang
//Display abfrage
LCD_RS = 0; // LCD im Befehls-Mode
LCD_RW = 1; // LCD im Lesen-Mode
enable();
temp1 = PORTLCD;

temp1 = temp1 & 0x80;

enable(); // high nibble abfragen (wird für busy-flag abfrage nich weiter benötigt)
} while (temp1==0x80); // wiederhole schleife bis busy-flag (LCD DATA PIN D7) low

delay100us(2);
LCD_RW = 0; // Busy = low: LCD im Schreiben-Mode
TRIS_LCD = 0x00; // LCD-PORT = Ausgänge
PORTLCD = 0x00; // Daten und Steuerleitungen LOW
}


void LCD_WriteZeichen( char zeichen)
{
unsigned char x;

LCD_BUSY(); // Warten bis LCD bereit ist

x = zeichen & 0xf0;
PORTLCD = x; // höherwertiges nibbel an LCDPORT übergeben
LCD_RS = 1; // LCD im Daten-Mode
LCD_RW = 0; // LCD im Schreiben-Mode
enable(); // high nibble bei fallenden Flanke von enable an LCD senden

x = zeichen;
x = (x << 4)& 0xf0; //niederwertiges nibbel an LCDPORT übergeben
PORTLCD = x;
LCD_RS=1;
LCD_RW = 0;
enable(); // low nibble bei fallenden Flanke von enable an LCD senden

LCD_RS = 0;
PORTLCD = 0x00; // Daten und Steuerleitungen LOW
}

void LCD_WriteString(char *string)
{
unsigned char temp;

temp=*string;
while(temp)
{
LCD_WriteZeichen(temp); // zeichen am LC-Display ausgeben
string++;
temp=*string;
}
}


void LCD_WriteRegister(unsigned char data)
{
unsigned char x;

LCD_BUSY(); // Warten bis LCD bereit ist

x = data & 0xf0;
PORTLCD = x; //höherwertiges nibbel an LCD senden
LCD_RW = 0; // LCD im Schreiben-Mode
LCD_RS = 0; // LCD im Befehl-Mode
enable();

x = data;
x = (x << 4)& 0xf0; //niederwertiges nibbel an LCD senden
PORTLCD = x;
enable();
}


void LCD_Init(void)
{
// LCD initialisieren

TRIS_LCD = 0x00; // LCD-PORT = Ausgänge
PORTLCD = 0x00; // Daten und Steuerleitungen LOW


delay100us (151);
delay100us (151); // warte über 30ms


PORTLCD = 0x30; // Interface auf 8-Bit setzen
enable();

delay100us(46); //warte 4,5ms

// Interface auf 8-Bit setzen
enable(); // Enable (LCD)

delay100us(2); //warte 100µs

enable(); // Interface auf 8-Bit setzen
// Enable (LCD)

delay100us(2); //warte 100µs

PORTLCD = 0x20; // Interface auf 4-Bit setzen
enable(); // Enable (LCD)

LCD_WriteRegister(0x28); // 2-zeilig, 5x8-Punkt-Matrix
LCD_WriteRegister(0x08); // Display aus
LCD_WriteRegister(0x01); // Display löschen
LCD_WriteRegister(0x06); // Kursor nach rechts wandernd, kein Display-Shift
LCD_WriteRegister(0x0f); // Display ein [ 0x0C = ein, 0x08 = aus ]
}


void main (void)
{
LCD_Init();

LCD_WriteZeichen('H');
LCD_WriteZeichen('a');
LCD_WriteZeichen('l');
LCD_WriteZeichen('l');
LCD_WriteZeichen('o');

LCD_WriteString(" ,wie geht's"); // compiler meldet Warning [2066] type qualifier mismatch in assignment

while(1);
}



wodrann kann das liegen

izaseba
26.07.2008, 00:31
hallo,
wie wäre es, wenn Du den char Zeiger in unsigned char Zeiger castest ?

Oder noch besser deine LCD_WriteString Funktion umänderst, daß sie einen Zeiger auf char erwartet.
Gibt es einen Grund, warum der Zeiger unsigned char ist ?

Gruß Sebastian

andi.studi
26.07.2008, 00:56
der einzige grund ist ich wusste es nicht besser ;)

wie kann ich das den bewerkstelligen das die funktion LCD_WriteString einen zeiger auf string erwartet?

void LCD_WriteString(char *string) // siehe code oben

klappt nicht.

izaseba
26.07.2008, 01:11
Es gibt in C keine Zeiger auf String.
Es gibt auch keine Strings so wie man sie von Java oder so kennt.
In C ist ein String ein char Array, das mit einem 0 (kein '0') terminiert ist.

Wenn man jetzt eine Funktion schreiben will, die einen Zeiger auf ein char Array schlucken soll, muß man sie wohl so definieren


void LCD_WriteString(char* string);


Irgendwie logisch.

Bedenke, der Kompiler warnt Dich, daß da was nicht passt,
es ist kein Fehler.
Dein Code müßte trotzdem übersetzt und richtig ausgeführt werden.
Man soll keine Warnungen ignorieren, diese fällt aber in die Kategorie,
nicht wichtig.
Um Ruhe zu kriegen ist es natürlich sinnvoll unsigned an der Stelle wegzulassen.

Gruß Sebastian

andi.studi
26.07.2008, 09:14
hallo, vielleicht hätte ich noch erwähnen sollen, das der text auch nicht ausgegeben wird.

ich bekomme nur "hallo" auf dem display zu sehen (code sehe oben)

so langsam nervt es mich ](*,)

hat jemand eine idee??

izaseba
26.07.2008, 10:06
Das ist komisch,
es sollte schon laufen ...

Das einzigste, was noch auffällt,
ändere
unsigned char temp;
in LCD_WriteString in
char temp;

das wird aber kaum das Problem sein.

Gruß Sebastian

andi.studi
26.07.2008, 12:37
habe ich auch schon probiert, bekomme aber immer die gleiche fehlermeldung:(weß nicht mehr weiter

muss beim c18 compiler auf etwas wichtiges geachtet werden wenn man mit pointern arbeitet?

izaseba
26.07.2008, 14:14
weß nicht mehr weiter

muss beim c18 compiler auf etwas wichtiges geachtet werden wenn man mit pointern arbeiet

Glaub ich nicht, ich arbeite zwar mit gcc, aber es gibt ja Standards.

was passiert denn, wenn Du sowas machst:


char text[] = " ,wie geht's";
LCD_WriteString(text);


Gruß Sebastian

andi.studi
26.07.2008, 14:25
das funktioniert.


void LCD_WriteString(unsigned char *string)
{
while(*string)
{
LCD_WriteZeichen(*string++); // zeichen am LC-Display ausgeben
}

void main (void)
{
unsigned char buffer[]="hallo";

LCD_Init();

LCD_WriteString(buffer);

while(1);
}


sogar mit unsigned char.

aber ich möchte ja den text direckt eingeben. z.b.


LCD_WriteString("hallo..");

andi.studi
13.08.2008, 23:51
so jetzt klappt es endlich :)


void LCD_WriteString(const rom int8 *string)
{
while(*string)
{
LCD_WriteZeichen(*string++); // zeichen am LC-Display ausgeben
}
}