www.mikrocontroller.net

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


Autor: Mario (Gast)
Datum:

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

Autor: Wolfgang Horn (Gast)
Datum:

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

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.