Re: Was für Zykluszeiten muß ich einstellen? An was kann es liegen? Kategorie: Programmierung C (von PeterS - 27.06.2008 8:53) | |
Als Antwort auf Was für Zykluszeiten muß ich einstellen? An was kann es liegen? von Markus - 27.06.2008 1:28
| |
Hi, was mir sofort auffällt: 1. Man startet die Threads nur einmal, die Endlosschleife kommt dahinter. 2. ThreadDelay wird in 10ms Schritten abgegeben: Ein Wert von 1000 wartet daher 10 Sekunden Gruss Peter > 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. > > Was für Zykluszeiten mu� ich einstellen? > 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! > > void main(void) > { > while(true) > { > > Thread_Start(1,temp_thread) > Thread_Start(2,spuell_thread); > } > } > > void temp_thread(void) > { > 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); > } > } > > void spuell_thread (void) > { > while(eingeschaltet?) > { > if(tür zu?) > { > Ventile ansteuern,Pumpen einschalten waschen > > Thread_Delay (62000); 62 Sekunden spülen > > Ventile schliessen,Pumpen ausschalten abtropfen > > Thread_Delay (10000); 10 Sekunden abtropfen > Ventile öffnen, pumpen einschalten klarspülen > Thread_Delay (8000); 8 Sekunden klarspülen > > Ventile schliessen,Pumpen ausschalten.. > }}} > > > | |
Antwort schreiben Antworten: Re: Was für Zykluszeiten muß ich einstellen? An was kann es liegen? (von Markus - 27.06.2008 13:10) Re: Was für Zykluszeiten muß ich einstellen? An was kann es liegen? (von PeterS - 27.06.2008 15:04) |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum