Hallo Gemeinde, ich hoffe ich finde hier ein paar PIC18F / C18 oder Code Spezialisten. Ich hole mal aus. Also ich habe ein 4x40 LCD. Da es im Netz keine Codes gab, hab ich eine funktionierende Libary genommen und diese quasi kopiert und im Datei- und Befehlsnamen um _2 oder 2 erweitert. Die Datenports etc. sind bis auf das Enable gleich konfiguriert in der xlcd oder xlcd2. Das LCD ist HD44780 tauglich und hat schon mal mit allen Zeilen funktioniert. Was ich für Befehle (puts oder putrs) zum tetsten hatte weis ich nicht mehr. Stolz wie Oskar hab ich nun die Zeilen programmiert und bei der 3. Zeile gibts die Probleme mit dem Linker. Könnte jemand sich der Angelegenheit bitte mal annehmen bzw. drüber schauen? Evtl. hift der 4x40 Code ja auch anderen. Danke. Daniel
Ich verstehe zwar nicht warum du zwei Bibliotheken brauchst, du must doch nur die Adresse richtig setzten um die 3. und 4. Zeile an zu sprechen. Egal ich denke du hast da irgendwas mit putr... und putrs... durcheinander gebracht. Am Besten du überdenkst das noch mal mit den Zeilen ;-)
Vloki schrieb: > Ich verstehe zwar nicht warum du zwei Bibliotheken brauchst, > du must doch nur die Adresse richtig setzten um die 3. und 4. > Zeile an zu sprechen. Ok, das war vieleicht voreilig. (So ein Display mit zwei Enables hab ich noch nie gesehen ;-)
Vloki schrieb: > du must doch nur die Adresse richtig setzten um die 3. und 4. > Zeile an zu sprechen. Nein, ein 4x40 Display sind eigendlich 2 2x40 Zeichen Displays die einzeln initialisiert und angesprochen werden müssen. Das Display hat zwei Enable-Anschlüsse mit denen man das obere oder das untere Display auswählt.
Oliver R. schrieb: > Nein, ein 4x40 Display sind eigendlich 2 2x40 Zeichen Displays die > einzeln initialisiert und angesprochen werden müssen. Hmmm, ja ich hab nicht so genau hin geschaut und gedacht es wäre so eines wie hier -> http://www.microchip.com/forums/FindPost/758877
@Daniel EGAL (everyday_fun69) Hab mal vor Jahren bei Pollin aus Restbestaenden 4 2x40 Lcd-Displays gekauft und ebenso mit einem PIC 18F... angesteuert. Meine Lcd-Quelldateien hab ich genauso modifiziert wie die deinigen. An denen liegt es nicht(habe nicht alles gecheckt-aber sie hatten ja mal funktioniert...) - hast Du in den "Project Settings" ueberprueft ob noch alle Pfadangaben stimmen? Wenn Du ein altes funktionierendes Projekt auf deiner Festplatlte woanders hinkopiert hast ,dann musst du auch die Pfadangaben aendern. Teilweise informiert dich MPLAB darueber dass es bestimmte Dateien nicht mehr findet etc.... Ich kann momentan deine LCD-Dateien nicht testen weil MPLAB auf Windows 8.1 nicht mehr stabil laeuft.(aaarghhhh) Davon abgesehen - wie lautet denn die Fehlermeldung?
Leerzeichen in Verzeichnissnamen? Hast du kontrolliert, ob die Kommandozeile für den Linker das LCD 4x40 maskiert?
Toxic schrieb: > Davon abgesehen - wie lautet denn die Fehlermeldung? Sorry - die Fehlermeldung is ja schon im Threadnamen enthalten...nicht mein Tag heute. Ich hab mir eben nochmal - aufgrund der Fehlermeldung - deine Dateien angesehen: Es gibt keine Funktion mit dem Namen "putrsXLC" Die Funktionen zur Ausgabe eines Strings oder Characters heissen entweder putrXLC oder putsXLC Nur diese put-Funktionen sind in deinen Ordnern enthalten Kann es sein, dass Du dich einfach nur vertippt hast ?
Toxic schrieb: > putrXLC > > oder > > putsXLC Heute ist der Teufel mit mir los.... putrXLCD oder putsXLCD
Hallo Gemeinde, vielen Dank für die vielen Posts. In den Zeilen 1 + 2 schreib ich ja auch putrsXLCD (siehe auch Code). Ich habe mich somit nicht vertippt. Dort geht das ja! Und die putrs Funktion ist ja auch in der xlcd.h und der xlcd2.h definiert /* putrsXLCD * Writes a string of characters in ROM to the LCD */ void putrsXLCD_2(PARAM_SCLASS const MEM_MODEL rom char *); Habt Ihr sonst noch Vorschläge, ich weiß langsam nicht mehr so recht weiter!? Danke im Voraus Grüße Daniel
Daniel, in den _2 Dateien fehlt aus irgendweelchnen Gründen das "s" im Funktionsnamen. Darauf wollte ich schon ganz oben in meiner ersten Antwort hinweisen ! ---------------------------------------------------------------------- Egal ich denke du hast da irgendwas mit putr... und putrs... durcheinander gebracht. ----------------------------------------------------------------------
Hallo noch mal, evtl. stehe ich auf dem Schlauch, ABER diese Funktion (putrsXLCD_2) ist nur in XLCD2.H und XLCD.h vorhanden !! Es funktioniert ja in Zeile 1 und 2 !! Diese scheis main.o... Aber selbst dort, wenn mann mit dem Editor diese öffnet steht das putrsXLCD_2 drin. Kann das was mit dem Speichermodel small and large evtl. noch zu tun haben?? Grüße Daniel
Daniel EGAL schrieb: > Hallo noch mal, > > evtl. stehe ich auf dem Schlauch, ABER diese Funktion (putrsXLCD_2) ist > nur in XLCD2.H und XLCD.h vorhanden !! GENAU - im c file fehlt ein "s" !!!!!!!!!!!!!!!!!!!!!!!!!
/* $Id: putrxlcd.c,v 1.1 2003/12/09 22:52:09 GrosbaJ Exp $ */ #include <p18cxxx.h>
1 | #include "xlcd2.h" |
2 | |
3 | /********************************************************************
|
4 | * Function Name: putrsXLCD
|
5 | * Return Value: void
|
6 | * Parameters: buffer: pointer to string
|
7 | * Description: This routine writes a string of bytes to the
|
8 | * Hitachi HD44780 LCD controller. The user
|
9 | * must check to see if the LCD controller is
|
10 | * busy before calling this routine. The data
|
11 | * is written to the character generator RAM or
|
12 | * the display data RAM depending on what the
|
13 | * previous SetxxRamAddr routine was called.
|
14 | ********************************************************************/
|
15 | void putrXLCD_2(const rom char *buffer) |
16 | {
|
17 | while(*buffer) // Write data to LCD up to null |
18 | {
|
19 | while(BusyXLCD_2()); // Wait while LCD is busy |
20 | WriteDataXLCD_2(*buffer); // Write character to LCD |
21 | buffer++; // Increment buffer |
22 | }
|
23 | return; |
24 | }
|
void putr*?????????*XLCD_2(...
vloki schrieb: > void putr*?????????*XLCD_2(... Wie ich schon erwaehnte existiert die Funktion "putrsXLCD" nicht vloki hat es in seiner letzten POST gezeigt (und ich poste zur Verdeutlichung auch nochmal ein Bild) Das fehlende "s" musst du selbst versehentlich geloescht haben - es gibt eigentlich keinen Grund diese Funktion zu aendern... Des weiteren habe ich noch einen weiteren Fehler gefunden - der dich moeglicherweise zu einem spaeteren Zeitpunkt nerven koennte. In der Datei "readaddr_2.c" musst du #include "xlcd_2.h" umaendern in #include "xlcd2.h"
Hallo, danke für den Hinweis mit dem Fehler "readaddr_2.c". Das war in der Tat falsch! Das Function Name: putrsXLCD und void putrXLCD_2(const rom char *buffer) sind auch in der originalen Datei, welche von einem Prof. Ing..... so! Leute, warum funktioniert das in der Zeile 1 und 2, aber nicht in der Zeile 3+4???? #include "xlcd2.h" /******************************************************************** * Function Name: putrsXLCD * Return Value: void * Parameters: buffer: pointer to string * Description: This routine writes a string of bytes to the * Hitachi HD44780 LCD controller. The user * must check to see if the LCD controller is * busy before calling this routine. The data * is written to the character generator RAM or * the display data RAM depending on what the * previous SetxxRamAddr routine was called. ********************************************************************/ void putrXLCD_2(const rom char *buffer) { while(*buffer) // Write data to LCD up to null { while(BusyXLCD_2()); // Wait while LCD is busy WriteDataXLCD_2(*buffer); // Write character to LCD buffer++; // Increment buffer } return; } #include "xlcd.h" /******************************************************************** * Function Name: putrsXLCD * Return Value: void * Parameters: buffer: pointer to string * Description: This routine writes a string of bytes to the * Hitachi HD44780 LCD controller. The user * must check to see if the LCD controller is * busy before calling this routine. The data * is written to the character generator RAM or * the display data RAM depending on what the * previous SetxxRamAddr routine was called. ********************************************************************/ void putrXLCD(const rom char *buffer) { while(*buffer) // Write data to LCD up to null { while(BusyXLCD()); // Wait while LCD is busy WriteDataXLCD(*buffer); // Write character to LCD buffer++; // Increment buffer } return; } Danke und Grüße. Daniel
Daniel EGAL schrieb: > Leute, warum funktioniert das in der Zeile 1 und 2, aber nicht in der > Zeile 3+4???? Weil diese Funktion in der original Prozessorbibliothek enthalten ist ! (Die p18F4520_e.lib welche über das Linkerscript eingebunden wird)
vloki schrieb: > Weil diese Funktion in der original Prozessorbibliothek enthalten ist ! > (Die p18F4520_e.lib welche über das Linkerscript eingebunden wird) Ich glaube nicht (mir fehlen wichtige Pfadangaben) dass auf die Lcd-Libfunktionen von Microsoft zugegriffen wird.Ich bin mir ziemlich sicher dass fuer Zeile 1 und Zeile 2 die @Danial EGAL's Quelldateien verwendet werden - also die im Ordner LCD Wenn dem nicht so waere, haette er spaeter Probleme mit dem Display da Microchips Libs vordefinierte Pinbelegungen verwenden.(PORTB)Schaut man sich dich die XLCD.h/xlcd2.h an sieht man, dass der Prof? das Display an anderen Pins verwendet (PORTD,PORTE) @Danial EGAL - aendere doch einfach den Namen der Funktion so wie sie urspruenglich mal geheissen hatte oder ruf die Funktion so auf wie sie heisst - sonst hagelt es eben Fehlermeldungen ! Ist ja lediglich ein einziger Buchstabe zu aendern oder hinzu zu fuegen...
Toxic schrieb: > Ich glaube nicht (mir fehlen wichtige Pfadangaben) dass auf die > Lcd-Libfunktionen von Microsoft zugegriffen wird. Da es diese Funktion in Daniels Source Dateien nicht gibt, muss die aus der Bibliothek stammen ...
vloki schrieb: > Da es diese Funktion in Daniels Source Dateien nicht gibt, muss die aus > der Bibliothek stammen ... @Daniel Du kannst das ja mal mit dem Debugger überprüfen, falls du Zwiefel hast.
Hallo Leute, hier die Daten vom Linker: // $Id: 18f4580.lkr,v 1.2 2004/08/22 23:40:54 curtiss Exp $ // File: 18f4580.lkr // Sample linker script for the PIC18F4580 processor LIBPATH . FILES c018i.o FILES clib.lib FILES p18f4580.lib CODEPAGE NAME=vectors START=0x0 END=0x29 PROTECTED CODEPAGE NAME=page START=0x2A END=0x7FFF CODEPAGE NAME=idlocs START=0x200000 END=0x200007 PROTECTED CODEPAGE NAME=config START=0x300000 END=0x30000D PROTECTED CODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF PROTECTED CODEPAGE NAME=eedata START=0xF00000 END=0xF000FF PROTECTED ACCESSBANK NAME=accessram START=0x0 END=0x5F DATABANK NAME=gpr0 START=0x60 END=0xFF DATABANK NAME=gpr1 START=0x100 END=0x1FF DATABANK NAME=gpr2 START=0x200 END=0x2FF DATABANK NAME=gpr3 START=0x300 END=0x3FF DATABANK NAME=gpr4 START=0x400 END=0x4FF DATABANK NAME=gpr5 START=0x500 END=0x5FF DATABANK NAME=sfr13 START=0xD00 END=0xDFF PROTECTED DATABANK NAME=sfr14 START=0xE00 END=0xEFF PROTECTED DATABANK NAME=sfr15 START=0xF00 END=0xF5F PROTECTED ACCESSBANK NAME=accesssfr START=0xF60 END=0xFFF PROTECTED SECTION NAME=CONFIG ROM=config STACK SIZE=0x100 RAM=gpr5 Die Datenports sind doch in beiden XLCD.H files gleich, lediglich Enable 1 ist an E1 und Enable 2 an E2. #define RW_PIN PORTEbits.RE0 /* PORT for RW */ #define TRIS_RW DDREbits.RE0 /* TRIS for RW */ #define RS_PIN PORTBbits.RB5 /* PORT for RS geändert */ #define TRIS_RS DDRBbits.RB5 /* TRIS for RS geändert */ #define E_PIN PORTEbits.RE1 /* PORT for E1 */ #define TRIS_E DDREbits.RE1 /* TRIS for E1 */ #define RW_PIN PORTEbits.RE0 /* PORT for RW */ #define TRIS_RW DDREbits.RE0 /* TRIS for RW */ #define RS_PIN PORTBbits.RB5 /* PORT for RS geändert */ #define TRIS_RS DDRBbits.RB5 /* TRIS for RS geändert */ #define E_PIN_2 PORTEbits.RE2 /* PORT for E2 */ #define TRIS_E_2 DDREbits.RE2 /* TRIS for E2 */ Das mit putr und putrs probier ich gleich mal. Ich melde mich !! Danke und Grüße
Also, habe das void putrsXLCD_2 (const rom char *buffer) geändert, es gab folgende Meldung nun: D:\LCD_2015\LCD 4x40\putrxlcd_2.c:17:Error [1109] type mismatch in redeclaration of 'putrsXLCD_2' Dank google fand ich http://www.microchip.com/forums/m309658.aspx -> smercier posts Ich tauschte noch das Memory model von far to near change the definition of MEM_MODEL to near : #define MEM_MODEL near Compilieren und siehe da keine Fehlermeldung !! Ich verstehe trotzdem nicht, warum das in Zeile 1+2 ging und in 3+4 nicht. Ein Teil des Textes Zeile 3 wird nun ordnungsgemäß angezeigt, der Rest dahinter fehlerhaft. Ich bedanke mich nochmals für Eure Klasse Hilfe. Das was man zur Verfügung hat, ist halt auch zu Hinterfragen und ggf. fehlerhaft. Danke Daniel
Daniel EGAL schrieb: > Ich verstehe trotzdem > nicht, warum das in Zeile 1+2 ging und in 3+4 nicht Daniel, jetzt stell dich nicht so an ;-) Du machst das laut deiner Registrierung im MCHP Forum doch nicht erst seit gestern. (4 Tage nach mir?) In deinem Projekt gibt/gab es drei Funktionen 1. putrXLCD(... in einer c Datei 2. putrXLCD_2(... in einer zweiten c Datei 3. putrsXLCD(... in der Prozessor Library (Das mit den XLCD Funtionen in der Library ist IMHO der größte Mist) ABER KEINE putrsXLCD_2(... !!!
:
Bearbeitet durch User
Tja, wie ich schon schrieb, nicht alles was man hat ist richtig. Das waren XLCD Dateien, welcher ein mir bekannter Prof. für seine Studenten für ein µC Projekt bereitgestellt hatte. Dank Microchip Forum und Eurer Aufdringlichkeit (ist gut gemeint !!) hat sich leider ja leider herausgestellt, das es in putrxlcd.c Datei void putrsXLCD(const rom char *buffer)heissen muss. Ein verfuckter Buchstabe und das Memory model eben Naja, es läuft nun zum Glück. Vielen Dank an alle !!! Daniel
Daniel EGAL schrieb: > Das waren XLCD Dateien, welcher ein mir bekannter Prof. für seine > Studenten für ein µC Projekt bereitgestellt hatte. Heißt der Prof. Guttenberg ? (Schau mal in das Verzeichnis /microchip/mplabc18/v3.4?/src/pmc_common/XLCD) Wie wohl das "s" verloren gegangen ist ? Ja, der Tipfehler ist anscheinend niemals aufgefallen, weil der Linker einfach immer die Funktion aus der bescheuerten Bibliothek benutzt hat ... Warum der Prototyp im Header und die Funktion im Sourcefile unterschiedlich sind ist mir aber auch ein Rätsel :-(
:
Bearbeitet durch User
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.