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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.