Pic16f877a ilk Çalışmada LCD bozuk karakter sorunu.

Başlatan ademtosun58, 22 Mart 2017, 15:43:30

ademtosun58

Merhaba Arkadaşlar Mplab Xc8 kullanarak hazırldagım projede hex dosyasını pice attıktan sonra ilk çalışmada 2*16 LCD ekranıma Bozuk karakter ler geliyor ("%&31"). Daha sonra pici 1-2 kere resetledigimde sistem düzeliyor ve istedigim fonksiyonlar ekrana geliyor. Bunun sebebi ne olabilir .Elektronik kısımdamı veya yazılımsal olabilirmi?

Hittman

Eğer breadboard da çalışıyorsanız kristalin sağlam oturup oturmadığını kontrol edin eğer sağlamsa yazılımda fuses ayarlarını kontrol edin. Genelde bu iki durumdan dolayı farklı karakterler görünüyor.

ademtosun58

Alıntı yapılan: Hittman - 22 Mart 2017, 22:04:24
Eğer breadboard da çalışıyorsanız kristalin sağlam oturup oturmadığını kontrol edin eğer sağlamsa yazılımda fuses ayarlarını kontrol edin. Genelde bu iki durumdan dolayı farklı karakterler görünüyor.


Breadbord değil normal delikli pertinaks üzerinde Yapıyorum yani Lehimli herşey, ayriyeten normal bi role tetikleme için çıkış verdim sistem normal çalışıyor işin içine lcd girince sapıtıyor

erdogan_82

Adem devreyi görmeden birşey söylemek pek doğru olmaz ama şöyle birşey başıma gelmişti 16f877 de bir yapmıştım. Sölediğin gibi devrede bir anormallik vardı. Sorunu şöyle çözdüm picin ya 6 nolu ayak veya b6 pini ( tam emin değilim hangisi olduğundan ) bu ayağa 10kohm direnç bağladım sorun çözüldü. Serdar çiçeğin kitabında bu konu anlatılıyor. Bu 877 de öle bir sorun oluyormuş.
     İkincıi aklıma gelende ekrana yazdıracağın şey rakamsal bir değerse yeterli bir hafıza birimi tanıtmamışsındır. Pic ondan da hata verebilir.

dursuncemal

initialize sorunu olabilir.lcd'nin bussy pinini kullaniyormusunuz.

:=

tekosis

cihazın ilk açılışında oluşan dalgalanmalar, parazitlerle ilgili bir problem gibi duruyor. lcd nin en pinini mcu ya bağlayıp işlemci ilk çalıştığı anda ekranı disable yapıp ~1 saniye sonra enable yapıp lcd'yi devreye alırsanız probleminiz hallolur.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

ademtosun58

Alıntı yapılan: tekosis - 23 Mart 2017, 00:14:02
cihazın ilk açılışında oluşan dalgalanmalar, parazitlerle ilgili bir problem gibi duruyor. lcd nin en pinini mcu ya bağlayıp işlemci ilk çalıştığı anda ekranı disable yapıp ~1 saniye sonra enable yapıp lcd'yi devreye alırsanız probleminiz hallolur.


Arkadaslar Sistemim de parazit olması veya dalgalanma olayı yok denebilir osilaskop ile ölçtügümde herhangi bi dalgalanma görmüyorum.

D6 pinine pull-up yaptım yine aynı sorun oldu

en pinini delay ile sonra da aktif ettim yine olmadı

Reset bir iki kere basınca bozuk ekran yerine normal ekran geliyor ama gerilimi kapatıp açtıgımda tekrar bozulma oluyor.






vitruvius


ademtosun58

Alıntı yapılan: vitruvius - 23 Mart 2017, 12:28:45
Kodunu paylaşır mısın?

Şöyle bir şey farkettim avometre ile ölçüm yaparken prob u mclr bacağına değdirdigimde ekran düzeliyor .

Mclr bacağındaki bağlantım ise 10 k direnç ile giriyorum ve buton ile toprağa çekiyor.

Acaba araya ufak bi kapasite eklemesimi yapayım

mehmet

10K drenci düşürebilirsin. 1K * 2.2K civarı. Buton arasına da
100nF kondansatör olabilir.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

vitruvius


ademtosun58

#11
Alıntı yapılan: vitruvius - 23 Mart 2017, 13:59:53
Devre şemanı da bir paylaş en iyisi.


Lcd 4 bit kullanıyorum

RS->D1
En->D0
D4->D4
D5->D5
D6->D6
D7->D7

şeklinde bağlı

void ToggleEpinOfLCD(void)
{
	LCD_E = 1;                // Give a pulse on E pin
	__delay_us(E_Delay);      // so that LCD can latch the
	LCD_E = 0;                // data from data bus
	__delay_us(E_Delay); 	
}


void WriteCommandToLCD(unsigned char Command)  
{
	LCD_RS = 0;				  // It is a command
	
	PORTD &= 0x0F;			  // Make Data pins zero
	PORTD |= (Command&0xF0);  // Write Upper nibble of data
	ToggleEpinOfLCD();		  // Give pulse on E pin	
	
	PORTD &= 0x0F;			  // Make Data pins zero
	PORTD |= ((Command<<4)&0xF0); // Write Lower nibble of data
	ToggleEpinOfLCD();		  // Give pulse on E pin
}


void WriteDataToLCD(char LCDChar)  
{
	LCD_RS = 1;				  // It is data
	
	PORTD &= 0x0F;			  // Make Data pins zero
	PORTD |= (LCDChar&0xF0);  // Write Upper nibble of data
	ToggleEpinOfLCD();		  // Give pulse on E pin	
	
	PORTD &= 0x0F;			  // Make Data pins zero
	PORTD |= ((LCDChar<<4)&0xF0); // Write Lower nibble of data
	ToggleEpinOfLCD();		  // Give pulse on E pin
}


void InitLCD(void)
{ 
	// Firstly make all pins output
	LCD_E  		 		 = 0;   // E  = 0
	LCD_RS  	 		 = 0;   // RS = 0
	LCD_Data_Bus_D4		 = 0;  	// Data bus = 0
	LCD_Data_Bus_D5		 = 0;  	// Data bus = 0
	LCD_Data_Bus_D6		 = 0;  	// Data bus = 0
	LCD_Data_Bus_D7		 = 0;  	// Data bus = 0
	LCD_E_Dir    		 = 0;   // Make Output
	LCD_RS_Dir    	 	 = 0;   // Make Output
	LCD_Data_Bus_Dir_D4  = 0;   // Make Output
	LCD_Data_Bus_Dir_D5  = 0;   // Make Output
	LCD_Data_Bus_Dir_D6  = 0;   // Make Output
	LCD_Data_Bus_Dir_D7  = 0;   // Make Output

  ///////////////// Reset process from datasheet //////////////
   __delay_ms(40);
   
	PORTD &= 0x0F;			  // Make Data pins zero
	PORTD |= 0x30;			  // Write 0x3 value on data bus
	ToggleEpinOfLCD();		  // Give pulse on E pin

   __delay_ms(6);
   
	PORTD &= 0x0F;			  // Make Data pins zero
	PORTD |= 0x30;			  // Write 0x3 value on data bus
	ToggleEpinOfLCD();		  // Give pulse on E pin

   __delay_us(300);
   
	PORTD &= 0x0F;			  // Make Data pins zero
	PORTD |= 0x30;			  // Write 0x3 value on data bus
	ToggleEpinOfLCD();		  // Give pulse on E pin

   __delay_ms(2);
   
	PORTD &= 0x0F;			  // Make Data pins zero
	PORTD |= 0x20;			  // Write 0x2 value on data bus
	ToggleEpinOfLCD();		  // Give pulse on E pin
	
	__delay_ms(2);
  /////////////// Reset Process End ////////////////
	WriteCommandToLCD(0x28);    //function set
	WriteCommandToLCD(0x0c);    //display on,cursor off,blink off
	WriteCommandToLCD(0x01);    //clear display
	WriteCommandToLCD(0x06);    //entry mode, set increment
    WriteCommandToLCD(0x80);
}


void WriteStringToLCD(const char *s)
{
	while(*s)
		WriteDataToLCD(*s++);   // print first character on LCD 
}


void ClearLCDScreen(void)       // Clear the Screen and return cursor to zero position
{
	WriteCommandToLCD(0x01);    // Clear the screen
	__delay_ms(2);              // Delay for cursor to return at zero position
}



Hittman

#12
Problem şundan kaynaklanıyor. Mclr bacağına bağladığın butona bastığın zaman mikro saniyeler mertebesinde ark meydana geliyor. Bu arkta devrede kararsızlık oluşturuyor ve mikroişlemci butona basılıp basılmadığını ayırt edemiyor. Bunu aşmak için genelde programda rest butonuna basıldığında bir kaç mikro saniye gecikme vererek aşılabilir. Fakat bunu denemeden önce mclr a direk direnç bağlayarak deneyin önce. Yani butonu iptal edip deneyin.


pwm.c

öncelikle program başına ve lcd_init(); fonksiyonundan sonra bir miktar gecikme koy.
olmadıysa ccs'nin kendi bünyesindeki lcd.c kütübhanesini kullan ancak rw bacağını ilave etmen gerekiyor.
lcd yazma gecikmelerinde oynama yap. bazı lcd çalışma hızları farklı oluyor.
butonları pull-down bağlamışın. bunların hepsini pull-up olarak değiştir ve programı onagöre yeniden düzenle yada pull-down ile ısrarcıysan dirençleri 1k altında düşük değerli kullan.
birde, 877 ve 877a farkına dikkat et. bence hiç kullanma. çok eski ve pahalı malzeme. ayrıca piyasada sahteleri çok fazla. bunların çoğu sorunlu çalışıyor.
birde, devrede niye lm35 kullandın? bu şekilde negatif sıcaklığı ölçemezsin.
son olarak, ccs c versiyonun eski ise hemen güncelle. forumda linkleri var.
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-