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

[Atmega8][C][HD44780] LCD nic nie wyświetla dla f>4MHz

maciek_nh 30 Maj 2010 20:48 3934 24
  • #1 8135092
    maciek_nh
    Poziom 12  
    Witam

    Do tej pory używałem do obsługi LCD(hd44780) programu ze strony:
    http://mikrokontrolery.net/ogolne_lcd_hd44780.htm
    Wszystko działa dobrze dotąd dopóki częstotliwość z jaką pracuje atmega jest nie większa niż 4Mhz. Powyżej tej częstotliwości nic nie wyświetla się na ekranie. Próbowałem zwiększać opóźnienia ale to nic nie dało. Czy ktoś wie jak przerobić ten program żeby LCD działało też dla większych częstotliwości pracy atmegi ?
  • #2 8135105
    tadzik85
    Poziom 38  
    A wydłużyłeś sygnał enable?
  • #4 8135158
    maciek_nh
    Poziom 12  
    Pisze program w AVR Studio i zawsze tam ustawiam częstotliwość na taką jaką ustawiam procka.
    @tadzik85 Chodzi co o dołożenie opóźnienia między set_e, a clr_e ?
  • Pomocny post
    #5 8135165
    tadzik85
    Poziom 38  
    Tak, wg noty musi to być 0,5us.
  • #6 8135202
    maciek_nh
    Poziom 12  
    Ok dołożenie opóźnienia 1us rozwiązało problem. Dzięki za pomoc.
  • #8 8174354
    janbernat
    Poziom 38  
    Dobrze, że znalazłem ten temat.
    Bo to moja pierwsza próba z C.
    No i nic nie wyświetlało z generatorem 8Mhz.
    A zmieniłem na 1MHz- i działa.
    A powiedzcie mi gdzie się to opóźnienie ustawia.
    Bo wykomentowałem /*#define F_CPU 8000000UL*/
    I ustawiłem na 1MHz- ale też bym chciał aby chodziło na 8MHz.
    No i szukam "set_e, a clr_e ?"- no i gdzie to jest?
    To znaczy- ani w delay.h ani w delay_basic.h tego nie widzę.
  • #9 8174375
    tadzik85
    Poziom 38  
    W funkcjach obsługi wyświetlacza.
    I nie myl pojęcia opóźnienia czasowego z opóźnieniem zwolnienia sygnału Enable.
    Gdyż tu chodzi o wydłużenie jego czasu trwania do co najmniej 50ns.
    Wobec tego musisz poszukać instrukcji ustawiającej i zerującej tą linię.
  • #10 8174468
    janbernat
    Poziom 38  
    To znaczy- tu?
    
    // Funkcja zapisu bajtu do wyświetacza (bez rozróżnienia instrukcja/dane).
    //
    //-------------------------------------------------------------------------------------------------
    void _LCD_Write(unsigned char dataToWrite)
    {
    LCD_E_PORT |= LCD_E;
    _LCD_OutNibble(dataToWrite >> 4);
    LCD_E_PORT &= ~LCD_E;
    LCD_E_PORT |= LCD_E;
    _LCD_OutNibble(dataToWrite);
    LCD_E_PORT &= ~LCD_E;
    _delay_us(50);
    

    Po:
    LCD_E_PORT |= LCD_E;
    Wstawić opóźnienie?
    Wybaczcie głupie pytania- ale dopiero w C zaczynam.
  • #11 8174621
    rpal
    Poziom 27  
    Gdybyś kolego Maćku uzył linii EN którą pewnie masz na stałe połączoną do masy i sprawdzał status zajętości wyświetlacza a nie zakładał ze wyświetlacz przy jakiejś stałej zwłoce czasowej wyrobi się ze wszystkim to tego postu by nie było. A czy poganiałabyś swojego procka 4 MHz czy 16 MHz nie mialoby to żadnego znaczenia. Niestety wiekszość ten drobiazg olewa idąc na łatwiznę a potem dziwią się że wyświetlacz głupieje przy zmianie kwarcu albo podmianie samego LCD na inny (wolniejszy) model.

    Kolega chyba pisze o linii RW? Proszę poprawić posta.
    Robak

    istotnie dzięki za uwagę chodzi oczywiście o linię R/W określającej kierunek transmisji
  • #12 8174700
    tadzik85
    Poziom 38  
    rpal co ty za głupoty wypisujesz? E na stale podpięta do masy?? dobre.

    janbernat tak w tym miejscu najlepiej przed zerowaniem linii E. I musisz znaleźć wszystkie tego typu fragmenty.
  • #13 8175275
    PO.
    Poziom 20  
    Datasheet mówi że hd44780 może się komunikować do 2MHz, w praktyce nie wszystkie to wytrzymują i zależy jeszcze od połączenia (wstążki, kabelki itp). Ja wyciągnąłem u siebie sporo więcej przy dobrym podłączeniu i odpowiednio napisanej bibliotece :) ale też miałem szczęśliwy jakiś wyświetlacz (sam się zdziwiłem). Generalnie ~1MHz jest bezpiecznie i dlatego początkującym działa na przypadkowej bibliotece a potem przestaje, no i do tego nie trzeba żadnych opóźnień.
    Nie ma to związku z odczytywaniem zajętości - tam są duużo większe opóźnienia. Przy braku odczytu zajętości i tylko czekaniu oczywiście prędzej czy później też zaczną się problemy...
  • #14 8175318
    utak3r
    Poziom 25  
    O ile dobrze pamiętam, najdłużej trwa instrukcja "home" - trwa zdaje się do 5 milisekund - tak więc tutaj wymagane byłoby opóźnienie.
    Natomiast większość pozostałych ma czas trwania około 40µs. Tutaj więc o działaniu lub nie może decydować nawet kod programu... Ostatnio miałem właśnie kilka problemów z wyświetlaczem, więc po kolei, z datasheetem w dłoni, do każdej funkcji w mojej bibliotece, dodałem na końcu waity wg tabelki.
  • #15 8176001
    rpal
    Poziom 27  
    Używam procedur które sprawdzają zajętość wyświetlacza LCD, nie miałem żadnych klopotów przy żadnych częstotliwościach taktowania. Więcej w tym temacie nie mam do dodania z wyjątkiem tego że szkoda procesora na bezmyślne oczekiwanie w zwłoce + ew. margines głupoty który skobie ktoś założy jako wystarczające opóźnienie. Dziala to dla każdego modelu LCD wolnego i szybkiego.
  • #16 8176280
    janbernat
    Poziom 38  
    Ale zajmuje to o jedną końcówkę procesora więcej.
    A w przypadku gdy końcówek mało & procedury czasowe nie są krytyczne to rozwiązanie bez sprawdzania zajętosci jest lepsze.
    Często jest na odwrót- wtedy trzeba sprawdzać zajętość.
    Nie ma rozwiązań idealnych- tak jak kobiet.
    Ale zawsza na szczęście można coś znośnego wybrać.
    Program można ostatecznie zrobić samemu.
    P.S.
    A kobiety- nie.
    Ale ab ovo.
    Najpierw nic nie wpisywałem w "configurationn options" w okienko "frequency".
    A w programiku wpisywałem grzecznie #define F_CPU...
    No i programik nie chodził.
    A potem wpisałem w "configurationn options" 8Mhz.
    I w fusebity też.
    No i zaczęło działać.
    Potem wywaliłem opóźnienia w funkcji:
    
    // Funkcja zapisu bajtu do wyświetacza (bez rozróżnienia instrukcja/dane).
    //
    //-------------------------------------------------------------------------------------------------
    void _LCD_Write(unsigned char dataToWrite)
    

    No i działa.
    Potem wsadziłem w podstawkę kwarc 16Mhz, ustawiłem procesor na ten kwarc i działa.
    A przedtem wstawiłem tak:
    #define F_CPU pies_i kot.
    No i działa na kwarcu 16 Mhz- z tym pies_i_kot.
    I nie jest to odkrywcze- przypomniałem sobie posty Freddie_Chopin- ale On proponował wpisanie tylko "kot".
    I uwagi atom-a- że AVRStudio potrafi być głupsze niż Bascom w pewnych sytuacjach.
  • #17 8177439
    PO.
    Poziom 20  
    Hmmm, no to na 16MHz zarządziłeś. Ja mam w sumie podobną bibliotekę, samodzielnie pisaną ale mi się bez nopa nie przeładowuje dobrze linia e między machnięciami nóżką - przynajmniej nie zawsze i dla bezpieczeństwa on tam jest. Nie wiem czym miałeś połączony ten wyświetlacz...

    Jak wywaliłeś delaye to F_CPU nie było potrzebne do niczego już :) więc to nie odkrywcze w sumie.


    Gdy brakuje nóżek to się dodaje ekspander do czegoś. Albo robi softwarowy ekspander na a8 (albo robiło jak chodziły po 3zł, było taniej niż pcf...). Albo robi kontroler do wyświetlacza i steruje nim np po i2c. Albo do czegoś innego. Milion opcji żeby odczytywać poprawnie zajętość.

    A propos - odczytuje Ci się dobrze flaga zajętości na tych 16MHz? Sprawdź resztę biblioteki czy nie ma delay'ów i wyślij jakiegoś dłuższego stringa. Albo kilka komend, jakieś czyszczenie i coś potem.
    Biblioteka radzia miała w głupich miejscach opóźnienia i czytała flagę nadmiarowo nie tam gdzie trzeba swoją drogą więc nie wiem czy go zmusisz do wywalenia się.
  • #18 8179876
    janbernat
    Poziom 38  
    No to tak:
    
    #include <util/delay.h>
    #define F_CPU 16000000UL
    #include <avr/interrupt.h>
    
    int main(void)
    {
    sei();
    DDRB=0x8;
    TCCR2=0x11;
    
    char *text="ok_pies i kot";
    
    LCD_Initalize();
    LCD_WriteText(text);
    _delay_ms(100);
    while(1)
    	{
    	LCD_WriteText(text);
    	_delay_ms(100);
    	LCD_GoTo(40,2);
    	LCD_WriteText(text);
    	_delay_ms(100);
    	LCD_Clear();
    	
    	
    	}
    }
    

    W drugiej linijce miga- pewnie to LCD_Clear(); tak działa.
    Ale ni udaje mi się tego programiku wykrzaczyć przy 16MHz.
  • #19 8179894
    PO.
    Poziom 20  
    Załamałeś mnie...
    Tobie chodzi o 16MHz zegar procka a mnie częstotliwość transmisji (w skrócie machanie nóżkami z tą częstotliwością - czyli co cykl, a nie jakieś delaye i nie wiadomo co w reszcie funkcji).
  • #20 8179958
    janbernat
    Poziom 38  
    No ale że LCD nie działa z częstotliwością 16MHz- to chyba oczywiste.
    2MHz- to aż za dużo.
    Tak że nie rozumiem Twojego załamania.
    Toż to jest interfejs dla człowieka- kto odczyta zmianę informacji częściej niż co 0.5s?
    No ale pewnie chodzi Ci o to aby tę paczkę informacji wysłać w możliwie krótkim czasie- a potem niech już na wyświetlaczu zostanie.
    No- takich badań nie robiłem.
    To byłoby trochę ryzykowne- dla danego wyświetlacza i kabelków działa- a dla innego nie.
    No ale nie mówię nie- może to sprawdzę.
  • #21 8181294
    PO.
    Poziom 20  
    Jak pisałem, że wyciągnąłem więcej to miałem na myśli prędkość transmisji. LCD jest dla człowieka ale szyna dla procesora i im dłużej go obsługuje tym mniej ma czasu na resztę.
    W/g datasheeta od oryginału hd44780 to granicą są właśnie 2MHz - ale nie wszystkie wyświetlacze to wytrzymują, więc w poważnych projektach, które mają być stabilnie nie polecam wychodzenia poza 1MHz. Nie wiem czy to kwestia "zamienników", czy podłączenia, czy też układów peryferyjnych lcd.

    A zegar procesora to zupełnie inna bajka... Robiłem procesor i na 20MHz i lcd chodził, i nie ma się czym chwalić bo to normalne, że biblioteka moja dopilnowana :) i automatycznie dopasowuję ją do zegara.

    PS: co do kabelków to zawsze mam piny na lcd i albo w płytkę wpinam albo we wstążkę (z drugiej strony też piny) i leży sobie 20-30cm :) . Nigdy nie lutuję bezpośrednio bo dla mnie to bezsens - niewygoda. Do tego mam małe czary-mary na płytce z procesorem pozostałe z czasów pisania pierwszej wersji biblioteki, gdy natknąłem się na nieopisywany nigdzie problem. Zawsze to stosuję i z podejrzliwością patrzę na wszystkie biblioteki z sieci. Podpowiem, że dotyczy to prawiłdłowego odczytywania zajętości - i może dlatego podstawową radą jest wpychanie wszędzie opóźnień i dodatkowych odczytów.

    PS2: te moje testy prędkości, o których wspominałem gdzieś wyżej to były na płyce prototypowej na pająka + taśma, więc żadnych wypasów ;) .
  • #22 8181673
    janbernat
    Poziom 38  
    No to pomimo tego że to jest pierwsze co robię w C-zero doświadczenia- zacząłem grzebać w w bibliotece radzia.
    Tak coś jednak korci.
    Jedyne opóźnienie to jest 50us po zapisie półbajtu do wyświetlacza.
    Udało mi się zejść do 38us.
    Poniżej jest niestabilnie.
    Oczywiście _delay_ms(2) po czyszczeniu wyświetlacza to można rozwiązać trochę inaczej.
    Wysłać LCD_clear() i inkrementować jakąś zmienną od przerwania licznika i po 2ms wrócić do obsługi LCD.
    Te 50us w zasadzie też- ale nie wiem czy sprawdzanie zmiennej w pętli głownej nie zajmie więcej czasu.
    A procesor swoje robi w tym czasie.
    Ale to wtedy nie byłby prosty program do obsługi LCD.
    P.S.
    Jakiś czas temu w ferworze porządków wyrzuciłem stary katalog Intersil-a gdzie były dokładnie opisane sygnały do LCD- no bo wszystko jest w sieci.
    A teraz to żal- albo ślipić w ekran- a ekran ma skończone rozmiary- albo wydrukować.
  • #23 8181768
    PO.
    Poziom 20  
    Bez przesady, dużo w tym datasheecie nie ma ;) , dasz radę na ekranie.
    Wydaje mi się, że jesteś zaawansowany i dasz radę.
    Co do Radzia i Twoich prób: nie lepiej poświęcić jedną nóżkę i odczytywać zajętość? Wtedy zero opóźnień, zero rozrostu programu itp. Dla mnie odpowiedź jest oczywista i nigdy nawet nie podchodziłem do pisania wersji biblioteki bez obsługi dwukierunkowej ale ludzie robią dziwne rzeczy ;) ...

    Te opóźnienia są zachowawczo wstawione, trafisz na wolniejszy wyświetlacz i nie będziesz wiedział w którym miejscu program się wysypał... Albo jeszcze się okażą za małe te oryginalne...

    Inna bajka że u mnie też nie jest optymalnie, procek czeka na odpowiedź wyświetlacza, nie przełączy sobie wątku w międzyczasie... No ale to już duży program/system trzeba napisać żeby miało sens coś takiego :) , albo pod konkretny projekt bardzo krytyczny czasowo. Dla mnie nie ma sensu, bo docelowo przestawiam się pod obsługę przez i2c (hd44780 też, z kontrolerem zewnętrznym, który będzie tej zajętości pilnował) więc wszystko się uprości i sporo pracy poszłoby na marne ;) .
  • #24 8181932
    janbernat
    Poziom 38  
    Zaawansowany- to jestem w latach- a nie w doświadczeniu w programowaniu.
    Zwłaszcza w C.
    W programach radzia jest też wersja z odczytywaniem zajętości LCD.
    Ściągnę i będę trenował.
    Jak już wiem gdzie co zmieniać- to jak trafię na wolniejszy wyświetlacz- wiem gdzie co zmienić.
    A procek nie powinien czekać na odpowiedź- powinien sprawdzać czy jest.
    Odpytywanie w głównej pętli.

    A obsługa przez I2C wyświetlaczy LCD i LED- to można kupić w AVT za kilkadziesiąt zł gotowe.
    Nawet gdzieś mam- dobrze działają.
    Oczywiście kod "tajne/poufne"
    Ale jak się coś robi dla klienta- to albo sam napiszę, zrobię płytkę itd.- albo kupię- bo szkoda czasu.
    No- nie mam takich problemów- czyste hobby.
    Aby na starość nie zgnuśnieć.
    Zarabiam na czymś zupełnie innym- projektowanie w CAD, Solidworks, CAM i inne technologie.
  • #25 8181982
    PO.
    Poziom 20  
    No dobra, to co ma robić w międzyczasie i jak :) ?
    Założenie jest przecież takie, że wyświetlacz jest wolny - sprawdza i jak nie to czeka aż będzie (znaczy sprawdza w kółko). Inne rozwiązanie to jak pisałem - program musiałby być pisany wielowątkowo z wywłaszczeniem...
    Kupić nic nie kupię bo muszę mieć pełen dostęp do wszystkiego - zmienia się i rozwija z biegiem czasu. Podstawową funkcjonalność przez i2c mam więc nawet grosza na to szkoda ;) a bardziej zaawansowana będzie w miarę potrzeb.

    PS: wersję Radzia ze sprawdzaniem zajętości będziesz musiał poprawić bo nie wszystko jest tam sensowne, nawet jeśli zadziała.
REKLAMA