Za gratulacje dziękuję ślicznnie. Są, niestety, jeszcze nieco na "wyrost", że się tak wyrażę.
Pierwsza próba nie była totalną klapą, ale wykazała błędy i niedoróbki w oprogramowaniu
modelu. Po pierwsze primo silnik główny się wyłączał w najniespodziewanym momencie.
Po drugie primo zbiornik rufowy nie opróżniał się tak jak powinien.
Po trzecie primo, na koniec, model nabrał trzy krople wody i odmówił dalszej wspólnej zabawy
z Panem Smitem.
Błąd w obsłudze silnika poprawiłem. Nie będę przedstawiał poprawek, bo się będziecie ze mnie
śmiać i będziecie mieli rację. A tego nie lubię, jak ktoś się ze mnie śmieje i jeszcze ma rację.
Na drugie primo rada jest taka :
Kod: Zaznacz cały
unsigned char MocSilnWZalOdOdleglZbiorniki( unsigned char zbiornik, int NumerZadanyImp )
{// Ustawia moc silnika zbiornika w zaleznosci od aktualnej ilosci impulsow
 // Silnik rufowy ma wieksze opory
   int nrImp = CalkujImpulsyZbiornika( zbiornik );
   nrImp -= NumerZadanyImp;
   if ( nrImp < 0 )nrImp = -nrImp;
   if ( ZBIORNIK_DZIOBOWY == zbiornik )
   {// Silkik dziobowy ma mniejsze opory
      if ( nrImp > 100 )return PELNA_MOC;
      if ( nrImp > 70 )return TRZY_CZWARTE_MOCY;
      if ( nrImp > 40 )return POL_MOCY; 
      if ( nrImp > 25 )return JEDNA_CZWARTA_MOCY;
   
      return JEDNA_OSMA_MOCY;
   }
   else
   {// zbiornik rufowy ma wieksze opory
      
      if ( nrImp > 70 )return PELNA_MOC;
      if ( nrImp > 30 )return TRZY_CZWARTE_MOCY;
      if ( nrImp > 15 )return POL_MOCY;
      return JEDNA_CZWARTA_MOCY;
   }
}
Czyli silnik zbiornika rufowego pracuje z większą moca.
Na trzecie twardnieje epidian na "telujce" na rufie.
Teraz program do sterowania wygląda tak :
Kod: Zaznacz cały
void TestSterowaniaGlebokoscia20110904( void )
{
   int czas;
   SilnikGlownyOff();   
   BootWaterOnBoardMain();
   OpoznienieNaStarcie10Sek();
   InitZbiorniki();
   PORTA &= ~_BV(LED_GREEN);
   while( !ShipInTheWater() );
   czas = GetIntSecondMain();
   while( ( GetIntSecondMain() - czas ) < 2 );
   
   for(;;)
   {
      SetPolozenieTlokaZbiornikaDzRuZbiorniki();
      SterowanieSilnikiemGlownym();
      SterowanieZaworemNapowietrzaniaMain();
      SteryGlebokosciMain();
      
      if ( WaterOnBoard( ) )
      {
         for(;;)
         {
            WynurzOkretAwaryjnieZbiorniki();
            SterowanieZaworemNapowietrzaniaMain();
            SteryGlebokosciMain();
            if ( !ShipInTheWater() )
            {
               InitZbiorniki();
               for(;;);
            }
         }
      }
      
      if ( !ShipInTheWater() )
      {
         InitZbiorniki();
         for(;;);
      }
      
   }
}
I działa, w pojęciu autora, tak :
1. Włącz zasilanie, jak jest włączony nadajnik, to poruszaj sterami na kiosku, zaworem
napowietrzania, zainicjuj zbiorniki i czekaj na włożenie do wody.
Jak nie jest włączony nadajnik, to wyłącz się i czekaj na reset.
2. We wodzie daj się sterować za pomocą nadajnika, aż do wyjęcia z wody, albo do
pojawienia się wody na pokładzie.
Jak woda się pojawi na pokładzie, to wynurz awaryjnie model i daj się doprowadzić do tatusia.
Po wyjęciu z wody wylej resztkę ze zbiorników i czekaj na reset.
Tak oto w skrócie telegraficznym i bez zbędnych szczegółow to MA działać, a czy działa, no to dobre
pytanie. Odpowiedź być może w środę.
I wymagana fotka :
Z ukłonami
Andrzej Korycki