Forum: Mikrocontroller und Digitale Elektronik MMC schreiben bleibt hängen


von Harald N. (avranfaenger)


Lesenswert?

Hallo, ich hab folgendes Problem mit einem ATMEGA128 und Codevision als 
Compiler. Und zwar habe ich einen PID Regler programmiert der Soll und 
Istwert berechnet am LCD ausgibt und auf eine MMC schreibt. Das 
beschreiben der MMC passiert aus einer Forschleife heraus (aufruf 
ausgabe())und wird beim ersten Mal also 49 Mal auch wie erwartet 
ausgeführt. Nachdem sich der Vorgang wiederholt (Endlosschleife) bricht 
das Programm nach dem fopen –Befehl ab. (da das debuggen mit avr4 ja 
nicht hinhaut habe ich mir portpins gesetzt -so sehe ich bis wohin das 
Programm noch läuft).Gibts da ein Problem mit dem fclosen oder fopen.
Ich hab jedenfalls keine Ahnung warum das Prog beim ersten Durchlauf 
klappt und danach hängen bleibt.
Vielleicht hat je wer von Euch eine Idee

Anbei der Code

.
.
.
void regler(void)
{
        char anzahl[4];
  int n;

  //Flags initialisieren
  createflag=0;
  wflag=0;

  // Regler initialisieren
  kr=0.001;
  Tv=1;
  Tn=2;
  T=1;

while(1)
{
  Fuhrungsgr();
  berechne();
  for(n=0; n <= 49; n++)
  {

    pwmuebergabe=x1[n];
    pwm();

    x=x1[n];
    wandle();
    sollwert=ergebnis;

    x=i;
    wandle();
    istwert=ergebnis;

    itoa(n,anzahl);
    itoa(createflag,Cflag);
                lcd_init(20);
                lcd_clear();
    lcd_gotoxy(0,0);
    lcd_putsf("Anzahl:");
    lcd_gotoxy(11,0);
    lcd_puts(anzahl);
    lcd_gotoxy(0,1);
    lcd_putsf("Cflag=");
                lcd_gotoxy(11,1);
    lcd_puts(Cflag);
                delay_ms(500);
                lcd_clear();


    ausgabe();
    if(n == 49)
    {
     wflag=1;
    }

  }
}
.
.
.

ausgabe an MMC


//MMC-Read Write functions
#include <options.h>
#include <lcd.h>


//Prototypendefinition


//globale Variablen
int8 flash _FF_FNAME[17]="Daten.txt";
int8 flash ld_str[] = "%03ld, ";
int8 flash done_str[] = "\r\n\r\nDONE!!!";
int8 flash column_d[] = "Column %d, ";
int8 flash Fail_str[] = "\r\nFAILED!!! - %02X";
int8 flash C2DStr[] = "%c%02d/";
int8 flash p2DSlashStr[] = "%02d/";
int8 flash p4DStr[] = "%04d  ";
int8 flash p2DColinStr[] = "%02d:";
int8 flash p2DCRLFStr[] = "%02d%c";//\r\n



//Globale Variablen vom Reglerprogramm kommend
float sollwert;
float istwert;
int createflag;

void ausgabe(void)
{
//Lokale Variablen
FILE *file;
int16 h;
int8 stemp[14];
int8 jahr[5];
int8 monat[3];
int8 tag[3];
int8 strich[2]="-";
int8 extens[5]=".txt";
char csollwert[7];
char cistwert[7];

//Globaler Interrupt enable
#asm("sei");

#ifdef RTC_ON
twi_setup();
#endif

//rtc_set_time(14, 28, 0);
//rtc_set_date(10, 1, 2008);

ftoa(sollwert,3,csollwert);
ftoa(istwert,3,cistwert);

if(initialize_media())
{

/*//Hier wird der Filebezeichner gebildet
rtc_get_timeNdate(&RTCHour, &RTCMin, &RTCSec, &RTCDay, &RTCMonth, 
&RTCYear);
h=(int16) (RTCYear);
itoa(h,jahr);
h=(int8) (RTCMonth);
itoa(h,monat);
h=(int8) (RTCDay);
itoa(h,tag);
strcat(stemp,jahr);
strcat(stemp,strich);
strcat(stemp,monat);
strcat(stemp,strich);
strcat(stemp,tag);
strcat(stemp,extens);*/

if(createflag == 0)
{
 file=fcreatec(_FF_FNAME,0);
 fclose(file);
}
if(createflag != 0)
{
file=fopenc(_FF_FNAME,APPEND);//fcreatec(_FF_FNAME,0);
}
        createflag=1;
        lcd_init(20);
        lcd_clear();
        lcd_gotoxy(0,0);
        lcd_putsf("Sollwert...");
        lcd_gotoxy(11,0);
        lcd_puts(csollwert);
        lcd_gotoxy(0,1);
        lcd_putsf("Istwert...");
        lcd_gotoxy(11,1);
        lcd_puts(cistwert);
        delay_ms(500);
        lcd_clear();

        fprintf(file, C2DStr, '\"', RTCMonth);
        fprintf(file, p2DSlashStr, RTCDay);
        fprintf(file, p4DStr, RTCYear);
        fprintf(file, p2DColinStr, RTCHour);
        fprintf(file, p2DColinStr, RTCMin);
        fprintf(file, p2DCRLFStr, RTCSec, ';"');
        fputc(';"',file);
        fprintf(file," Messwert1 in W/m² %s",csollwert);
        fputc(';"',file);
  fprintf(file," Messwert2 in W/m² %s",cistwert);
        fputc('\r',file);
        fputc('\n',file);
        fclose(file);
}
else
{
         lcd_init(20);
        lcd_clear();
        lcd_gotoxy(0,1);
        lcd_putsf("kein Medium!");
         delay_ms(500);

}

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
Noch kein Account? Hier anmelden.