Forum: Mikrocontroller und Digitale Elektronik Error - could not find definition of symbol 'putrsXLCD_2' in file 'D:\LCD_2015\main.o'.


von Daniel E. (everyday_fun69)


Angehängte Dateien:

Lesenswert?

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

von Vloki (Gast)


Lesenswert?

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 ;-)

von Vloki (Gast)


Lesenswert?

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 ;-)

von Oliver R. (orb)


Lesenswert?

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.

von Vloki (Gast)


Lesenswert?

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

von Toxic (Gast)


Lesenswert?

@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?

von Noch einer (Gast)


Lesenswert?

Leerzeichen in Verzeichnissnamen? Hast du kontrolliert, ob die 
Kommandozeile für den Linker das LCD 4x40 maskiert?

von Toxic (Gast)


Lesenswert?

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 ?

von Toxic (Gast)


Lesenswert?

Toxic schrieb:
> putrXLC
>
> oder
>
> putsXLC

Heute ist der Teufel mit mir los....

putrXLCD

oder

putsXLCD

von Daniel E. (everyday_fun69)


Lesenswert?

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

von vloki (Gast)


Lesenswert?

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.
----------------------------------------------------------------------

von Daniel E. (everyday_fun69)


Angehängte Dateien:

Lesenswert?

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

von vloki (Gast)


Lesenswert?

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" !!!!!!!!!!!!!!!!!!!!!!!!!

von vloki (Gast)


Lesenswert?

/* $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(...

von Toxic (Gast)


Angehängte Dateien:

Lesenswert?

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"

von Daniel E. (everyday_fun69)


Lesenswert?

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

von vloki (Gast)


Lesenswert?

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)

von Toxic (Gast)


Lesenswert?

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...

von vloki (Gast)


Lesenswert?

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 ...

von vloki (Gast)


Lesenswert?

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.

von Daniel E. (everyday_fun69)


Lesenswert?

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

von Daniel E. (everyday_fun69)


Lesenswert?

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

von Volker S. (vloki)


Lesenswert?

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
von Daniel E. (everyday_fun69)


Angehängte Dateien:

Lesenswert?

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

von Volker S. (vloki)


Lesenswert?

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