Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C Quellcode formatieren: <code>Quellcode</code> BASIC Quellcode formatieren: <basic>Quellcode</basic> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! -> I > Hallo , > > > ich hab eine Regelung für eine Industriegeschierspülmaschine gebaut. > > Dazu habe ich zwei Programme geschrieben die in Multithreading zusammen arbeiten sollen. > > Das eine arbeitet das Spülprogramm ab. > Gestartet wird es wenn eingeschaltet und die Tür geschlossen wird. > 62 Sekunden waschen, 10 Sekunden abtropfen und 8 Sekunden. klarspülen > Nach dem ansteuern der Aktoren versetze ich den Thread die entsprechenden Sekunden in den schlaf (Thread_Delay). > Wenn die Tür geöffnet wird soll das Waschprogramm unterbrochen werden.(ISR) > > Das zweite Programm soll alle 5 Sekunden 2 Temperaturen erfassen und dementsprechend die Heizungen schalten. > Die gemessenen Temperaturen werden über den I2C Digital-analog Umsetzer (TDA8444) auf die beiden LED-Bargraf dargestellt > > Einzeln laufen beide Programme ohne Probleme. > In Multithreading nicht richtig. Das Spülprogramm wird gar nicht abgearbeitet. > Die Temperatur wir gemessen, wird aber falsch auf den LEDs ausgegeben. > > <b>Was für Zykluszeiten muß ich einstellen?<b> > An was kann es liegen? > Sind die ADC und I2C zugriffe die Ursache? > Hat jemand eine Idee wie ich die ISR schreiben muß wenn sie das Spülprogramm abbrechen soll wenn die Tür geöffnet wird. > Springen ist ja nicht möglich! > > <b><i>void main(void)</i></b> > { > while(true) > { > > Thread_Start(1,temp_thread) > Thread_Start(2,spuell_thread); > } > } > > <b><i>void temp_thread(void)</i></b> > { > Variablen > while(1) > { > Thread_Lock(1); Tread wechsel während AD wandeln unterbinden > > ADC_Set(ADC_VREF_VCC,0); > ad_wert0=ADC_Read(); > ADC_Set(ADC_VREF_VCC,1); > ad_wert1=ADC_Read(); > ADC_Disable(); > Thread_Lock(0); > ------- > Auswerten von ad_wert 0 und 1 > -------- > Thread_Lock(1); LED bar über I2C ansteuern > I2C_Init(I2C_100kHz ); > I2C_Start(); > I2C_Write(0x40); > I2C_Write(0x00); > I2C_Write(adress0); LED_BAR 1 > I2C_Write(adress1); LED_BAR 2 > I2C_Stop(); > Thread_Lock(0); > } > } > > <b><i>void spuell_thread (void)</i></b> > { > while(eingeschaltet?) > { > if(tür zu?) > { > Ventile ansteuern,Pumpen einschalten <b>waschen<b> > > Thread_Delay (62000); <b> 62 Sekunden spülen<b> > > Ventile schliessen,Pumpen ausschalten <b>abtropfen<b> > > Thread_Delay (10000); <b>10 Sekunden abtropfen<b> > Ventile öffnen, pumpen einschalten <b>klarspülen<b> > Thread_Delay (8000); <b>8 Sekunden klarspülen <b> > > Ventile schliessen,Pumpen ausschalten.. > }}} > >