Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Bascom - Czeka 2 minuty na nie wiadomo co.

T-play 16 Lip 2012 21:11 1322 18
  • #1 16 Lip 2012 21:11
    T-play
    Poziom 14  

    Witam.

    Mam spory problem wynikający zapewne z małej pomyłki.

    Rozumiem, że zrozumienie kodu napisanego przez kogoś innego jest bardzo trudne, ale niestety ja sam już nie daje sobie rady z błędem.

    Mianowicie chodzi o to, że po wprowadzeniu z klawiatury Czasu oraz Kodu, zanim zacznie się odliczanie mija czas około 2 minut, gdzie powinno wykonać się to natychmiast.

    Podczas pisanie programu miałem problem, że gdy wartość wyniesie 0 zostaje ona od razu zmieniona na 5, a powinno być gdy wartość wyniesie -1, lecz taka nie mieści się w "Byte" dlatego u mnie na wyświetlaczu 1 to tak na prawdę 2 w programie.


    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Jestem bardzo wdzięczny za jakąkolwiek pomoc.

    0 18
  • #2 16 Lip 2012 21:28
    MArSTER_1
    Poziom 18  

    Po co ci w procedurze nieskończona pętla?

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #3 16 Lip 2012 21:34
    T-play
    Poziom 14  

    Ta procedura wykonuje się gdy czas dobiegnie końca, powoduje ona wyświetlenie na wyświetlaczach czasu 00:00 oraz odpowiedniego kodu, aby program nie powrócił do wykonywanie pętli głównej wstawiłem tam pętle nieskończoną.

    0
  • #4 16 Lip 2012 22:02
    MArSTER_1
    Poziom 18  

    Zakładam, że problem jest w obsłudze przerwania od Timera0.
    Spróbuj troche zmodyfikowanej wersji, po prostu podmień podprogramy i daj znac. Ponizej podprogram:
    Sekunda:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #5 16 Lip 2012 22:27
    T-play
    Poziom 14  

    Niestety nic to nie dało, problem następuje na samym początku, zaraz po wykonaniu pierwszych procedur, czeka jakies 2 minuty a potem odlicza prawidłowo.

    Najciekawsze jest to ze ja ten program już kiedyś napisałem, tyle że był on na płytce stykowej a teraz jak przeniosłem to na płytkę drukowaną, musiałem pozamieniać porty i wszystko się popsuło. Muszę wszystko pisać od nowa ale na starym "schemacie".

    Podaję starszą działającą wersję.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #6 17 Lip 2012 14:59
    MArSTER_1
    Poziom 18  

    No dobrze. Mam pytanie. Czy próbowałeś jakoś określić miejsce, w którym program przebywa te 2 minuty? Chodzi mi o to, czy po ustawieniu z klawiatury Czasu i kodu program wyskakuje z podprogramu do pętli głównej? Aby to sprawdzić wystarczy na początku pętli , po Do wstawić wyświetlanie komunikatu na przykład : "w pętli ".
    Czyli coś takiego:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #7 17 Lip 2012 17:03
    T-play
    Poziom 14  

    Porozstawiałem znaczniki tak jak proponowałeś z tego co mi wyszło to program bezproblemowo przechodzi do pętli głównej ale wykonuje ją kilkadziesiąt razy zanim zmieni wyświetlaną wartość.

    Niestety nie mam już portów na lcd, wszystko multiplexuje na ośmiu 7-segmentowych wyświetlaczach.

    Znacznik dałem w pętli głównej zaraz po

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #8 17 Lip 2012 17:23
    MArSTER_1
    Poziom 18  

    Czy zmienne:
    Sekundyj oraz
    Poprzednia
    Zmieniały się?

    0
  • #9 17 Lip 2012 17:42
    T-play
    Poziom 14  

    A to bardzo ciekawe, wartość sekundyj = 2 a poprzednia = 0 i tak jest dopóki zegar nie wystartuje, a potem już normalnie, poprzednia=skeundyj.

    0
  • #10 17 Lip 2012 17:54
    MArSTER_1
    Poziom 18  

    Prawdopodobnie dlatego tak jest, że masz instrukcje wyświetlania po If a nie po Do jak prosiłem. Czy na prawdę nie da się nic zrobić, żeby umieścić wyświetlanie po Do?No i dołóż jeszcze zmienną Integer ( jakąkolwiek nową zdefiniuj na przykład test_petli) i zwiekszaj ją o 1 przy każdym obiegu pętli głównej 9także wyswietlaj). Wtedy przekonamy się czy pętla zawodzi czy jakiś podprogram.

    0
  • #11 17 Lip 2012 18:07
    T-play
    Poziom 14  

    O jaką funkcję wyświetlania Ci chodzi?
    Declare Sub Wyswietlacz(byval Cyfra As Byte) <- ta procedura wykonywana jest przy przerwaniu timera0 czyli co 2ms. Dzięki temu cały czas jest coś wyświetlane.

    Co do tej zmiennej to gdzie ja mam ja zwiększać? Jak dam zaraz po Do to będzie tak szybko zwiększana ze po chwili wyjdzie poza zakres.

    0
  • #12 17 Lip 2012 18:22
    MArSTER_1
    Poziom 18  

    Napisałeś: "Porozstawiałem znaczniki tak jak proponowałeś z tego co mi wyszło to program bezproblemowo przechodzi do pętli głównej ale wykonuje ją kilkadziesiąt razy zanim zmieni wyświetlaną wartość."
    Jeśli wykonuje kilkadziesiąt razy to zmienna się nie przepełni. A nawet gdyby to program się nie zatrzyma i nie wyświetli wyjątku.

    Proponowałem wstawić instrukcje wyświetlające po Do. Ale myślałem, że masz wyświetlacz LCD na przykład 2*16. Jednak piszesz, że nie, że używasz wyświetlaczy 7 segmentowych.
    Jednak aby ustalić gdzie program przebywa przez 2 minuty trzeba mieć możliwość wstawiana w program w dowolne miejsce instrukcji wyświetlających. To najprostsza metoda sprawdzania działania.

    Wyjaśnij mi jaką masz możliwość wstawienia w dowolne miejsce programu instrukcji wyswietlającej wartości wybranych zmiennych? Czy jedyną możliwością jest wstawienie wywołania podprogramu Wyswietlacz(byval Cyfra As Byte)?

    0
  • #13 17 Lip 2012 19:22
    T-play
    Poziom 14  

    Jak pisałem procedura Wyswietlacz(byval Cyfra As Byte) wywoływana jest przez przerwanie timer0, powoduje ona jedynie odświeżenie na wyświetlaczach wartości znajdujących się w zmiennych disp(8).
    Mam 8 wyświetlaczy, jeżeli chce aby na np. 2 z nich wyświetliło mi wartość 2 to wpisuje do zmiennej disp(2) wartość 2. Ze względu na to właśnie nie mogę zbytnio wyświetlać wartości 2 cyfrowych, bo jak to zrobić na 7 segmentowym wyświetlaczu i z tego tez powodu mam sekundy, minuty i godziny rozpisane na jedności i dziesiątki, "sekundyj" oznacza sekundy jedności a "sekundyd" sekundy dziesiątki.

    Jak wstawię zwiększanie po Do to będzie się ono wykonywało z częstotliwością około 16MHz, a znacznik umieściłem po

    If Sekundyj <> Poprzednia Then // To to zapytanie jest prawdziwe co około 1 sekundę
    Poprzednia = Sekundyj //i co sekundę własnie wykonywana jest cała pętla
    "znacznik"
    [...]
    end if //a w większości czasu, jest nie prawdą, więc pętla nie jest wykonywana
    loop

    0
  • #14 17 Lip 2012 19:46
    MArSTER_1
    Poziom 18  

    Napisałeś: "A to bardzo ciekawe, wartość sekundyj = 2 a poprzednia = 0 i tak jest dopóki zegar nie wystartuje, a potem już normalnie, poprzednia=skeundyj.'
    To znaczy, że przez dwie minuty wartość sekundyj się nie zmienia. Zastanawiałeś się skąd wartość 2 jeśli wcześniej ustawiasz ją na 10?

    0
  • #15 17 Lip 2012 21:00
    T-play
    Poziom 14  

    Znaczy zmieniam troszkę program na bieżąco i zmieniłem te wartości:
    Godzinyj = 1
    Godzinyd = 1
    Minutyj = 1
    Minutyd = 1
    Sekundyj = 2
    Sekundyd = 2
    Poprzednia = 10

    Ale myślę że to nie tu był problem bo procek powiedział papa i przeszedł do świata zmarłych procesorów, obecnie nie reaguje, może uda mi się go jeszcze ożywić, być może to właśnie on jest tu problemem.

    Dodano po 1 [godziny] 7 [minuty]:

    Ah, procek żyje, pękła nóżka od kwarcu, wymieniłem i już działa.

    Wstawiłem tak jak mówiłeś znaczniki, jeden zaraz po Do a drógi po
    If Sekundyj <> Poprzednia Then
    Poprzednia = Sekundyj

    Niczego się właściwie z tego nie dowiedziałem, tak jak pisałem wcześniej znacznik wstawiony zaraz po DO uruchamia się znacznie częściej niż ten po bloku warunkowym.

    Nie mam zielonego pojęcia gdzie następuje problem, zapewne gdzieś w tej pętli głównej, ale tam nie ma odnośników do podprogramów aby w nich utknąć.

    0
  • #16 17 Lip 2012 21:14
    MArSTER_1
    Poziom 18  

    To dobrze. Ale czy działa ten po Do od razu po ustawieniu Czasu i kodu?
    A ten po if dopiero po dwóch minutach zaczyna działać?w
    Bo jeśli tak to oznacza, że nie jest przez 2 minuty zmieniana zmienna sekundyj.

    0
  • #17 17 Lip 2012 21:20
    T-play
    Poziom 14  

    No właśnie o dziwo nie, wszystko startuje zaraz po, znacznik po DO jak i znacznik po zapytaniu.

    0
  • Pomocny post
    #18 17 Lip 2012 21:45
    MArSTER_1
    Poziom 18  

    No to już jesteśmy bliżej. Bo oznacza to, że program notuje, że sekundaj różni się od poprzedna skoro pojawia się za ifem.
    Może jest coś z wyswietlaniem? Bo skoro wskakuje poza if to i zmienia wartośc zmiennej poprzednia.

    0
  • #19 19 Lip 2012 13:06
    T-play
    Poziom 14  

    Witam ponownie, mój dostawca internetu mie troszke zawiódł bo nie miałem przez kilka dni sieci, ale przez ten czas znalazłem problem, tkwił on w tym miejscu:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Na początku określałem wartość Sekundyj przed procedurami przez to mogły zostać zmienione w tych procedurach i wrócić zmienionymi do pętli, przypuszczam, że z jakiejś przyczyny wartość sekundyj w tych procedurach wychodziła poza zakres i mogła osiągnąć 255, przez to program odliczał na samym początku 255. Aby to naprawić wystarczyło określić wartości tuż przed pętlą główną:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    i wszystko już działa.

    Dziękuję za pomoc.
    Pozdrawiam.

    0