p10 modül saniye dakika sayıcı problem

Başlatan ceyranman, 30 Eylül 2015, 15:10:21

ceyranman

Tek buton kullanarak durdurma devam etme ve resetleme işlemi yapmaya çalışıyorum

https://www.youtube.com/watch?v=zICfwHPGXeM
#include <18F4620.h>
#device adc=10


#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES H4 //High speed osc with HW enabled 4X PLL
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#define buton pin_b0
#use delay(clock=40000000)
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
#include <math.h>
/*******************************P10 Panel kütüphanesi**************************/
#include <P10_Panel_Driver.c>
/********************************Global Değişkenler****************************/
unsigned int8 int_syc=0;
int i=0,w=0,Saat=0, Dakika=0, Saniye=0;
/**********************************Fonksiyonlar********************************/
void write_data (unsigned int8 row_adr);
void TimeInit(void);
void BrightTest (void);

/********************************Kesme Alt Programı****************************/
#int_timer0 //Timer0 Kesmesi
void Timer0_int(){
set_timer0(133); //800us Gecikme için Timer kuruluyor..
switch (int_syc) //Her 800us de Bir bir sonraki satıra Geç
{
case 0:
output_low(PinOE);write_data(int_syc);
output_low(PinA);output_low(PinB);output_high(PinOE);
break;
case 1:
output_low(PinOE);write_data(int_syc);
output_high(PinA);output_low(PinB);output_high(PinOE);
break;
case 2:
output_low(PinOE);write_data(int_syc);
output_low(PinA);output_high(PinB);output_high(PinOE);
break;
case 3:
output_low(PinOE);write_data(int_syc);
output_high(PinA);output_high(PinB);output_high(PinOE);
break;
}
int_syc++;if(int_syc>3)int_syc=0;
}
/**********************************Ana Program*********************************/
void main()
{
set_tris_a(0x03);
set_tris_b(0b00000001);
set_tris_c(0x00);
setup_spi(SPI_MASTER | SPI_L_TO_H | SPI_SS_DISABLED);
setup_adc(ADC_OFF);
setup_ccp1(CCP_PWM);
setup_ccp2(CCP_OFF);
setup_timer_0(T0_INTERNAl | T0_8_BIT | T0_DIV_64);
setup_timer_2(T2_DIV_BY_4,249,1);


enable_interrupts(INT_timer0);
enable_interrupts(GLOBAL);
set_timer0(133);
output_a(0x00);
output_b(0x00);
output_c(0x00);
Set_Brightness(10); //Parlaklık veriliyor.
clear_display(0); //Ekranı Temizle
while(TRUE)
{
BrightTest();
delay_ms(1000);

}
}
void write_data(unsigned int8 row_adr)
{

int8 i=0,j=0,  saat=0, dakika=0, saniye=0;
       
         
int8 k=3;
while(k!=255) // Bu Döngü ileriye doğru sayarsa panel sağdan
{j=15-k; // Sola Doğru yüklenir.
for (i=0;i<4;i++) // Satırlar dolduruluyor..

{
spi_write(display_ram[j][row_adr]);
j-=4;
}
k--;
}
output_high(LATCH);
delay_cycles(2);
output_low(LATCH);
}




void BrightTest(void)






{

for(dakika=0;dakika<59;dakika++)
for(saniye=0;saniye<59;saniye++)

{
sprintf(Text,"%02d",saniye );
ShowString(17,7,1,0);
delay_ms(1);
sprintf(Text,"%02d",dakika );
ShowString(0,2,2,0);
}
if(saniye == 59)
{
sprintf(Text,"%02d",dakika = dakika + 1 ,);
ShowString(0,2,2,0);
delay_ms(1);
}
if(dakika == 60 )
{

saniye == 0 && dakika == 0 ;

}
if(!input(pin_b0 ))
delay_ms(5);
{continue;
   saniye = 0 , dakika=0 ;

}


while(!input(pin_b0)){continue;
   {basla:
(dakika == 0 && saniye ==0);
delay_ms(100);
goto basla;
   }
}
}

 

kartal_0689

#1
Bu yazdığın sence açıklayıcı mı?
ben ne demek istediğini hiç anlamadım.
TURKEY/ANK

ceyranman

Yani şunu söylemek istiyorum ;

Mucit23 hocanın yaptıgı bu çalışmada oynama yaparak sayıcı yapmak istiyorum
ve denetleyicinin b0 portuna bir buton bağlayıp bu buton ile p10 ekranını temizleme saymayı durdurma gibi işlemler yapmak istiyorum fakat b0 pinini giriş olarak atayamadım sanırım ne denediysem olmadı  http://arectron.com/yazilim/p10-panel-kullanimi.html

iyi çalışmalar

ceyranman

#3
#int_timer0                      //Timer0 Kesmesi
void Timer0_int(){
set_timer0(133);                 //800us Gecikme için Timer kuruluyor..
switch (int_syc)   //Her 800us de Bir bir sonraki satıra Geç
{
case 0:
     output_low(PinOE);write_data(int_syc);
     output_low(PinA);output_low(PinB);output_high(PinOE);
     break;
case 1:
     output_low(PinOE);write_data(int_syc);
     output_high(PinA);output_low(PinB);output_high(PinOE);
     break;
case 2:
     output_low(PinOE);write_data(int_syc);
     output_low(PinA);output_high(PinB);output_high(PinOE);
     break;
case 3:
     output_low(PinOE);write_data(int_syc);
     output_high(PinA);output_high(PinB);output_high(PinOE);
     break;
}
int_syc++;if(int_syc&gt;3)int_syc=0;
}


sanırım buradan ayarlamak gerekiyor ,

Mucit23

O kısımla oynamana gerek yok. Timer0 kesmesi 800uS aralıklarla oluşması gerekiyor. Panelin çalışması için gerekli birinci şart.

Kronometre yapmak için ikinci bir kesme kullansan güzel olur. Ama mantığını anlaman için aşağıdaki kodları incele.

Saat, Dakika ve Saniye adında 3 adet değişkenin olsun

int Saat=0, Dakika=0, Saniye=0;

Program main içerisinde sonsuz döngüde dönüyor olsun. En basitinden program aşağıdaki gibi olacaktır

int main()
{
   while(TRUE)
   {
        Saniye=Saniye+1;
        if(Saniye>59)
        {
             Saniye=0;
             Dakika=Dakika+1;
             if(Dakika>59)
             {
                  Dakika=0;
                  Saat=Saat+1;
                  if(Saat>23) Saat=0;
              }
         }
         delay_ms(1000);
   }
}


Burada 1000ms'lik gecikme saniye için gereklidir.

Eğer B0 pinini giriş yapmak istiyorsan ilk önce o pini giriş yapman lazım. Senin programında buna dair bir ayar bulamadım. Bir pini giriş veya çıkış yapmak için set_tris_x() fonksiyonun kullanman gerekiyor.

Örneğin B0 için set_tris_b(0b00000001); şeklinde bir yazım yeterlidir.
Diğer portlar içinde tanımlama yapılmalıdır. Aksi halde giriş ve çıkışlar çalışmaz.

Bundan sonra B0 pinine buton bağlayıp pull-up yapman gerekir. Buton bastığın zaman sayacın sıfırlanması için main programında  aşağıdaki kodlar çalışması gerekir.

if(!input(pin_b0))
{
    Saat=0,Dakika=0,Saniye=0;
}

vs.
Pek fazla vaktim yok o yüzden kısaca yazmaya çalıştım. Biraz senin uğraşman lazım. Dediğim düzeltmeleri yap geri kalan yerlere sonra tekrar bakarız.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ceyranman

Hocam teşekkür ederim uğraşmaya başladım bile . Allah razı olsun .

Powered by EzPortal