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

Opóźnienie Waitms 900 powoduje błędy w wyświetlaniu LED na ATmega8 i 74HCT164

Stuart 09 Sty 2006 08:59 1473 11
REKLAMA
  • #1 2161760
    Stuart
    Poziom 12  
    Posty: 147
    Ocena: 11
    Witam,
    Napisałem programik na atmega8 do sterowania multipleksowego 4 cyfrowego LEDa z użyciem 74HCT164. Multiplekcowanie odbywa sie po przepełnieniu licznika timer0. Program multipleksowania bierze z pętli głównej wartości zmiennych A,B,C odpowiadające dziesietnym, jednostkom i dziesiatkom i ma je wyświetlać. Do ustawiania tych zmiennych w pętli głównej wykorzystuje 2 przyciski - przytrzymanie oznacza zwiększanie lub zmniejszanie wartości dziesiętnych itd. Problem w tym, że chcę wprowadzić opóźnienie aby nie działo się to za szybko - na koniec operacji zmian wartości A,B,C w pętli głównej daje opóźnienie Wait 1 i wszystko jest OK. Daje tyle bo musze, zastosowanie np. Waitms 900 powoduje wyświetlanie głupot. Czy zetkneliście się z czymś takim. Nie sądzę aby obsługa przerwania i wyświetlenie 1 cyfry nawet przy użyciu 74HCT164 trwało ponad sekunde.
    Pzdr
  • REKLAMA
  • #2 2161838
    genetix
    Poziom 24  
    Posty: 669
    Pomógł: 42
    Na forum jest sporo osób piszących pod Bascomem, myślę, że Ci pomogą jak zapodasz źródło programu.
  • #3 2162588
    jacur
    Poziom 32  
    Posty: 1748
    Pomógł: 166
    Ocena: 296
    jezeli jest to bascom AVR to niepowinno byc problemu wartosc przy waitms to 1-65535, w przypadku bascom_a 8051 wartowsc waitmns to 1-255
    czyli jezeli robisz ten program na 51 to :

    waitms 255
    waitms 255
    waitms 255
    waitms 135
  • #4 2162672
    Stuart
    Poziom 12  
    Posty: 147
    Ocena: 11
    Atmega8 jak w pierwszym wpisie czyli AVR - "Wait 1" i inne wartosci Wait akceptuje, wstawiałem w to miejsce różne wartości waitms i waitus i kicha. Wieczorkiem wrzuce kod.
  • REKLAMA
  • #5 2162758
    heyka
    Poziom 17  
    Posty: 412
    Ocena: 56
    robilem kiedys zegar z wyswietlaniem czasy na multipleksie i mialem to samo, przenioslem wiec obsluge przyciskow z petli glownej programu do podprogramu obslugi multipleksu, tzne dalem

    case1 -obsluga 1 wyswietlacz
    case2 - ....................

    itda mialem 6 wyswietlaczy to dodlaem
    case 7 i wlasnie w tej siódemce dalem obsluge przyciskow ustawiajacych czs i waitms 500 , zadzilalalo
  • REKLAMA
  • #6 2162772
    Stuart
    Poziom 12  
    Posty: 147
    Ocena: 11
    Wrzucam kod
    Załączniki:
    • program.doc (16 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #7 2164261
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Stuart napisał:
    Wrzucam kod

    Kochasiu , wina nie leży po stronie "wait-a" , a po stronie hmmm ... programisty ;) Skąd Ty wytrzasnąłeś zmienne typu INTEGER :?: Do celu jaki zamierzasz osiągnąć , zastosuj BYTE i zmień sposób inkrementacji oraz dekrementacji zmiennych A B C D , a wtedy wszystko będzie OK :D

    Piotrek
  • #8 2165752
    Stuart
    Poziom 12  
    Posty: 147
    Ocena: 11
    > Zumek zgadzam się - zresztą już to zrobiłem wszystko chodzi pod zmiennymi Typu Byte ale nadal to samo. Co by nie być gołosłownym, po 17-tej wrzuce ten kawałek kodu do obsługi liczb.
  • #9 2167151
    Stuart
    Poziom 12  
    Posty: 147
    Ocena: 11
    Prosze - kod z inkrementacją na zmiennych typu Byte, nadal tylko można stosować wait, próbowałem na mega8535, i mega8. Wyrzucenie inkrementacji do podprogramu nic nie daje. Pozostaje spróbować co radzi Heyka.
    Załączniki:
    • program2.txt (5.81 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • Pomocny post
    #10 2167446
    jacur
    Poziom 32  
    Posty: 1748
    Pomógł: 166
    Ocena: 296
    zmien polecenie
    Goto Koniec
    na
    Gosub Koniec

    i

    Koniec:
    wait 1
    return

    gdzies kiedys czytalem zeby unikac w miare mozliwosci komendy goto w bascomie
  • #11 2167483
    adamusx
    Poziom 27  
    Posty: 977
    Pomógł: 94
    Ocena: 28
    Może to wina samego Bascoma. Zauwazylem ze przy wykorzystywaniu przerwan fukncje wait i waitms czesto sie "gubia".
  • #12 2167651
    Stuart
    Poziom 12  
    Posty: 147
    Ocena: 11
    > Jacur
    Wow - pomogło Dzięki :)

    Nawiasem, wait 1 działo, nie diałało waitms. Nawet jak była pusta petla
    Do
    Waitms 500
    loop
    end
    też nie działało.

    Teraz działa i waitms i to z dowolną ilością. :)

Podsumowanie tematu

LABEL_AI_GENERATED
Problem dotyczy opóźnienia Waitms 900 w programie na mikrokontrolerze ATmega8 sterującym wyświetlaczem LED 4-cyfrowym z multipleksowaniem realizowanym przez układ 74HCT164. Opóźnienie Wait 1 działa poprawnie, natomiast większe wartości Waitms powodują błędy w wyświetlaniu cyfr. Dyskusja wskazuje, że problem nie leży w czasie trwania obsługi przerwania ani w samym multipleksowaniu, lecz może wynikać z użycia komendy Goto zamiast Gosub w Bascom AVR, co powoduje nieprawidłowe działanie funkcji waitms. Zmiana Goto na Gosub oraz odpowiednia struktura podprogramów rozwiązała problem, umożliwiając stosowanie opóźnień Waitms o dowolnej długości. Dodatkowo zalecano użycie zmiennych typu Byte zamiast Integer do obsługi wartości wyświetlanych cyfr. Wskazano również, że w Bascom AVR funkcje wait i waitms mogą mieć problemy przy wykorzystaniu przerwań, co wymaga ostrożności w implementacji.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA