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?
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.
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
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.
initialize sorunu olabilir.lcd'nin bussy pinini kullaniyormusunuz.
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.
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.
(https://s28.postimg.cc/4spebj6op/IMG_2191.jpg) (https://postimg.cc/image/4spebj6op/)
(https://s1.postimg.cc/k5wf4oykr/IMG_2192.jpg) (https://postimg.cc/image/k5wf4oykr/)
Kodunu paylaşır mısın?
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
10K drenci düşürebilirsin. 1K * 2.2K civarı. Buton arasına da
100nF kondansatör olabilir.
Devre şemanı da bir paylaş en iyisi.
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
}
(https://s9.postimg.cc/kc0gwfz2j/Ads_z2.png) (https://postimg.cc/image/kc0gwfz2j/)
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.
Bu iki sitede çözüme dair örnekler verilmiş. Kontrol ediniz.
http://yasintuncel.com/elektronikadina/butonda-olusan-arka-cozum.html (http://yasintuncel.com/elektronikadina/butonda-olusan-arka-cozum.html)
https://elektrokod.wordpress.com/2013/11/18/buton-kontrolu/ (https://elektrokod.wordpress.com/2013/11/18/buton-kontrolu/)
ö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.
Arkadaşım senin lcd nin tek sorunu senin Pic Kristalinde sorun var. MCLR ucuna dokunca düzeliyor diyorsun. Kristali değiştir 100 de 90 düzelcektir.
Alıntı yapılan: pwm.c - 23 Mart 2017, 18:50:02
ö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.
Hocam CCs kullanmıyorum Mplab kullanıyorum o yüzden lcd.h kütüüphanesini kendin oluşturuyorsun.Pic 16f877a orijinal ürün çalıştıgım firma köşe başı malzemecileri ile çalışmıyor. Lm35 sistemimdeki sensörlerden bir tanesi, Telemetri sistemi oluşturuyorum onun için kullanıyorum. Ayrıyeten sorunu çözdüm regülatör devresinin pic ile bağlantısı olan kısma araya bi switch koydum ilk başta gerilimi veriyorum sonra switchi açtıgımda sistem düzeliyor.
Forumda Yanıt Veren yol gösteren tüm abilerime kardeşlerime hocalarıma teşekkür ederim . İyi günler