Re: SSN-688
: 26 maja 2011, 23:34
Panowie z NASA, w ogóle nie wiem o czym wy rozmawiacie
Strona poświęcona modelarstwu szkutniczemu, historii żeglugi, żaglowcom, statkom i okrętom. Forum, galeria, wirtualna modelarnia. Serdecznie zapraszamy!
https://www.koga.net.pl/phpbb3/
ramol pisze:...
edit: zwykła zmienna typu int też jest oparta na rejestrze 8 bitowym, ale jeżeli używając zmiennej typu char też ci wszystko chodzi to ok, moje obawy dotyczą tego że może się to czasem wykrzaczyć przy wykonywaniu jakichś procedur, bo pomimo że zmiennej char nadajesz określoną wartość to gdzieś w podprocedurach może być potraktowana jako zmienna znakowa i wyjdzie że program będzie usiłował porównać wartości pętli nie z liczbą podstawioną pod zmienną char, tylko ze znakiem z tablicy ASCI odpowiadajacym wartości podstawionej liczby. I wtedy wyjdzie taki mały zonk bo się wywali.
ramol pisze:Malutka uwaga: generalnie 8bitowa zmienna może być albo w zakresie 0-256 gdzie całe 8 bitów jest przeznaczone na liczbę, lub w zakresie (-128)do(128) gdzie 7 bitów przeznaczone jest na liczbę a 8 bit zawiera znak.
Stosując zakres zamiast -90 do 90, można zastosować zakres 0 do 180, asembler procesora oszczędza przy każdej operacji dodawania i odejmowania jedną operację sprawdzenia i przepisania znaku, ponieważ dostaje w rejestrze za każdym razem zmienna dodatnią i od razu wykonuje działanie bez operacji sprawdzania znaku zmiennej.
1. Zwykła zmienna int (mówimy o języku ANSI C) jest co najmniej 16 bitowa. To znaczy gwarantuje
zakres -32768 do 32767. Oparta jest o operacje na parach rejestrów ośmiobitowych w procesorach
ośmiobitowych.
Kon_Bar pisze:...
Eeee tam...
int jest równa słowu i na maszynach 8-bit powinna mieć 1B
Variables of type int are one machine-type word in length.
...
Kod: Zaznacz cały
void Test20110520( void )
{
/*Funkcja :
1. Sprawdza, czy nie ma wody na pokladzie. Jezeli jest, to zapala bialego leda
i konczy prace
2. Wykonuje test zbiorników, otwiera zawor napowietrzania, zapala bialego leda
3. Czeka na wlozenie okretu do wody
4. Mierzy zanurzenie okretu i traktuje je jako zero
5. Zanurza okret na 3 cm, zamyka zawor napowietrzania
6. Balansuje na glebokosci 3 cm przez 40 sekund
7. Wynurza okret otwierajac zawor
Pilnowane jest przechylenie dzob/rufa okretu
*/
int8_t inclination, inkl;
unsigned char stanZanurzenia, sz;
unsigned int czasStart;
int iZanurzenie, iz;
unsigned char stan = 0;
unsigned char stan1 = 0;
unsigned char prevStan = 0;
unsigned char prevStan1 = 0;
unsigned char bdisp = 0;
BootWaterOnBoardMain();
OpoznienieNaStarcie10Sek();
/*--------------------------------------
inclination = 0; // Okret w poziomie
iZanurzenie = 0; // Okret nad woda
WyslijZnak( inclination );
for(;; )
{
if ( INCLINATION_INVALID != ( inkl = GetInclinationAbs() ) )
{
if ( inclination != inkl )
{
inclination = inkl;
bdisp = 1;
}
}
if ( ( iz = GetZanurzenieMM() ) > 0 )
{
if ( iz != iZanurzenie )
{
iZanurzenie = iz;
bdisp = 1;
}
}
if ( bdisp )
{
WyslijZnak( inclination );
stan = (unsigned char)iZanurzenie;
WyslijZnak( stan );
bdisp = 0;
}
}
--------------------------------------*/
InitZbiornik( ZBIORNIK_RUFOWY );
InitZbiornik( ZBIORNIK_DZIOBOWY );
NapowietrzanieOpen();
// Po inicjacji zapalic bialego leda
PORTA &= ~_BV(LED_WHITE);
// Czekanie na wlozenie okretu do wody
while( !ShipInTheWater() )
{
}
KierunekObrotowSilnikaZbiornika( ZBIORNIK_RUFOWY, NAPELNIAJ_ZBIORNIK);
KierunekObrotowSilnikaZbiornika( ZBIORNIK_DZIOBOWY, NAPELNIAJ_ZBIORNIK);
czasStart = GetIntSecondMain();
while ( ( GetIntSecondMain() - czasStart ) < 3 );
iZanurzenie = 0;
czasStart = GetIntSecondMain();
while ( ( GetIntSecondMain() - czasStart ) < 3 )
{
if ( IsZanurzenieValid() )
{
iZanurzenie = GetZanurzenieMM();
break;
}
}
WyslijZnak( 'Z' );
inkl = (char)iZanurzenie;
WyslijZnak( inkl );
WyslijZnak( 'Z' );
czasStart = GetIntSecondMain();
while ( ( GetIntSecondMain() - czasStart ) < 3 );
iZanurzenie += 30;
inclination = 0; // Okret w poziomie
// Zanurzanie przez 30 sekund
stanZanurzenia = ZANURZENIE_OK;
czasStart = GetIntSecondMain();
while( ( GetIntSecondMain() - czasStart ) < 40 )
{
if ( ShipUnderTheWater() )
{
NapowietrzanieClose();
}
else
{
NapowietrzanieOpen();
}
if ( INCLINATION_INVALID != ( inkl = GetInclinationAbs() ) )
{
inclination = inkl;
}
if ( ZANURZENIE_INVALID != (sz = StanZanurzenia( iZanurzenie) ) )
{
stanZanurzenia = sz;
}
switch ( stanZanurzenia )
{
case ZMNIEJSZYC_ZANURZENIE:
if ( inclination > 0 ) // Zmniejszyc zanurzenie
{// dziob w gore
// Dziobowy stop, wypompowac z balastu rufowego
switch( StanSilnika( ZBIORNIK_DZIOBOWY ) )
{
case SILNIK_STOI:
stan = 1;
break;
case SILNIK_BUSY:
stan = 2;
break;
case SILNIK_NAPELNIA:
SilnikZbiornikaOff( ZBIORNIK_DZIOBOWY );
stan = 3;
break;
case SILNIK_OPROZNIA:
SilnikZbiornikaOff( ZBIORNIK_DZIOBOWY );
stan = 4;
break;
}
switch( StanSilnika( ZBIORNIK_RUFOWY ) )
{
case SILNIK_STOI:
if ( SILNIK_OPROZNIA != GetKierunekObrotowSilnikZbiornika( ZBIORNIK_RUFOWY ) )
{
stan1 = 5;
KierunekObrotowSilnikaZbiornika( ZBIORNIK_RUFOWY, OPROZNIAJ_ZBIORNIK);
break;
}
stan1 = 1;
SilnikZbiornikaOn( ZBIORNIK_RUFOWY );
break;
case SILNIK_BUSY:
stan1 = 2;
break;
case SILNIK_NAPELNIA:
SilnikZbiornikaOff( ZBIORNIK_RUFOWY );
stan1 = 3;
break;
case SILNIK_OPROZNIA:
stan1 = 4;
break;
}
}
else if ( 0 == inclination )// Zmniejszyc zanurzenie
{// okret poziomo
// wypompowac wode z obu balastow
switch( StanSilnika( ZBIORNIK_DZIOBOWY ) )
{
case SILNIK_STOI:
if ( SILNIK_OPROZNIA != GetKierunekObrotowSilnikZbiornika( ZBIORNIK_DZIOBOWY ) )
{
stan = 15;
KierunekObrotowSilnikaZbiornika( ZBIORNIK_DZIOBOWY, OPROZNIAJ_ZBIORNIK);
break;
}
SilnikZbiornikaOn( ZBIORNIK_DZIOBOWY );
stan = 11;
break;
case SILNIK_BUSY:
stan = 12;
break;
case SILNIK_NAPELNIA:
SilnikZbiornikaOff( ZBIORNIK_DZIOBOWY );
stan = 13;
break;
case SILNIK_OPROZNIA:
stan = 14;
break;
}
switch( StanSilnika( ZBIORNIK_RUFOWY ) )
{
case SILNIK_STOI:
if ( SILNIK_OPROZNIA != GetKierunekObrotowSilnikZbiornika( ZBIORNIK_RUFOWY ) )
{
stan1 = 15;
KierunekObrotowSilnikaZbiornika( ZBIORNIK_RUFOWY, OPROZNIAJ_ZBIORNIK);
break;
}
SilnikZbiornikaOn( ZBIORNIK_RUFOWY );
stan1 = 11;
break;
case SILNIK_BUSY:
stan1 = 12;
break;
case SILNIK_NAPELNIA:
SilnikZbiornikaOff( ZBIORNIK_RUFOWY );
stan1 = 13;
break;
case SILNIK_OPROZNIA:
stan1 = 14;
break;
}
}
else if ( inclination < 0 ) // Zmniejszyc zanurzenie
{// dzob w dol
// wypompowac wode z balastu dziobowego, zatrzymac zbiornik rufowy
switch( StanSilnika( ZBIORNIK_DZIOBOWY ) )
{
case SILNIK_STOI:
if ( SILNIK_OPROZNIA != GetKierunekObrotowSilnikZbiornika( ZBIORNIK_DZIOBOWY ) )
{
stan = 25;
KierunekObrotowSilnikaZbiornika( ZBIORNIK_DZIOBOWY, OPROZNIAJ_ZBIORNIK);
break;
}
SilnikZbiornikaOn( ZBIORNIK_DZIOBOWY );
stan = 21;
break;
case SILNIK_BUSY:
stan = 22;
break;
case SILNIK_NAPELNIA:
SilnikZbiornikaOff( ZBIORNIK_DZIOBOWY );
stan = 23;
break;
case SILNIK_OPROZNIA:
stan = 24;
break;
}
switch( StanSilnika( ZBIORNIK_RUFOWY ) )
{
case SILNIK_STOI:
stan1 = 21;
break;
case SILNIK_BUSY:
stan1 = 22;
break;
case SILNIK_NAPELNIA:
SilnikZbiornikaOff( ZBIORNIK_RUFOWY );
stan1 = 23;
break;
case SILNIK_OPROZNIA:
SilnikZbiornikaOff( ZBIORNIK_RUFOWY );
stan1 = 24;
break;
}
}
break;
case ZWIEKSZYC_ZANURZENIE:
if ( inclination > 0 )// Zwiekszyc zanurzenie
{// dziob w gore
// napelnic balast dziobowy, zatrzymac rufowy
switch( StanSilnika( ZBIORNIK_DZIOBOWY ) )
{
case SILNIK_STOI:
if ( SILNIK_NAPELNIA != GetKierunekObrotowSilnikZbiornika( ZBIORNIK_DZIOBOWY ) )
{
stan = 35;
KierunekObrotowSilnikaZbiornika( ZBIORNIK_DZIOBOWY, NAPELNIAJ_ZBIORNIK);
break;
}
SilnikZbiornikaOn( ZBIORNIK_DZIOBOWY );
stan = 31;
break;
case SILNIK_BUSY:
stan = 32;
break;
case SILNIK_NAPELNIA:
stan = 33;
break;
case SILNIK_OPROZNIA:
SilnikZbiornikaOff( ZBIORNIK_DZIOBOWY );
stan = 34;
break;
}
switch( StanSilnika( ZBIORNIK_RUFOWY ) )
{
case SILNIK_STOI:
stan1 = 31;
break;
case SILNIK_BUSY:
stan1 = 32;
break;
case SILNIK_NAPELNIA:
SilnikZbiornikaOff( ZBIORNIK_RUFOWY );
stan1 = 33;
break;
case SILNIK_OPROZNIA:
SilnikZbiornikaOff( ZBIORNIK_RUFOWY );
stan1 = 34;
break;
}
}
else if ( 0 == inclination )// Zwiekszyc zanurzenie
{// okret poziomo oba zbiorniki maja napelniac
switch( StanSilnika( ZBIORNIK_DZIOBOWY ) )
{
case SILNIK_STOI:
if ( SILNIK_NAPELNIA != GetKierunekObrotowSilnikZbiornika( ZBIORNIK_DZIOBOWY ) )
{
stan = 45;
KierunekObrotowSilnikaZbiornika( ZBIORNIK_DZIOBOWY, NAPELNIAJ_ZBIORNIK);
break;
}
SilnikZbiornikaOn( ZBIORNIK_DZIOBOWY );
stan = 41;
break;
case SILNIK_BUSY:
stan = 42;
break;
case SILNIK_NAPELNIA:
stan = 43;
break;
case SILNIK_OPROZNIA:
SilnikZbiornikaOff( ZBIORNIK_DZIOBOWY );
stan = 44;
break;
}
switch( StanSilnika( ZBIORNIK_RUFOWY ) )
{
case SILNIK_STOI:
if ( SILNIK_NAPELNIA != GetKierunekObrotowSilnikZbiornika( ZBIORNIK_RUFOWY ) )
{
stan1 = 45;
KierunekObrotowSilnikaZbiornika( ZBIORNIK_RUFOWY, NAPELNIAJ_ZBIORNIK);
break;
}
SilnikZbiornikaOn( ZBIORNIK_RUFOWY );
stan1 = 41;
break;
case SILNIK_BUSY:
stan1 = 42;
break;
case SILNIK_NAPELNIA:
stan1 = 43;
break;
case SILNIK_OPROZNIA:
SilnikZbiornikaOff( ZBIORNIK_RUFOWY );
stan1 = 44;
break;
}
}
else if ( inclination < 0 )// Zwiekszyc zanurzenie
{// dzob w dol. Zatrzymac dziobowy, napelniac rufowy
switch( StanSilnika( ZBIORNIK_DZIOBOWY ) )
{
case SILNIK_STOI:
stan = 51;
break;
case SILNIK_BUSY:
stan = 52;
break;
case SILNIK_NAPELNIA:
SilnikZbiornikaOff( ZBIORNIK_DZIOBOWY );
stan = 53;
break;
case SILNIK_OPROZNIA:
stan = 54;
break;
}
switch( StanSilnika( ZBIORNIK_RUFOWY ) )
{
case SILNIK_STOI:
if ( SILNIK_NAPELNIA != GetKierunekObrotowSilnikZbiornika( ZBIORNIK_RUFOWY ) )
{
stan1 = 55;
KierunekObrotowSilnikaZbiornika( ZBIORNIK_RUFOWY, NAPELNIAJ_ZBIORNIK);
break;
}
SilnikZbiornikaOn( ZBIORNIK_RUFOWY );
stan1 = 51;
break;
case SILNIK_BUSY:
stan1 = 52;
break;
case SILNIK_NAPELNIA:
stan1 = 53;
break;
case SILNIK_OPROZNIA:
SilnikZbiornikaOff( ZBIORNIK_RUFOWY );
stan1 = 54;
break;
}
}
break;
case ZANURZENIE_OK:
if ( inclination > 0 )// zanurzenie ok
{// dziob w gore
// napelnic balast dziobowy, oproznic balast rufowy
switch( StanSilnika( ZBIORNIK_DZIOBOWY ) )
{
case SILNIK_STOI:
if ( SILNIK_NAPELNIA != GetKierunekObrotowSilnikZbiornika( ZBIORNIK_DZIOBOWY ) )
{
stan = 65;
KierunekObrotowSilnikaZbiornika( ZBIORNIK_DZIOBOWY, NAPELNIAJ_ZBIORNIK);
break;
}
SilnikZbiornikaOn( ZBIORNIK_DZIOBOWY );
stan = 61;
break;
case SILNIK_BUSY:
stan = 62;
break;
case SILNIK_NAPELNIA:
stan = 63;
break;
case SILNIK_OPROZNIA:
SilnikZbiornikaOff( ZBIORNIK_DZIOBOWY );
stan = 64;
break;
}
switch( StanSilnika( ZBIORNIK_RUFOWY ) )
{
case SILNIK_STOI:
if ( SILNIK_OPROZNIA != GetKierunekObrotowSilnikZbiornika( ZBIORNIK_RUFOWY ) )
{
stan1 = 65;
KierunekObrotowSilnikaZbiornika( ZBIORNIK_RUFOWY, OPROZNIAJ_ZBIORNIK );
break;
}
SilnikZbiornikaOn( ZBIORNIK_RUFOWY );
stan1 = 61;
break;
case SILNIK_BUSY:
stan1 = 62;
break;
case SILNIK_NAPELNIA:
SilnikZbiornikaOff( ZBIORNIK_RUFOWY );
stan1 = 63;
break;
case SILNIK_OPROZNIA:
stan1 = 64;
break;
}
}
else if ( 0 == inclination )// zanurzenie ok
{// okret poziomo
// oba silniki stop
switch( StanSilnika( ZBIORNIK_DZIOBOWY ) )
{
case SILNIK_STOI:
stan = 71;
break;
case SILNIK_BUSY:
stan = 72;
break;
case SILNIK_NAPELNIA:
SilnikZbiornikaOff( ZBIORNIK_DZIOBOWY );
stan = 73;
break;
case SILNIK_OPROZNIA:
SilnikZbiornikaOff( ZBIORNIK_DZIOBOWY );
stan = 74;
break;
}
switch( StanSilnika( ZBIORNIK_RUFOWY ) )
{
case SILNIK_STOI:
stan1 = 71;
break;
case SILNIK_BUSY:
stan1 = 72;
break;
case SILNIK_NAPELNIA:
SilnikZbiornikaOff( ZBIORNIK_RUFOWY );
stan1 = 73;
break;
case SILNIK_OPROZNIA:
SilnikZbiornikaOff( ZBIORNIK_RUFOWY );
stan1 = 74;
break;
}
}
else if ( inclination < 0 )// Zanurzenie ok
{// dzob w dol
// oproznic dziobowy, napelnic rufowy
switch( StanSilnika( ZBIORNIK_DZIOBOWY ) )
{
case SILNIK_STOI:
if ( SILNIK_OPROZNIA != GetKierunekObrotowSilnikZbiornika( ZBIORNIK_DZIOBOWY ) )
{
stan = 85;
KierunekObrotowSilnikaZbiornika( ZBIORNIK_DZIOBOWY, OPROZNIAJ_ZBIORNIK);
break;
}
SilnikZbiornikaOn( ZBIORNIK_DZIOBOWY );
stan = 81;
break;
case SILNIK_BUSY:
stan = 82;
break;
case SILNIK_NAPELNIA:
SilnikZbiornikaOff( ZBIORNIK_DZIOBOWY );
stan = 83;
break;
case SILNIK_OPROZNIA:
stan = 84;
break;
}
switch( StanSilnika( ZBIORNIK_RUFOWY ) )
{
case SILNIK_STOI:
if ( SILNIK_NAPELNIA != GetKierunekObrotowSilnikZbiornika( ZBIORNIK_RUFOWY ) )
{
stan1 = 85;
KierunekObrotowSilnikaZbiornika( ZBIORNIK_RUFOWY, NAPELNIAJ_ZBIORNIK);
break;
}
SilnikZbiornikaOn( ZBIORNIK_RUFOWY );
stan1 = 81;
break;
case SILNIK_BUSY:
stan1 = 82;
break;
case SILNIK_NAPELNIA:
stan1 = 83;
break;
case SILNIK_OPROZNIA:
SilnikZbiornikaOff( ZBIORNIK_RUFOWY );
stan1 = 84;
break;
}
}
break;
case ZANURZENIE_INVALID:
break;
default:
stan = 0;
break;
}// switch( StanZanurzenia( izanurzenie ) )
if ( (stan != prevStan ) || ( stan1 != prevStan1 ) )
{
prevStan = stan;
WyslijZnak( stan );
prevStan1 = stan1;
WyslijZnak( stan1 );
WyslijZnak( inclination );
if ( KrancowkaSilnikaZbiornika( ZBIORNIK_DZIOBOWY ) ) WyslijZnak( 1 );
else WyslijZnak( 0 );
if ( KrancowkaSilnikaZbiornika( ZBIORNIK_RUFOWY ) ) WyslijZnak( 1 );
else WyslijZnak( 0 );
}
}// while( ( GetIntSecondMain() - czasStart ) < 30 )
while( IsSilnikZbiornikaBusy( ZBIORNIK_RUFOWY ) );
while( IsSilnikZbiornikaBusy( ZBIORNIK_DZIOBOWY ) );
SilnikZbiornikaOff( ZBIORNIK_RUFOWY );
SilnikZbiornikaOff( ZBIORNIK_DZIOBOWY );
while( IsSilnikZbiornikaBusy( ZBIORNIK_RUFOWY ) );
while( IsSilnikZbiornikaBusy( ZBIORNIK_DZIOBOWY ) );
KierunekObrotowSilnikaZbiornika( ZBIORNIK_RUFOWY, OPROZNIAJ_ZBIORNIK);
KierunekObrotowSilnikaZbiornika( ZBIORNIK_DZIOBOWY, OPROZNIAJ_ZBIORNIK);
while( IsSilnikZbiornikaBusy( ZBIORNIK_RUFOWY ) );
while( IsSilnikZbiornikaBusy( ZBIORNIK_DZIOBOWY ) );
SilnikZbiornikaOn( ZBIORNIK_RUFOWY );
SilnikZbiornikaOn( ZBIORNIK_DZIOBOWY );
while( ShipUnderTheWater() );
NapowietrzanieOpen();
while( (!KrancowkaSilnikaZbiornika( ZBIORNIK_DZIOBOWY ) ) | ( !KrancowkaSilnikaZbiornika( ZBIORNIK_RUFOWY ) ) )
{
}
SilnikZbiornikaOff( ZBIORNIK_DZIOBOWY );
SilnikZbiornikaOff( ZBIORNIK_RUFOWY );
for(;;);
}