Forum: Mikrocontroller und Digitale Elektronik String an ein Unterprogramm übergeben


von Sven W. (wache)


Lesenswert?

Moin!

Ich habe einen AT90CAN128 und ein EA eDIP240 und möchte das Display 
gerne über I2C ansprechen.
Da ich keien Lust habe, jedes mal den ganzen Wust zu schreiben, wollte 
ich mir ein Unterprogramm zum senden des Textes schrieben. Leider mache 
ich irgendwo bei der Übergabe noch einen Fehler! Leider sehe ich ihn 
aber nicht!
Wenn im Unterprogramm versucht wird, die Länge des String zu ermitteln, 
kommt immer 0 bei raus.

Edit: Als Compiler verwende ich den AVR GCC in der aktuellen Version.

Könnt ihr mir helfen?

Hier der Code:
1
#include <avr/pgmspace.h>
2
#include "string.h"
3
#include <avr/io.h>
4
#include <stdint.h>
5
#include <i2cmaster/twimaster.c>
6
7
#define DC1 0x17
8
#define DC2 0x12
9
#define ESC 0x1B
10
#define ACK 0x06
11
#define NAK 0x15
12
#define NUL 0x00
13
14
void text_send(int xpos, int ypos, char *text);
15
   
16
int main(void)
17
{ 
18
char str3[] = "Hallo Welt!";
19
20
 text_send(0,20, str3);
21
 return 0;
22
}
23
24
25
void text_send(int xpos, int ypos, char *text)
26
{
27
 int len, bcc, i;
28
 len = strlen(text);
29
 for (i = 0; i == len; i++)
30
    {
31
    bcc += text[i];
32
    }
33
 bcc += DC2 + ESC + len + 1 + 'Z' + 'L' + xpos + ypos;
34
 bcc %= 0x100;
35
 i2c_start(0x10);
36
 i2c_write(DC2);
37
 i2c_write(len + 1);
38
 i2c_write('Z');
39
 i2c_write('L');
40
 i2c_write(xpos);
41
 i2c_write(ypos);
42
 for (i=0; i == strlen(text); i++)
43
    i2c_write(text[i]);
44
 i2c_write(NUL);
45
 i2c_write(bcc);
46
}

von Sven '. (--j)


Lesenswert?

Moin,

die for-Schleife wird durchlaufen solange die Bedingung
1
i == len
erfüllt ist. Also genau ein mal wenn der String die Länge 0 hat.

von Matthias N. (vbchaos)


Lesenswert?

1
text_send(0,20, (char *)str3);

von Sven W. (wache)


Lesenswert?

Moin!

@ Sven J.: Das ist ja die Folge aus meinem Problem. Für die Länge wird 
immer 0 ermittelt. Die Korrekte Länge wäre aber 11!

@ Matthias: Die Veränderung hat leider keinen Erfolg gebracht...

Ich kämpfe mit diesem Problem schon seit Tagen...

Interessanterweise funktioniert dies aber einwandfrei:

1
#include <avr/pgmspace.h> 
2
#include "string.h"
3
4
5
int UP(char * ptr);  
6
7
unsigned int len; 
8
9
void main() 
10
 { 
11
 char str3[] = "Hallo Welt!"; 
12
 len = UP(str3);
13
 } 
14
15
int UP(char * ptr)
16
{
17
int i = 0;
18
i = strlen (ptr);
19
return i;
20
}

Ich verstehe mien Problem nicht...

Gruß,

Sven

von Sven '. (--j)


Lesenswert?

Nein, die for-Schleife wird eben nur genau dann EIN mal durchlaufen, 
wenn du einen String der Länge 0 übergibst. Ein String mit einer Länge > 
0 führt dazu, dass die for-Schleife genau null mal durchlaufen wird, da 
die Lauf-Bedingung NICHT erfüllt ist.

von Mano W. (Firma: ---) (manow)


Lesenswert?

@Sven W.

aus interesse gefragt, für was gehört das bcc eigentlich bzw. was bringt 
das?
1
void text_send(int xpos, int ypos, char *text)
2
{
3
 int len, bcc, i;
4
...
5
 for (i = 0; i == len; i++)
6
    {
7
    bcc += text[i];
8
    }
9
 bcc += DC2 + ESC + len + 1 + 'Z' + 'L' + xpos + ypos;
10
 bcc %= 0x100;
11
...
12
 i2c_write(bcc);
13
}

von Matthias N. (vbchaos)


Lesenswert?

JappJapp, Sven '\0' hat recht. In einer FOR-Schleife ist das eine 
LAUFbedingung, keine ABBURCHbedingung. Entsprechend muss da statt i == 
strlen(text) natürlich i < strlen(text) hin

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

1) die Bedingung in der Schleife ist wie gesagt falsch
2) bcc wird nicht initialisiert. Ergo: aktiviere Warnungen: -W -Wall und 
beachte sie. Warnungen sind leichter zu korrigieren als Laufzeitfehler.
3) unten greift text[i] (bei korrekter schleife oben) ins Leere bzw ist 
immer 0.
1
void text_send (int xpos, int ypos, char * text)
2
{
3
    int * t;
4
    int bcc = 0;
5
6
    for (t = text; *t != '\0'; t++)
7
    {
8
        bcc += 1 + *t;
9
    }
10
    bcc += DC2 + ESC + 1 + 'Z' + 'L' + xpos + ypos;

von Sven W. (wache)


Lesenswert?

Moin!

ersteinmal vielen Dank für Eure Antworten!
Man wird mit der Zeit wirklich blind... Ich habe die For-Schleife nun 
durch While-Schleifen ersetzt und siehe da, das läuft nun besser.

@ Mano Wee:
Das bcc ist die Checksumme der I2C Botschaft. Das Display erwartet 
diese. Es liegt folgende Formel zugrunde:
bcc = Summe aus allen Bytes inkl. Kommando und len, Modulo 256

Wenn die Routine fertig ist, werde ich sie hier nocheinmal posten.

Gruß,

Sven

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.