KS0073 (EA DIP204-4) Display Ansteuerung

Problemstellungen in und mit Bezug zur Sprache C

KS0073 (EA DIP204-4) Display Ansteuerung

Beitrag #1 von 18F4550 Fan (Themenstarter) » Do 16. Dez 2010, 21:47

-----------------------------------------------------------------------------------------------------------------------------
Dieses Problem wurde mittlerweile gelöst.
Hier finden Sie das funktionierende Programm: _disk Download (3,9kb)
-----------------------------------------------------------------------------------------------------------------------------

Ah, ok.

Also ich habe mir von Jochen A. die display.h für mein Display. Hier der Code:

Code: Alles auswählen

//-----------------------------------------------------------------//
//                    KS0073 Display Routinen                      //
//-----------------------------------------------------------------//
//                       Author: Neurotoxer                        //
//                         Date: 27.09.2007                        //
//                      Version: 0.2                               //
//                          LCD: EA DIP204-4                       //
//-----------------------------------------------------------------//

//-----------------------------------------------------------------//
//      Port und Pin Settings
//-----------------------------------------------------------------//
#define LCD_DATAPORT      PORTD   //Port für die 4 Datenleitungen
#define LCD_DATAPORTDR      DDRD
#define LCD_DATA0         4
#define LCD_DATA1         5
#define LCD_DATA2         6
#define LCD_DATA3         7
#define LCD_SETPORT         PORTB   //Port für die 3 Steuerleitungen
#define LCD_SETPORTDR      DDRB
#define LCD_RS            0      //Umschalten zwischen Befehl(Low) und Daten
#define LCD_E            2      //Enable bei fallender Flanke

//-----------------------------------------------------------------//
//      Display Befehle
//-----------------------------------------------------------------//
#define LCD_CLEAR         0b00000001      //Löschen des Display, Cursor auf Home
#define LCD_FUNCTION      0b00100100      //4-Bitmodus, RE=1
#define LCD_FUNCTION2      0b00100000      //4-Bitmodus, RE=0
#define LCD_CONTROL         0b00001100      //Display ON, Cursor OFF, Blinken OFF
#define LCD_CONTROL2      0b00001101      //Display ON, Cursor OFF, Blinken ON
#define LCD_CONTROL3      0b00001110      //Display ON, Cursor ON, Blinken OFF
#define LCD_CONTROL4      0b00001111      //Display ON, Cursor ON, Blinken ON
#define LCD_EXTENDED      0b00001001      //5-Dot Fontwidth, Normal Cursor, 4 Lines
#define LCD_ENTRYMODE      0b00000110      //Segment Bidirectional Function (Seg1->Seg60)
#define LCD_DDRAM         0b10000000      //DDRAM Adresse setzen

//-----------------------------------------------------------------//
//      Zeilenadressen und Länge einer Zeile
//-----------------------------------------------------------------//
#define LCD_LINE1         0x00
#define LCD_LINE2         0x20
#define LCD_LINE3         0x40
#define LCD_LINE4         0x60
int    LCD_LINELENGTH=      20;
int    LCD_LINES=         4;

// xus Pause
void pause_us(int us){
   int y=us;
   while(y>0){
      asm volatile("nop");
      asm volatile("nop");
      asm volatile("nop");
      asm volatile("nop");
      asm volatile("nop");
      asm volatile("nop");
      y--;
   }
}

//Display Enable
void display_enable(void){
   LCD_SETPORT&=~(1<<LCD_E);            //RS Low
   LCD_SETPORT|=(1<<LCD_E);            //RS High
   asm volatile("nop");
   LCD_SETPORT&=~(1<<LCD_E);            //RS Low
}

//Byte senden
void display_send(uint8_t byte){
   LCD_DATAPORT=(byte&0b11110000);         //1. High Nibble senden
   display_enable();
   LCD_DATAPORT=(byte<<4);            //2. Low Nibble senden
   display_enable();
   pause_us(100);
}

//Datenbyte senden
void display_data(uint8_t byte){
   LCD_SETPORT|=(1<<LCD_RS);            //RS High
   display_send(byte);
}

//Befehlsbyte senden
void display_command(uint8_t byte){
   LCD_SETPORT&=~(1<<LCD_RS);            //RS Low
   display_send(byte);
   pause_us(2000);
}

//Display löschen, Cursor auf Home
int display_clear(void){
   display_command(LCD_CLEAR);
   return 1;
}

//Text ausgeben
int display_text(char *text){
   int z=0;
   while(text[z]!='\0'){
      display_data(text[z]);
      z++;
   }
   return 1;
}

//Cursor positionieren
int display_position(int z, int s){
   if(z>LCD_LINES || s>LCD_LINELENGTH)
      return 0;
   uint8_t addr=LCD_LINE1;
   if(z==2)
      addr=LCD_LINE2;
   if(z==3)
      addr=LCD_LINE3;
   if(z==4)
      addr=LCD_LINE4;
   addr+=s;
   addr|=LCD_DDRAM;
   display_command(addr);
   return 1;
}

//Text an Position ausgeben
int display_ptext(char *text, int zeile, int spalte){
   display_position(zeile, spalte);
   display_text(text);
   return 1;
}


//Display initialisieren
//Der KS0073 möchte so initialisiert werden:
//1) Clear Display
//2) Set Functions instruction
//3) Control Display ON/OFF instruction
//4) Set Entry Mode instruction
//5) Set Extension Function instruction
//6) Enable Scroll/Shift instruction
//7) Set scroll Quantity instruction
//8) Clear Display
int display_init(void){
   pause_us(15000);
   LCD_DATAPORTDR|=(1<<LCD_DATA0);      //Pins als Ausgänge konfigurieren
   LCD_DATAPORTDR|=(1<<LCD_DATA1);
   LCD_DATAPORTDR|=(1<<LCD_DATA2);
   LCD_DATAPORTDR|=(1<<LCD_DATA3);
   LCD_SETPORTDR|=(1<<LCD_RS);
   LCD_SETPORTDR|=(1<<LCD_E);
   display_command(LCD_CLEAR);         //1
   display_command(LCD_FUNCTION);      //2
   display_command(LCD_CONTROL);      //3
   display_command(LCD_FUNCTION2);
   display_command(LCD_ENTRYMODE);      //4
   display_command(LCD_FUNCTION);
   display_command(LCD_EXTENDED);      //5
   display_command(LCD_FUNCTION2);
   display_command(LCD_CLEAR);         //8
   return 1;
}




Und hier gleich ein Beispielprogramm:

Code: Alles auswählen

#include <avr/io.h>
#include "display.h"


int main(void){
   DDRC=0b00000001;      //led an PC0
   display_init();
   display_ptext("Display-Routinen",1,2);
   display_ptext("Version: 0.2",2,4);
   display_ptext("Author: NeuroToxer",3,1);
   display_ptext("Date: 27.09.2007",4,2);
   //Endlosschleife
   while(1!=2);
   return 1;
}


Doch da ich keinen AVR habe, habe ich folgendes daraus gemacht:

Code: Alles auswählen

#include "display.h"
#include <p18f4550.h>    // Pic .h eigebunden

#pragma config FOSC = HS  //Oscilator Art zwischen 4MHz - 20MHz
#pragma config PWRT = ON  // AN
#pragma config BOR = OFF
#pragma config WDT = OFF  // Watch Dog AUS
#pragma config LVP = OFF
#pragma config PBADEN = OFF
#pragma config VREGEN = OFF
#pragma config MCLRE = ON  // Master Reset AN

#pragma code     //Code soll in den Programmspeicher geschrieben werden


int main(void){
  DDRC=0b00000001;    //led an PC0
  display_init();
  display_ptext("Display-Routinen",1,2);
  display_ptext("Version: 0.2",2,4);
  display_ptext("Author: NeuroToxer",3,1);
  display_ptext("Date: 27.09.2007",4,2);
  //Endlosschleife
  while(1!=2);
  return 1;
}


Doch kommt leider beim Compilen folgender Fehler:

C:\MCC18\h\display.h:52:Error: syntax error

_____________________________-

Liegt das daran, weil das in Zeile 52 ein AVR Code ist ? Und wie mache ich da C draus ? Ich denke viel umschreiben ist das nicht.

lg Tim

Werbung

Re: PIC µC - Referat

Beitrag #2 von pic18 » Fr 17. Dez 2010, 14:16

ich weiß nicht was die Zeile 52 ist. Die vorletzte Zeile in Main müßte anstatt "while(1!=2);" while(1);" heißen,
wenn es eine Endloschleife werden soll und Main nicht mit Return endet.

Ändern-Button benutzen :D

Anstatt " asm volatile("nop");" würde ich beim C18 Compiler " Nop();" schreiben.
der Datentyp uint8 ist wahrscheinlich nicht definiert, sollte durch "unsigned char" ersetzt werden.

Re: PIC µC - Referat

Beitrag #3 von 18F4550 Fan (Themenstarter) » Fr 17. Dez 2010, 15:24

Hattest du es wie folgt gemeint? :

Code: Alles auswählen

//-----------------------------------------------------------------//
//                    KS0073 Display Routinen                      //
//-----------------------------------------------------------------//
//                       Author: Neurotoxer                        //
//                         Date: 27.09.2007                        //
//                      Version: 0.2                               //
//                          LCD: EA DIP204-4                       //
//-----------------------------------------------------------------//

//-----------------------------------------------------------------//
//      Port und Pin Settings
//-----------------------------------------------------------------//
#define LCD_DATAPORT      PORTD   //Port für die 4 Datenleitungen
#define LCD_DATAPORTDR      DDRD
#define LCD_DATA0         4
#define LCD_DATA1         5
#define LCD_DATA2         6
#define LCD_DATA3         7
#define LCD_SETPORT         PORTB   //Port für die 3 Steuerleitungen
#define LCD_SETPORTDR      DDRB
#define LCD_RS            0      //Umschalten zwischen Befehl(Low) und Daten
#define LCD_E            2      //Enable bei fallender Flanke

//-----------------------------------------------------------------//
//      Display Befehle
//-----------------------------------------------------------------//
#define LCD_CLEAR         0b00000001      //Löschen des Display, Cursor auf Home
#define LCD_FUNCTION      0b00100100      //4-Bitmodus, RE=1
#define LCD_FUNCTION2      0b00100000      //4-Bitmodus, RE=0
#define LCD_CONTROL         0b00001100      //Display ON, Cursor OFF, Blinken OFF
#define LCD_CONTROL2      0b00001101      //Display ON, Cursor OFF, Blinken ON
#define LCD_CONTROL3      0b00001110      //Display ON, Cursor ON, Blinken OFF
#define LCD_CONTROL4      0b00001111      //Display ON, Cursor ON, Blinken ON
#define LCD_EXTENDED      0b00001001      //5-Dot Fontwidth, Normal Cursor, 4 Lines
#define LCD_ENTRYMODE      0b00000110      //Segment Bidirectional Function (Seg1->Seg60)
#define LCD_DDRAM         0b10000000      //DDRAM Adresse setzen

//-----------------------------------------------------------------//
//      Zeilenadressen und Länge einer Zeile
//-----------------------------------------------------------------//
#define LCD_LINE1         0x00
#define LCD_LINE2         0x20
#define LCD_LINE3         0x40
#define LCD_LINE4         0x60
int    LCD_LINELENGTH=      20;
int    LCD_LINES=         4;

// xus Pause
void pause_us(int us){
   int y=us;
   while(y>0){
              Nop();
              Nop();
              Nop();
              Nop();
              Nop();
              Nop();
      y--;
   }
}

//Display Enable
void display_enable(void){
   LCD_SETPORT&=~(1<<LCD_E);            //RS Low
   LCD_SETPORT|=(1<<LCD_E);            //RS High
   Nop();
   LCD_SETPORT&=~(1<<LCD_E);            //RS Low
}

//Byte senden
void display_send(unsigned char){
   LCD_DATAPORT=(byte&0b11110000);         //1. High Nibble senden
   display_enable();
   LCD_DATAPORT=(byte<<4);            //2. Low Nibble senden
   display_enable();
   pause_us(100);
}

//Datenbyte senden
void display_data(unsigned char){
   LCD_SETPORT|=(1<<LCD_RS);            //RS High
   display_send(byte);
}

//Befehlsbyte senden
void display_command(unsigned char){
   LCD_SETPORT&=~(1<<LCD_RS);            //RS Low
   display_send(byte);
   pause_us(2000);
}

//Display löschen, Cursor auf Home
int display_clear(void){
   display_command(LCD_CLEAR);
   return 1;
}

//Text ausgeben
int display_text(char *text){
   int z=0;
   while(text[z]!='\0'){
      display_data(text[z]);
      z++;
   }
   return 1;
}

//Cursor positionieren
int display_position(int z, int s){
   if(z>LCD_LINES || s>LCD_LINELENGTH)
      return 0;
   uint8_t addr=LCD_LINE1;
   if(z==2)
      addr=LCD_LINE2;
   if(z==3)
      addr=LCD_LINE3;
   if(z==4)
      addr=LCD_LINE4;
   addr+=s;
   addr|=LCD_DDRAM;
   display_command(addr);
   return 1;
}

//Text an Position ausgeben
int display_ptext(char *text, int zeile, int spalte){
   display_position(zeile, spalte);
   display_text(text);
   return 1;
}


//Display initialisieren
//Der KS0073 möchte so initialisiert werden:
//1) Clear Display
//2) Set Functions instruction
//3) Control Display ON/OFF instruction
//4) Set Entry Mode instruction
//5) Set Extension Function instruction
//6) Enable Scroll/Shift instruction
//7) Set scroll Quantity instruction
//8) Clear Display
int display_init(void){
   pause_us(15000);
   LCD_DATAPORTDR|=(1<<LCD_DATA0);      //Pins als Ausgänge konfigurieren
   LCD_DATAPORTDR|=(1<<LCD_DATA1);
   LCD_DATAPORTDR|=(1<<LCD_DATA2);
   LCD_DATAPORTDR|=(1<<LCD_DATA3);
   LCD_SETPORTDR|=(1<<LCD_RS);
   LCD_SETPORTDR|=(1<<LCD_E);
   display_command(LCD_CLEAR);         //1
   display_command(LCD_FUNCTION);      //2
   display_command(LCD_CONTROL);      //3
   display_command(LCD_FUNCTION2);
   display_command(LCD_ENTRYMODE);      //4
   display_command(LCD_FUNCTION);
   display_command(LCD_EXTENDED);      //5
   display_command(LCD_FUNCTION2);
   display_command(LCD_CLEAR);         //8
   return 1;
}

Re: KS0073 Display Ansteuerung

Beitrag #4 von Nico » Fr 17. Dez 2010, 15:59

Ich habe das Thema mal aufgeteilt, da es mit dem Referat nichts mehr zu tun hat :-) Was passiert jetzt, wenn Du den Code verwendest?

Re: KS0073 Display Ansteuerung

Beitrag #5 von 18F4550 Fan (Themenstarter) » Fr 17. Dez 2010, 16:28

Erstmal danke das du die Ordnung da reingebracht hast. Das hätte ich eigentlich machen müssen. Habe das garnicht gesehen. Sorry.

Auch danke für den PASTEBIN.
Ich habe doch nicht wohl beim abändern der "uint8_t" zuviel weggemacht.

Nun bekomme ich folgenden Fehler:

Code: Alles auswählen

----------------------------------------------------------------------
Debug build of project `C:\Dokumente und Einstellungen\Tim-Programming\Eigene Dateien\MPLAB\C\Test und Bastel.mcp' started.
Language tool versions: mpasmwin.exe v5.37, mplink.exe v4.37, mcc18.exe v3.36, mplib.exe v4.37
Preprocessor symbol `__DEBUG' is defined.
Fri Dec 17 16:27:02 2010
----------------------------------------------------------------------
Make: The target "C:\Dokumente und Einstellungen\Tim-Programming\Eigene Dateien\MPLAB\C\Test und Bastel.o" is out of date.
Executing: "C:\MCC18\bin\mcc18.exe" -p=18F4550 "Test und Bastel.c" -fo="Test und Bastel.o" -D__DEBUG -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-
C:\MCC18\h\display.h:80:Error [1154] parameter 1 in 'display_send' must have a name
C:\MCC18\h\display.h:87:Error [1154] parameter 1 in 'display_data' must have a name
C:\MCC18\h\display.h:95:Error [1154] parameter 1 in 'display_command' must have a name
C:\MCC18\h\display.h:119:Error: syntax error
Halting build on first failure as requested.
----------------------------------------------------------------------
Debug build of project `C:\Dokumente und Einstellungen\Tim-Programming\Eigene Dateien\MPLAB\C\Test und Bastel.mcp' failed.
Language tool versions: mpasmwin.exe v5.37, mplink.exe v4.37, mcc18.exe v3.36, mplib.exe v4.37
Preprocessor symbol `__DEBUG' is defined.
Fri Dec 17 16:27:02 2010
----------------------------------------------------------------------
BUILD FAILED

Re: KS0073 Display Ansteuerung

Beitrag #6 von Nico » Fr 17. Dez 2010, 16:38

Pack am besten mal den Ordner in dem das Projekt ist in eine ZIP oder RAR Datei und lade sie hier hoch. Weil die Fehlermeldungen beziehen sich ja auf Zeilen ist sonst immer nen bisschen schwer.


Re: KS0073 Display Ansteuerung

Beitrag #8 von Nico » Fr 17. Dez 2010, 17:26

Hi Tim, also ich habe bis jetzt folgendes gefunden:

Code: Alles auswählen

void display_send(unsigned char)  <--- Hier fehlt ein Name der Variablen z.B. so:
void display_send(unsigned char byte)


Der Name der Variable muss natürlich dem entsprechen mit dem in der Funktion dann gearbeitet wird. Das wäre bei den allen zum Beispiel "byte".

Das gleiche hier:

Code: Alles auswählen

void display_data(unsigned char) <-- Auch "byte" einfügen
void display_command(unsigned char) <-- " "


Und in der Routine "display_position" ist noch eine vergessene Variable, welche vom Typ her noch an C18 angepasst werden muss. Und außerdem muss die Variablen Deklaration an den Anfang der Funktion:

(schon verbessert:)

Code: Alles auswählen

int display_position(int z, int s)
{
   unsigned char addr;
   if(z>LCD_LINES || s>LCD_LINELENGTH)
      return 0;
   addr=LCD_LINE1;
...


Mehr hab ich auf den ersten Blick nicht gefunden.
PS: Du kannst Datei Anhänge auch direkt hier hoch laden (unter dem Editor) ;)
Dateianhänge
KS0073.zip
(5.99 KiB) 135-mal heruntergeladen

Re: KS0073 Display Ansteuerung

Beitrag #9 von 18F4550 Fan (Themenstarter) » Fr 17. Dez 2010, 18:00

So, nun folgender Fehler:

lg Tim

Edit: Bei mir ist Zeile Nummer 170 Die letzte mit der Klammer. Aber das koann doch nicht sein. Ich zerbreche mir schon den Kopf was da nicht stimmt. Aber immerhin gibt es anscheinend im obigen Rest kein Problem.
Dateianhänge
SCREEN.JPG

Re: KS0073 Display Ansteuerung

Beitrag #10 von Nico » Fr 17. Dez 2010, 19:13

Okay auf die schnelle finde ich den Fehler nicht aber ich versuch ihn mal zu finden. Melde mich dann wieder :-)

Re: KS0073 Display Ansteuerung

Beitrag #11 von 18F4550 Fan (Themenstarter) » Fr 17. Dez 2010, 19:40

Danke dir ;)

lg Tim

Re: KS0073 Display Ansteuerung

Beitrag #12 von Nico » Fr 17. Dez 2010, 19:52

Also um ehrlich zu sein ich glaube es ist einfacher ein eigenes Programm für das Display zu schreiben als dieses von AVR auf PIC zu ändern, was für einen Anfänger und mich auch ziemlich schwierig ist. Lass dich nicht davon abschrecken das Programm selber zu schreiben, so schwer ist das eigentlich beim Textdisplay nicht.

Ich will gleich nochmal eine leichte Ansteuerung für den HD44780 in C hoch laden, dann kannst Du dich erstmal daran lang hangeln. Ändere die Pins soweit, dass sie mit denen im Programm überein stimmen und dann versuch ob es klappt. Wird es wahrscheinlich nicht, da der KS0073 ja geringfügig anders sein soll (nicht dolle). Dann schauen wir weiter. Ich kümmere mich jetzt mal eben um das C Programm für den HD44780.

Sry, dass ich das jetzt so sagen muss aber ein Programm übersetzten ist sau schwer. Und für einen Anfänger eigentlich nicht zu schaffen.

Gruß ;-)

Re: KS0073 (EA DIP204-4) Display Ansteuerung

Beitrag #13 von Nico » Fr 17. Dez 2010, 20:53

Hi, ich habe mal meine HD44780 ASM Routinen in C für den KS0073 umgeschrieben. Du kannst die Routinen ja mal testen. Achte auf die Pin Belegung die musst du dann in der C Datei noch anpassen! Es sind jetzt keine besonderen Routinen drin sondern nur die Basics um es erstmal zum Laufen zu kriegen. Wenn es dann funktioniert kann man erweitern (z.B. Ausgabe über Zeichenkette,..)

-----------------------------------------------------------------------------------------------------------------------------
Bitte den Link im 1. Beitrag dieses Threads benutzen.
-----------------------------------------------------------------------------------------------------------------------------

Re: KS0073 (EA DIP204-4) Display Ansteuerung

Beitrag #14 von 18F4550 Fan (Themenstarter) » Sa 18. Dez 2010, 18:32

Hey, super was du da geleistet hast. Das finde ich wirklich gut. ;) DANKE dir !!!

Hast du deine Datei als include gedacht, oder als normaler C-Code ?

lg Tim

Re: KS0073 (EA DIP204-4) Display Ansteuerung

Beitrag #15 von Nico » Sa 18. Dez 2010, 18:50

Du kannst die Datei einfach zu den "Source files" in deinem Projekt fügen. Dann müsstest Du wahrscheinlich in der Datei oben nochmal den PIC includieren. Und dann kannst Du das Beispiel wie man was aufs Display schreiben kann (ganz unten in der Datei) raus kopieren und z.B. in deine Main.c vor die Endlosschleife packen. Und ganz wichtig deine Pinbelegung anpassen :) Das war es dann glaub ich.

In deinem Programm könnte es dann z.B. so aussehen:

Code: Alles auswählen

void main (void)
{
  ...
  Init_LCD();
  ...

  ...
  LCD_write('H',1); // Die "1" steht nur für Daten. "0" wären Befehle
  LCD_write('a',1);
  LCD_write('l',1);
  LCD_write('l',1);
  LCD_write('o',1);
  ...

  while(1)
  {
  }
}

Zurück zu „C“



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder

cron

Anmelden  •  Registrieren