ich habe zunächst das Unterprogramm messung und darunter dann den gesamten Quelltext reinkopiert! die Zeile mit dem Fehler hebe ich jeweils mit einem Pfeil markiert: ***-->> void messung (void) // von heir noch ca.120 Zeilen abwerts { unsigned char idata i = 0; unsigned char idata testVar = 0; unsigned char adresseAktuell= 0x00; unsigned char Adresse; float idata tempVar = 0; float idata endVar = 0; unsigned char ZNr, zTag; //Array zählvariablen für Zyklus 1bis 4 und Zyklus Tag 1 bis 28 init_display(); moveto(0,0); printf("Messfühler----------"); moveto(1,0); printf("positionieren-------"); moveto(2,0); printf("mit mess/ok starten "); //Messung durchführen while (ok==1 && mess==1) ; prelle(); init_display(); moveto(0,0); printf("*messung gestartet**"); //----------einstellungen für adwandler------------------------------------ ADINS = 0x01; // auswahl A-D Eingang AD00 ADCON0 = 0x04; // Freigabe AD Wandler ( Eandc0 = 1) ADMODA = 0x02; ADMODB = 0x00; // ADCI0-Flag zuruecksetzen //------------------------------------------------------------------------- //------------------------Messvorgang-------------------------------------- hould(); moveto(0,0); printf("messung laeuft.... "); hould(); while(wert1 > testVar) { testVar = wert1; wandlung(); hould(); moveto(3,0); printf("|"); hould(); moveto(3,0); printf("/ "); hould(); moveto(3,0); printf("-"); hould(); moveto(3,0); printf("\\"); hould(); } for(i = 0;i < 6;i++) { moveto(3,0); printf("*+*+*+"); wandlung(); hould(); tempVar = (float) wert1; CalculateFloatTemp(&tempVar); endVar += tempVar; moveto(2,0); printf("Temperatur %.2f ßC",tempVar); moveto(3,0); printf("+*+*+*"); hould(); } endVar = endVar / 6; init_display(); moveto(1,0); printf("Temperatur %.2f ßC",endVar); ZNr=0; zTag=0; // InitEEProm(&schnubel); // LoadData(adresseAktuell); //datesatz aus EEPROM auslesen (Adresse) // ZNr = 3//schnubel.tag ; //zum speichern der aktuellen Adresse wird ab Adresse 0 im EEPROM // zTag= 10//schnubel.monat ; //wird ein daten satz verwendet. in diesem Datensatz werden die Arrayelementnummern //in die ersten zwei elemente verwendet um das richtige element zu finden //die die aktuelle adresse im EEprom beinhaltet ***-->> Adresse = TAGESSATZ[ZNr][zTag]; Adresse--; SaveData(Adresse); //Datensatz ins EEPROM schreiben (Adresse) moveto(2,0); printf ("mit co zur anzeige"); while(co==1); while(co==0); prelle(); menueanzeige(); } //================================================================================ //================================================================================ //================================================================================ //================================================================================ //=================================hier noch der rest vom Quelltext!=============================================== #include #include #include #include "calculate.h" #include "ZyklusEEPROM.h" #include #include zSatz xdata schnubel; //(Datensatz) extern init_display(); //Deklaration der externen Unterprogramme extern printchar(char); extern moveto(char,char); extern cursor_on(); extern print_lcd(); //===================deklaration der nicht ausgelagerten Unterprogramme void messung (void); //Messvorgang void messanz(void); //anzeige der Datensätze //void Eschreiben(void); //Datensätze ins EEPROM schreiben (noch nicht fertig gestellt) //void Elesen(void); //Datensätze aus dem EEPROM lesen (noch nicht fertig gestellt) void menueanzeige (void); //zeigt den Menübildschirm void X(void); //wertet die Tastenbetätigungen aus und ruft die Unterprogramme auf void uhrstell(void); //Urzeit einstellen void wandlung (void); //Analogwandlung //void init(void); //void EEPROMwrite(unsigned int adr, unsigned char dat); //unsigned char EEPROMread(unsigned int adr); void prelle(void); //entprellschleife void hould(void); //zeitferzögerung ca. 1sec für Messung sbit ok = P0^1; //Deklaration von Port0 Bit0 als Bitvariable sbit auf = P0^2; //Deklaration von Port0 Bit0 als Bitvariable sbit ab = P0^3; //Deklaration von Port0 Bit0 als Bitvariable sbit co = P0^4; //Deklaration von Port0 Bit0 als Bitvariable sbit mess= P0^5; //Deklaration von Port0 Bit0 als Bitvariable sbit on = P0^6; //Deklaration von Port0 Bit0 als Bitvariable unsigned char punkt1; //Menüpunkt unsigned char punkt2; //Menüunterpunkt unsigned char stand1; //MenueMopped unsigned int wart1; //für Mess unsigned int wart2; //für Mess unsigned char fertig; //für Mess unsigned char messfertig; unsigned char wert0; unsigned char wert1; unsigned char wert2; unsigned char wert3; unsigned char wert4; unsigned char wert5; struct tagessatz { unsigned char scTag; //struktur für Zyklustag im ablaufenden Programm lese/schreibe unsigned char scMon; //diese Struktur wird verwendet um die daten aus dem EEPROM unsigned char scZtag; //hineinzschreiben um sie im Programm Mess und Messanzeige zu verwenden unsigned char scStd; unsigned char scMin; float scTemp; }; typedef struct tagessatz TAGESSATZ; unsigned char adresseAktuell; unsigned char code speicherNummer[10][29] = { { 0xFE,0xFC,0xFB,0xFA,0xF9,0xF8,0xF7, 0xF6,0xF5,0xF4,0xF3,0xF2,0xF1,0xF0, 0xEF,0xEE,0xEC,0xEB,0xEA,0xE9,0xE8, 0xE7,0xE6,0xE5,0xE4,0xE3,0xE2,0xE1, }, { 0xE0,0xDF,0xDE,0xDD,0xDC,0xDB,0xDA, 0xD9,0xD8,0xD7,0xD6,0xD5,0xD4,0xD3, 0xD2,0xD1,0xD0,0xCF,0xCE,0xCD,0xCC, 0xCB,0xCA,0xC9,0xC8,0xC7,0xC6,0xC5, }, { 0xC4,0xC3,0xC2,0xC1,0xC0,0xBF,0xBE, 0xBD,0xBC,0xBB,0xBA,0xB9,0xB8,0xB7, 0xB6,0xB5,0xB4,0xB3,0xB2,0xB1,0xB0, 0xAF,0xAE,0xAD,0xAC,0xAB,0xAA,0xA9, }, { 0xA8,0xA7,0xA6,0xA5,0xA4,0xA3,0xA2, 0xA1,0xA0,0x0F,0x0E,0x0D,0x0C,0x0B, 0x0A,0x09,0x08,0x07,0x06,0x05,0x04, 0x03,0x02,0x01,0x00, }, }; unsigned char ZSatzw[10]; //Datensatz für Züklustag, Temperatug, Uhrzeit in stunden unsigned char ZSatzr[6]; unsigned char read[6]; unsigned char ucx; unsigned char sec; unsigned char min; unsigned char std; unsigned char tag; unsigned char mon; unsigned char jahr; unsigned char Ztag; unsigned char zeit; unsigned char temp; unsigned char okStand; //speichert betätigung der OK-Taste unsigned char coStand; //speichert die Betätigung der Korekturtaste unsigned char prell; struct zSatz { unsigned char scTag; unsigned char scMon; unsigned char scZtag; unsigned char scStd; unsigned char scMin; float scTemp; }; data SaveRom; main() { P1M1 = 0x80; P1M2 = 0x00; P2M1=0x00; //P2 und P0 Quasi-bidirektional P2M2=0x00; // " " P0M1=0x00; // " " P0M2=0x00; // " " tag = 31 ; mon = 12 ; jahr= 38 ; Ztag= 28; std = 23; min = 59; sec = 58; punkt1 = 0x01; punkt2 = 0x01; init_display(); //Display initialisieren while (on==1); //-------------------Startbildschirm anzeige---------------------------- moveto(0,0); //Cursor positionieren printf("Guten Morgen"); //Text ausgeben moveto(1,0); printf("es ist 9:30"); moveto(2,0); printf("mit mess zur Messung"); moveto(3,0); //Cursor positionieren printf("mit ok zur Auswahl"); //Text und Variablenwert ausgeben //--------------------------------------------------------------------------- while (mess==1 && ok==1); //Startmenüabfrage if (mess==0) { while(mess==1); prelle(); messung(); //Messprogramm } if (ok==0) { while (ok==0); prelle(); okStand=0x00; coStand=0x00; // punkt1 = 0x01; init_display(); moveto(0,0); printf("Messwerte anzeigen <"); moveto(1,0); printf("Datum/Uhr stellen"); moveto(2,0); printf("Messung starten"); moveto(3,0); printf("********************"); punkt1=0x01; } do { okStand=0; while(ok==1 && auf==1 && ab==1 ); //Tastendruck abwarten if(ok==0) //ok Taste betätigt { while (ok==0); //loslassen abfragen prelle(); okStand = 0x01; }; if(auf==0) //auf-Taste betätigt { while (auf==0); //loslassen abearten prelle(); punkt1 -- ; //Menüpunktvariable erhöhen if (punkt1<=0) punkt1=0x03; }; if(ab==0) { while (ab==0); //loslassen abearten prelle(); punkt1 ++ ; if(punkt1 >= 4)punkt1=0x01; }; if (co ==0) { while(co==0); //loslassen abearten prelle(); punkt1=0x01; }; X(); }while(1); } //=============================main ende======================= //================================================================ void X(void) //pfeilanzeie und Menüunterprogramm aufrufe { switch(punkt1) { case 0x01: { moveto(0,19); printf("<"); moveto(1,19); printf(" "); moveto(2,19); printf(" "); if (okStand==1) messanz(); break; }; case 0x02: { moveto(0,19); printf(" "); moveto(1,19); printf("<"); moveto(2,19); printf(" "); if (okStand==1) uhrstell(); break; }; case 0x03: { moveto(0,19); printf(" "); moveto(1,19); printf(" "); moveto(2,19); printf("<"); if (okStand==1)messung(); break; }; }; } //======================================== UP X ====================================================== //============================================================================================== //======================================== UP messung ====================================================== // hier liegt das probleem begraben die stelle ist mit einem Pfeil markiert! **-->> void messung (void) { unsigned char idata i = 0; unsigned char idata testVar = 0; unsigned char adresseAktuell= 0x00; unsigned char Adresse; float idata tempVar = 0; float idata endVar = 0; unsigned char ZNr, zTag; //Array zählvariablen für Zyklus 1bis 4 und Zyklus Tag 1 bis 28 init_display(); moveto(0,0); printf("Messfühler----------"); moveto(1,0); printf("positionieren-------"); moveto(2,0); printf("mit mess/ok starten "); //Messung durchführen while (ok==1 && mess==1) ; prelle(); init_display(); moveto(0,0); printf("*messung gestartet**"); //----------einstellungen für adwandler------------------------------------ ADINS = 0x01; // auswahl A-D Eingang AD00 ADCON0 = 0x04; // Freigabe AD Wandler ( Eandc0 = 1) ADMODA = 0x02; ADMODB = 0x00; // ADCI0-Flag zuruecksetzen //------------------------------------------------------------------------- //------------------------Messvorgang-------------------------------------- hould(); moveto(0,0); printf("messung laeuft.... "); hould(); while(wert1 > testVar) { testVar = wert1; wandlung(); hould(); moveto(3,0); printf("|"); hould(); moveto(3,0); printf("/ "); hould(); moveto(3,0); printf("-"); hould(); moveto(3,0); printf("\\"); hould(); } for(i = 0;i < 6;i++) { moveto(3,0); printf("*+*+*+"); wandlung(); hould(); tempVar = (float) wert1; CalculateFloatTemp(&tempVar); endVar += tempVar; moveto(2,0); printf("Temperatur %.2f ßC",tempVar); moveto(3,0); printf("+*+*+*"); hould(); } endVar = endVar / 6; init_display(); moveto(1,0); printf("Temperatur %.2f ßC",endVar); ZNr=0; zTag=0; // InitEEProm(&schnubel); // LoadData(adresseAktuell); //datesatz aus EEPROM auslesen (Adresse) // ZNr = 3//schnubel.tag ; //zum speichern der aktuellen Adresse wird ab Adresse 0 im EEPROM // zTag= 10//schnubel.monat ; //wird ein daten satz verwendet. in diesem Datensatz werden die Arrayelementnummern //in die ersten zwei elemente verwendet um das richtige element zu finden //die die aktuelle adresse im EEprom beinhaltet **-->> Adresse = TAGESSATZ[ZNr][zTag]; Adresse--; SaveData(Adresse); //Datensatz ins EEPROM schreiben (Adresse) moveto(2,0); printf ("mit co zur anzeige"); while(co==1); while(co==0); prelle(); menueanzeige(); } //=============================Messung=================================================================== //================================================================================================ //=============================Mbildschirm anzeigen=================================================================== void menueanzeige (void) // Menüanzei auf dem LCD { init_display(); moveto(0,0); printf("Messwerte anzeigen <"); moveto(1,0); printf("Datum/Uhr stellen "); moveto(2,0); printf("Messung starten "); moveto(3,0); printf("********************"); } //===================================Menueanzeige============================================================= //================================================================================================ //===================================Uhrzeit/Datum einstellen============================================================= void uhrstell(void) { //======================================================================= //======================================================== moveto(0,0); printf(" hier wird dann "); moveto(1,0); printf(" die Uhr "); moveto(2,0); printf(" eingestellt "); moveto(3,0); printf("*mit co zur auswahl*"); while(co==1); while(co==0); prelle(); punkt1=0x01; menueanzeige (); //anzeige der Menüauswahl } //=====================================Uhrzeit/Dautm einstellen=========================================================== //================================================================================================ //===============================Messwerte/Datensätze anzeigen======================================================= void messanz(void) { std=9; min=36; Ztag=5; temp=34,65; init_display(); moveto(0,0); printf("Tag: %c ",Ztag); moveto(1,0); printf("Temperatur: %.2fßC",temp); moveto(2,0); printf(" %d:%d Uhr",std,min); moveto(3,3); printf("%d %d 20%d",tag,mon,jahr); while (co==1); while (co==0); prelle(); okStand=0; init_display(); moveto(0,0); printf ("mit ok tzur anzeige "); while (ok==1); prelle(); while (ok==0); prelle(); while(ok==1); // prelle(); while(ok==0); prelle(); menueanzeige(); } //===============================Messwerte/Datensätze anzeigen======================================================= void wandlung (void) { ADCON0 = ADCON0 | 0x01; while ((ADCON0&0x08)==0); ADCON0 = ADCON0 & 0xF7; wert1=AD0DAT0; } //=================================================================== //=========== EEPROM ============================================================= void hould (void) { for (wart1 = 0 ; wart1 <= 0xFFFE ; wart1++) { for (wart2 = 0 ; wart2 <= 0x009 ; wart2 ++); }; } void prelle (void) { unsigned int prell; for(prell=0x00;prell<=0xFFFE;prell++); { for(prell=0x0000;prell<=0x0003;prell++); } }