ccs c ile ikili displayde 1 dakika ara ile geri sayma yardım

Siz benim yazdığım 3-4 satırlık koddan bahsediyorsunuz.

Şu an yazdığınız program display taraması mantığından uzak. Öyle olduğu için de sorunu buraya yazmışsınız. Size orada uzunca bir program yazıp gönderdim. O program sizin eski programdan fazla sapmadan, gereksiz tekrarları bir alt programa atarak, koddaki hatalarınızı daha iyi görmenizi sağlayacaktı.

Ben verdiğim kurslarda bu tarz örnekler için timer kesmesi kullandırır ve ne işe yaradığını anlatırım. Sizin ilk önce yapmanız gereken şey, yazdığınız programı bir kenara bırakıp, sıfırdan kesme kullanarak 4 ms.lik (veya isterseniz 1 ms.lik) kesme oluşturup çalışır hale getirmenizdir. Bunu yaparsanız geriye kalanları birer birer bunun üzerine monte edebilirsiniz.

4 ms.lik kesme oluşturduğunuzu varsayalım. Ne işe yarayacak? Birincisi, her bir kesmeye gidişte 7 segment displaylerden birini süreceksiniz. İkincisi, 1000/4=250 sayısına kadar her kesmeye gidişte birer birer artan bir sayaç oluşturacaksınız. 250'ye vardığınızda sayıyı sıfırlayacaksınız. İster sıfırladığınız sayıyı veya isterseniz bir bitlik bir değişkeni (kendinize ait bir bayrak, veya plc cilerin kullandığı dahili röle) 1 yapacaksınız. Bu da size hassas bir saniyelik zaman dolduğunu bildirecek. Bu değişkenler global tanımlayacağınız için her yerden erişebileceksiniz. ana program döngüsünde kendi bayrağınızı sürekli takip edeceksiniz. O bayrak 1 olduğunda geri sayacağınz sayıdan bir çıkartıp (0 olup olmadığını da kontrol edeceksiniz) segmentlerde gösterilecek sayılara ayrıştıracaksınız ve bayrağı 0 yapacaksınız.

Döngünün diğer bir yerinde de (bayrak 1 olduğunda yapılacak işlerden olmadığı için o if bloğunun dışında) isterseniz butonları kontrol edip, set, + , - gibi işlemleri yapabilirsiniz. Arttırdığınız veya azalttığınız sayaç değerlerini ekranda görünsün diye yine dijitlere ayıracaksınız). İsterseniz timeout vs. gibi özellikler de ekleyerek, artırma veya azaltma işleminden sonra set etmezseniz belirli bir süre sonunda en son sayıya geri dönebilirsiniz. Elinizde 4 ms.lik zaman dilimlerini size bildirecek başka bir flag daha olursa, isterseniz hayalinizdeki pek çok şeyi yapabilirsiniz. Tabi 1 ms. kesme yaparsanız bu durumda çok daha hassas işler de yapabilirsiniz. Displaydeki her bir dijitin yanık kalma süresi 4 ms. olsa iyi olur. İsterseniz 1 ms. de bir sürün, fazla da bir şey farketmez.
 
Ze_tr hocam şimdi sizi daha iyi anladım hemen deniyorum çok teşekkür ederim.
 
benim anlattığım kısmı da aynen yaptıysanız ve çalışmıyorsa diğer kısımlarınızda sorun vardır çünkü benim dediğim de, timer ile yapılacak olan işlemin, timersiz yapılması.
 
mberkanbicer hocam konfigürasyondamı hata yapmış olabilirim sizin önerinizde sayıyıor ancak yine tarama hızı kadar görünüyor timer kesmesi yaratınca hangi portları yönlendireceğim A0ve A1 pinleri display seçme pini B0.......B7 display pinleri tarama işini A0 ve A1 pinleri ile yapıyoruz timer kesmesini hangi pinlere vereceğim şaşırdım,
******************************************************************
Ze_tr hocam sizin gönderdiğiniz uzun kodlama da onar onar sayıyordu birler=sayi%10 onlar=sayi/10 yapınca düzeldi ancak çok hızlı sayıyor nasıl yavaşlatacağımı bulamadım ancak for(sayi=99;sayi<=99;sayi--)
goster();
göster();
................3000 tekrar yapınca 1 dakika gecikme olacak ancak editör programım hata veriyor rom yetersiz diyor çıkamadım işin içinden
timer kesmesi yaratarak mantığını anladım ancak timer kesmesini hangi pinlere yönlendireceğim A0ve A1 pinleri display seçme pini b portu display pinleri
tarama yapan sayaç dışında bir sayaçta tarama sayısınımı saymalı mantığı böylemi kurmalıyım
Değerli ustalar ilginize teşekkür ederim.
 
Ze_tr hocam sizin gönderdiğiniz uzun kodlama da onar onar sayıyordu birler=sayi%10 onlar=sayi/10 yapınca düzeldi ancak çok hızlı sayıyor nasıl yavaşlatacağımı bulamadım ancak for(sayi=99;sayi<=99;sayi--)
goster();
göster();
................3000 tekrar yapınca 1 dakika gecikme olacak ancak editör programım hata veriyor rom yetersiz diyor çıkamadım işin içinden
timer kesmesi yaratarak mantığını anladım ancak timer kesmesini hangi pinlere yönlendireceğim A0ve A1 pinleri display seçme pini b portu display pinleri
tarama yapan sayaç dışında bir sayaçta tarama sayısınımı saymalı mantığı böylemi kurmalıyım
Değerli ustalar ilginize teşekkür ederim.
kesmeyi herhangi bir bacağa göndermek diye bir kavram yok. kesme rutini içerisinde bir dijiti gösterecek bir rutin yazacaksınız. Ekranınız 4 dijitli ise, ikinci girişinizde 2. dijiti , 3. de 3. dijiti, 4.de 4 dijiti gibi. Eğer iki basamaklı ise dijitler, 3. de 1. dijiti, 4. de 2. dijiti gösterecek ve bu sırayla devam edip gidecek.
 
Arkadaşım kesme karmaşık geliyosa bide şunu dene:

void main()
{
int i=99;
int birler;
int onlar;
int16 a;
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
while(1)
{
birler=i%10;
onlar=i/10;
for(a=0;a<50;a++)
{
output_low(disp0);
output_b(dizi[birler]);
delay_ms(10);
output_high(disp0);
output_low(disp1);
output_b(dizi[onlar]);
delay_ms(10);
output_high(disp1);
}
i--;
if(i<=0)
i=99;
}
}

Şu an bir sn aralıklarla 99 dan geriye sayıyor.
sn yi artırmak icim for döngüsündeki 50 rakamıyla oyna 10 sn için 500 yap mesela
Kolay gelsin...
 
Sayın piskopatisa ustam teşekkür ederim gönderdiğiniz kodlar üzerinde ufak tefek değişikliklerle tamamdır çok teşekkür ederim son halini koyuyorum başka arkadaşlra yardımı dokunur
bu kodlarda 7segment dual display tarama yapılarak 30dan geriye istenen zaman aralıkları ile sayacak daha sonra d0 ve d1 pinlerine bağlı ledleri yakacak 30 dan geriye zaman ayarlamasını for döngüsündeki a<50 sayısı değiştirilerek istenen zaman aralığında geriye sayması yapılır ledlerin zaman aralığını ise delay_ms(1000); buradaki değer artırılarak yapılır
Değerli usta ZE_tr e ayrıca mberkanbicer ustalarada teşekürlerimi sunarım.
---------------------------------------------------------------
#include "16F877A.h"
#use fast_io(a)
#use fast_io(b)
#define display_1 pin_a0
#define display_2 pin_a1
#define arttir pin_a2
#define azalt pin_a3

const int digit[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x6f};


void main()
{
int i=30;
int birler;
int onlar;
int16 a;
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
set_tris_a(0xfc);
set_tris_b(0x00);
output_low(display_1);
output_low(display_2);
while(true)
{
birler=i%10;
onlar=i/10;
for(a=0;a<50;a++)// bu döngüdeki a<50 değeri artırılarak daha yavaş geriye saydırılır
{
output_high(display_2);
output_b(digit[birler]);
delay_ms(5);
output_low(display_2);
output_high(display_1);
output_b(digit[onlar]);
delay_ms(5);
output_low(display_1);


}
i--;

if(i<=0)
{
output_high(pin_d0);
delay_ms(1000); // buradaki değer değiştirilerek daha uzun yanması sağlanır
output_low(pin_d0);

delay_ms(1000);

output_high(pin_d1);
delay_ms(1000);
output_low(pin_d1);
}
{
if(i==0)
i=30;
}
}
}
 
Rica ederim arkadaşım yardımcı olabildiysem ne mutlu başarılar kolay gelsin...
 

Forum istatistikleri

Konular
128,165
Mesajlar
915,610
Kullanıcılar
449,931
Son üye
mecuxell

Yeni konular

Geri
Üst