logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Bascom AVR /M168 - Czas trwania instrukcji warunkowej w Bascomie i innych jęz.

Ture11 28 Lip 2014 17:51 1377 4
REKLAMA
  • #1 13832138
    Ture11
    Poziom 39  
    Witajcie.
    Nadeszły wakacje, nadeszła i nuda. I to jaka, aż wstyd przyznać mi się, że wziąłem się za obsługę kineskopu cz/b 5,5". No cóż, w wieku 22 lat powinno się obsługiwać dziewczynę a nie kineskop, no ale zdarza się i tak :-)

    Generalnie nie za bardzo jest sens przytaczać kod programu czy schemat. Ogólnie synchronizuje się na przerwaniach z impulsem FBT (jako początek linii) i odchylaniem pionowym ( jako początek podróży plamki). Steruję tylko plamką (włącz / wyłącz).

    Do sterowania używam atmegi168 z kwarcem 18,432MHz, program piszę w Bascomie. Wszystko działa git, tj. mogę wyświetlić kropkę czy linie poziome czy pionowe. Mój problem polega natomiast na synchronizacji z początkiem wyświetlania, a dokładniej, z instrukcją warunkową, która występuje w przerwaniu - jej użycie wprowadza opóźnienie (co jest oczywiste) i w skutek tego opóźnienia, gdy chcę wyświetlić dwie linie równoległe poziome, zostają one przesunięte względem siebie.....

    Wyjaśnię to dokładniej
    C = 0 - początek podróży plamki
    c=70 - linia numer 70
    c=90 - linia numer 90

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Te dwa warunki oczywiście nie występują na raz, ale za każdym przerwaniem są sprawdzane... No właśnie, IF c=70 jest sprawdzany wcześniej niż IF c=90 i wprowadza opóźnienie do działania drugiego warunku, wskutek czego linia 90 jest przesunięta względem linii 70.


    Właściwie mam jedno pytanie. Czy napisanie kodu, np. w C pozwoli na uniknięcie oczekiwania na warunku IF, czy też wykonanie tego warunku w obu językach jest takie samo i zależy tylko od procesora (ilości cykli)? Dodam, że zmiana kwarcu z 16 MHz na 18,432 MHz nie zmieniła nic, a szybszego procesora nie mam.

    Pytam także dla tego, że nie znam języka C czy Assemblera i wiem, że Bascom nie jest optymalny, ale jeśli instrukcja warunkowa w obu językach trwa tyle samo, to nie będę kombinował w tę stronę.

    Aha i jeszcze jedno... Użycie instrukcji Select Case polepsza trochę sprawę, ale nadal jest przesunięcie między liniami...

    Zmieniać język czy procesor... Jak radzicie? Prawdopodobnie po prostu daruje sobię odchylanie "skanujące" ( telewizorowe) i zrobię własne, wtedy w gre wchodzą nie MHz a kHz (plamką steruję nie dłużej niż 1 mikrosekundę, narysowanie kółka to zbiór kropek, natomiast z własnym odchylaniem wystarczy załączyć plamkę i wyrysować sin i cos odchylaniem :-)

    No i przepraszam że się tak rozpisałem w tak błachym temacie. Może pójdę szukać dziewczyny lepiej...?

    Pozdrawiam.
  • REKLAMA
  • Pomocny post
    #2 13832543
    M. S.
    Poziom 34  
    ... a gdyby tak w programie do zmiennej d podstawić żądaną wartość, a w przerwaniu sprawdzać jednokrotnie czy c=d?
  • REKLAMA
  • #3 13832671
    Ture11
    Poziom 39  
    W sumie rozwiązało to po części mój problem, bo o ile umieszczenie czegokolwiek w pętli programu dało migotanie linii (brak synchro na czas), o tyle wpadłem na ciekawszy pomysł - opóźniłem wszystkie o równy czas, bo wyświetlanie plamki jest tylko w jednym warunku...W sumie wystarczy teraz przekazać czasy przed plamką i czas trwania plamki jako zmienne i po problemie... Że też na to nie wpadłem :-)

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Dziękuję, ale wciąż czekam na odpowiedzi :-)
  • REKLAMA
  • Pomocny post
    #4 13832683
    Fredy
    Poziom 27  
    Korzystając z języka wysokiego poziomu, czyli C lub Bascom uzyskasz takie afekty, że zawsze coś się będzie rozjeżdzało.
    W Bascomie te efekty będzą napewno wieksze niż w C.
    Musisz dążyć do tego, aby procedury obsługi przerwania były jak najprostsze i najszybsze , oraz dla wszystkich przypadków takie same czasowo.
    Jeżeli widzisz że któraś opcja jest zawsze szybsza, możesz dokleic w niej jakąś instrukcję np typu NOP i sprobować to recznie wyrównać, ale będzie to bardzo mozolna robota.
    Aby uzyskać idealne przesunięcia, to należy to zrobić tylko i wyłącznie w asm.
    Ratuje cię też zrobienie to np na ATXMEGA i zastosowanie częstotliwości próbkowania rzędu 32MHz.
  • #5 13841160
    Ture11
    Poziom 39  
    Przepraszam za nieaktywność. Oczywiście, te informacje są bardzo pomocne. Co od instrukcji NOP, działałyby one tak samo jak warunki, tzn. opóźniałyby każdy kolejny wiersz, więc przy każdym warunku musiałbym dać +1x NOP. Dla 30 warunków byłaby lipa...

    Nie mam pomysłu, jak można inaczej liczyć linie i wykonywać w nich jakieś operacje.. Chyba że na przerwaniach... Ale to na razie sobie odpuszczę, wolę postawić na próbę własnego sterowania odchylaniem (ale i tu jest lipa, bo mam tylko PWM a jego scałkowanie daje bezwładność z pojemności)...
REKLAMA