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

Problem z optymalizacją bloku instrukcji warunkowych

Villen 22 Kwi 2010 20:13 1287 9
  • #1 7992412
    Villen
    Poziom 21  
    Głowię się dzisiaj od samego rana nad pewnym problemem. Mam taki oto kawałek kodu:

    
    If zmienna = 1 Then :  Gosub podprogram_1 : End If
    If zmienna = 2 Then :  Gosub podprogram_2 : End If
    If zmienna = 3 Then :  Gosub podprogram_3 : End If
    If zmienna = 4 Then :  Gosub podprogram_4 : End If
    If zmienna = 5 Then :  Gosub podprogram_5 : End If
    If zmienna = 6 Then :  Gosub podprogram_6 : End If
    If zmienna = 7 Then :  Gosub podprogram_7 : End If
    If zmienna = 8 Then :  Gosub podprogram_8 : End If
    If zmienna = 9 Then :  Gosub podprogram_9 : End If
    


    Chciałbym napisać ten fragment tak, by po trafieniu na prawdziwy warunek i wykonaniu podprogramu, program nie sprawdzał dalej kolejnych instrukcji tylko skakał od razu do miejsca zaraz po tym bloku.

    W tej postaci całość wywołuje u mnie uciążliwe migotanie wyświetlacza, bo po trafieniu na właściwy warunek np juz za pierwszym razem, po wykonaniu podprogramu i tak sprawdzana jest cała reszta.

    A może podpowiecie mi jak z podprogramu wskoczyć do pętli głównej?
  • #2 7992447
    Konto nie istnieje
    Poziom 1  
  • #3 7992464
    tadzik85
    Poziom 38  
    else if jeśli kolejne warunki nie mają być sprawdzane, lecz wątpię by właśnie to miało wpływ na migotanie wyświetlacza.
  • #4 7992479
    Villen
    Poziom 21  
    No własnie troszkę tego nie rozumiem. Eelementy które są wyświetlane na wyświetlaczu że tak powiem na stałe nie migotają. Pozostałe są aktualizowane w przerwaniu co sekundę. Żadnych waitów nie ma, a mega taktowana jest oscylatorem 8MHz - chyba na prawdę trzebaby mieć talent, by skopać w takich warunkach wyświetlanie na LCD, a póki co mikrokontroler nic innego nie robi...

    [edit]

    A czy jest jakis sposób żeby po wykonaniu podprogramu wbić się do pętli głównej? Wtedy mógłbym sobie napisać całość nieco inaczej...
  • #5 7992639
    rpal
    Poziom 27  
    Villen napisał:
    No własnie troszkę tego nie rozumiem. Eelementy które są wyświetlane na wyświetlaczu że tak powiem na stałe nie migotają. Pozostałe są aktualizowane w przerwaniu co sekundę. Żadnych waitów nie ma, a mega taktowana jest oscylatorem 8MHz - chyba na prawdę trzebaby mieć talent, by skopać w takich warunkach wyświetlanie na LCD, a póki co mikrokontroler nic innego nie robi...

    [edit]

    A czy jest jakis sposób żeby po wykonaniu podprogramu wbić się do pętli głównej? Wtedy mógłbym sobie napisać całość nieco inaczej...

    coś mi się zdaje że jednak skopałeś. Może sprawdź czy to przerwanie istotnie wykonuje się co 1 sekundę a nie co np. 0,01 s. W przerwaniu czyli jak w ciele przerwania czy jako flaga ustawiana przerwaniem a wykonana w głownej pętli. Z drugiej strony to nie wiem jak ten BASCOM obsługuje przerwania :) ale pewnie tak jak w C.
  • #6 7992663
    Villen
    Poziom 21  
    Tak, przerwanie na 100% jest co sekundę, jest wywoływane przez podłączone wyjście INT PCF'a 8583 do wejscia INT1 mikrokontrolera.
    Jako zbocze aktywne jest ustawione zbocze opadające.
    Pętla główna jest pusta, na każde wystąpienie przerwania wywoływany jest podprogram w którym znajdują się własnie te instrukcje warunkowe.
  • #7 7992708
    rpal
    Poziom 27  
    Czy w takim razie procedura przerwania jest odpowiedzialna za aktualizację LCD ? Czy to jest jedyne przerwanie czy jest jeszcze jakieś inne ?
  • #8 7992743
    Villen
    Poziom 21  
    Jest tylko to jedno przerwanie "uruchamiajace" podprogram, ktory najpierw odczytuje wartosc czasu z PCF'a (co zajmuje ułamki sekund) a potem aktualizuje LCD.

    Cóż, jedyne co mi przychodzi do głowy to problem z podprogramami, które "rysują" duże cyfry na wyświetlaczu. Ogólnie efekt działania wygląda tak:

    <embed src="http://www.youtube.com/v/nBfkru6yL3U&hl=pl_PL&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385">

    Kod "rysujący" przykładową cyfrę:

    
    Pisz_0:
    Locate 1 , Kolumna : Lcd Chr(0) ; Chr(1) ; Chr(0)
    Locate 2 , Kolumna : Lcd Chr(0) ; Chr(4) ; Chr(0)
    Locate 3 , Kolumna : Lcd Chr(3) ; Chr(3) ; Chr(0)
    Locate 4 , Kolumna : Lcd Chr(2) ; Chr(2) ; Chr(0)
    Return
    

    Pozostaje mi chyba tylko kombinowanie nad usprawnieniem właśnie tego.
    Chociaż przy pierwszych próbach, kiedy napisałem na szybkiego program wyświetlający po kolei cyfry urzywając właśnie tego sposobu problem nie występował...
  • Pomocny post
    #9 7992795
    rpal
    Poziom 27  
    Zakładam że w tym twoim bascomie idea obsługi przerwania jest taka jak w c albo asm bo inaczej przecież być nie może. Przerwanie ma się wykonać jak tylko najszybciej jest to możliwe. W związku z tym żadne tam wyświelanie znaków na LCD nie wchodzi w rachubę a tym bardziej transmisja po I2C. Przerwanie ma ustawić co najwyżej flagę którą z kolei głowny program będzie sprawdzał i w zalezności o jej stanu odczyta i dokona akualizacji LCD albo też nie. No i oczywiście skasuej tę flagę po obsłudze wyświatlania. Masz już odpowiedź. Chociaż z drugiej strony to nie wiadomo na czym polega twoja procedura wyswiatlania LCD ? Może w swojej fantazji zrobiłeś to tak że LCD jest np. inicjowany, czyszczony, ustawiany kursor a potem wyswietlane znaki. Jeśli tak to porażka :( Zajmij się najpierw flagą a potem sie zobaczy.
  • #10 7993971
    Villen
    Poziom 21  
    rpal: dzięki za kopa :P Bo chociaz nie do końca miałeś rację, to rzeczywiscie niepotrzebnie czyściłem cały ekran przed wyświetleniem cyfr. Wystarczyło wywalić cls'a i delikatnie zmodyfikować procedury "rysujące" duże cyfry. A wpadłem na to usypiając prawie że w łóżku :D

    Choć cały program właściwie w ogóle się nie zmienił to teraz działa już wszystko bez najmniejszego problemu, migotania brak! ;)
REKLAMA