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][M32] nieoczekiwane dane na wyświetlaczu LCD(nadmiar jedynek)

Antystatyczny 17 Cze 2012 22:49 1772 9
REKLAMA
  • #1 11012259
    Antystatyczny
    Poziom 16  
    Witam. Na początek trochę kodu.
    Kod:
    Kod: text
    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.
  • REKLAMA
  • #2 11012361
    tech-com
    Poziom 12  
    Symulator nie wie że to już koniec Twojego programu
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #3 11012639
    Antystatyczny
    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: text
    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?
  • #4 11012667
    Konto nie istnieje
    Poziom 1  
  • #5 11014952
    tech-com
    Poziom 12  
    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)
  • #6 11015568
    Antystatyczny
    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: text
    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.
  • REKLAMA
  • REKLAMA
  • #8 11015768
    Antystatyczny
    Poziom 16  
    Kod: text
    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.
  • #9 11016494
    Konto nie istnieje
    Poziom 1  
  • #10 11019834
    Antystatyczny
    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: text
    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!
REKLAMA