Menü oluşturmak hakkında fazla bir kaynak bulamadım ve kendim el yordamıyla birşeyler yaptım.Similasyonda gayet güzel çalışıyor ama gerçek devrede sapıtıyor.Butonlara belli bir kere üst üste basınca alıp başını gidiyor ya da kitleniyor.
Yaptığım şey 4 bölümlü bir menü.Bir butonla menüler geziliyor,diğer iki butonda her menüye ait parametreyi artırıp azaltıyor.
Sorun neden kaynaklanıyor olabilir?
Ya da menü tasarımı için başka önerisi olan var mı?
#include <pic.h>
#include "delay.h"
#include "lcd.h"
void menu1(void);
void menu2(void);
void menu3(void);
void menu4(void);
unsigned char menu_deger1,menu_deger2,menu_deger3,menu_deger4,menu;
const char bas1[]={"MOTOR KONTROL"};
const char bas2[]={"***************"};
const char m1[]={"*****PWM******"};
const char m2[]={"*****MENU-2*****"};
const char m3[]={"*****MENU-3*****"};
const char m4[]={"*****MENU-4*****"};
const char a[]={"<-AZALT ARTIR->"};
void main(void)
{
TRISA=0x00;
TRISB=0x00;
TRISD=0x00;
TRISC=0x00;
PR2=0XFF; //PWM periyodu
CCPR1L=0XFF;// PWM duty cycle
CCP1CON=0X1C;
T2CON=0X05;
menu=0;
lcd_init(); //LCD'yi hazırla
lcd_puts(bas1);
lcd_goto(64);
lcd_puts(bas2);
DelayMs(255);
DelayMs(255);
lcd_clear();
//Sonsuz döngü
while(1){
if(menu==1) menu1();
if(menu==2) menu2();
if(menu==3) menu3();
if(menu==4) menu4();
if(RD4==0)
{
DelayMs(200);
menu++;
}
/* if(RD1==0)
{
DelayMs(200);
CCPR1L= CCPR1L+1;
}
if(RD0==0)
{
DelayMs(200);
CCPR1L= CCPR1L-1;
/ }
lcd_goto(4);
lcd_dec_byte(CCPR1L);
lcd_goto(69);
lcd_dec_byte(CCPR1H);
}*/
}
}
void menu1(void){
lcd_clear();
lcd_puts(m1);
lcd_goto(64);
lcd_puts(a);
while(1) { //menü sonsuz döngüsü
if(RD0==0){ //azalt
while(RD0==0);
DelayMs(100);
if(menu_deger1!=0)//sıfıra geldiyse
// CCPR1L--;
menu_deger1--;
lcd_goto(64);
lcd_dec_byte(menu_deger1);
}
if(RD1==0){ //artır
while(RD1==0);
DelayMs(100);
if(menu_deger1!=255)//sınıra geldiyse
// CCPR1L++;
menu_deger1++;
lcd_clear();
lcd_puts(m1);
lcd_goto(64);
lcd_dec_byte(menu_deger1);
}
if(RD4==0){ //menu atla
while(RD4==0);
DelayMs(100);
menu=2;
break;
}
}
//end while
return;
}//end menu1
void menu2(void){
lcd_clear();
lcd_puts(m2);
lcd_goto(64);
lcd_puts(a);
while(1){ //menü sonsuz döngüsü
if(RD0==0){ //azalt
while(RD0==0);
DelayMs(100);
if(menu_deger2!=0)//sıfıra geldiyse
menu_deger2--;
lcd_puts(m2);
lcd_goto(64);
lcd_dec_byte(menu_deger2);
}
if(RD1==0){ //artır
while(RD1==0);
DelayMs(100);
if(menu_deger2!=255)//sınıra geldiyse
menu_deger2++;
lcd_puts(m2);
lcd_goto(64);
lcd_dec_byte(menu_deger2);
}
if(RD4==0){ //menu atla
while(RD4==0);
DelayMs(100);
menu=3;
break;
}
}
//while son
return;
}//menu2 sonu
void menu3(void){
lcd_clear();
lcd_puts(m3);
lcd_goto(64);
lcd_puts(a);
while(1){ //menü sonsuz döngüsü
if(RD0==0){ //azalt
while(RD0==0);
DelayMs(100);
if((--menu_deger3)==0)//sıfıra geldiyse
menu_deger3=0;
lcd_puts(m3);
lcd_goto(64);
lcd_dec_byte(menu_deger3);
}
if(RD1==0){ //artır
while(RD1==0);
DelayMs(100);
if((--menu_deger3)==255)//sınıra geldiyse
menu_deger3=255;
lcd_puts(m3);
lcd_goto(64);
lcd_dec_byte(menu_deger3);
}
if(RD4==0){ //menu atla
while(RD4==0);
DelayMs(100);
menu=4;
break;
}
}
//end while
return;
}//menu3 sonu
void menu4(void){
lcd_clear();
lcd_puts(m4);
lcd_goto(64);
lcd_puts(a);
while(1){ //menü sonsuz döngüsü
if(RD0==0){ //azalt
while(RD0==0);
DelayMs(100);
if((--menu_deger4)==0)//sıfıra geldiyse
menu_deger4=0;
lcd_puts(m4);
lcd_goto(64);
lcd_dec_byte(menu_deger4);
}
if(RD1==0){ //artır
while(RD1==0);
DelayMs(100);
if((++menu_deger4)==255)//sınıra geldiyse
menu_deger4=255;
lcd_puts(m4);
lcd_goto(64);
lcd_dec_byte(menu_deger4);
}
if(RD4==0){ //menu atla
while(RD4==0);
DelayMs(100);
menu=0;
lcd_clear();
break;
}
}
//end while
return;
}//menu4 sonu
Butonlara belirli bir aralıkta bastım mı sorun yok ama biraz hızlı ard-arda bastım mı kitleniyor? Butonların basılma anlarına bekleme de koyduğum halde bu neden olabilir?
Bu konuda yorumu olan yok mu acaba?
Acaba artık C'de kod yazan kalmadı mı diye düşünmeye başlıyorum :roll:
Yazılımsal olarak değilde donanımsal olarak yardım etmeye calısayım . Butonlara cap ekledinmi? Eger yoksa capasitor ekleyerek denermisin?
Şu sıralar pek uğraşamadım ama kaçlık caps ekleyeyim mesala?
Pointer kullanarak programı daha da basitleştirdim.
Menü tasarımı hakkında konuşmak isteyen yok mu?
Arkadaslar ben bir tane menu yaptım ama ne kadar isinize yarar bilmem gayet güzel ama daha cok gelistirilmesi lazım o kodun zaman bulup bakamıyorum. CCS C ile yazdım ben size
http://www.hemenpaylas.com/download/547672/lcd_menu.rar.html
dosya yukarıdaki adreste ben upload ettim ama kaynak kodu yok orda sadece proteus ve hex dosyası vardır
Alıntı yapılan: "CoşkuN"Menü oluşturmak hakkında fazla bir kaynak bulamadım ve kendim el yordamıyla birşeyler yaptım.Similasyonda gayet güzel çalışıyor ama gerçek devrede sapıtıyor.Butonlara belli bir kere üst üste basınca alıp başını gidiyor ya da kitleniyor.
Yaptığım şey 4 bölümlü bir menü.Bir butonla menüler geziliyor,diğer iki butonda her menüye ait parametreyi artırıp azaltıyor.
Sorun neden kaynaklanıyor olabilir?
Ya da menü tasarımı için başka önerisi olan var mı?
#include <pic.h>
#include "delay.h"
#include "lcd.h"
void menu1(void);
void menu2(void);
void menu3(void);
void menu4(void);
unsigned char menu_deger1,menu_deger2,menu_deger3,menu_deger4,menu;
const char bas1[]={"MOTOR KONTROL"};
const char bas2[]={"COSKUN TASDEMiR"};
const char m1[]={"*****PWM******"};
const char m2[]={"*****MENU-2*****"};
const char m3[]={"*****MENU-3*****"};
const char m4[]={"*****MENU-4*****"};
const char a[]={"<-AZALT ARTIR->"};
void main(void)
{
TRISA=0x00;
TRISB=0x00;
TRISD=0x00;
TRISC=0x00;
PR2=0XFF; //PWM periyodu
CCPR1L=0XFF;// PWM duty cycle
CCP1CON=0X1C;
T2CON=0X05;
menu=0;
lcd_init(); //LCD'yi hazırla
lcd_puts(bas1);
lcd_goto(64);
lcd_puts(bas2);
DelayMs(255);
DelayMs(255);
lcd_clear();
//Sonsuz döngü
while(1){
if(menu==1) menu1();
if(menu==2) menu2();
if(menu==3) menu3();
if(menu==4) menu4();
if(RD4==0)
{
DelayMs(200);
menu++;
}
/* if(RD1==0)
{
DelayMs(200);
CCPR1L= CCPR1L+1;
}
if(RD0==0)
{
DelayMs(200);
CCPR1L= CCPR1L-1;
/ }
lcd_goto(4);
lcd_dec_byte(CCPR1L);
lcd_goto(69);
lcd_dec_byte(CCPR1H);
}*/
}
}
void menu1(void){
lcd_clear();
lcd_puts(m1);
lcd_goto(64);
lcd_puts(a);
while(1) { //menü sonsuz döngüsü
if(RD0==0){ //azalt
while(RD0==0);
DelayMs(100);
if(menu_deger1!=0)//sıfıra geldiyse
// CCPR1L--;
menu_deger1--;
lcd_goto(64);
lcd_dec_byte(menu_deger1);
}
if(RD1==0){ //artır
while(RD1==0);
DelayMs(100);
if(menu_deger1!=255)//sınıra geldiyse
// CCPR1L++;
menu_deger1++;
lcd_clear();
lcd_puts(m1);
lcd_goto(64);
lcd_dec_byte(menu_deger1);
}
if(RD4==0){ //menu atla
while(RD4==0);
DelayMs(100);
menu=2;
break;
}
}
//end while
return;
}//end menu1
void menu2(void){
lcd_clear();
lcd_puts(m2);
lcd_goto(64);
lcd_puts(a);
while(1){ //menü sonsuz döngüsü
if(RD0==0){ //azalt
while(RD0==0);
DelayMs(100);
if(menu_deger2!=0)//sıfıra geldiyse
menu_deger2--;
lcd_puts(m2);
lcd_goto(64);
lcd_dec_byte(menu_deger2);
}
if(RD1==0){ //artır
while(RD1==0);
DelayMs(100);
if(menu_deger2!=255)//sınıra geldiyse
menu_deger2++;
lcd_puts(m2);
lcd_goto(64);
lcd_dec_byte(menu_deger2);
}
if(RD4==0){ //menu atla
while(RD4==0);
DelayMs(100);
menu=3;
break;
}
}
//while son
return;
}//menu2 sonu
void menu3(void){
lcd_clear();
lcd_puts(m3);
lcd_goto(64);
lcd_puts(a);
while(1){ //menü sonsuz döngüsü
if(RD0==0){ //azalt
while(RD0==0);
DelayMs(100);
if((--menu_deger3)==0)//sıfıra geldiyse
menu_deger3=0;
lcd_puts(m3);
lcd_goto(64);
lcd_dec_byte(menu_deger3);
}
if(RD1==0){ //artır
while(RD1==0);
DelayMs(100);
if((--menu_deger3)==255)//sınıra geldiyse
menu_deger3=255;
lcd_puts(m3);
lcd_goto(64);
lcd_dec_byte(menu_deger3);
}
if(RD4==0){ //menu atla
while(RD4==0);
DelayMs(100);
menu=4;
break;
}
}
//end while
return;
}//menu3 sonu
void menu4(void){
lcd_clear();
lcd_puts(m4);
lcd_goto(64);
lcd_puts(a);
while(1){ //menü sonsuz döngüsü
if(RD0==0){ //azalt
while(RD0==0);
DelayMs(100);
if((--menu_deger4)==0)//sıfıra geldiyse
menu_deger4=0;
lcd_puts(m4);
lcd_goto(64);
lcd_dec_byte(menu_deger4);
}
if(RD1==0){ //artır
while(RD1==0);
DelayMs(100);
if((++menu_deger4)==255)//sınıra geldiyse
menu_deger4=255;
lcd_puts(m4);
lcd_goto(64);
lcd_dec_byte(menu_deger4);
}
if(RD4==0){ //menu atla
while(RD4==0);
DelayMs(100);
menu=0;
lcd_clear();
break;
}
}
//end while
return;
}//menu4 sonu
arkadasım verdigin kod hi-tide picc 9.5 de derlenmiyor hata veriyor sanırım lcd_dec_byte(..) komutundan kaynaklanıyor....
birde bir degiskenin icerigini rakam olarak (h-tech picc 9.5 kullanıyorum) lcd ye nasıl gönderebilirim yardımcı olabilirseniz sevinirim.
(lcd.h lcd.c dosyalarını include dosyasına attım)
İstersen birde donanımdan meseleyi çözmeyi dene senin koda bakacak zamanım yok ama butonlara parazit önleyici kondansatör koy 330 pf koy öyle dene eger kodun dogru ise sorun olmaması lazım kond yoksa butonlarda her basmada parazit oluşur ve birden çok kez başmış olacak algılar. Benim verdigim kod çalışıyor simülasyonda ve uygulamadada çalışıyor.
Alıntı yapılan: "3ddark"İstersen birde donanımdan meseleyi çözmeyi dene senin koda bakacak zamanım yok ama butonlara parazit önleyici kondansatör koy 330 pf koy öyle dene eger kodun dogru ise sorun olmaması lazım kond yoksa butonlarda her basmada parazit oluşur ve birden çok kez başmış olacak algılar. Benim verdigim kod çalışıyor simülasyonda ve uygulamadada çalışıyor.
arkadasım ilgilendigin icin tsk ederim ama ben sorum kodun ustunde deıl altında yazmısdım senın okudugun kısım alıntı kısmı...
birde upload ettigin link hemenpaylasdan silinmis tekrar upload edebilirmisin?
tskler..
Alıntı yapılan: "3ddark"İstersen birde donanımdan meseleyi çözmeyi dene senin koda bakacak zamanım yok ama butonlara parazit önleyici kondansatör koy 330 pf koy öyle dene eger kodun dogru ise sorun olmaması lazım kond yoksa butonlarda her basmada parazit oluşur ve birden çok kez başmış olacak algılar. Benim verdigim kod çalışıyor simülasyonda ve uygulamadada çalışıyor.
sayın coşkun hocam gibi bende bu şekilde bir menü oluşturmuştum ama simülasyonda çalışıyor fakat devrede çalışmıyor.mesela elektriğini verince bir çalışıyor bir hiç görüntü gelmiyor ve butonlarda senin dediğin gibi aksaklıklar oluşuyor.sayın hocalarım acaba bu tuşa kondansatör serimi yoksa paralelmi bglanacak. bir soruyum dedim çünkü daha önce hiç bu şekilde bir uygulamayla karşılaşmadım acemilik işte.birde bu elektrik verince bazen devre hiç çalımıyor reset botonu ekledim o bile pice reset leyemyor.acaba nedendir.
saygılarımla
Arkadaşlar kusura bakmayın çalıştıgım için pek zamanım olmuyor ama en kısa zamanda bir ufak menü uygulamasının css için yazılmış kodunu ve şemasının linki koyacagım buraya. Bu arada kond paralel baglanır butona.
Kolay gelsin herkeze
Eskinden yazdıgım kodu buldum nereye upload edeyim ufak bir dosya
http://www.fupload.com/download.php?file_id=hvw025xmt3d8yjrq4csg
buraya upload ettim isteyen bakabilir kodları biraz karısık yazdım yani düzenlenmesi lazım ama çalışıyor su hali ile
Alıntı yapılan: "CoşkuN"Acaba artık C'de kod yazan kalmadı mı diye düşünmeye başlıyorum :roll:
ben yeni yeni başlıorum inş... 1 ay süre zarfında sizler seviyesine gelip yardımcı olacağım.
nuri2978
Nuri kardesim ugrasacaksan surekli olsun ben ara ara bakabiliyorum zaman olmuyor sürekli bakarsan bu işle ugrasırsan bu işten ekmek yersin bunu unutma hobi için ise bir sure sonra unutlur gider
@CoşkuN
Kondansatör ü buton un bağlı olduğu pin ve eksi besleme (-) arasına takın. Ayrıca kondansatöre paralel 4k7 pulldown direnci de ilave etmeyi unutmayın. Bunu yapmazsanız buton işlemi kararsız çalışır.
(http://www.resimekle.gen.tr/imagehosting/images/QCL88790.jpg)
Bir buton algılama rutini oluşturun. Butonlardan herhangi birine basılmışsa ilgili işlemi yaptırıp, daha sonra buton un bırakılıp bırakılmadığını kontrol eden bir rutin çalıştırın. Buton basılı kaldığı sürece o rutin içerisinde döngüde kalsın.
Buton bırakıldığnı algıladığında tekrar buton algılama rutinini çalıştırın.
PICC bilmiyorum ama basit bir PICBASIC örneği vereyim:
buton_1_kontrol:
if buton=0 then buton_1_kontrol ;buton a basılmamışsa buton kontrol et
islem_yap:
............. ;yapılacak işlemler bu rutinde yapılacak
.............
buton_0_kontrol:
if buton = 1 then buton_0_kontrol ;buton hala basılıysa bırakılmasını kontrol et
goto buton_1_kontrol ;buton basma kontrol rutinine git.
B portu kesmeleri varken sonsuz döngülerle işlemciyi sürekli meşgul etmenin mantığı nedir anlamış değilim butonu kesme ile kullanın ve kendi haline bırakın basılana kadar da arka planda işlemci başka işleri varsa onları halletsin
@xenitis
Buradaki sorun buton basma işleminin nasıl kontrol edileceğiyle ilgiliydi. Buton basmalarında kararsız çalışmalar nasıl aşılır, ona çözüm aranıyor. Yukarıdaki örnek kodları ve şemayı da o yüzden vermiştim.
Yoksa farklı uygulamalarda elbette B portunun kesmelerinin kullanılması daha uygun olur.
Alıntı yapılan: "bluesea2005"
arkadasım verdigin kod hi-tide picc 9.5 de derlenmiyor hata veriyor sanırım lcd_dec_byte(..) komutundan kaynaklanıyor....
birde bir degiskenin icerigini rakam olarak (h-tech picc 9.5 kullanıyorum) lcd ye nasıl gönderebilirim yardımcı olabilirseniz sevinirim.
(lcd.h lcd.c dosyalarını include dosyasına attım)
Sebebi #include "lcd.c" yazması yani library i include un icinden değilde o klasorun icinden almasıdır . Yani eger bu kodları kullanmak istiyorsun coskundan Lcd.c ve lcd.h ı alman gerekecek .