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

[Bascom][M32] nieoczekiwane dane na wyświetlaczu LCD(nadmiar jedynek)

17 Cze 2012 22:49 1601 9
  • Poziom 16  
    Witam. Na początek trochę kodu.
    Kod:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Zarówno na wyświetlaczu LCD, jak i na wyjściu UART pojawia mi się pięć jedynek, a powinny pojawić się cztery. Gdzie robię błąd?

    Pozdrawiam.

    Dodano po 44 [sekundy]:

    Zapomniałem dodać, że to na razie symulacja programowa.
  • Poziom 11  
    Symulator nie wie że to już koniec Twojego programu
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod
  • Poziom 16  
    Bardzo dziękuje za podpowiedź, choć nie rozwiązała ona problemu. Póki co porzuciłem ten projekt na rzecz trudnierjszego rozwiązania, bo dążę do opanowania obsługi przerwań w Bascom. A teraz w kilku słowach o tym, co chcę osiągnąć.
    4 switche podłączone do portu mają powodować wyświetlanie stanów logicznych na 4 cyfrowym LED tzn. naciskam klawisz1 - zmieniam zero na jedynkę i odwrotnie na wyświetlaczu nr.1 (cyfra pierwsza wyświetlacza LED)
    Analogicznie ma być z pozostałymi cyframi.
    Z pojedynczymi diodami nie ma problemu, z wyświeltaczem LCD generalnie również nie. Problem jest w odświeżaniu wyświetlacza LED. Zaopatrzyłem się w książkę p. Wiązania, ale tam nie dokońca przejrzyście jest wyjaśnione, w jaki sposób mam prawidłowo włączyć obsługę przerwań.
    Teraz wkleję kod:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    To jest testowy program, który ma zwiększać wartość zmiennej A i wyświetlać w oknie symulatora, ale wciąż wyświetla mi zero. Jeśli ręcznie wywołuję ovf0 w symulatorze, wartość zmiennej się zwiększa. Timer0 nie wysyła automatycznie przepełnienia?
  • Poziom 36  
    Antystatyczny napisał:
    Zaopatrzyłem się w książkę p. Wiązania, ale tam nie dokońca przejrzyście jest wyjaśnione, w jaki sposób mam prawidłowo włączyć obsługę przerwań.
    Teraz wkleję kod:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Timer0 nie wysyła automatycznie przepełnienia?


    Oczywiście, Twój program dowodzi że Timer0 wysyła automatycznie przepełnienia; już po pierwszym przepełnieniu zatrzymałeś go i dalej już nie pracuje.
    W tym krótkim testowym programie masz kilka nieprawidłowości:
    Spróbuj ten (twój poprawiony) test i obserwuj timer0, Zmienną A oraz Terminal emulator.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    e marcus
  • Poziom 11  
    Odnośnie pierwszego pytania
    Cytat:
    Bardzo dziękuje za podpowiedź, choć nie rozwiązała ona problemu.

    [Bascom][M32] nieoczekiwane dane na wyświetlaczu LCD(nadmiar jedynek)[Bascom][M32] nieoczekiwane dane na wyświetlaczu LCD(nadmiar jedynek)
  • Poziom 16  
    Do tech-com:

    Jeszcze raz sprawdziłem i faktycznie działa, a więc zwracam honor. Poprzednio przeoczyłem, że miałem nie wiem po co apostrof przed end.

    Marcus, za moment przeanalizuję poprawiony kod i naniosę konieczne poprawki. Bardzo dziękuję za wszelką krytykę.

    Dodano po 24 [minuty]:

    Zastosowałem się do wskazówek, ale program w ogóle nie stosuje obsługi przepełnienia timer0. Symulator wciąż pokazuje, że zmienna A nie jest inkrementowana, co jest dla mnie oczywiste. Program zapętla się na Do Loop. Może powinienem zastosować "On TIMER0 plus"?
    Poniżej wklejam aktualną postać kodu:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Usunąłem niepotrzebne configi portów - miały służyć do multipleksowania.
    Badałem program z różnymi opóźnieniami w pętli głównej. Nie badałem skompilowanego z dyrektywą $sim, bo ona podobno pomija wszelkie opóźnienia i mógłbym coś przeoczyć.
    Niestety nie potrafię w oknie symulatora na bieżąco podglądać zawartości np. timer0 czy zmiennej A.
  • VIP Zasłużony dla elektroda
    On Timer0 Overflow ?
  • Poziom 16  
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Teraz program działa. Zmieniłem prescaler, by przepełnienie występowało jak najwolniej.
    Przyczyną braku działania programu była moja niewiedza. Należy w symulatorze włączyć symulację timerów.
    Teraz mogę rozpocząć eksperymenty.
    Bardzo dziękuję za pomoc.
  • Poziom 36  
    Antystatyczny napisał:
    Należy w symulatorze włączyć symulację timerów.
    Teraz mogę rozpocząć eksperymenty.


    Jak również należy włączyć "Refresh variables"...\

    [Bascom][M32] nieoczekiwane dane na wyświetlaczu LCD(nadmiar jedynek)

    Cytat:



    Może powinienem zastosować "On TIMER0 plus"?


    Jest równoważne z "Ovf0 plus"

    e marcus
  • Poziom 16  
    Wielkie dzięki!. przeoczyłem odświeżanie. troszkę powalczyłem w nocy z pisaniem kodu i wyszedł mi taki oto niedziałający zegarek:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    sam algorytm zliczania minut i godzin działa. nacisnięcie klawisza nie powoduje powrotu do głównej pętli programu - wyświetla się pojedyncza cyfra na wyświetlaczu, czyli tkwie w podprogramie. Poza tym mam duchy na wyświetlaczu, czyli odświeżany jest zbyt szybko, a gdy wpakuję opóxnienia rzędu 200µs na wyświetlaczu mam ledwo widoczne cyfry. Rozumiem, że program jest po prostu źle napisany. Zna ktoś jakiś "schemat blokowy" programu zegarka led?
    Nie chcę gotowego rozwiązania, a jedynie np. kolejność wykonywania czynności.

    Dodano po 15 [minuty]:

    Poprawiłem program w zakresie powrotu z podprogramu. Miałem źle przypisane piny klawiatury w podprogramach. Nadal mam duchy, a naciskanie klawiszy powoduje okresowe przygasanie wyświetlacza, co rozumiem, bo mam pętle w podprogramach obsługi klawiszy.

    Dodano po 38 [minuty]:

    Usunięcie duchów umożliwiła mi instrukcja waitus 100 tuż przed wygaszeniem danej cyfry. Pewnie nie jest to najszczęśliwsze rozwiązanie, ale już rozumiem mechanizm działania. Pozostaje mi zmiana obsługi klawiatury. W jaki sposób obsłużyć ją, by nie powodowała opóźnień w wyświetlaniu i jednocześnie nie powodowała narastania wartości inkrementowanej zmiennej o ileś tam setek w ciągu sekundy?

    Dodano po 20 [minuty]:

    Bardzo dziękuję wszytkim za pomoc, temat zamykam, a sprawę klawiatury przedstawię w nowym temacie. Raz jeszcze dzięki!