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

Jak przyspieszyć działanie ATmega16 z LCD 20x4 w Bascom?

Roman Szemik 15 Cze 2005 21:37 2334 20
REKLAMA
  • #1 1580814
    Roman Szemik
    Poziom 14  
    Posty: 150
    Pomógł: 2
    Ocena: 6
    Czy jest jakiś sposób na przyspieszenie działania programu napisanego w Bascom na ATmega16 kwarc 4Mhz, który współpracuje z wyświetlaczem lcd 20x4 ? Wymiana kwarcu na 16Mhz nie przyniosła oczekiwanych rezultatów. Z góry dziękuję za jakiekolwiek wskazówki.
  • REKLAMA
  • #2 1580839
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    Na pewno ten kwarc pracuje zamiast wewnętrznego oscylatora RC ? Fusebity przestawiono w/g omawianych na tym forum wskazówek ?
    Alternatywy :
    - Własne zooptymalizowane procedurki obsługi LCD.
    - Przesiadka na C lub asm(jeszcze szybszy... ;))
    No i nieśmiertelne porady na temat programowania zoptymalizowanego pod wzgledem wykorzystania czasu procesora (Pod Bascomem raczej ciężkie do zaimplementowania) .
  • #3 1581125
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    Light'I napisał:
    - Przesiadka na asm... ;)

    Albo C...
  • #4 1582779
    Roman Szemik
    Poziom 14  
    Posty: 150
    Pomógł: 2
    Ocena: 6
    Fuse bity i inne ustawienia raczej są poprawne, a przejście na programowanie w C lub asm raczej odpada ze względu na brak czasu aby się tego nauczyć.
    Zauważyłem pewną rzecz w pracy mojego programu. Jeżeli nie ma wyświetlania informacji na lcd to prędkość działania programu całkowicie mnie zadowala natomiast jeśli będę coś wyświetlał to np. liczba A w rozkazie incr A zwiększa się mniej więcej o dwa na sekundę (zmienna A widoczna na LCD). Potrzebuję większej prędkości aby generator
    portc.1 = not portc.1 działał z jak największą częstotliwością.
    A co to jest optymalizacja procedur LCD i czym się to je ?
    Pozdrawiam i dzięki za informacje.
  • #5 1582864
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    Roman Szemik napisał:
    A co to jest optymalizacja procedur LCD i czym się to je ?
    Link podałem wyżej(podkreślone i wytłuszczone litery). Po prostu zamiast użycia "LCD..." piszemy własną procedurke obsługi i to najlepiej w asm, stosując się do wytycznych w tym opisie (wszelkie konstrukcje typu "waitms" do śmieci... ;)).
  • #6 1582978
    frohme
    Poziom 21  
    Posty: 421
    Pomógł: 25
    Ocena: 15
    Sądząc z opisu jak to się zachowuje przy wyświetlaniu czegokolwiek to program jest chyba napisany tak, że czeka aż do LCD będzie można wpisać dane (czeka na gotowość przyjęcia nowych danych a to trwa po kilkanaście albo i kilkadziesiąt milisekund w najlepszym przypadku). W Bascomie pewnie te procedury operują czasami z zapasem i dlatego tak to sie wlecze. Podejrzewam, że bez dość znaczącej przeróbki programu to nie ma co marzyć o przyśpiszeniu (zmiana kwarcu nic nie da). Mimo wszystko radziłbym C, lub asembler i ograniczyć czasy na obsługę LCD lub jeżeli to możliwe działać na przerwaniach, no chyba, żeby zadziałać w Bascomie na przerwaniach, ale tu nie jestem pewien rezultatu.
  • REKLAMA
  • #7 1584264
    Roman Szemik
    Poziom 14  
    Posty: 150
    Pomógł: 2
    Ocena: 6
    Za wszelkie informacje dziękuję ale dalej chciałbym drążyć temat aby w jakiś sposób i to najlepiej w bascomie ograniczyć obciążenia czasowe przez wyświetlacz lcd.
    Nie wyssałem z mlekiem matki sposobu programowania mikrokontrolerów lecz staram się jak mogę aby dokończyć projekt i jestem wdzięczny za wszelkie informacje.
    Jak ograniczyć czasy na obsługę LCD - czy to można zrobić w bascomie ?
    Zrobiłem małe doświadczenie. Na wyświetlaczu led cztery cyfry patrzyłem na zmienną w rozkazie incr A. Praktycznie liczba 9999 przekręcała się bardzo szybko na oko pięć razy na sekundę. To samo zrobiłem na lcd i na odliczenie do 9999 musiałem czekać około pięciu sekund. Czy to jest normalne i czy da się przeskoczyć tak wolne liczenie i tym samym obciążenie czasowe programu?
    Pozdrawiam
  • #8 1585454
    frohme
    Poziom 21  
    Posty: 421
    Pomógł: 25
    Ocena: 15
    Jeżeli dobrze zrozumiałem to zaokrąglając do pełnych 10000 dla ledów było 5x10000 zliczeń zmiennej A w sekundzie czyli 0,2 sek na przekręcenie licznika, natomiast dla lcd ten sam proceder trwał 5 sek? Czy tak?
  • #9 1585520
    Roman Szemik
    Poziom 14  
    Posty: 150
    Pomógł: 2
    Ocena: 6
    Dokładnie tak Panie frohme. Aby wynik odliczenia zmiennej równał się 10000 na lcd muszę czekać około 5 sekund.Program w obu przypadkach jest taki sam czyli (nie będę tu przytaczał programu sterującego lcd i led)

    do
    incr A
    wyświetl informację na lcd lub wyświetlaczach led
    loop

    Tak sobie myśle iż jeżeli zmienna A jest tak wolno dodawana i wyświetlana na lcd to najprawdopodobniej również cały program o tyle wolniej będzie pracował. Bardzo jest mi to nie wsmak a doświadczenie przeprowadziłem na dwóch różnych wyświetlaczach lcd i z tym samym smutnym efektem wolnej pracy. Może jest jakieś rozwiązanie tego problemu i tylko najlepiej pod Bascomem bo tylko ten język szlifuję.
    Dzięki za zainteresowanie
  • #10 1585824
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Jeśli chcesz przyspieszyć obsługę wyświetlacza LCD , to skorzystaj z biblioteki "lcd4busy.lib".Warunek - wolny port do podłączenia LCD.
    Przykład dla PORTB.
    
    $regfile = "m16def.dat"
    
    $lib "lcd4busy.lib"
    Const _lcdport = Portb
    Const _lcdddr = Ddrb
    Const _lcdin = Pinb
    'Szyna danych musi być podłączona w poniższy sposób:
    'pb7-db7
    '...'
    'pb4-db4
    Const _lcd_e = 1      'pb1 - syg. sterujące na bitach 1,2,3 (kolejność dowolna)
    Const _lcd_rw = 2    'pb2
    Const _lcd_rs = 3     'pb3
    'a dalej już normalnie ;)
    Cls
    Lcd "Costam"
    Do
    Loop
    


    Piotrek

    PS
    Standardowo , funkcja LCD "Costam"= ~80000 cykli,powyższa ~500 :wink:
  • #11 1585865
    Roman Szemik
    Poziom 14  
    Posty: 150
    Pomógł: 2
    Ocena: 6
    Tylko powiedz mi Piotrze jako że nie jestem tak dobry w te klocki jak Ty
    czy ten programik należy wpisać na początku mojego programu tam gdzie jest konfiguracja i czy z pozostałych wolnych pinów danego portu można korzystać?
    Pozdrawiam
  • REKLAMA
  • #12 1586114
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Roman Szemik napisał:

    ...czy ten programik należy wpisać na początku mojego programu tam gdzie jest konfiguracja i ...

    Tak.
    Roman Szemik napisał:

    ...czy z pozostałych wolnych pinów danego portu można korzystać?
    Pozdrawiam

    Pozostaje raptem 1 wolny pin , a i tak wykorzystać go nie można :( bez przeróbki "lcd4busy.lib".

    Pozdrawiam
  • #13 1586205
    Roman Szemik
    Poziom 14  
    Posty: 150
    Pomógł: 2
    Ocena: 6
    Spróbuję to jeszcze dzisiaj sprawdzić i dam znać. Wielkie dzięki!
  • REKLAMA
  • #14 1591152
    jasiekz
    Poziom 15  
    Posty: 128
    Pomógł: 5
    Ocena: 2
    tylko za bardzo nie przyśpieszysz gdyż odświerzanie jednego lunktu na lcd jes w przybliżeniu 1,3 khz ( badałem) do właśnych potrzeb mozesz pokombinować z zegarem na lcdku ale mi sie nie udało dobrać większej prędkości
  • #15 1591212
    frohme
    Poziom 21  
    Posty: 421
    Pomógł: 25
    Ocena: 15
    Sądzę po wszystkich wypowiedziach, że problem tkwi nie w nieprawidłowym, czy źle działajacym programie, a w jego organizacji logicznej. Dla wyświetlaczy led Bascom prawdopodobnie nie dodaje sam z siebie żadnych opóźnień, natomiast dla lcd to i owszem. Inkrementacja zmiennej może w programie przebiegać z szybkościa "wolnego elektronu na wysokości lamperii", ale jeżeli każde takie zdarzenie ma być uwiecznione na wyświetlaczu to jest to normalne, że działa tak jak działa. Należy się zastanowić czy nie wyświetlać stanu początkowego i końcowego, albo co jakiś czas lub co określony odstęp w wyniku. Licząc w przybliżeniu dla 10000 wyświetleń potrzeba 5 sek, to jedno wymaga czasu 0,5 ms i dużo lepiej nie będzie.
  • #16 1591878
    Roman Szemik
    Poziom 14  
    Posty: 150
    Pomógł: 2
    Ocena: 6
    Z braku czasu nie sprawdziłem rozwiązania kolegi Zumka. Małe pytanko. Czy Twoje rozwiązanie jest sprawdzone w praktyce czy tylko w symulacji, gdyż u mnie wiąże się to z reorganizacją na płytce i cięciem ścieżek.

    Aby przybliżyć temat zrobiłem pewne doświadczenie i obmierzyłem następujące parametry.
    Jak wspominałem interesuje mnie aby program w pętli działał jak najszybciej czyli normalnie. Sprawdzałem częstotliwości dla generatora
    portc.1 = not portc.1 (procesor Atmega16/4Mhz).
    Co się okazało.
    W momencie kiedy wyświetlacz miał (coś ty kotku chciał?) wyświetlać w momencie przepełnienia zmiennej co 12 (lcd nie zdążył oczywiście nic w tak krótkim czasie pokazać) częstotliwość na generatorze wynosiła 30 Hz.
    Jeżeli wyświetlacz 20x4 pracował normalnie i pokazywane były informacje to częstotliwość na wyjściu wynosiła około 3Hz (pomiar oscyloskopem). Jeszcze gorzej jest w przypadku kiedy jedna linijka w lcd ma migać pokazując na przemian informację i puste pole.
    Czy to jest normalne?
    I czy można oszukiwać w konfiguracji wpisując mu inną wartość kwarcu w tym przypadku 1Mhz (na płytce jest 4Mhz) bo zauważyłem iż po takim przekłamaniu program chodzi szybciej co najmniej raz szybciej. Czy to nie będzie miało negatywnego wpływu na pracę lub inne parametry?
    Serdeczne podziękowania dla wszyskich chcących pomóc w złośliwości rzeczy martwych.
  • #17 1595705
    frohme
    Poziom 21  
    Posty: 421
    Pomógł: 25
    Ocena: 15
    Wszystko zgodnie z zasadami - deklarujesz kwarc 1 MHz to Bascom tworzy własne opóźnienia dla tej częstotliwości, pracujesz na 4 MHz no to masz szczęście , że wszystko chodzi bo wpisy do lcd niekoniecznie muszą być akceptowane (czasy wymagane przez sterownik lcd). Jak coś w linijce ma migać (pusto) i pokazywać jakiś znak to przecież dwa kolejne wpisy dla tej samej pozycji na wyświetlaczu i nic dziwnego, że sie wlecze jeszcze bardziej. Jeszcze raz dla pełnej jasnośći - to nie lcd zwalnia pracę procesora, tylko program w Bascomie tworzy takie pętle w których czeka i czeka i czeka......a procesor pracuje ze swoją normalną szybkością.
  • #18 1596299
    Roman Szemik
    Poziom 14  
    Posty: 150
    Pomógł: 2
    Ocena: 6
    Panie Piotrku (Zumek). Podpiąłem zaprogramowałem zgodnie z propozycją , lecz wyświetlacz ani drgnie. Proszę o konsultację.
    A swoją drogą jeśli sugestia wyżej wymieniona nie odpali to powoli tracę nadzieję na przeskoczenie technicznych niedoskonałości pewnych rozwiązań .
  • Pomocny post
    #19 1596338
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Roman Szemik napisał:
    Panie Piotrku (Zumek)...


    Obecny :wink:
    Proszę o więcek danych , a najlepiej o załączenie kodu źródłowego i wynikiwego (BIN lub HEX).Wtej chwili , pracuje u mnie wyświetlacz 16 * 2 , którym steruje program oparty na proponowanej bibliotece.

    Piotrek
  • #20 1597298
    Roman Szemik
    Poziom 14  
    Posty: 150
    Pomógł: 2
    Ocena: 6
    Jeszcze raz sprawdzę połączenia i jeżeli nie znajdę przyczyny w mechanice to prześlę plik wieczorem.
    Dziękuję za odpowiedź.

    I jeszcze dla potwierdzenia sposobu połączeń
    PB7 - b7
    PB6 - b6
    PB5 - b5
    PB4 - b4
    RS - b3
    RW - b2
    EN - b1
    pin b0 wolny i nie do wykorzystania, czy można go zaprzęgnąć do jakiejkolwiek pracy?
  • #21 1598918
    Roman Szemik
    Poziom 14  
    Posty: 150
    Pomógł: 2
    Ocena: 6
    Przelutowałem wyświetlacz na inne piny i można by powiedzieć iż nie wiem dlaczego ale ważne że zmienna wyświetlana na lcd zasuwa aż się miło patrzy lotem błyskawicy .
    Co prawda był to test na lcd również 16x2 ale mam nadzieję iż z lcd 20x4 też nie będzie problemów pomimo iż program zajmuje 92% pamięci ATmega16.
    Swoją drogą Panie Piotrku prosze mi powiedzieć lub raczej napisać, gdzie można się dowiedzieć o takich perełkach informacyjnych.
    Pozdrawiam.

Podsumowanie tematu

✨ Dyskusja dotyczy problemu niskiej szybkości działania programu napisanego w Bascom na mikrokontrolerze ATmega16 z kwarcem 4 MHz współpracującym z wyświetlaczem LCD 20x4. Wymiana kwarcu na 16 MHz nie przyniosła znaczącej poprawy. Główną przyczyną spowolnienia jest czasochłonna obsługa LCD, która w Bascomie realizowana jest przez procedury oczekujące na gotowość wyświetlacza, co powoduje znaczne opóźnienia (rzędu kilku sekund na 10000 inkrementacji zmiennej). Proponowane rozwiązania to: zastosowanie własnych zoptymalizowanych procedur obsługi LCD, najlepiej w asemblerze, lub użycie biblioteki "lcd4busy.lib" dla szybszej komunikacji z LCD (wymaga odpowiedniego podłączenia do portu i modyfikacji pinów). Wskazano, że Bascom generuje opóźnienia dostosowane do deklarowanej częstotliwości kwarcu, co może powodować błędy przy niezgodności ustawień. Zwrócono uwagę, że częste odświeżanie LCD jest naturalnie wolne i należy rozważyć ograniczenie liczby wyświetleń (np. wyświetlanie tylko co pewien czas lub tylko stanów początkowych i końcowych). Testy wykazały, że zmiana pinów i zastosowanie biblioteki "lcd4busy.lib" znacząco przyspiesza wyświetlanie, nawet na LCD 16x2, co powinno przełożyć się na lepszą wydajność także z LCD 20x4. Wskazano, że programowanie w C lub asemblerze może przynieść dalsze przyspieszenia, jednak ze względu na brak czasu autor preferuje rozwiązania w Bascomie.
Wygenerowane przez model językowy.
REKLAMA