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