Witam
Tą razą bez zdjęć i filmów. Nie będę Wam pokazywał mojego oparzonego palucha.
A było to tak :
Napisałem cudny program, który :
1. Inicjuje zbiorniki
2. Czeka na włożenie okrętu do wody
3. Okręt w wodzie, czeka 5 sekund
4. Zanurza okręt na 10 cm
5. Utrzymuje go w poziomie przez 30 sekund
6. Wynurza okręt
7. Kończy prace
I tu Gura Procesorowa wyraziła swoją wątpliwość co do poprawnego działania czujników
wykrywających wodę (zresztą autorstwa Gury). Nakazała napisanie prostszego programu, który :
1. Wykonuje test zbiorników, otwiera zawór napowietrzania
2. Czeka na wlożenie okrętu do wody
3. Zanurza okręt, aż do otrzymania sygnału, że okręt zanurzony, zamyka zawór napowietrzania
4. Wynurza okręt otwierajac zawor
Pilnowane jest przechylenie dziób/rufa okrętu
Bowiem testowanie jest łatwiejsze na małych kawałkach.
Napisałem ten program. Próba uruchomienia go skończyła się tym, że tranzystory sterujące silnikami
zbiorników rozgrzały się do temperatury powodującej widoczne obrażenia na palcach programisty,
natomiast silniki zbiorników nie ruszyły. Okazało się, że na akumulatorach mocy napięcie spadło
poniżej 7V. Tak nie może być, bo zamiast się wyłączyć, okręt się spali gdy akumulatory się rozładują.
Ale jeden, czy dwa eksperymenty na świeżo naładowanym akumulatorze można przeprowadzić.
Sam program (POPRAWNY) wyglądał tak :
Kod: Zaznacz cały
void TestSIWiSUW20110509( void )
{
/*Funkcja :
1. Wykonuje test zbiornikow, otwiera zawor napowietrzania
2. Czeka na wlozenie okretu do wody
3. Zanurza okret, az do otrzymania sygnału, ze okret zanurzony, zamyka zawor napowietrzania
4. Wynurza okret otwierajac zawor
Pilnowane jest przechylenie dzob/rufa okretu
*/
unsigned char inclination;
unsigned int czasStart;
InitZbiornik( ZBIORNIK_RUFOWY );
InitZbiornik( ZBIORNIK_DZIOBOWY );
NapowietrzanieOpen();
// Zapalenie białego leda na rufie.
PORTA &= ~_BV(LED_WHITE);
// Czekanie na wlozenie okretu do wody
while( !ShipInTheWater() )
{
}
// Gdy okret w wodzie, to zanurzanie okretu
KierunekObrotowSilnikaZbiornika( ZBIORNIK_RUFOWY, NAPELNIAJ_ZBIORNIK);
KierunekObrotowSilnikaZbiornika( ZBIORNIK_DZIOBOWY, NAPELNIAJ_ZBIORNIK);
while( IsSilnikZbiornikaBusy( ZBIORNIK_RUFOWY ) );
while( IsSilnikZbiornikaBusy( ZBIORNIK_DZIOBOWY ) );
SilnikZbiornikaOn( ZBIORNIK_RUFOWY );
SilnikZbiornikaOn( ZBIORNIK_DZIOBOWY );
czasStart = GetIntSecondMain();
/* Zanurzanie */
while( !ShipUnderTheWater() )
{
if ( IsInclinationValid() )
{
inclination = GetInclinationAbs();
}
else
{
continue;
}
// Raz na sekunde korekcja polozenia okretu
if ( GetIntSecondMain() - czasStart > 0 )
{
czasStart = GetIntSecondMain();
if ( inclination > 0 )
{// Dzob okretu w gore - zatrzymac napelnianie zbiornika rufowego
// lub uruchomic napelnianie dziobowego
switch( StanSilnika( ZBIORNIK_DZIOBOWY ) )
{
case SILNIK_STOI:
SilnikZbiornikaOn( ZBIORNIK_DZIOBOWY );
continue;
case SILNIK_BUSY:
break;
case SILNIK_NAPELNIA:
break;
case SILNIK_OPROZNIA:
SilnikZbiornikaOff( ZBIORNIK_DZIOBOWY );
break;
}
switch( StanSilnika( ZBIORNIK_RUFOWY ) )
{
case SILNIK_STOI:
SilnikZbiornikaOn( ZBIORNIK_RUFOWY );
continue;
case SILNIK_BUSY:
break;
case SILNIK_NAPELNIA:
break;
case SILNIK_OPROZNIA:
SilnikZbiornikaOff( ZBIORNIK_RUFOWY );
break;
}
}
else if ( 0 == inclination )
{// Okret na rownej stepce. Jezeli ktorys z silnikow wylaczony, to go wlaczyc
switch( StanSilnika( ZBIORNIK_DZIOBOWY ) )
{
case SILNIK_STOI:
SilnikZbiornikaOn( ZBIORNIK_DZIOBOWY );
continue;
case SILNIK_BUSY:
break;
case SILNIK_NAPELNIA:
break;
case SILNIK_OPROZNIA:
SilnikZbiornikaOff( ZBIORNIK_DZIOBOWY );
break;
}
switch( StanSilnika( ZBIORNIK_RUFOWY ) )
{
case SILNIK_STOI:
SilnikZbiornikaOn( ZBIORNIK_RUFOWY );
continue;
case SILNIK_BUSY:
break;
case SILNIK_NAPELNIA:
break;
case SILNIK_OPROZNIA:
SilnikZbiornikaOff( ZBIORNIK_RUFOWY );
break;
}
}
else if ( inclination < 0 )
{// rufa okretu w gore - zatrzymac napelnianie zbiornika dziobowego
switch( StanSilnika( ZBIORNIK_DZIOBOWY ) )
{
case SILNIK_STOI:
break;
case SILNIK_BUSY:
break;
case SILNIK_NAPELNIA:
SilnikZbiornikaOff( ZBIORNIK_DZIOBOWY );
break;
case SILNIK_OPROZNIA:
SilnikZbiornikaOff( ZBIORNIK_DZIOBOWY );
break;
}
switch( StanSilnika( ZBIORNIK_RUFOWY ) )
{
case SILNIK_STOI:
SilnikZbiornikaOn( ZBIORNIK_RUFOWY );
continue;
case SILNIK_BUSY:
break;
case SILNIK_NAPELNIA:
break;
case SILNIK_OPROZNIA:
SilnikZbiornikaOff( ZBIORNIK_RUFOWY );
break;
}
}
}
}
SilnikZbiornikaOff( ZBIORNIK_RUFOWY );
SilnikZbiornikaOff( ZBIORNIK_DZIOBOWY );
NapowietrzanieClose();
while( IsSilnikZbiornikaBusy( ZBIORNIK_RUFOWY ) );
while( IsSilnikZbiornikaBusy( ZBIORNIK_DZIOBOWY ) );
KierunekObrotowSilnikaZbiornika( ZBIORNIK_RUFOWY, OPROZNIAJ_ZBIORNIK);
KierunekObrotowSilnikaZbiornika( ZBIORNIK_DZIOBOWY, OPROZNIAJ_ZBIORNIK);
while( (!KrancowkaSilnikaZbiornika( ZBIORNIK_DZIOBOWY ) ) | ( !KrancowkaSilnikaZbiornika( ZBIORNIK_RUFOWY ) ) )
{
if ( !ShipUnderTheWater() )
{
NapowietrzanieClose();
}
if ( KrancowkaSilnikaZbiornika( ZBIORNIK_DZIOBOWY ) )
{
switch( StanSilnika( ZBIORNIK_DZIOBOWY ) )
{
case SILNIK_STOI:
break;
case SILNIK_BUSY:
break;
case SILNIK_NAPELNIA:
SilnikZbiornikaOff( ZBIORNIK_DZIOBOWY );
break;
case SILNIK_OPROZNIA:
SilnikZbiornikaOff( ZBIORNIK_DZIOBOWY );
break;
}
}
else
{
switch( StanSilnika( ZBIORNIK_DZIOBOWY ) )
{
case SILNIK_STOI:
SilnikZbiornikaOn( ZBIORNIK_DZIOBOWY );
break;
case SILNIK_BUSY:
break;
case SILNIK_NAPELNIA:
SilnikZbiornikaOff( ZBIORNIK_DZIOBOWY );
break;
case SILNIK_OPROZNIA:
break;
}
}
if ( KrancowkaSilnikaZbiornika( ZBIORNIK_RUFOWY ) )
{
switch( StanSilnika( ZBIORNIK_RUFOWY ) )
{
case SILNIK_STOI:
break;
case SILNIK_BUSY:
break;
case SILNIK_NAPELNIA:
SilnikZbiornikaOff( ZBIORNIK_RUFOWY );
break;
case SILNIK_OPROZNIA:
SilnikZbiornikaOff( ZBIORNIK_RUFOWY );
break;
}
}
else
{
switch( StanSilnika( ZBIORNIK_RUFOWY ) )
{
case SILNIK_STOI:
SilnikZbiornikaOn( ZBIORNIK_RUFOWY );
break;
case SILNIK_BUSY:
break;
case SILNIK_NAPELNIA:
SilnikZbiornikaOff( ZBIORNIK_RUFOWY );
break;
case SILNIK_OPROZNIA:
break;
}
}
}
SilnikZbiornikaOff( ZBIORNIK_DZIOBOWY );
SilnikZbiornikaOff( ZBIORNIK_RUFOWY );
for(;;);
}
Objawił się jeszcze jeden problem - okręt się nie chce programować przez wtyczkę. Trzeba skrócić
kable.
Dalsza część eksperymentów - wieczorem.
Z ukłonami
Andrzej Korycki
Dopisane wieczorem: Ze dwie godziny zajęło mi skręcanie i rozkręcanie okrętu. To to trzeba było
poprawić to tamto. Uruchomiłem światłowód abym wiedział, że komputer jest wyłączony. Ale aby
lampka świeciła trzeba było zmienić program. Ale, aby zmienić program bez rozkręcania okrętu
trzeba było skrócić kable we wtyczce. Na koniec już wszystko było gotowe i pozostało tylko
uszczelnienie kiosku. Ale kable wychodzące z kiosku uniemożliwiały to uszczelnienie. Musiałem
rozkręcić rurę po raz piąty. Teraz wyszło, że śruby trzymające stery głębokości na kiosku się
poluzowały. Unieruchomiłem śruby w jednej połówce preparatem Loctitle . Na drugą nie starczyło
energii. Ze złości ładuję akumulator. To wszystko z dala od wody. Na jutro pozostała druga połówka
kiosku i można do wody.
Z ukłonami
Andrzej Korycki