Hallo ich bin am verzweifeln. Wer kann mir helfen?
Ich habe versucht den Beispiel Quellcode sd-karte.c mit dem AtmelStudio kompilieren.
Zum linken und brennen kommt es nicht. AtmelStudio bricht mit vielen undefined reference to ....Fehlermeldungen ab.zb.
Error 28 ld returned 1 exit status collect2.exe 0 0 GccApplication8
Error 5 undefined reference to `fat_loadFatData' C:\Users\mb_win 7\Documents\Atmel Studio\6.2\GccApplication8\GccApplication8\Debug/.././GccApplication8.c 120 1 GccApplication8
Error 26 undefined reference to `uputc' C:\Users\mb_win 7\Documents\Atmel Studio\6.2\GccApplication8\GccApplication8\Debug/.././GccApplication8.c 146 1 GccApplication8
Error 2 undefined reference to `uputs' C:\Users\mb_win 7\Documents\Atmel Studio\6.2\GccApplication8\GccApplication8\Debug/.././GccApplication8.c 110 1 GccApplication8
Error 19 undefined reference to `ffclose' C:\Users\mb_win 7\Documents\Atmel Studio\6.2\GccApplication8\GccApplication8\Debug/.././GccApplication8.c 137 1 GccApplication8
...... ......
und noch einige mehr undefined reference to Fehlermeldungen andere Fehlermeldungen außer undefined reference to.... erscheinen nicht.
wer kann mir helfen? Liegt es daran das der Compiler einen Zugriff auf der SD Karte sucht und nicht darauf zugreifen kann?
vielen Dank
Holger
Code:
/**
* Greift auf eine SD Karte per SPI zu
*
* Doku, siehe http://www.mikrocontroller.net/articles/AVR_FAT32
* Neuste Version: http://www.mikrocontroller.net/svnbrowser/avr-fat32/
* Autor: Daniel R.
*
* Modifikationen: Florian Schäffer, www.blafusel.de, 23.6.2014
*
*/
# define F_CPU 4000000UL
#include <avr/io.h>
#include <util/delay.h> // definiert _delay_ms()
#include <avr/interrupt.h>
#include <stdio.h>
#include <mmc_config.h> // Hier werden alle noetigen Konfigurationen vorgenommen, umbedingt anschauen !
#include <file.h>
#include <fat.h>
#include <mmc.h> // Hardware abhaengig
#include <uart.h> // Hardware abhaengig, es kann auch eine eigene eingebunden werden !
// prototypen von funktionen in dieser datei
static void timer0_init(void);
int main(void);
// timer0 einstellungen, werte mit http://www.avrcalc.com/download.html berechnet!
// aus diesen 3 werten ergibt sich die tick zeit, hier 10ms.
// 4 = prescaler 256, 3 = prescaler 64, 5 = prescaler 1024, 2 = prescaler 8. wenn prescaler 0 = prescaler dann stoppt der timer
#if(F_CPU == 4000000) // error 0.16%
#define TOP_OCR 0x9B
#define START_TCNT 0x64
#define PRESCALER 0x04
#endif
#if(F_CPU == 8000000) // error 0,16%
#define TOP_OCR 0x4D
#define START_TCNT 0xB2
#define PRESCALER 0x05
#endif
#if(F_CPU == 10000000) // error 0.351%
#define TOP_OCR 0x61
#define START_TCNT 0x9E
#define PRESCALER 0x05
#endif
#if(F_CPU == 12000000) // error 0.16%
#define TOP_OCR 0x74
#define START_TCNT 0x8B
#define PRESCALER 0x05
#endif
#if(F_CPU == 16000000) // error 0,16%
#define TOP_OCR 0x9B
#define START_TCNT 0x64
#define PRESCALER 0x05
#endif
#if(F_CPU == 20000000) // error 0.16%
#define TOP_OCR 0x4D
#define START_TCNT 0xB2
#define PRESCALER 0x04
#endif
// timer0 variable
volatile uint8_t TimingDelay; // fuer mmc.c
ISR (TIMER0_COMP_vect)
{
TimingDelay = (TimingDelay==0) ? 0 : TimingDelay-1;
}
static void timer0_init()
{
// timer0 config
// initialisierung, auf jeden fall vor mmc_init(),
// denn da wird der timer benoetigt!
TimingDelay = 0; // initialisierung der zaehl variable
TCCR0 = 1<<WGM01; // timer0 im ctc mode
TIMSK = 1<<OCIE0; // compare interrupt an
TCNT0 = START_TCNT; // ab wo hochgezaehlt wird,
OCR0 = TOP_OCR; // maximum bis wo gezaehlt wird bevor compare match
TCCR0 = PRESCALER; // wenn prescaler gesetzt wird, lauft timer los
sei(); // interrupts anschalten, wegen compare match
}
// *****************************************************************************************************************
int main(void)
{
uint8_t file_name [] = "test.txt";
char str [20];
uint32_t seek;
timer0_init(); // Timer initialisieren bevor FAT Library genutzt wird
uinit(); // uart config
uputs((uint8_t*)"Start");
// sd/mmc config
if( FALSE == mmc_init() )
{
uputs((uint8_t*)" -> Fehler Init. Ende\n");
return -1;
}
// fat config
if( FALSE == fat_loadFatData() )
{
uputs((uint8_t*)" -> Fehler loadFatData. Ende\n");
return -1;
}
uputs((uint8_t*)" OK\n");
// ********************** Datei schreiben **********************
if( MMC_FILE_OPENED == ffopen(file_name,'r') ) // Oeffne existierende Datei zum anhaengen von Daten. Wenn geklappt
ffseek(file.length); // Gehe ans Ende der Datei
else
ffopen(file_name,'c'); // Lege Datei neu an
ffwrites ((uint8_t*)"Hello world.");
sprintf (str, " File Size: %ld Bytes\r\n", file.length); // DOS Zeilenumbruch
ffwrites ((uint8_t*)str);
ffclose();
// ********************** Datei lesen **********************
if( MMC_FILE_OPENED == ffopen(file_name,'r') ) // Datei zum lesen oeffnen
{
seek = file.length; // Dateigroesse
do // Lese Byte ein
{
uputc( ffread() );
} while(--seek); // bis alle Bytes der Datei eingelesen wurden
ffclose();
}
return 0;
}