Picproje Elektronik Sitesi

DERLEYİCİLER => PIC C => Konuyu başlatan: CoşkuN - 26 Şubat 2006, 21:56:15

Başlık: PIC16f877de menü oluşturma
Gönderen: CoşkuN - 26 Şubat 2006, 21:56:15
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
Başlık: PIC16f877de menü oluşturma
Gönderen: CoşkuN - 28 Şubat 2006, 16:02:06
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?
Başlık: PIC16f877de menü oluşturma
Gönderen: CoşkuN - 02 Mart 2006, 10:37:44
Bu konuda yorumu olan yok mu acaba?
Başlık: PIC16f877de menü oluşturma
Gönderen: CoşkuN - 05 Mart 2006, 10:49:34
Acaba artık C'de kod yazan kalmadı mı diye düşünmeye başlıyorum  :roll:
Başlık: PIC16f877de menü oluşturma
Gönderen: Göktuğ - 05 Mart 2006, 23:53:03
Yazılımsal olarak değilde donanımsal olarak yardım etmeye calısayım . Butonlara cap ekledinmi? Eger yoksa capasitor ekleyerek denermisin?
Başlık: PIC16f877de menü oluşturma
Gönderen: CoşkuN - 09 Mart 2006, 08:09:34
Şu sıralar pek uğraşamadım ama kaçlık caps ekleyeyim mesala?
Başlık: PIC16f877de menü oluşturma
Gönderen: CoşkuN - 06 Nisan 2006, 19:59:25
Pointer kullanarak programı daha da basitleştirdim.
Menü tasarımı hakkında konuşmak isteyen yok mu?
Başlık: PIC16f877de menü oluşturma
Gönderen: 3ddark - 23 Nisan 2006, 15:36:44
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
Başlık: PIC16f877de menü oluşturma
Gönderen: 3ddark - 23 Nisan 2006, 15:40:10
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
Başlık: Re: PIC16f877de menü oluşturma
Gönderen: bluesea2005 - 14 Nisan 2007, 17:13:41
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)
Başlık: LCD Menü
Gönderen: 3ddark - 14 Nisan 2007, 20:48:02
İ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.
Başlık: Re: LCD Menü
Gönderen: bluesea2005 - 14 Nisan 2007, 21:04:08
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..
Başlık: Re: LCD Menü
Gönderen: deserteagle - 15 Nisan 2007, 23:37:02
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
Başlık: PIC16f877de menü oluşturma
Gönderen: 3ddark - 17 Nisan 2007, 12:40:41
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
Başlık: PIC16f877de menü oluşturma
Gönderen: 3ddark - 22 Nisan 2007, 11:37:12
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
Başlık: PIC16f877de menü oluşturma
Gönderen: nuri2978 - 03 Mayıs 2007, 19:32:46
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.
Başlık: PIC16f877de menü oluşturma
Gönderen: 3ddark - 03 Mayıs 2007, 22:25:32
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
Başlık: PIC16f877de menü oluşturma
Gönderen: crypto - 17 Mayıs 2007, 10:57:50
@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.
Başlık: PIC16f877de menü oluşturma
Gönderen: xenitis - 18 Mayıs 2007, 18:33:27
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
Başlık: PIC16f877de menü oluşturma
Gönderen: crypto - 19 Mayıs 2007, 10:22:49
@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.
Başlık: Re: PIC16f877de menü oluşturma
Gönderen: 733n - 02 Mart 2008, 19:57:01
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 .