2X16 LCD de her saniyede rakamın bir artması sorunu

Başlatan Recep METE, 11 Mayıs 2016, 10:39:14

Recep METE

Yaptığım bir çalışmada rtc saat uygulaması var. Bunun yanına her dakika  bir artması gereken bir rakam koydum.Rakam 1 den başlayacak her dakika bir artacak.Kaç dakika geçtiğini bulacağım. Kodun bir kısmını paylaşıyorum.Sorun şu:
if(saniye==59){
     for(i = 0; i < 1; i++){
     sayi=sayi+1;
   delay_ms(1000);
lcd_gotoxy(13,1);
     printf(lcd_putc,"%ld",sayi);

saniye==59 olunca 1 rakamı çıkmalı daha sonra 2 olmalı ama  lcd ekranda sayı  145 e kadar  hızlı ilerliyor.Saniye geçince duruyor.Ben her saniye 1 rakam artmasını istiyorum.Bir türlü çözemedim.Değişik şeyler denedim bazen sayı 3 e kadar ilerliyor.Çıldıracağım.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

ylmz

sure ++;
if (sure > 2550)//7550
{
sahtedakika = sahtedakika +1 ;
sure = 0;
}

if (sahtedakika > 59)
{
sahtedakika = 0;
sahtesaat = sahtesaat +1;
sure = 0;
}
Regülatör Dns Trafo | Regülatör | Redresör | Ups

bilisimci2001

Hocam 2550 değerini nasıl buluyoruz anlatabilirseniz sevinirim

ylmz

O değer bende öyle benim döngümün içerisindeki gecikmelere karşılık o değer geliyor 2550 benım döngümün içerisinde 60 sanıyeye karşılık geliyor ılla öyle yapacaksın diye bir koşul yok kesme kur mesela tımer1 ı kur daha basite indirgersin ve kayma olmaz böyle olunca ıllakı kayma olur.
Regülatör Dns Trafo | Regülatör | Redresör | Ups

dursuncemal

#4
hocam burda sayi degiskenini hic sifirlamiyorsunuz her 59 saniyede bir sayi degiskeni surekli artiyor.

mesaj birleştirme:: 12 Mayıs 2016, 05:41:07

burda sizin yapmak istediginiz eger dakikanin artislarini lcd de gormek ise: tabi bu adece gormek icin eger gercek bir timer yapacaksaniz interupt kulanmalisiniz.bu sekılde olmaz

if(saniye==59){ 
   
     sayi=sayi+1;

    if(sayi == 59){sayi = 0;}

   delay_ms(1000);

 lcd_gotoxy(13,1);

     printf(lcd_putc,"%ld",sayi);

}


:=

Recep METE

Yanıt veren herkese çok teşekkür ederim.Yolunuz açık olsun.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

ogoculu

 Pic ile reel zaman hesabi yapmak istiyorsan intterrupt(kesme) kullanman gerekir. timer interrupt kullanmadığın sürece hiç bir şekilde doğru zamanı yakalayamazsın. ayrıca algoritmanın sağlıklı çalışması için mümkün olduğu sürece delay kullanmayacaksın. kesme kullanırken önemli nokta ise bir sonraki kesme süresi gelmeden fonksiyondan çıkmak gerekmektedir. o yüzden kesme fonksiyonu içinde süre bakımından uzun işlemler yapılmaz.

4 mhzllik kristal osilatörde aşağıdaki kodlar işini görecektir. kristal frekansın farklı ise timer0 değerini ayarlaman gerekir.



unsigned long int sayi=0,sayac=0;
unsigned int saniye;
#INT_RTCC
void  RTCC_isr(void) //1 mslik intterupt
{

sayac++;
if (sayac>999){sayac=0;saniye++;}
}

void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4|RTCC_8_bit);      //1,0 ms overflow

   enable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);

   while(1)
   {
if (saniye>59){
saniye=0;
sayi++;
printf(lcd_putc,"%lu",sayi);
}
}
}