Forum: Compiler & IDEs LCD will keine Strings die länger als 3 Zeichen sind ausgeb


von Mario (Gast)


Lesenswert?

Hallo!!!!!
Ich benutze einen ATmega 32...mit einer Taktfrequenz von 3,6864 MHz
main.c:
#include<avr/io.h>
#include<avr/delay.h>
#include "lcd.h"           // eigene lcd lib getester mit atm16 alle
ports



int main (void)
{
char text[]="Keb";
char text2[]="Keb";

init();
boot('.',1,1,1);   // zeichen'a'  wie oft0-255  nur zeile 1
(bug)/ pos spalte 1-24
run(2);
boot('.',1,1,1);   // zeichen'a'  wie oft0-255  pos zeile 1
(bug)/ pos spalte 1-24
run(2);
boot('.',1,1,1);   // zeichen'a'  wie oft0-255  pos zeile 1
(bug)/ pos spalte 1-24
clear();            // löscht aktuelle eingabe / pos 1,1


pos(1,1);
print(text);
//drucken(text, 1,1);          // ausgabe string
pos(2,1);
run(20);
//drucken(text, 2,1);            // ausgabe string
run(20);


for(;;){ }                            //endlosschleife

}

lcd.h:
#include<avr/io.h>
#include<avr/delay.h>
#include<string.h>

#define ddrx DDRA
#define portx PORTA
#define db4 PINA0
#define db5 PINA1
#define db6 PINA2
#define db7 PINA3
#define rs  PINA4
#define rw  PINA5
#define en   PINA6
#define led PINA7


void delay(void);                   // 3 takte verzvgerung
void delay5ms(void);                 // 5 ms verzögerung
void enable(void);                  // erzeugen des enable puls
void buisy(void);                   // warten bis bereit(nur durch
zeitverzvgerung)
void comm(unsigned char comm);            // schreibt commando
void data(unsigned char data);            // schreibt daten
void init(void);                    // initialisiert display
void clear(void);                   // löscht display
void pos(unsigned char l,unsigned char p);       // zeile spalte   1/2
1-24
void print(char buffer []);                      // gibt string aus
void drucken(char buffer2 [],int x,int y);
void boot(unsigned char zeichen,unsigned char  zahl
    ,unsigned char  zeile,unsigned char  sp);
     //zeichen anzahl durchgänge  zeile / spalte)
void run(char ms100);


// drei takte warten
void delay(void)
{
asm volatile(  "nop\n\t"
        "nop\n\t"
               "nop\n\t"::);}

//enable ein aus
void enable(void)
{
portx |= (1 << en);        // setzt bit
delay();
portx &= ~(1 << en);         // lvscht Bit
}


void delay5ms(void)
{
// inline asm warteschleife
asm volatile(

                                    "push R16"            "\n\t"
                                    "push R17"            "\n\t"
                  "ldi  R16, 0x25"      "\n\t"
        "WGLOOP0:""\n\t"    "ldi  R17, 0xA5"      "\n\t"
        "WGLOOP1:""\n\t"     "dec  R17"            "\n\t"
                        "brne WGLOOP1"        "\n\t"
                        "dec  R16"            "\n\t"
                        "brne WGLOOP0"        "\n\t"

                        "pop R16"              "\n\t"
                                    "pop R17"
    "\n\t"::);}





// wartet bis lcd bereit
void buisy(void)
{
_delay_ms(15);

}


// sendet comando --- rs nicht gesetzt

void comm(unsigned char comm)
{
buisy();
unsigned char comm1 = comm;
portx = (0x0f & (comm>>4));
enable();
portx = (0x0f & (comm1));
enable();

}



// sendet daten    -- rs gesetzt


void data(unsigned char data)
{
buisy();
unsigned char data1 = data;           // daten geseichert
portx = (0x1f & (data>>4)|(1 << rs));           // rechtschieben
enable();
portx = (0x1f & ((data1))|(1 << rs));             // ausgabe sicherung
enable();
}

void init(void){

ddrx  = 0xff;
portx = 0xff;

// 15 ms warten

unsigned char d= 10;
do{ --d;
  delay5ms();

  }while(d  != 0 );


// drei mal 8 bit initialisieren
portx = (0b00000011);
enable();
delay5ms();
enable();
delay5ms();
enable();

// 4 bit modus aktivieren
delay5ms();
portx = (0b00000010);
enable();
delay5ms();

// sachen einstellen
comm(0b00101000);          //2zeilig 5*8
delay();
comm(0b00001000);
delay();
comm(0b00000001);
delay();
comm(0b00000010);
delay();
comm(0b00001100);
// display lvschen
}



void clear(void)
{
comm(0b00000001);
pos(1,1);
}


void pos(unsigned char l,unsigned char p)
{
unsigned char pos = 0b10000000;
if(l==1){
    pos |= p-1;
      }
if(l==2){
        p =+40;
    pos |= p;
      }
comm(pos);


}



//
void print(char buffer [])
{
for ( int i = 0; buffer [i] !='\0'; i++)
    data(buffer[i]);
}

void boot(  unsigned char zeichen,unsigned char  zahl,
      unsigned char  zeile,unsigned char  sp)
{
do{
unsigned char spalte= sp;
zahl = zahl-1;
_delay_ms(100);
pos(zeile, spalte);
print("      ");
pos(zeile,spalte);
_delay_ms(100);
data(zeichen);
_delay_ms(100);
data(zeichen);
_delay_ms(100);
data(zeichen);
_delay_ms(100);
data(zeichen);
_delay_ms(100);
data(zeichen);

  }while(zahl != 0);

}

void drucken(char buffer2 [],int x,int y)
{
pos(x,y);
int i=0;
while(i<=strlen(buffer2))
{

print(buffer2[i]);
y=y+1;
pos(x,y);
i=i+1;
}
}


/*void drucken(unsigned char *p)
{
  do
    {
    data(*p);
    p++;
    }
    while (*p!='\0');

}
*/

void run(char ms100)
{
unsigned char d= ms100;
do{ --d;
  _delay_ms(100);

  }while(d  != 0 );
  portx |= (1 << led);        // setzt bit
  d= ms100;
do{ --d;
  _delay_ms(100);

  }while(d  != 0 );
     portx &= ~(1 << led);         // löscht Bit

}

Problem:

Ich kann mit diesem Programm nur Strings die 3 Symbole lang sind
ausgeben. Will ich mehr als 3 ausgeben gibt das Display nur Blödsinn
aus.
Schreibe ich den Text hingegen direkt in die print funktion hinein gibt
er den ganzen Text aus. z.B: print("Test");
Um dem Problem aus dem Weg zu gehen habe ich eine Funktion geschrieben
die den String auf dessen einzelnen Symbole aufspalltet und einzel
ausgibt.
mit:
char text[5];

text[0]='T';
text[1]='e';
text[2]='s';
text[3]='t';
text[0]='\0';

Habe auch schon versucht den String in die oben stehende Form
umgewandelt und dann ausgegeben.
Das führte aber auch zu keinem Ergebnis

von Wolfgang Horn (Gast)


Lesenswert?

Hi, Mario,

ich bin einer von Hunderten von Lesern dieser Mail.
Ich habe weder die Muße, noch genügend Masochismus in mir, um Dein
Listing genau zu lesen.

Vor allem nicht, nachdem ich in den ersten Zeilen las "eigene lcd.h",
diese aber ohne Inhalt.

Bitte grenze den Fehler ein. Ist es das LCD selbst? Funktioniert es mit
den LC-Funktionen von Peter Fleury? Welche Funktion genau spielt nicht?
Wenigstens andere?
Du kennst das alles, scheinst es mit dem Atmega16 auch geschafft zu
haben.
Ich vermute, wenn Du den Fehler so erst mal geortet hast, dann brauchst
Du auch niemanden mehr zu fragen.

Toi, toi, toi.
Wolfgang Horn

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.