SSN-688
- Andrzej1
- Posty: 1568
- Rejestracja: 04 gru 2010, 21:56
- Lokalizacja: {"name":"Polska Szczecin","desc":"","lat":"","lng":""}
O:SSN-688
Witaj Andrzeju i Ty Oglądaczu.
Wszystko na koguta (jak na zdjęciu). Gura twierdzi, że przy mosfetach opornik wyrównujący
nie jest konieczny ze względu na charakterystykę tranzystora.
Oporniki są potrzebne w tranzystorach bipolarnych. Tyla mogę Ci odpowiedzieć, bo moja wiedza
elektroniczna jest wyłącznie wiedzą zasłyszaną i to z jednego źródła (Gura Procesorowa).
Dzięki za pytania. One mogą naprowadzić nas (to znaczy Gurę) na faktyczne źródło kłopotów z tym
mostkiem.
Z ukŁonami
Andrzej Korycki
[Edit 13-09-2010]
Okazało się, że tranzystory przeżyły. Tym razem zaciął się wyłącznik krańcowy. Konstrukcja prosta jak cep,
ale coś się stało. Muszę zmiejszyć tarcie (czyli nasmarować). Jak to nie pomoże, to tuleje i te rzeczy.
Najdziwniejsze jest to, że gdy nastąpiła awaria, to on wcale używany nie był. Pokory uczy nie tylko
elektronika ale i mechanika. Za kilka dni to ja całkiem pokorny będę.
Wszystko na koguta (jak na zdjęciu). Gura twierdzi, że przy mosfetach opornik wyrównujący
nie jest konieczny ze względu na charakterystykę tranzystora.
Oporniki są potrzebne w tranzystorach bipolarnych. Tyla mogę Ci odpowiedzieć, bo moja wiedza
elektroniczna jest wyłącznie wiedzą zasłyszaną i to z jednego źródła (Gura Procesorowa).
Dzięki za pytania. One mogą naprowadzić nas (to znaczy Gurę) na faktyczne źródło kłopotów z tym
mostkiem.
Z ukŁonami
Andrzej Korycki
[Edit 13-09-2010]
Okazało się, że tranzystory przeżyły. Tym razem zaciął się wyłącznik krańcowy. Konstrukcja prosta jak cep,
ale coś się stało. Muszę zmiejszyć tarcie (czyli nasmarować). Jak to nie pomoże, to tuleje i te rzeczy.
Najdziwniejsze jest to, że gdy nastąpiła awaria, to on wcale używany nie był. Pokory uczy nie tylko
elektronika ale i mechanika. Za kilka dni to ja całkiem pokorny będę.
- Andrzej1
- Posty: 1568
- Rejestracja: 04 gru 2010, 21:56
- Lokalizacja: {"name":"Polska Szczecin","desc":"","lat":"","lng":""}
O:SSN-688
Witam
Elektronika, mechanika i programowanie jest sztuką trudną ale udało się pokonać opór wrednej materii
i tłok zbiornika zasuwa w obu kierunkach dojeżdżając do krańcówek i wracając na zurick. Program wygląda tak :
[code:1] stan = 0;
kierunek = 0
for (;;ÂŤÂť)
{// nieskończona pętla - niech zajeździ akumulator a co...
switch ( stan )
{
case 0:
if ( IsSilnikZbiornikaBusy( 0 ) )
{// Pomiędzy rozkazami musi uplynac czas i wtedy silnik jest zajety
continue;
}
KierunekObrotowSilnikaZbiornika( 0, kierunek );
++stan;
break;
case 1:
if ( IsSilnikZbiornikaBusy( 0 ) )
{
continue;
}
SilnikZbiornikaOn( 0 );
++stan;
break;
case 2:
if ( KrancowkaSilnikaZbiornika( 0 ) )
{
// Jak zadziala krancowka, to zmieniamy kierunek obrotow i wylaczamy logicznie silnik
// fizycznie to on został wyłaczony krancowką. Po zatrzymaniu też należy chwilę odczekac
SilnikZbiornikaOff( 0 );
stan = 3;
kierunek = 1 - kierunek;
break;
}
break;
case 3:
if ( IsSilnikZbiornikaBusy( 0 ) )
{
continue;
}
KierunekObrotowSilnikaZbiornika( 0, kierunek );
stan = 4;
break;
case 4:
if ( IsSilnikZbiornikaBusy( 0 ) )
{
continue;
}
// Zmieniony kierunek i ruszamy
SilnikZbiornikaOn( 0 );
++stan;
break;
case 5:
// czekamy az odpusci krancowke
if ( KrancowkaSilnikaZbiornika( 0 ) )continue;
++stan;
// Dajmy mu troche czasu aby ruszyl na dobre
SetSilnikZbiornikaBusy( 0, 10 );
break;
case 6:
if ( IsSilnikZbiornikaBusy( 0 ) )continue;
// i wrocmy do wachlowania tlokiem
stan = 1;
break;
default:
stan = 0;
break;
}
}
[/code:1]
Z rzeczy, na które trzeba zwrócić uwagę, to czas potrzebny na odpuszczenie
krańcówki. W końcu mam jeden bit informujący o tym, że któraś zadziałała. I żadnego pojęcia która.
Tym, którzy wolą obrazki zamiast tekstu :
Z ukłonami
Andrzej Korycki
P.S.
Te pięknie wlutowane, na krzywy ryj, ledy to debugger pozwalający na stwierdzenie, czy ja rzeczywiście
chcę kręcić silnikiem, czy tylko mi się to marzy. Pomysł i realizacja Gura Procesorowa.
Elektronika, mechanika i programowanie jest sztuką trudną ale udało się pokonać opór wrednej materii
i tłok zbiornika zasuwa w obu kierunkach dojeżdżając do krańcówek i wracając na zurick. Program wygląda tak :
[code:1] stan = 0;
kierunek = 0
for (;;ÂŤÂť)
{// nieskończona pętla - niech zajeździ akumulator a co...
switch ( stan )
{
case 0:
if ( IsSilnikZbiornikaBusy( 0 ) )
{// Pomiędzy rozkazami musi uplynac czas i wtedy silnik jest zajety
continue;
}
KierunekObrotowSilnikaZbiornika( 0, kierunek );
++stan;
break;
case 1:
if ( IsSilnikZbiornikaBusy( 0 ) )
{
continue;
}
SilnikZbiornikaOn( 0 );
++stan;
break;
case 2:
if ( KrancowkaSilnikaZbiornika( 0 ) )
{
// Jak zadziala krancowka, to zmieniamy kierunek obrotow i wylaczamy logicznie silnik
// fizycznie to on został wyłaczony krancowką. Po zatrzymaniu też należy chwilę odczekac
SilnikZbiornikaOff( 0 );
stan = 3;
kierunek = 1 - kierunek;
break;
}
break;
case 3:
if ( IsSilnikZbiornikaBusy( 0 ) )
{
continue;
}
KierunekObrotowSilnikaZbiornika( 0, kierunek );
stan = 4;
break;
case 4:
if ( IsSilnikZbiornikaBusy( 0 ) )
{
continue;
}
// Zmieniony kierunek i ruszamy
SilnikZbiornikaOn( 0 );
++stan;
break;
case 5:
// czekamy az odpusci krancowke
if ( KrancowkaSilnikaZbiornika( 0 ) )continue;
++stan;
// Dajmy mu troche czasu aby ruszyl na dobre
SetSilnikZbiornikaBusy( 0, 10 );
break;
case 6:
if ( IsSilnikZbiornikaBusy( 0 ) )continue;
// i wrocmy do wachlowania tlokiem
stan = 1;
break;
default:
stan = 0;
break;
}
}
[/code:1]
Z rzeczy, na które trzeba zwrócić uwagę, to czas potrzebny na odpuszczenie
krańcówki. W końcu mam jeden bit informujący o tym, że któraś zadziałała. I żadnego pojęcia która.
Tym, którzy wolą obrazki zamiast tekstu :

Z ukłonami
Andrzej Korycki
P.S.
Te pięknie wlutowane, na krzywy ryj, ledy to debugger pozwalający na stwierdzenie, czy ja rzeczywiście
chcę kręcić silnikiem, czy tylko mi się to marzy. Pomysł i realizacja Gura Procesorowa.
- rychenko
- Posty: 681
- Rejestracja: 04 gru 2010, 21:56
O:SSN-688
Andrzejku skoro już przełamałeś te drobne kłopoty:P z oprogramowaniem to jest szansa że przed pierwszymi lodami Lalunia zejdzie pod wode ?
Pięknie to wszystko wygląda i jestem pełen podziwu ze nie wywaliłes wszystkiego przez okno w chwilach słabości , ale przeciez ty takowych nie masz prawda?:evil:
A tak na marginesie jestes zalogowany na jakimś forum informatycznym?
Pięknie to wszystko wygląda i jestem pełen podziwu ze nie wywaliłes wszystkiego przez okno w chwilach słabości , ale przeciez ty takowych nie masz prawda?:evil:
A tak na marginesie jestes zalogowany na jakimś forum informatycznym?
Pozdrawiam Ryszard
- Andrzej1
- Posty: 1568
- Rejestracja: 04 gru 2010, 21:56
- Lokalizacja: {"name":"Polska Szczecin","desc":"","lat":"","lng":""}
O:SSN-688
rychenko napisał:
Witaj Ryszardzie i Ty Kogowiczu
Z tym zejściem pod wodę przed lodami, to może być kłopot bo :
- Nie ma ostatecznej odpowiedzi, czy te tranzystory "wytrzymią" próby. Jak nie, to nowy projekt płytki
i cały cyrk od nowa.
- Nie jest uruchomiony sterownik silnika głównego.
- Nie mam programu do sterowania serwami
- Nie działa impulsator, informujący procesor o tym, że silnik się kręci (oscyloskop w drodze)
- Nie jest uruchomiony (a nawet wlutowany głębokościomierz)
- i jeszcze parę nie.
Lody mi nie przeszkodzą wcale, bo :
- Pierwsze próby w rybkarium w piwnicy.
- Próba morska w jakimś szkolnym basenie wynajętym za pół "litry".
- Próba fontannowa planowana jest na maj 2011 - i tu myślę, że się zmieszczę.
Co do chwil słabości, to oczywiście, że je mam. Ale jak pomyślę, że wypieprzę to wszystko do kubła
i będę musiał zrobić od nowa po staremu, to wcale do tego kubła lecieć nie chcę.
A wreszcie jak będę wyglądał przed Forumowiczami. Tomasz_D będzie spluwał śliną modelarską
na mój widok. A ślina modelarska, to cenna rzecz, szkoda jej marnować.
Poza tym, to jest moje dziecięce marzenie i kiedyś muszę je zrealizować. Jak to się nie powiedzie, to
będzie następny SSN688. Powodzenie nie wyklucza następnego SSN688.
Co do forum o programowaniu (bo nie informatycznym), to byłem kiedyś na grupie dyskusyjnej C.
Ale Ci, którzy coś umieli odeszli (porodziły się im dzieci, porozwodzili się, czy co jeszcze tam)
to i ja znikłem - nie było z kim gadać. A odpowiadać na pytania, czy w instrukcji switch musi być default
nie miałem już ochoty, bo jeżeli ktoś nie rozumie K&R to z całą pewnością nie zrozumie mojego tekstu.
który jest jakościowo gorszy.
Z ukłonami
Andrzej Korycki
Andrzejku skoro już przełamałeś te drobne kłopoty:P z oprogramowaniem to jest szansa że przed pierwszymi lodami Lalunia zejdzie pod wode ?
Pięknie to wszystko wygląda i jestem pełen podziwu ze nie wywaliłes wszystkiego przez okno w chwilach słabości , ale przeciez ty takowych nie masz prawda?:evil:
A tak na marginesie jestes zalogowany na jakimś forum informatycznym?
Witaj Ryszardzie i Ty Kogowiczu
Z tym zejściem pod wodę przed lodami, to może być kłopot bo :
- Nie ma ostatecznej odpowiedzi, czy te tranzystory "wytrzymią" próby. Jak nie, to nowy projekt płytki
i cały cyrk od nowa.
- Nie jest uruchomiony sterownik silnika głównego.
- Nie mam programu do sterowania serwami
- Nie działa impulsator, informujący procesor o tym, że silnik się kręci (oscyloskop w drodze)
- Nie jest uruchomiony (a nawet wlutowany głębokościomierz)
- i jeszcze parę nie.
Lody mi nie przeszkodzą wcale, bo :
- Pierwsze próby w rybkarium w piwnicy.
- Próba morska w jakimś szkolnym basenie wynajętym za pół "litry".
- Próba fontannowa planowana jest na maj 2011 - i tu myślę, że się zmieszczę.
Co do chwil słabości, to oczywiście, że je mam. Ale jak pomyślę, że wypieprzę to wszystko do kubła
i będę musiał zrobić od nowa po staremu, to wcale do tego kubła lecieć nie chcę.
A wreszcie jak będę wyglądał przed Forumowiczami. Tomasz_D będzie spluwał śliną modelarską
na mój widok. A ślina modelarska, to cenna rzecz, szkoda jej marnować.
Poza tym, to jest moje dziecięce marzenie i kiedyś muszę je zrealizować. Jak to się nie powiedzie, to
będzie następny SSN688. Powodzenie nie wyklucza następnego SSN688.
Co do forum o programowaniu (bo nie informatycznym), to byłem kiedyś na grupie dyskusyjnej C.
Ale Ci, którzy coś umieli odeszli (porodziły się im dzieci, porozwodzili się, czy co jeszcze tam)
to i ja znikłem - nie było z kim gadać. A odpowiadać na pytania, czy w instrukcji switch musi być default
nie miałem już ochoty, bo jeżeli ktoś nie rozumie K&R to z całą pewnością nie zrozumie mojego tekstu.
który jest jakościowo gorszy.
Z ukłonami
Andrzej Korycki
- Andrzej1
- Posty: 1568
- Rejestracja: 04 gru 2010, 21:56
- Lokalizacja: {"name":"Polska Szczecin","desc":"","lat":"","lng":""}
O:SSN-688
Wiem, że moje uwagi są nie do przecenienia, ale gdyby ktoś z litościwych Moderatorów wyp... tego dubla,
to byłbym wdzięczny.
Z ukłonami
Andrzej Korycki
P.S.
Tu chodzi o zdrowie psychiczne pozostałych Użytkowników Kogi, którym to Użytkownikom
mogę je nadszarpnąć za pomocą nieodpowiedzialnych wpisów.
to byłbym wdzięczny.
Z ukłonami
Andrzej Korycki
P.S.
Tu chodzi o zdrowie psychiczne pozostałych Użytkowników Kogi, którym to Użytkownikom
mogę je nadszarpnąć za pomocą nieodpowiedzialnych wpisów.
- Smok_740
- Posty: 243
- Rejestracja: 04 gru 2010, 21:56
O:SSN-688
Hmm Andrzeju.
Im dluzej sie przygladam twojemu ostatniemu zdjeciu LA odnajduje wiele podobienstw do rakiety 5Ja24 (stary S-75 Wolchow - jesli jeszcze ktos pamieta):D ktore to kiedys rozbieralem w duzych ilosciach. Normalnie identyczna :D:D. Elektronika plus elementy wykonawcze hmmm. :D:D:D. Tylko glowicy brak :P
(uprzedzam fakty - polskie "ogonki" w literkach wstawie jak wroce do domu :))
Pozdrawiam
Smoku
Im dluzej sie przygladam twojemu ostatniemu zdjeciu LA odnajduje wiele podobienstw do rakiety 5Ja24 (stary S-75 Wolchow - jesli jeszcze ktos pamieta):D ktore to kiedys rozbieralem w duzych ilosciach. Normalnie identyczna :D:D. Elektronika plus elementy wykonawcze hmmm. :D:D:D. Tylko glowicy brak :P
(uprzedzam fakty - polskie "ogonki" w literkach wstawie jak wroce do domu :))
Pozdrawiam
Smoku
W porcie
DKM "BISMARCK" 1/200
W stoczni
ALBATROS 1/55 - Constructo -a ze 45% - zawieszona do czasu wyzdrowienia :(
W kolejce: Santissima Trinidad 1/90 DeAgostini
CSS "Alabama" RC 1/48 - wlasny wyrob (mam nadzieje)
DKM "BISMARCK" 1/200
W stoczni
ALBATROS 1/55 - Constructo -a ze 45% - zawieszona do czasu wyzdrowienia :(
W kolejce: Santissima Trinidad 1/90 DeAgostini
CSS "Alabama" RC 1/48 - wlasny wyrob (mam nadzieje)
- Andrzej1
- Posty: 1568
- Rejestracja: 04 gru 2010, 21:56
- Lokalizacja: {"name":"Polska Szczecin","desc":"","lat":"","lng":""}
O:SSN-688
Witam
Smoku_740:
Gura Procesorowa, przeczytawszy Twój Smoczy post, podnieciła się niezdrowo.
Ponieważ chłopina nie jest już podlotkiem, to w trosce o jego ciśnienie i parcie, wyrażam Jego prośbę :
Gdyby jakaś fotka, albo lepiej kilka, tej enigmatycznej "rakiety 5Ja24 (stary S-75 Wolchow )"
oczywiście od środka, to Gura byłaby zaspokojoną.
Prawdopodobnie nie jest to już tajne i nie naruszysz żadnej tajemnicy. A może wiesz gdzie takowe
się znajdują ?
Z ukłonami
Andrzej Korycki
P.S.
Trwają prace programistyczne nad LA. Na razie katuję zbiorniki i ich elektronikę sterującą (w sensie
dosłownym). Jak dokonam jakiegoś epokowego odkrycia, to dziecięcą radością się nim pochwalę.
Smoku_740:
Gura Procesorowa, przeczytawszy Twój Smoczy post, podnieciła się niezdrowo.
Ponieważ chłopina nie jest już podlotkiem, to w trosce o jego ciśnienie i parcie, wyrażam Jego prośbę :
Gdyby jakaś fotka, albo lepiej kilka, tej enigmatycznej "rakiety 5Ja24 (stary S-75 Wolchow )"
oczywiście od środka, to Gura byłaby zaspokojoną.
Prawdopodobnie nie jest to już tajne i nie naruszysz żadnej tajemnicy. A może wiesz gdzie takowe
się znajdują ?
Z ukłonami
Andrzej Korycki
P.S.
Trwają prace programistyczne nad LA. Na razie katuję zbiorniki i ich elektronikę sterującą (w sensie
dosłownym). Jak dokonam jakiegoś epokowego odkrycia, to dziecięcą radością się nim pochwalę.
- Smok_740
- Posty: 243
- Rejestracja: 04 gru 2010, 21:56
O:SSN-688
Andrzeju
Wkradł sie czeski błąd, ta rakieta to 5Ja23 a nie 5Ja24 ("3" bardzo blisko"4" i mi się pomyliło :()
Przepraszam. Ogólnie nie mam zdjec elektroniki tej rakiety w każdym bądź razie była to elektornika lampowa (analogowa). Odporna na wysokie przeciażenia. Smieszne bylo to ze eleketronika wytrzymywala za to sama konstrukcja rakiety juz nie (czasami sie łamały, ale te starsze :D)
5Ja23 były ostatnimi jakie były stosowane w zestawach S-75 (najnowoczesniejsze jak na tamte czasy bo produkcje mialy 1980 - 1982) w WOPK potem WLOP teraz Siły Powietrzne.
Pozdrawiam
Smoku
Wkradł sie czeski błąd, ta rakieta to 5Ja23 a nie 5Ja24 ("3" bardzo blisko"4" i mi się pomyliło :()
Przepraszam. Ogólnie nie mam zdjec elektroniki tej rakiety w każdym bądź razie była to elektornika lampowa (analogowa). Odporna na wysokie przeciażenia. Smieszne bylo to ze eleketronika wytrzymywala za to sama konstrukcja rakiety juz nie (czasami sie łamały, ale te starsze :D)
5Ja23 były ostatnimi jakie były stosowane w zestawach S-75 (najnowoczesniejsze jak na tamte czasy bo produkcje mialy 1980 - 1982) w WOPK potem WLOP teraz Siły Powietrzne.
Pozdrawiam
Smoku
W porcie
DKM "BISMARCK" 1/200
W stoczni
ALBATROS 1/55 - Constructo -a ze 45% - zawieszona do czasu wyzdrowienia :(
W kolejce: Santissima Trinidad 1/90 DeAgostini
CSS "Alabama" RC 1/48 - wlasny wyrob (mam nadzieje)
DKM "BISMARCK" 1/200
W stoczni
ALBATROS 1/55 - Constructo -a ze 45% - zawieszona do czasu wyzdrowienia :(
W kolejce: Santissima Trinidad 1/90 DeAgostini
CSS "Alabama" RC 1/48 - wlasny wyrob (mam nadzieje)
- Andrzej1
- Posty: 1568
- Rejestracja: 04 gru 2010, 21:56
- Lokalizacja: {"name":"Polska Szczecin","desc":"","lat":"","lng":""}
O:SSN-688
Witam
Epokowe odkrycie to nie jest, ale jakiś postęp zawsze.
Inicjalizacja położenia tłoka w zbiorniku balastowym.
Założenia są takie :
1. Po zakończeniu procedury, zbiornik ma być w położeniu opróżniony, tuż przy krańcówce
opróżniania (tej co ogranicza ruch w stronę opróżniania zbiornika). 3 razy to samo słowo w jednym
zdaniu - to trzeba być polonistą pierwszej wody. Widać taki jestem.
2. Funkcja obsługująca nie powinna zajmować dużo czasu procesora, ponieważ w tym
czasie powinny być również wykonywane inne czynności (cholera wie jakie).
Funkcja wykonywana jest gdy model NIE znajduje się w wodzie, ale zaraz po włączeniu systemu.
3. Zbiornik ma dwie krańcówki włączane gdy tłok osiągnie położenia krańcowe (masło maślane).
4. Procesor „nie wie”, która krańcówka jest włączona. Załączenie którejkolwiek krańcówki ustawia
jeden i ten sam bit.
5. Procesor może sterować silnikiem w stronę każdej krańcówki i „wie” w stronę której
(krańcówki ) tłok się przesuwa.
6. Załączenie krańcówki powoduje, że silnik w stronę zabezpieczoną przez krańcówkę
NIE MOŻE się już poruszać, czyli nie zniszczy ani krańcówki ani zbiornika.
Zabezpiecza to zbiornik przed błędami w programie.
7.Zmiana kierunku obrotów silnika nie może odbywać się w czasie gdy silnik się kręci (elektronika
tego nie wytrzymuje). Trzeba najpierw zatrzymać silnik i dopiero potem zmieniać kierunek obrotów.
8. Można stwierdzić, czy silnik się kręci, bo do procesora dostarczane są impulsy (lub nie
gdy się nie kręci ) z transoptora refleksyjnego (takiego, co to stwierdza czy jest „papiór”
w drukarce). Tu transoptor „patrzy” na biało-czarne pola na kole zębatym wewnątrz zbiornika.
Sposób realizacji (połączenie ze sprzętem) nikomu się do niczego nie przyda, ale sam algorytm –
być może.
Wymyśliłem, że przerwanie co 20 milisekund zmniejsza ( o ile jest co ) zmienną SilnikBusy, którą
ustawiają funkcje : KierunekObrotowSilnikaZbiornika( ... ) na 2 (co najmniej 20 milisekund, max 40 )
oraz
SilnikZbiornikaOff( ... ) na 20 ( co najmniej 0.38 sekundy, max 0,4 sek ). Te 0.4 sekundy
daje silnikowi czas na całkowite zatrzymanie się. Liczby z niczego czyli z głowy.
Każdy silnik ma swoją zmienną SilnikBusy. A silniki takie są dwa.
Poza tym, istnieje funkcja, która może zmienną SilnikBusy ustawić na dowolną wartość ( 0-255).
Nazwy funkcji są w języku GutenKompot, ale każdy Polak może je zrozumieć.
Funkcja wykonywana jest w ten sposób, że po stwierdzeniu stanu, wykonuje akcję
i opuszcza funkcję pozwalając programowi głównemu na wykonanie innych zadań.
Funkcja zwraca wartość 0 gdy ma być ponownie wywołana i nie zero gdy koniec.
Wartość 1 to O.K. pozostałe to błędy.
Oto i ona funkcja :
[code:1]
unsigned char SetZbiornikGotow( unsigned char numer, unsigned char* status, unsigned char* timeSec )
{// Funkcja ustawia zbiornik gotow do pracy. Zbiornik pusty. Tłok tuż za krańcówką opróżniania
// Funkcja jest przezroczysta - musi byc wykonywana, az do chwili zwrocenia nie zero
// Zwroci 1 - silnik gotow
// Kod bledu > 1
// 2 - uszkodzona krancowka
// 3 - uszkodzony silnik
// 4 - hgw co
// status musi byc ustawiony na 0 na starcie
// Krancowka przy wysuniętej srubie to napelniania
// Krancowka przy wsunietej srubie to oprozniania
// Aby wszelkie operacje byly wykonywane na silniku w stanie ustalonym
if( IsSilnikZbiornikaBusy( numer ) )return 0;
switch( *status )
{
// Mozliwe dwa wypadki : krancowka wlaczona i krancowki wylaczone
case 0:// Nic nie wiadomo o polozeniu tloka
if ( KrancowkaSilnikaZbiornika( numer ) )
{// Jest wlaczona jakas krancowka
// Zaklada sie, że jest to krancowka oprozniania
KierunekObrotowSilnikaZbiornika( numer, NAPELNIAJ_ZBIORNIK );
++(*status);
return 0;
}
else
{// nie jest wlaczona zadna krancowka
KierunekObrotowSilnikaZbiornika( numer, OPROZNIAJ_ZBIORNIK );
*status = 40;
}
return 0;
// Jedna z krancowek wlaczona
case 1: // proba w kierunku NAPELNIAJ_ZBIORNIK
ClearNrImpulsuZbiornika( numer );
SilnikZbiornikaOn( numer );
SetSilnikZbiornikaBusy( numer, 10 ); // Na 0,2 sekundy
++(*status);
return 0;
case 2: // Sprawdzenie czy po 0,2 sek silnik sie ruszyl
if ( GetNrImpulsuZbiornika( numer ) )
{// silnik ruszyl, czyli krancowka oprozniania
++(*status);
}
else
{// silnik nie ruszyl czyli krancowka napelniania
SilnikZbiornikaOff( numer );
*status = 30;
}
return 0;
case 3:
if ( KrancowkaSilnikaZbiornika( numer ) )
{// silnik ruszyl a krancowka oprozniania nie odpuscila
// uszkodzona krancowka oprozniania
return 2;
}
// Krancowka oprozniania odpuscila. Tlok w polozeniu wsuniety, tuz przy krancowce
// Zatrzymac silnik
SilnikZbiornikaOff( numer );
*status = 10;
return 0;
// Silnik stoi przy krancowce oprozniania, krancowka wylaczona
// przestawienie go blizej
case 10:
KierunekObrotowSilnikaZbiornika( numer, OPROZNIAJ_ZBIORNIK );
++(*status);
return 0;
case 11:
SilnikZbiornikaOn( numer );
++(*status);
*timeSec = GetIntSecondMain();
return 0;
case 12:
if ( KrancowkaSilnikaZbiornika( numer ) )
{
SilnikZbiornikaOff( numer );
++(*status);
return 0;
}
if ( GetIntSecondMain() - (*timeSec) < 2 )
{
return 0;
}
if ( GetNrImpulsuZbiornika( numer ) )
{
// Po sekundzie nie osiagnieta krancowka - uszkodzona
SilnikZbiornikaOff( numer );
return 2;
}
// silnik sie nie kreci
SilnikZbiornikaOff( numer );
return 3;
// Krancowka oprozniania wlaczona silnik stoi
case 13: // Odsunac tlok, aby wylaczyć krańcowkę oprozniania
KierunekObrotowSilnikaZbiornika( numer, NAPELNIAJ_ZBIORNIK );
++(*status);
return 0;
case 14:
SilnikZbiornikaOn( numer );
++(*status);
*timeSec = GetIntSecondMain();
// SetSilnikZbiornikaBusy( numer, 10 );
return 0;
case 15:
if ( !KrancowkaSilnikaZbiornika( numer ) )
{
SilnikZbiornikaOff( numer );
ClearNrImpulsuZbiornika( numer );
break; //return 1; // Powodzenie
}
if ( GetIntSecondMain() - (*timeSec) < 2 )
{
return 0;
}
if ( GetNrImpulsuZbiornika( numer ) )
{
// Po sekundzie nie zwolniona krancowka - uszkodzona
SilnikZbiornikaOff( numer );
return 2;
}
// silnik sie nie kreci
SilnikZbiornikaOff( numer );
return 3;
case 30:// wlaczona krancowka napelniania proba w kierunku OPROZNIAJ_ZBIORNIK
KierunekObrotowSilnikaZbiornika( numer, OPROZNIAJ_ZBIORNIK );
++(*status);
return 0;
case 31:
ClearNrImpulsuZbiornika( numer );
SilnikZbiornikaOn( numer );
SetSilnikZbiornikaBusy( numer, 10 ); // Na 0,2 sekundy
++(*status);
*timeSec = GetIntSecondMain();
return 0;
case 32:
if ( GetNrImpulsuZbiornika( numer ) )
{// silnik się kręci krancowka powinna byc odpuszczona
if ( KrancowkaSilnikaZbiornika( numer ) )
{
if ( GetIntSecondMain() - (*timeSec) < 2 )
{
return 0;
}
// krancowka nie odpuszczona po sekundzie - uszkodzona
SilnikZbiornikaOff( numer );
return 2;
}
// krancowka puscila
++(*status);
*timeSec = GetIntSecondMain();
return 0;
}
// silnik się nie kręci
SilnikZbiornikaOff( numer );
return 3;
case 33:
if ( KrancowkaSilnikaZbiornika( numer ) )
{ // musi byc krancowka w kierunku oprozniania
SilnikZbiornikaOff( numer );
*status = 13;
return 0;
}
if ( GetIntSecondMain() - (*timeSec) < 20 )
{
return 0;
}
return 3;
case 40: // Nie jest wlaczona zadna krancowka - oproznianie
SilnikZbiornikaOn( numer );
++(*status);
*timeSec = GetIntSecondMain();
return 0;
case 41: // oproznianie az do chwili zadzialania krancowki oprozniania
if ( KrancowkaSilnikaZbiornika( numer ) )
{
SilnikZbiornikaOff( numer );
ClearNrImpulsuZbiornika( numer );
*status = 13;
return 0;
}
if ( GetIntSecondMain() - (*timeSec) < 20 )
{// Daje mu czas 20 sekund na dojechanie do krancowki oprozniania
return 0;
}
if ( GetNrImpulsuZbiornika( numer ) )
{// sa impulsy
// Po 20 sekundach nie osiagnieta krancowka - uszkodzona
SilnikZbiornikaOff( numer );
return 2;
}
// silnik sie nie kreci
SilnikZbiornikaOff( numer );
return 3;
default:
return 4;
}
ClearNrImpulsuZbiornika( numer );
return 1;
}
[/code:1]
A tu kawałek programu, który ją woła :
[code:1]
PORTB |= _BV( LED_TEST );
DelayUtils ( 1000 );
statusold = status = 0;
PORTB &= ~_BV(LED_TEST);
for(;;ÂŤÂť)
{
stan = SetZbiornikGotow( ZBIORNIK_RUFOWY, &status, × );
if ( stan )
{
break;
}
if ( status != statusold )
{// sprawdzenie jak wewnatrz funkcji zmienia sie status (na PC)
// Wolany tylko gdy status sie zmieni, bo tak to szybko zapelnialy sie bufory
WyslijZnak( status );
statusold = status;
}
}
switch( stan )
{// Sygnalizacja ewentualnych bledow
case 1:
break;
case 2:
PORTA &= ~_BV(LED_WHITE);
break;
case 3:
PORTA &= ~_BV(LED_RED);
break;
default:
PORTA &= ~_BV(LED_GREEN);
break;
}
// NiebieskiLED na stale
PORTB |= _BV( LED_TEST );
for(;;ÂŤÂť); // koniec balu
[/code:1]
Niebieski led (LED_TEST) służy wyłącznie do stwierdzenia, że program żyje.
Krótkie mrugnięcie na początku i zapalenie na stałe na końcu programu.
Ostatnia instrukcja for(;;); (fajnie wyszło, ale miało być tak : for( ; ; ) ; )
powoduje, że program wchodzi w nieskończoną
pętlę i nie robi nic. Inaczej, mówiąc, się zawiesza, jak to program.
Jak na razie nie wykryłem błędów, co wcale nie oznacza, że ich tam nie ma.
Jeżeli wykryję, to zamieszczę stosowne poprawki.
Z ukłonami
Andrzej Korycki
Epokowe odkrycie to nie jest, ale jakiś postęp zawsze.
Inicjalizacja położenia tłoka w zbiorniku balastowym.
Założenia są takie :
1. Po zakończeniu procedury, zbiornik ma być w położeniu opróżniony, tuż przy krańcówce
opróżniania (tej co ogranicza ruch w stronę opróżniania zbiornika). 3 razy to samo słowo w jednym
zdaniu - to trzeba być polonistą pierwszej wody. Widać taki jestem.
2. Funkcja obsługująca nie powinna zajmować dużo czasu procesora, ponieważ w tym
czasie powinny być również wykonywane inne czynności (cholera wie jakie).
Funkcja wykonywana jest gdy model NIE znajduje się w wodzie, ale zaraz po włączeniu systemu.
3. Zbiornik ma dwie krańcówki włączane gdy tłok osiągnie położenia krańcowe (masło maślane).
4. Procesor „nie wie”, która krańcówka jest włączona. Załączenie którejkolwiek krańcówki ustawia
jeden i ten sam bit.
5. Procesor może sterować silnikiem w stronę każdej krańcówki i „wie” w stronę której
(krańcówki ) tłok się przesuwa.
6. Załączenie krańcówki powoduje, że silnik w stronę zabezpieczoną przez krańcówkę
NIE MOŻE się już poruszać, czyli nie zniszczy ani krańcówki ani zbiornika.
Zabezpiecza to zbiornik przed błędami w programie.
7.Zmiana kierunku obrotów silnika nie może odbywać się w czasie gdy silnik się kręci (elektronika
tego nie wytrzymuje). Trzeba najpierw zatrzymać silnik i dopiero potem zmieniać kierunek obrotów.
8. Można stwierdzić, czy silnik się kręci, bo do procesora dostarczane są impulsy (lub nie
gdy się nie kręci ) z transoptora refleksyjnego (takiego, co to stwierdza czy jest „papiór”
w drukarce). Tu transoptor „patrzy” na biało-czarne pola na kole zębatym wewnątrz zbiornika.
Sposób realizacji (połączenie ze sprzętem) nikomu się do niczego nie przyda, ale sam algorytm –
być może.
Wymyśliłem, że przerwanie co 20 milisekund zmniejsza ( o ile jest co ) zmienną SilnikBusy, którą
ustawiają funkcje : KierunekObrotowSilnikaZbiornika( ... ) na 2 (co najmniej 20 milisekund, max 40 )
oraz
SilnikZbiornikaOff( ... ) na 20 ( co najmniej 0.38 sekundy, max 0,4 sek ). Te 0.4 sekundy
daje silnikowi czas na całkowite zatrzymanie się. Liczby z niczego czyli z głowy.
Każdy silnik ma swoją zmienną SilnikBusy. A silniki takie są dwa.
Poza tym, istnieje funkcja, która może zmienną SilnikBusy ustawić na dowolną wartość ( 0-255).
Nazwy funkcji są w języku GutenKompot, ale każdy Polak może je zrozumieć.
Funkcja wykonywana jest w ten sposób, że po stwierdzeniu stanu, wykonuje akcję
i opuszcza funkcję pozwalając programowi głównemu na wykonanie innych zadań.
Funkcja zwraca wartość 0 gdy ma być ponownie wywołana i nie zero gdy koniec.
Wartość 1 to O.K. pozostałe to błędy.
Oto i ona funkcja :
[code:1]
unsigned char SetZbiornikGotow( unsigned char numer, unsigned char* status, unsigned char* timeSec )
{// Funkcja ustawia zbiornik gotow do pracy. Zbiornik pusty. Tłok tuż za krańcówką opróżniania
// Funkcja jest przezroczysta - musi byc wykonywana, az do chwili zwrocenia nie zero
// Zwroci 1 - silnik gotow
// Kod bledu > 1
// 2 - uszkodzona krancowka
// 3 - uszkodzony silnik
// 4 - hgw co
// status musi byc ustawiony na 0 na starcie
// Krancowka przy wysuniętej srubie to napelniania
// Krancowka przy wsunietej srubie to oprozniania
// Aby wszelkie operacje byly wykonywane na silniku w stanie ustalonym
if( IsSilnikZbiornikaBusy( numer ) )return 0;
switch( *status )
{
// Mozliwe dwa wypadki : krancowka wlaczona i krancowki wylaczone
case 0:// Nic nie wiadomo o polozeniu tloka
if ( KrancowkaSilnikaZbiornika( numer ) )
{// Jest wlaczona jakas krancowka
// Zaklada sie, że jest to krancowka oprozniania
KierunekObrotowSilnikaZbiornika( numer, NAPELNIAJ_ZBIORNIK );
++(*status);
return 0;
}
else
{// nie jest wlaczona zadna krancowka
KierunekObrotowSilnikaZbiornika( numer, OPROZNIAJ_ZBIORNIK );
*status = 40;
}
return 0;
// Jedna z krancowek wlaczona
case 1: // proba w kierunku NAPELNIAJ_ZBIORNIK
ClearNrImpulsuZbiornika( numer );
SilnikZbiornikaOn( numer );
SetSilnikZbiornikaBusy( numer, 10 ); // Na 0,2 sekundy
++(*status);
return 0;
case 2: // Sprawdzenie czy po 0,2 sek silnik sie ruszyl
if ( GetNrImpulsuZbiornika( numer ) )
{// silnik ruszyl, czyli krancowka oprozniania
++(*status);
}
else
{// silnik nie ruszyl czyli krancowka napelniania
SilnikZbiornikaOff( numer );
*status = 30;
}
return 0;
case 3:
if ( KrancowkaSilnikaZbiornika( numer ) )
{// silnik ruszyl a krancowka oprozniania nie odpuscila
// uszkodzona krancowka oprozniania
return 2;
}
// Krancowka oprozniania odpuscila. Tlok w polozeniu wsuniety, tuz przy krancowce
// Zatrzymac silnik
SilnikZbiornikaOff( numer );
*status = 10;
return 0;
// Silnik stoi przy krancowce oprozniania, krancowka wylaczona
// przestawienie go blizej
case 10:
KierunekObrotowSilnikaZbiornika( numer, OPROZNIAJ_ZBIORNIK );
++(*status);
return 0;
case 11:
SilnikZbiornikaOn( numer );
++(*status);
*timeSec = GetIntSecondMain();
return 0;
case 12:
if ( KrancowkaSilnikaZbiornika( numer ) )
{
SilnikZbiornikaOff( numer );
++(*status);
return 0;
}
if ( GetIntSecondMain() - (*timeSec) < 2 )
{
return 0;
}
if ( GetNrImpulsuZbiornika( numer ) )
{
// Po sekundzie nie osiagnieta krancowka - uszkodzona
SilnikZbiornikaOff( numer );
return 2;
}
// silnik sie nie kreci
SilnikZbiornikaOff( numer );
return 3;
// Krancowka oprozniania wlaczona silnik stoi
case 13: // Odsunac tlok, aby wylaczyć krańcowkę oprozniania
KierunekObrotowSilnikaZbiornika( numer, NAPELNIAJ_ZBIORNIK );
++(*status);
return 0;
case 14:
SilnikZbiornikaOn( numer );
++(*status);
*timeSec = GetIntSecondMain();
// SetSilnikZbiornikaBusy( numer, 10 );
return 0;
case 15:
if ( !KrancowkaSilnikaZbiornika( numer ) )
{
SilnikZbiornikaOff( numer );
ClearNrImpulsuZbiornika( numer );
break; //return 1; // Powodzenie
}
if ( GetIntSecondMain() - (*timeSec) < 2 )
{
return 0;
}
if ( GetNrImpulsuZbiornika( numer ) )
{
// Po sekundzie nie zwolniona krancowka - uszkodzona
SilnikZbiornikaOff( numer );
return 2;
}
// silnik sie nie kreci
SilnikZbiornikaOff( numer );
return 3;
case 30:// wlaczona krancowka napelniania proba w kierunku OPROZNIAJ_ZBIORNIK
KierunekObrotowSilnikaZbiornika( numer, OPROZNIAJ_ZBIORNIK );
++(*status);
return 0;
case 31:
ClearNrImpulsuZbiornika( numer );
SilnikZbiornikaOn( numer );
SetSilnikZbiornikaBusy( numer, 10 ); // Na 0,2 sekundy
++(*status);
*timeSec = GetIntSecondMain();
return 0;
case 32:
if ( GetNrImpulsuZbiornika( numer ) )
{// silnik się kręci krancowka powinna byc odpuszczona
if ( KrancowkaSilnikaZbiornika( numer ) )
{
if ( GetIntSecondMain() - (*timeSec) < 2 )
{
return 0;
}
// krancowka nie odpuszczona po sekundzie - uszkodzona
SilnikZbiornikaOff( numer );
return 2;
}
// krancowka puscila
++(*status);
*timeSec = GetIntSecondMain();
return 0;
}
// silnik się nie kręci
SilnikZbiornikaOff( numer );
return 3;
case 33:
if ( KrancowkaSilnikaZbiornika( numer ) )
{ // musi byc krancowka w kierunku oprozniania
SilnikZbiornikaOff( numer );
*status = 13;
return 0;
}
if ( GetIntSecondMain() - (*timeSec) < 20 )
{
return 0;
}
return 3;
case 40: // Nie jest wlaczona zadna krancowka - oproznianie
SilnikZbiornikaOn( numer );
++(*status);
*timeSec = GetIntSecondMain();
return 0;
case 41: // oproznianie az do chwili zadzialania krancowki oprozniania
if ( KrancowkaSilnikaZbiornika( numer ) )
{
SilnikZbiornikaOff( numer );
ClearNrImpulsuZbiornika( numer );
*status = 13;
return 0;
}
if ( GetIntSecondMain() - (*timeSec) < 20 )
{// Daje mu czas 20 sekund na dojechanie do krancowki oprozniania
return 0;
}
if ( GetNrImpulsuZbiornika( numer ) )
{// sa impulsy
// Po 20 sekundach nie osiagnieta krancowka - uszkodzona
SilnikZbiornikaOff( numer );
return 2;
}
// silnik sie nie kreci
SilnikZbiornikaOff( numer );
return 3;
default:
return 4;
}
ClearNrImpulsuZbiornika( numer );
return 1;
}
[/code:1]
A tu kawałek programu, który ją woła :
[code:1]
PORTB |= _BV( LED_TEST );
DelayUtils ( 1000 );
statusold = status = 0;
PORTB &= ~_BV(LED_TEST);
for(;;ÂŤÂť)
{
stan = SetZbiornikGotow( ZBIORNIK_RUFOWY, &status, × );
if ( stan )
{
break;
}
if ( status != statusold )
{// sprawdzenie jak wewnatrz funkcji zmienia sie status (na PC)
// Wolany tylko gdy status sie zmieni, bo tak to szybko zapelnialy sie bufory
WyslijZnak( status );
statusold = status;
}
}
switch( stan )
{// Sygnalizacja ewentualnych bledow
case 1:
break;
case 2:
PORTA &= ~_BV(LED_WHITE);
break;
case 3:
PORTA &= ~_BV(LED_RED);
break;
default:
PORTA &= ~_BV(LED_GREEN);
break;
}
// NiebieskiLED na stale
PORTB |= _BV( LED_TEST );
for(;;ÂŤÂť); // koniec balu
[/code:1]
Niebieski led (LED_TEST) służy wyłącznie do stwierdzenia, że program żyje.
Krótkie mrugnięcie na początku i zapalenie na stałe na końcu programu.
Ostatnia instrukcja for(;;); (fajnie wyszło, ale miało być tak : for( ; ; ) ; )
powoduje, że program wchodzi w nieskończoną
pętlę i nie robi nic. Inaczej, mówiąc, się zawiesza, jak to program.
Jak na razie nie wykryłem błędów, co wcale nie oznacza, że ich tam nie ma.
Jeżeli wykryję, to zamieszczę stosowne poprawki.
Z ukłonami
Andrzej Korycki