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.
Das ist ein Linkerfehler. Dein *.cpp-File wird nicht übersetzt bzw. das Übersetzungsergebnis nicht dem Linker vorgeworfen.
Hast Du die Code-Datei auch dem Project hinzugefügt? Kannst Du recht einfach überprüfen, wenn Du eine Zeile mit "#error" hineinschreibst.
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 =)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.