Hallo,

ich habe immer noch nicht den Fehler in meinem Skript gefunden. Witzigerweise taucht manchmal Hallo ganz schwach im Display auf. Manchmal aber auch nicht. Das C-Programm arbeitet offensichtlich nicht richtig. Ich habe schon in die main eine Endlosschleife eingebaut.
Aber wenn ich das Assemblerskript von Sprut nehme funktioniert das ganze immer Einwand frei. Da sieht man das Wort Hallo gut. Also kann es nicht am Kontrast liegen.

Hier noch mal mein Code [Ich weiss, dass man C-files nicht in eine header-file auslagert - aber anders versteht MikroC das nicht - oder ich müsste alles in eine Datei schreiben]:
Code:
#include <lcd.h>
void inittheLCD ();
 void schreiben(char byte);

 
void main() {
     TRISB = 0;
     PORTB = 0;
     TRISA = 0;
     PORTA = 0;
     PORTA.F0 = 1;
     inittheLCD();
     PORTA.F0 = 0;
     schreiben('H');
     schreiben('a');
     schreiben('l');
     schreiben('l');
     schreiben('o');
     Delay_ms(10);
     while(1);
}
und die lcd.h:
Code:
#define ENABLE PORTB.F0
#define RS PORTB.F2
#define RW PORTB.F3
#define D4 PORTB.F4
#define D5 PORTB.F5
#define D6 PORTB.F6
#define D7 PORTB.F7
#define T4 TRISB.F4
#define T5 TRISB.F5
#define T6 TRISB.F6
#define T7 TRISB.F7

void controlachtbit(char byte);
 void inittheLCD();
 void OutLcdControl(char byte);
 void display_loeschen_cursor();
 void display_on();
 void display_off();
 void cursor_anfang();
 void entry_mode();
 void zwei_zeilig();
 void ausfuehren();
 void busy();
 void schreiben(char byte);


void inittheLCD()
{
/*Initialisierung des LCD-Displays*/
    Delay_ms(250);
    //LCD auf 8bit initialisieren (3mal)
    controlachtbit(0b00110000);
    Delay_ms(50);
    controlachtbit(0b00110000);
    Delay_ms(50);
    controlachtbit(0b00110000);
    Delay_ms(50);
    controlachtbit(0b00110000);
    Delay_ms(50);
    controlachtbit(0b00110000);
    Delay_ms(50);
    //LCD auf 4bit initialisieren
    controlachtbit(0b00100000);
    //LCD auf 4bit initialisieren
    controlachtbit(0b00100000);
    //2zeilig
    zwei_zeilig();
    //Display: aus
    display_off();
    //Display loeschen - curser home
    display_loeschen_cursor();
    //Eingabemodus
    entry_mode();
    //Curser Anfang:
    cursor_anfang();
    //Display: an
    display_on();
}
void controlachtbit(char byte)
{
       /*Ein Steuerbyte 8bittig uebertragen*/
       PORTB = 0;
       D4 = byte.F4;
       D5 = byte.F5;
       D6 = byte.F6;
       D7 = byte.F7;
       ausfuehren();
       //Test:
       PORTA.F3 = D7;
       return;
}

void OutLcdControl(char byte){
/*Ein Steuerbyte 4-bittig uebertragen*/
       busy();
       PORTB = 0;
       D4 = byte.F4;
       D5 = byte.F5;
       D6 = byte.F6;
       D7 = byte.F7;
       ausfuehren();
       busy();
       PORTB = 0;
       D4 = byte.F0;
       D5 = byte.F1;
       D6 = byte.F2;
       D7 = byte.F3;
       ausfuehren();
       busy();

       //Test:
       PORTA.F2 = 1;
       return;
}
void display_loeschen_cursor(){
//Display wird geloescht und Cursor an den Anfang gesetzt
          OutLcdControl(1);
}
void display_on(){
//Display wird eingeschaltet
          OutLcdControl(15);
}
void display_off(){
//Display wird ausgeschaltet
          OutLcdControl(8);
}

void cursor_anfang(){
//Curser wird an den Anfang gesetzt
         OutLcdControl(3);
}
void entry_mode(){
//LCD wird auf eingabemodus geschaltet
      OutLcdControl(0b00000110);
}
void zwei_zeilig(){
//LCD wird auf 2 zeilig eingestellt
      OutLcdControl(0b00101000);
}
void ausfuehren(){
       //ein Befehl wird ausgefuehrt (LCD-ENABLE an und aus)
      ENABLE = 1;
      Delay_ms(15);
      ENABLE = 0;
      Delay_ms(15);
}
void busy(){
       /*Diese Fkt. laueft solange bis das Busyflag 0 ist*/
       PORTB = 0;
       //Datenbus auf Eingabe schalten
       T4 = 1;
       T5 = 1;
       T6 = 1;
       T7 = 1;
       RW = 1;
       while(1){
          ENABLE = 1;
          Delay_ms(10);
          if(D7 == 0)//Wenn das Busy-Flag 0 ist - dann wird diese Schleife abgebrochen
                break;
          ENABLE = 0;
          Delay_ms(20);
          ENABLE = 1;
          Delay_ms(20);
          ENABLE = 0;
          Delay_ms(20);
      }
      ENABLE = 0;
      Delay_ms(20);
      ENABLE = 1;
      Delay_ms(20);
      ENABLE = 0;
      //Datenbus auf Ausgabe schalten
      T4 = 0;
      T5 = 0;
      T6 = 0;
      T7 = 0;
      PORTB = 0;
}
void schreiben(char byte){
       busy();
       PORTB = 0;
       D4 = byte.F4;
       D5 = byte.F5;
       D6 = byte.F6;
       D7 = byte.F7;
       RS = 1;
       ausfuehren();
       busy();
       PORTB = 0;
       D4 = byte.F0;
       D5 = byte.F1;
       D6 = byte.F2;
       D7 = byte.F3;
       RS = 1;
       ausfuehren();
       busy();

}
Ich möchte - damit endlich mal fertig werden und nicht 4 Tage lang hinter einem blöden Fehler hersuchen.

Mit freundlichen Grüßen,
Sebastian