mikrocontroller.net

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


Autor: Sven W. (wache)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <avr/pgmspace.h>
#include "string.h"
#include <avr/io.h>
#include <stdint.h>
#include <i2cmaster/twimaster.c>

#define DC1 0x17
#define DC2 0x12
#define ESC 0x1B
#define ACK 0x06
#define NAK 0x15
#define NUL 0x00

void text_send(int xpos, int ypos, char *text);
   
int main(void)
{ 
char str3[] = "Hallo Welt!";

 text_send(0,20, str3);
 return 0;
}


void text_send(int xpos, int ypos, char *text)
{
 int len, bcc, i;
 len = strlen(text);
 for (i = 0; i == len; i++)
    {
    bcc += text[i];
    }
 bcc += DC2 + ESC + len + 1 + 'Z' + 'L' + xpos + ypos;
 bcc %= 0x100;
 i2c_start(0x10);
 i2c_write(DC2);
 i2c_write(len + 1);
 i2c_write('Z');
 i2c_write('L');
 i2c_write(xpos);
 i2c_write(ypos);
 for (i=0; i == strlen(text); i++)
    i2c_write(text[i]);
 i2c_write(NUL);
 i2c_write(bcc);
}

Autor: Sven '\0' (--j)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

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

Autor: Matthias Nix (vbchaos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
text_send(0,20, (char *)str3);

Autor: Sven W. (wache)
Datum:

Bewertung
0 lesenswert
nicht 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:

#include <avr/pgmspace.h> 
#include "string.h"


int UP(char * ptr);  

unsigned int len; 

void main() 
 { 
 char str3[] = "Hallo Welt!"; 
 len = UP(str3);
 } 

int UP(char * ptr)
{
int i = 0;
i = strlen (ptr);
return i;
}

Ich verstehe mien Problem nicht...

Gruß,

Sven

Autor: Sven '\0' (--j)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mano Wee (Firma: ---) (manow)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Sven W.

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

Autor: Matthias Nix (vbchaos)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.
void text_send (int xpos, int ypos, char * text)
{
    int * t;
    int bcc = 0;

    for (t = text; *t != '\0'; t++)
    {
        bcc += 1 + *t;
    }
    bcc += DC2 + ESC + 1 + 'Z' + 'L' + xpos + ypos;

Autor: Sven W. (wache)
Datum:

Bewertung
0 lesenswert
nicht 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

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.