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

[Atmega8][C] Niestabilna praca LCD

marti_ql 27 Maj 2009 20:15 2656 13
REKLAMA
  • #1 6582709
    marti_ql
    Poziom 10  
    Eksperymentuję sobie z Atmega8 poznając C, 1wire, twi itp.
    Wykorzystuję do tego płytkę stykową (zdjęcie niżej).
    Problem polega na tym, że często na wyświetlaczu pojawiają się krzaczki zamiast informacji jaka powinna być wyświetlona. Kilka-kilkanaście resetów zazwyczaj pomaga, ale nie zawsze. Nie wiem co może powodować takie zachowanie wyświetlacza. Procedury są poprawne (wcześniej wszystko działało na Tiny 2313 i płytce ZL11AVR). LCD na porcie D (RS, E na PD0, PD1, dane PD4-PD7).
    Może komuś uda się wypatrzeć na zdjęciu jakieś błędne połączenie, zwarcie (kabelki wychodzące poza płytkę biegną do programatora).
    Układ jest zasilany z programatora USB.

    [Atmega8][C] Niestabilna praca LCD

    Poprawiłem tytuł.
    [zumek]
  • REKLAMA
  • #2 6583050
    dawid512
    Poziom 32  
    Cytat:
    (R/W, E na PD0, PD1, dane PD4-PD7)

    R/W zazwyczaj podłącza się do masy, no chyba że z tego korzystasz. Nie wspomniałeś nic o RS.
  • REKLAMA
  • #3 6583273
    arktik1
    Poziom 27  
    Przede wszystkim oscylator powinien być jak najbliżej m8.
  • #4 6583480
    janbernat
    Poziom 38  
    A podświetlanie LCD nie jest przypadkiem podłączone?
    Nie widać dokładnie na zdjęciu-ale jeśli jest- USB może tego nie zasilić.
  • #5 6586665
    marti_ql
    Poziom 10  
    dawid 512 -> oczywiście że RS do PD0 (poprawilłem post wyżej) a R/W zwarte do masy

    arktik1 -> pracuje na wewn. oscylatorze, a ten na płytce jest tylko "dla ozdoby"

    janbernat -> próbowałem z włączonym i wyłączonym podświetleniem, ten sam efekt (tzn. raz działa raz nie)
  • #7 6586973
    marti_ql
    Poziom 10  
    No ale sęk w tym, że na Tiny2313 (dla niego były pisane procedury obsługi LCD) wszystko działało bez problemu, dopiero teraz zaczęły sie schody.
    Kilka resetów i zazwyczaj problem znika.
  • #8 6590537
    budzik1678
    Poziom 10  
    Zobacz jakie masz czasy dostępu do wyswietlacza. Może wyświetlacz nie jest w stanie tak szybko czytać komend które mu wysyłasz...
  • REKLAMA
  • #9 6596284
    marti_ql
    Poziom 10  
    Z czasami też kombinowałem. Bez efektu.
  • REKLAMA
  • #10 6596992
    mirekk36
    Poziom 42  
    matko z córką! - weź ty zasiądź porządnie do swojego spapranego kodu - bo to on jest winny wszystkiemu - zamiast zadawać tu pytania, po których wmawiasz wszystkim, że wszystko masz dobrze połączone a tajemniczy kod jest idealny bo działał - tylko teraz nie działa..... to zaczyna być śmieszne

    1. rozrysuj sam tak dla siebie schemat tego co połączyłeś na pająka, sprawdź to ze 2-3 razy i pokaż ten schemat tutaj

    2. pokaż kawałek swojego tajemniczego SUPER kodu

    ..... a wtedy łatwiej będzie ci pomóc niż takie zgadywanki z dziwnego zdjęcia na płytce stykowej, gdzie dla zmylenia "przeciwnika" dodałeś jakieś nie działające w układzie elementy jak np kwarc - i zadajesz pytania niczym jak do wróżek
  • #11 6597134
    _Robak_
    Poziom 33  
    Kolega mirekk36 dobrze pisze ;) Ja od siebie dodam zebys sciagnal biblioteke z netu, przekonal sie sie ze wszystko dziala albo i nie, ale bedziesz wiedzial gdzie lezy problem.
  • #12 6597487
    marti_ql
    Poziom 10  
    Dokładnie miałem nadzieję, że tutejsi guru od razu wypatrzą jakiś błąd.
    Wyszedłem z założenia, że to nie windows - raz działa raz nie. Działało na jednym procku to będzie i na innym.

    A "supertajny" kod (nie mojego autorstwa), nie przypuszczałem, że komuś będzie się chciało przeglądać to - proszę bardzo:

    lcd.h

    
    #include <avr/io.h>
    #include <util/delay.h>
    
    #define lcd_rs _BV(0)  	// definicja bitu portu dla linii RS
    #define lcd_e  _BV(1)  	// definicja bitu portu dla linii E
    #define LCD_PORT PORTD			// port do ktorego podpieta jest linia danych LCD
    #define LCD_RS_SET LCD_PORT|=lcd_rs	// wyslanie 1 do RS
    #define LCD_RS_CLR LCD_PORT&=~lcd_rs	// wyslanie 0 do RS
    #define LCD_E_SET  LCD_PORT|=lcd_e		// wyslanie 1 do E
    #define LCD_E_CLR  LCD_PORT&=~lcd_e	// wyslanie 0 do E
    #define CR 0x0A         //definicja znaku CR (przejście do nowej linii)
    
    void writeilcd(unsigned char instr);
    void writedlcd(char dana);
    void clearlcd(void);
    void lcdxy(unsigned char w, unsigned char k);
    void writetext(char *tekst);
    void initlcd();
    


    lcd.c

    
    /* Procedury obsługi wyświetlacza LCD w trybie 4-bitowym
       szyna danych to starsze 4bity portu LCD_PORT		*/
    
    #include <avr/pgmspace.h>
    #include "lcd.h"
    #define tau 1
    
    unsigned char row=0;		//rząd
    unsigned char col=0;		//kolumna
    
    void initlcd()
    {
    	unsigned char i;
    	_delay_ms(tau*100);
    	for(i=0;i<3;i++)       //3-krotne wysłanie 3-
    	{
    		LCD_E_SET;
    		LCD_PORT=(LCD_PORT&0x0f)|0x30; //wyślij 3- do LCD
    		asm("nop");
    		asm("nop");
    		asm("nop");
    		LCD_E_CLR;
    		_delay_ms(tau*5); //ok. 5ms
    	}
    	LCD_E_SET;
    	LCD_PORT=(LCD_PORT&0x0f)|0x20;  //wyślij 2- do LCD
    	asm("nop");               //wymagane wydłużenie impulsu
    	asm("nop");
    	asm("nop");
    	LCD_E_CLR;
    	_delay_us(tau*150);  
    	writeilcd(0x28);     //interfejs 4-bitowy, 2 linie, znak 5x7
    	writeilcd(0x08);     //wyłącz LCD, wyłącz kursor, wyłącz mruganie
    	writeilcd(0x01);     //czyść LCD
    	_delay_ms(tau*5);    //wymagane dla instrukcji czyszczenia ekranu opóźnienie
    	writeilcd(0x06);     //bez przesuwania w prawo
    	writeilcd(0x0c);     //włącz LCD, bez kursora, bez mrugania
    	_delay_ms(tau*100);
    	clearlcd();
    }
    
    void writeilcd(unsigned char instr) //zapisz instrukcję sterującą do LCD
    {
    	LCD_RS_CLR;
    	LCD_E_SET;
    	LCD_PORT=(LCD_PORT&0x0f)|((instr&0xf0));  //przygotuj starszy półbajt do LCD
    	asm("nop");                       //wymagane wydłużenie impulsu
    	asm("nop");
    	asm("nop");
    	LCD_E_CLR;
    	_delay_us(tau*100);               //czekaj na gotowość LCD ok. 100us
    	LCD_E_SET;
    	LCD_PORT=(LCD_PORT&0x0f)|((instr&0x0f)<<4);  //przygotuj młodszy półbajt do LCD
    	asm("nop");
    	asm("nop");
    	asm("nop");
    	LCD_E_CLR;
    	_delay_us(tau*100);               //czekaj na gotowość LCD ok. 100us
    }
    
    void writedlcd(char dana)             //zapisz daną do LCD
    {
    	LCD_RS_SET;
    	LCD_E_SET;
    	LCD_PORT=(LCD_PORT&0x0f)|((dana&0xf0));   //przygotuj starszy półbajt do LCD
    	asm("nop");                            //wymagane wydłużenie impulsu
    	asm("nop");
    	asm("nop");
    	LCD_E_CLR;
    	_delay_us(tau*100);                    //czekaj na gotowość LCD
    	LCD_E_SET;
    	LCD_PORT=(LCD_PORT&0x0f)|((dana&0x0f)<<4); //przygotuj młodszy półbajt do LCD
    	asm("nop");
    	asm("nop");
    	asm("nop");
    	LCD_E_CLR;
    	_delay_us(tau*100);              //czekaj na gotowość LCD ok. 100us
    }
    
    void clearlcd(void)                //czyść ekran
    {
    	writeilcd(0x01);        //polecenie czyszczenia ekranu dla kontrolera LCD
    	_delay_ms(tau*5);      //czekaj 0x01 wykonuje się 1.64ms
    	row=0;
    	col=0;
    }
    
    void lcdxy(unsigned char w, unsigned char k)    //ustaw współrzędne kursora
    {
    	writeilcd((w*0x40+k)|0x80);  //standardowy rozkaz sterownika LCD 
                                     //ustawiający kursor w określonych współrzędnych
    }
    
    void writetext(char *tekst)  //pisz tekst na LCD wskazywany pointerem *tekst
    {
    	unsigned char zn;
    	int nr=0;
    
    	while(1)
    	{
    		zn=pgm_read_byte(&tekst[nr++]);             //pobranie znaku z pamięci programu
    		if(zn!=0)                  					//czy nie ma końca tekstu?
    		{
    			if(zn==CR)               //czy znak nowej linii
    			{
    				row==1?row=0:++row;  //przejdź do nowej linii
    				col=0;
    				lcdxy(row,col);      //ustaw obowiązujące po zmianie współrzędne na LCD
    			}
    			else
    			{
    				writedlcd(zn);       //umieść pojedynczy znak tekstu na LCD
    			}
    		}
    		else
    		{
    			break;                    //zakończ pętlę, jeśli koniec tekstu
    		}
    	}
    }
    


    No to teraz tylko czekać na zmieszanie z błotem. Jeżeli miałoby to rozwiązać problem to zapraszam.

    W międzyczasie chyba rzeczywiście ściągne jakieś biblioteki i potestuję.
  • #14 6598258
    marti_ql
    Poziom 10  
    Biblioteka kolegi _Robak_ działa bez zastrzeżeń.
    Wypada uderzyć się w pierś i szukać błędu w kodzie.
REKLAMA