Hallo zusammen
Ich habe derzeit ein komisches Verhalten beim ATmega16. Folgende
Konfiguration:
- ATmega16 @4MHz internen Oszillator
- Kommunikation über RS232 @ 19200Baud
Nun zu meinem Problem:
Ich versuche derzeit die FAT32 Lib von hier zu verwenden:
http://www.mikrocontroller.net/articles/AVR_FAT32
Es tritt jetzt jedoch ein Fehlverhalten des Controllers auf das ich
nicht nachvollziehen kann.
Wenn ich folgenden Code verwende
1 | int main(void){
|
2 | u8Flag = 0;
|
3 | //Datei die auf SD Karte angelegt werden soll
|
4 | unsigned char file_name [] = "test.txt";
|
5 | //String der in die Datei geschrieben werden soll
|
6 | unsigned char str [] = "Hallo Datei!";
|
7 |
|
8 | unsigned long int seek;
|
9 |
|
10 | _delay_ms(200); //dummy delay
|
11 | gvUsartConfig(&tdsUsartConfig);
|
12 | MAKRO_USART_ENABLE_CHANNELS(USART_TX);
|
13 |
|
14 | timer0_init();
|
15 | vPortInit();
|
16 |
|
17 | gvUsartPutStringPolling("Startup\n");
|
18 | gvUsartPutCharPolling(TERM_CARRIAGE_RETURN);
|
19 |
|
20 | if( FALSE == mmc_init() ){
|
21 | gvUsartPutStringPolling("No SD Card!\n");
|
22 | //gvUsartPutCharPolling(TERM_CARRIAGE_RETURN);
|
23 | return 1;
|
24 | }
|
25 | /*
|
26 | Ab hier alles gleich
|
27 | */
|
Hier einmal kurz die Funktionen für das senden:
1 | void gvUsartPutCharPolling(const uint8_t u8Char){
|
2 | while(!(UCSRA & (1<<UDRE))); //wait until transmission possible
|
3 | UDR = u8Char; //write char into transmit buffer
|
4 | }
|
1 | void gvUsartPutStringPolling(const char* u8String){
|
2 | while(*u8String != '\0'){
|
3 | gvUsartPutCharPolling((uint8_t)*u8String);
|
4 | u8String++;
|
5 | }
|
6 | }
|
Wenn ich keine SD-Karte anschließe habe ich das gewünschte Verhalten=>
Das Programm startet immer wieder neu da mmc_init einen Fehler
zurückliefert.
Nun aber zu meinem seltsammen verhalten:
Wenn ich die Codezeile
1 | gvUsartPutCharPolling(TERM_CARRIAGE_RETURN);
|
herausnehme wird gar nichts mehr über RS232 herausgesendet, nicht einmal
irgendwelcher Unsinn.
Dieser Fehler tritt auch bei noch minimalistischeren Code auf (Nur
initialisierung und dann senden). Manchmal nimmt er alles an, dann beim
hinzufügen eines weiteren sendebefehls geht wieder gar nichts usw.
Ich kann mir nicht erklären woher dieser Fehler nun kommt. Das einzige
das ich mir erklären kann ist das der Controller in irgendeinen Reset
wegen eines Fehler reinspringt. Leider habe ich keinen Debugger um der
Vermutung nachzugehen.
Hatte mal jmd. ein ähnliches Problem und hat eine Lösung gefunden?