Gast
#1710210
Hallo,
ich habe noch nicht allzuviel Erfahrung mit Mikrocontroller, deswegen
möchte hier um einen Rat bitten.
Beim Testen Ulrich Radig MMC Bibliothek mit SPI-Treiber von Atmel auf
einem ATxmega128A1 Board von Alvidi.de bin ich auf einen Effekt
gestoßen.
Nach erfolgreicher USART und MMC Initialisierung, beim ersten Zugriff
auf SD Karte bricht das Programm ab, bzw. starten neu. Alle
Initialisierungen bleiben dabei erhalten.
Habe leider keinen Debugger, benutze einen AVRISP MKII Programmer.
Durch Textausgaben wurde die kritische Stelle gefunden.
Beim Schreiben in SPID.DATA Register bricht das Programm ab.
Das merkwürdige für mich, das der Register während Initialisierung,
mehrere Male ohne Probleme beschrieben wird. Beim zweiten Durchlauf des
Programms läuft alles auch ganz normal.
int main( void )
{
uint8_t i= 0;
uint8_t w[512];
rprintfInit(usart_E0_putc);
rprintfProgStrM("Programmanfang\r\n");
//*******************************************************
//System Clock Konfiguration
//*******************************************************
*
*
*
//Jetzt läuft das System auf 32 MHz
//##########################################################
//**********************************************************
// usart_init(uint8_t usart,uint8_t bsel,uint16_t bscale, uint8_t
clk2x, bool interrupt)
//**********************************************************
cli();
usart_init(USART_E0,1047,-6,0, true); // 115200@32MHz
/* Enable PMIC interrupt level low. */
PMIC.CTRL |= PMIC_LOLVLEX_bm;
/* Enable global interrupts. */
sei();
_delay_ms(1000);
usart_E0_puts("USART Initialisation..........OK!\n\r");
//##########################################################
//**********************************************************
//MMC Init
//**********************************************************
cli();
i=mmc_init ();
_delay_ms(1000);
//i=mmc_init ();
// Initialisation of MicroSD card slot
// - return 0 if the card was detected
// - return 1 if the card slot is empty
sei();
usart_E0_puts("for spid.data\r\n");
// an der Stelle springt das Programm auf den Anfang von main()
SPID.DATA = 0;
// durch direkten Zugriff auf den Register oder durch Zugriff
auf den Register aus den read/write Funktionen kommt es zum Restart
//mmc_read_sector(1504, (uint8_t*)(&w));
//mmc_write_sector(777, (uint8_t*)(&w));
usart_E0_puts("nach spid.data\r\n");
mmc_write_sector(777, (uint8_t*)(&w));
usart_E0_puts("Programmende\n\r");
while(1){asm volatile("nop");
}
}
Ausgabe sieht dann so aus:
USART Initialisation..........OK!
for spid.data
Programmstart
USART Initialisation..........OK!
for spid.data
nach spid.data
Programmende
Wäre jedem Rat dankbar.
Gruß
Dome