Buton kontrol ile ilgili yardım

Başlatan leflau42, 11 Ekim 2017, 15:59:04

leflau42

Abiler bu ara foruma giren pek yok sanırım ama yine belki birisi cevap verir umuduyla yazıyorum.

Şimdi bir buton var. Ben bu butona bir defa bastığımda a değerini alacak ve eeproma kaydedecek. Aynı butona bir defa daha bastığımda eeproma kaydedilen değeri okuyacak ve başka bir değer ile toplayıp geri dönecek. Nasıl yapabiliriz böyle bir fonksiyonu ?

ete

Sorularına yanıt alamayınca böyle düşünüyorsun giren yok diye. Acaba öylemi yoksa sen yanlış forumda mı geziniyorsun acaba?
Bu sitede daha ziyade Pic Basic konuları işlenir. Ama spor olsun diye CCSC yi de dahil ettik çünki bazı arkadaşlar hem Basic hem CCSC ile çalışıyorlar. Soruların çok genel anlamlı. Üzerinde kafa yormadan direk bana şunu verin diyorsun. Biz burada üyelerimiz işe başlasınlar takıldıkları yerde soru sorsunlar prensibini uygularız genelde. İşi olmayan yada konuyu bilip de kendine yapacak iş bulamayanlar ancak sorularını cevaplar. CCSC de çalışıyor isen tavsiyem direk o derleyici konularını işleyen bir foruma üye olman ve sorularını orada sorman yönündedir.
Çok istiyorsan soruna mantıksal cevap verebilirim. Bakalım ne istiyorsun;

"Şimdi bir buton var. Ben bu butona bir defa bastığımda a değerini alacak ve eeproma kaydedecek. Aynı butona bir defa daha bastığımda eeproma kaydedilen değeri okuyacak ve başka bir değer ile toplayıp geri dönecek. Nasıl yapabiliriz böyle bir fonksiyonu ?"

Demekki önce butona basılıyormu onu test etmen gerekiyor. Peki diyelimki butona bastık kaçıncı basılış bunu nerden anlayacak program?. Demekki bir bit değişkeni kullanmak gerek. Bu diyelimki KAC olsun. KAC başlangıta sıfırdır. İlk butona basıldığında değerini toggle yaparak 1 yaparsın. Demekki butona basıldığında önce KAC değerine bakmak gerek. Değer sıfır ise ilk basılıyor, değer 1 ise ikinci basılış demek olacaktır. Her basışta KAC mutlaka toggle yapılmalı ki işlem sırası otomatiğe bağlanmış olsun.
Bu durumda KAC=0 ise A değeri neyse ve nereden alınacak ise onu alıp eproma kayıt et.
KAC=1 ise Eprom dan kayıt edilmiş değeri okuyacak. Üzerine eklenecek sayı nereden alınacak ise onu alacak ve  toplayarak Toplamı verecek şekilde geri dönecek.
Bütün mantık bu.

Ete


leflau42

Hocam kesinlikle benim aradığım şey kod değil sadece bir mantık basit bir algoritma mantığı, inanın şu ana kadar sorduğum soruları tamamen kendi çabamla hallettim. Kullandığım compiler ccs c olduğu için bu başlık altında sordum. Sorularım genel olarak zaten basit algoritmalar üretmeyle ilgili kafa bazen gerçekten duruyor. Zira Günün 12 saatini kod yazmayla uğraşarak geçiriyorum. Burada sorduktan sonra bir şeylerle meşgul olurken aklıma geliveriyor nasıl yapmam gerektiği. Çeşitli forumlar da üyeliğim var zaten. Ama esasına bakacak olursak bu forum da zaten genel olarak soruları siz cevaplıyorsunuz ve algoritma konusunda iyi olduğunuzu düşündüğünüzü belirtmiştiniz daha önce. Bende buna istinaden buraya yazıyorum sorularımı yani ete hoca olsa nasıl bir yol izlerdi düşüncesiyle sorulmuş sorulardır. Cevaplarınız için teşekkür ederim.

ete

Bu durumda verdiğim yanıt sende bir fikir uyandırdımı onu merak ettim. Takip ettiğin yol bu ise yanlış değil. Bende öğrendiklerimi kendi başıma öğrenmiştim. Elbette birisinden akıl almak süreci hızlandırıyor ama her zaman mümkün olmuyor işte.  Normalde kod yazmasını biliyor isen yani komutlara hakim isen bu söylediklerim işine yaraması gerekir.
Çok daha detay istiyorsan basicte bu işi nasıl yapardım onu açıklamam yada kod örneği vermem işini kolaylaştırır belki ama açıkladıklarımın kod hali olacaktır sonuçta.

Ete

leflau42

Hocam dediğim gibi kodlara hakimim bir şeyi nasıl yapabileceğimi bulmam gerekiyor bana lazım olan da tam olarak bu. İlk başta dediğiniz gibi yaptım. Ama daha sonra kafamda şimşekler çaktı ve döngü içinde döngü kullanarak yaptım bu işi. Yani şu şekilde.


void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16|RTCC_8_bit);
set_timer0(193);
setup_ccp1(CCP_PWM|CCP_SHUTDOWN_ON_COMP1|CCP_SHUTDOWN_AC_L|CCP_SHUTDOWN_BD_L);
set_pwm1_duty((int16)0); 
enable_interrupts(int_timer0);
enable_interrupts(GLOBAL);
eepromset();

while(1)
{
gelen=readadc();
gelen-=sifir;
if(katsayi>0)
gelen=gelen*katsayi;
taksimat_kontrol();
role_set();
taremodu();
if(input(bos)){write_int32_eeprom(tare_adres,gelen); delay_ms(100); tare=read_int32_eeprom(tare_adres);
while(1)
{
gelen=readadc();
gelen-=sifir;
if(katsayi>0)
gelen=gelen*katsayi;
taksimat_kontrol();
role_set();
gelen=gelen-tare;
butonlar();
if((gelen>kapasite)&(kapasite>0)) {yaz1(226,120,0,0,0);} else yaz(gelen);
}

fprintf(PORT1,"%Lu\n",tare);
}
}

leflau42

Hocam burada bana lazım olan kesinlikle kod değil sadece nasıl bir yol izlemem gerektiği hakkında fikir. Yukarıdaki komutlarda yaptığım şey ise bos butonuna basınca adc'den o an okunan değeri alıp eeproma kaydetmek ve bir başka while döngüsüne sokmak. O while döngüsünde ise kaydedilen değeri okunan değerden çıkarmak. Yani sensörün üstündeki ağırlığın darasını almış oluyoruz. Ve o döngü içerisinde tekrar bos butonuna basıldığında break; komutuyla o döngüden çıkıp normal while döngüsüne giriyoruz. Normal moda girince ise adc'den okunan değer normale dönüyor.

leflau42

Sizin söylediğiniz biçim ise gayet mantıklı ve ben onu defalarca yapmama rağmen aklıma gelmiyor birden. Sizin dediğiniz yanlış anlamadıysam buton için iki koşul belirtmemiz yani birinci koşulumuz butona basılması ise ikinci koşulumuz bir değişken. O şekilde de yaptım. Ama bu yukarıda yaptığım şekilde daha sağlıklı olabileceği kanısına vardım.

Powered by EzPortal