Forum: Mikrocontroller und Digitale Elektronik Funktionsaufruf aus C++ Klasse funkioniert nicht


von Joe D. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo, ich versuche seite 2 Stunden eine einfach Memberfunktion über ein 
erstelltes Objekt meiner eigenen Klasse aufzurufen. jedoch behauptet 
Atmel Studio, dass diese Funktion gar nicht existiere:

E:\Duerr\Atmel Studio 
Projects\20150417_TLC5947_cpp_Test\20150417_TLC5947_cpp_Test\Debug/.././ 
20150417_TLC5947_cpp_Test.cpp(21,1):  error: undefined reference to 
`LTI_TLC5947::TLC5947_SetGS(unsigned char, unsigned int)'
E:\Duerr\Atmel Studio 
Projects\20150417_TLC5947_cpp_Test\20150417_TLC5947_cpp_Test\Debug/.././ 
20150417_TLC5947_cpp_Test.cpp(22,1):  error: undefined reference to 
`LTI_TLC5947::updatePWM()'
E:\Duerr\Atmel Studio 
Projects\20150417_TLC5947_cpp_Test\20150417_TLC5947_cpp_Test\Debug/.././ 
20150417_TLC5947_cpp_Test.cpp(24,1):  error: undefined reference to 
`LTI_TLC5947::clear()'



Ich nutze Atmel Studio 6(Version 6.2.1563 - Service Pack 2) und 
erstellte ein
GCC C++ Executable Project. Soweit noch alles ok. Aber eben beim "Build" 
meckert es rum.
Sowohl die Header-Datei für die Klassendeklaration, als auch die 
zugehörige .cpp-Datei der Klasse sind im selben Verzeichnis wie die 
main.cpp des Atmel Studio Projekts.

Bisher habe ich keine Probleme gehabt, C-Projekte zu erstellen auf 
demselben Laufwerk. Also Schreibrechte habe ich.

Dateien sind im Anhang. Vielen Dank für jeden Hinweis!

Joe D.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das ist ein Linkerfehler. Dein *.cpp-File wird nicht übersetzt bzw. 
das Übersetzungsergebnis nicht dem Linker vorgeworfen.

von Bronco (Gast)


Lesenswert?

Hast Du die Code-Datei auch dem Project hinzugefügt?
Kannst Du recht einfach überprüfen, wenn Du eine Zeile mit "#error" 
hineinschreibst.

von Joe D. (Gast)


Lesenswert?

Vielen Dank für eure schnellen Antworten.
Habe jetzt die .cpp und .h-Datei im Soultion Explorer integriert und 
noch einen Fehler ausgemerzt:

in der .cpp der Klasse stand
#include <LTI_TLC5947.h> statt #include "LTI_TLC5947.h"

Jetzt läuft das Programm. Besten Danke =)

von Joe D. (Gast)


Lesenswert?

Hallo,

nachdem das eine Problem gelöst wurde, stehe ich nun vor einem anderen:
sobald ich für die beiden Leitungen XLAT und BLANK andere Pins wähle,

nämlich PD5 für BLANK und PD4 für XLAT, funktioniert das Programm nicht 
mehr, obwohl ich in meiner init-Funktion reinschreibe

DDRD = 0xFF;

sowie die #define-Zeilen in der Header-Datei abändere.

1
/* LTI-Library for the TLC5947 LED-PWM-Driver by Texas Instruments*/
2
3
#ifndef LTI_TLC5947_H
4
#define LTI_TLC5947_H
5
6
#define DDR_SPI DDRB    //PORTB for SPI hardware
7
#define DD_MOSI PB3      //digital pin 11   gelbes Kabel
8
#define DD_SCK  PB5      //digital pin 13   grünes Kabel
9
//#define BLANK   PB2      //digital pin 10  weißes Kabel
10
//#define XLAT    PB1      //digital pin 9   blaues Kabel
11
12
//PORTD for BLANK and XLAT line
13
#define BLANK PD5        //digital pin 5  weißes Kabel
14
#define XLAT PD4        //digital pin 4  blaues Kabel
15
16
//rotes Kabel    -->    VCC TLC5947
17
//orangenes Kabel  -->    V+ LEDs
18
19
/*
20
#define BLANK_ON  PORTB |=   ( 1 << PB2 )
21
#define BLANK_OFF PORTB &= ~ ( 1 << PB2 )
22
23
#define XLAT_ON   PORTB |=   ( 1 << PB1 )
24
#define XLAT_OFF  PORTB &= ~ ( 1 << PB1 )
25
*/
26
27
#define BLANK_ON  PORTD |=   ( 1 << PD5 )
28
#define BLANK_OFF PORTD &= ~ ( 1 << PD5 )
29
30
#define XLAT_ON   PORTD |=   ( 1 << PD4 )
31
#define XLAT_OFF  PORTD &= ~ ( 1 << PD4 )
32
33
34
35
#define F_CPU 1000000
36
37
#include <avr/io.h>
38
#include <util/delay.h>
39
#include <stdint.h>
40
41
42
class LTI_TLC5947
43
{
44
  public:  
45
    void init(uint8_t n = 1);
46
    void TLC5947_SetGS(uint8_t channel, uint16_t value);
47
    void TLC5947_SetAllGS(uint16_t value);
48
    void updatePWM(void);
49
    void clear(void);
50
  private:
51
  uint8_t numdrivers;
52
  //Data-Array for the TLC5947's shift register
53
  uint8_t gsData[36];
54
  
55
};
56
57
#endif

1
#include "LTI_TLC5947.h"
2
3
void LTI_TLC5947::init(uint8_t n)
4
{
5
  
6
  numdrivers = n;
7
  
8
  #define TLC5947_N numdrivers
9
  
10
  #if (36 * TLC5947_N > 255)
11
  #define gsData_t uint16_t
12
  #else
13
  #define gsData_t uint8_t
14
  #endif
15
16
  #define gsDataSize ((gsData_t)36 * TLC5947_N)
17
  
18
  //Data-Array for the TLC5947's shift register
19
  //gsData_t gsData[36 * TLC5947_N];
20
  
21
  
22
  /*---SPI Init---*/
23
  // MOSI und SCK als Ausgang.
24
  
25
  DDR_SPI |= ( 1 << DD_MOSI ) | ( 1 << DD_SCK );
26
  
27
  DDRD = 0xFF;
28
    
29
  // SPI-Takt = CPU-Takt / 16. ATmega als Busmaster.
30
  SPCR |= ( 1 << SPE ) | ( 1 << MSTR ) | ( 1 << SPR0 );
31
}

Die Arduino Uno Platine, die ich zum Programmieren eines nackten 
ATmega328P nutze, habe ich auch überprüft und die Pins erfolgreich 
durchgeklingelt.

Langsam drehe ich durch.....man wird doch auch andere Pins nehmen 
können.

Hat jemand eine Idee, was hier vll falsch läuft?

Vielen Dank!

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.