Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

pic kronometre

Başlatan emalper, 22 Şubat 2017, 13:43:24

emalper

Merhaba arkadaslar ben yaptigim uv box icin bir zamanlayici/timer yapmak istiyorum ama bunu picin timer1 ile yapmak istiyorum cunku bana gercek bir zamanlama lazim. Serdar cicek hocamizin kitabindaki en basit timer1 uygulamasini asagida paylasacagim eger bir bilginiz varsa bana bu konuda yardim edip bu programa nasil 7 segmentli display ekleyip dakikayi saniyeyi bu segmente yazdirabilirim acaba.

/******************************************************
      PIC16F877 ile Timer1 Uygulamasý-1
      PIC PROG/DEKA     : Port B jumper'ý LED konumunda olmalý
*******************************************************/
#include <16f877.h>     // Kullanýlacak denetleyicinin baþlýk dosyasý tanýtýlýyor.

// Denetleyici konfigürasyon ayarlarý
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanýlacak osilatör frekansý belirtiliyor.

#use fast_io(b) //Port yönlendirme komutlarý B portu için geçerli

int i=0; // Tamsayý tipinde deðiþken tanýmlanýyor

//****************** Timer0 Kesmesi *****************************
#int_timer1  // Timer1 kesmesi
void  timer1_kesme ()   // Kesme fonksiyonu ismi
{
   set_timer1(63036); // TMR1 deðeri belirleniyor

   i++; // i deðeri 1 arttýrýlýyor

   if (i==50)    // i deðeri 50'ye eþit olursa RB0 lojik-1 olsun
      output_high(pin_b0);
   if (i==100)  // i deðeri 100'e eþit olursa RB0 lojik-0 ve i=0 olsun
   {
      output_low(pin_b0);
      i=0;
   }
}

/********* ANA PROGRAM FONKSÝYONU********/

void main ( )
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dýþý
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayýcýsý devre dýþý
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriþ yok
   setup_adc(ADC_OFF);             // ADC birimi devre dýþý
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dýþý
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dýþý


   set_tris_b(0x00);   // B portu komple çýkýþ

   output_b(0x00);     // B portu çýkýþý ilk anda sýfýrlanýyor

   setup_timer_1(T1_INTERNAL | T1_DIV_BY_8); // Timer1 ayarlarý yapýlýyor
   set_timer1(63036);   // TMR1 deðeri belirleniyor


   enable_interrupts(INT_timer1); // int_timer0 kesmesini aktif yapar
   enable_interrupts(GLOBAL);     // Aktif edilen kesmelere izin ver

   while(1); // Sonsuz döngü

}

vitruvius

Serdar Çiçek'in kitabındaki  7 segment display uygulamalarına da baktın mı? Yapacağın şey zamanı bir değişkende saklayacaksın, sonra bunu basamaklara ayırıp display'e göndereceksin.

JOKERAS

Dakika Saniye için RTC (Real Time Clock) kullanmak gerekir.
Yok, gerçek zamanlı olmasın diyorsanız Saat kodu yazacaksınız.
Saniyeler, Dakikalar, Saatler, Günler aylar yıllar vs.
O kolay...
Timerı  32768 'de taşar şekilde ayarlayın bu saatin kök noktası olacak buradaki en küçük değişiklik tüm
değerlere büyüyerek sirayet eder.Tabii işlemci clocunu ona göre set edip ideal durumu veya
tam 1 Saniyede İnt oluşacak şekilde ayarlayın.Ama aşağı yukları kayma mutlaka olacaktır.
Önemli değil.

Her int rutininde Saniye değişkenini 0- 59 a kadar arttırıp Dakika değişkenini, Dakika değişkenini 0-59'a kadar bir arttırıp
Saat değişkenini, Saat değişkenini 0-23'e kadar arttırıp Gün,Hafta,Ay vs vs uzar gider neyse.
Bunu yaptıktan sonra bir Display Fonksiyonu yazın,yazdığınız fonksiyonun parametre veya parametrelerine
Saniye,dakika saat vs olacak şekilde aktarın.
Bu kadarcık.







sifirzero

7 segment yerine lcd kullanirsan daha kolay yaparsin.saati dısaridan bagla daha gercekci olur.rtc devreler var.
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

emalper

Alıntı yapılan: serkancetin - 22 Şubat 2017, 14:47:08
7 segment yerine lcd kullanirsan daha kolay yaparsin.saati dısaridan bagla daha gercekci olur.rtc devreler var.

lcd ile yapmasi daha kolay belki ama 7 segment daha az yer kapliyor e benim projem icin daha uygun o yuzden ben 7 segmentte kaliyim) birde saati disardan baglamak daha mantikli dogru soyluyorsun ama benim anladigim kadari ile yada bildigim kadari ile timer1 ile de 5-10 dakikalik sadece dakika ve saniye gosteren bir uygulama cok kucuk bir sapma ile yapiliyor dogru degilmiyim acaba?

Emre MERMİ

Benim yaptığım bir proje vardı. Şuraya not düşeyim de bilgisayara geçince paylaşayım.

emalper

Alıntı yapılan: Emre MERMİ - 22 Şubat 2017, 15:49:26
Benim yaptığım bir proje vardı. Şuraya not düşeyim de bilgisayara geçince paylaşayım.

Cok memnun olurum tessekurler. Bu arada bende basit bir sayim devresi yazmayi basardim.Timer olmadan ama butonlari eklemeyi ve timer ile nasil eslestirecegim hakkinda en ufak bir fikrim yok. Birde bu devre ileriye dogru gidiyor)) Geriye dogru gidmesi icin herseyi denedim ama her yol devreyi bozdu. Lutfen kodlari inceleyip fikrinizi belirtirmisiniz?

#include <16f877.h>      
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD 

#use delay(clock=4000000)    

int i,k,c;  

const int digit[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7C, 0x07, 0x7F, 0x6F, 0x77}; 

void main () 
{ 
    
   while(1)    
   { 
      for(i=0;i<=9;i++) 
      { 
         for(k=0;k<=9;k++) 
         { 
        
         for(c=0;c<=9;c++) 
         { 
          output_b(digit[i]); 
          output_d(digit[k]); 
          output_c(digit[c]); 
          delay_ms(500); 
         } 
        } 
      } 
   } 
}

mehmet

http://www.candrian.gr/index.php/category/microcontrollers/avr/switch-timer/

Ben yaptım güzel çalışıyor. Ancak röleyi biraz daha
büyük seçebilirsiniz...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

emalper

Alıntı yapılan: mehmet - 23 Şubat 2017, 13:54:39
http://www.candrian.gr/index.php/category/microcontrollers/avr/switch-timer/

Ben yaptım güzel çalışıyor. Ancak röleyi biraz daha
büyük seçebilirsiniz...

cok tesekkur ederim kodlari inceleyecegim ama eger mumkunse ve ccs c ustunde bilgi sahibiyseniz sizde benim yukarida yazdigim kodu inceleyip start,set ve reset butonlarini nasil ekleyecegimi soyleyebilirmisiniz?

Emre MERMİ

#include <16F877.h>

#FUSES NOPUT                    //No Power Up Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG

#use delay(crystal=20000000)
#use rs232(baud=1200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PORT1)

int1 z=0,y=0;
int a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,r=0,s=0,t=0,v=0,a1=0,a2=0,a3=0;
const int digit[16]={0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};  //ortak katot display için port çıkışları
char veri=0;
#INT_RDA
void  RDA_isr(void) 
{
veri=getc();
if(veri=='N'){
a1=a1+1;
veri=0;
}
if(a1==5){
reset_cpu();
a=0;b=0;c=0;d=0;e=0;f=0;
}
}

#INT_TIMER2
void  TIMER2_isr(void) 
{
if(d==1){
   g=g+1;
   }
 
h=h+1;
if(h==7){
   h=0;
   
   }
}

void saat()
{
if(g==10){
   a=a+1;
   g=0;
   }
   
if(a==100){
   a=0;
   b=b+1;
   }

if(b==60){
   b=0;
   c=c+1;
   }

if(c==100){
   c=0;
   b=0;
   a=0;
   }
}

void display_yaz(){
if(h==0){
   output_high(pin_d2);
   output_low(pin_d3);
   output_low(pin_d4);
   output_low(pin_d5);
   output_low(pin_d6);
   output_low(pin_d7);
   j=a%10;
   output_b(digit[j]);
   }

if(h==1){
   output_low(pin_d2);
   output_high(pin_d3);
   output_low(pin_d4);
   output_low(pin_d5);
   output_low(pin_d6);
   output_low(pin_d7);
   k=a/10;
   output_b(digit[k]);
   }
if(h==2){
   
   output_low(pin_d2);
   output_low(pin_d3);
   output_high(pin_d4);
   output_low(pin_d5);
   output_low(pin_d6);
   output_low(pin_d7);
   l=b%10;
   output_b(digit[l]);
   output_high(pin_b7);  //display nokta.
   }
if(h==3){
   output_low(pin_d2);
   output_low(pin_d3);
   output_low(pin_d4);
   output_high(pin_d5);
   output_low(pin_d6);
   output_low(pin_d7);
   m=b/10;
   output_b(digit[m]);
   }
if(h==4){
   
   output_low(pin_d2);
   output_low(pin_d3);
   output_low(pin_d4);
   output_low(pin_d5);
   output_high(pin_d6);
   output_low(pin_d7);
   n=c%10;
   output_b(digit[n]);
   output_high(pin_b7); // display nokta.
   }
if(h==5){
   output_low(pin_d2);
   output_low(pin_d3);
   output_low(pin_d4);
   output_low(pin_d5);
   output_low(pin_d6);
   output_high(pin_d7);
   p=c/10;
   output_b(digit[p]);
   }

}

void display_yaz1(){
if(h==0 || h==2 || h==4 || h==6){
   output_high(pin_d2);
   output_low(pin_d3);
   output_low(pin_d4);
   output_low(pin_d5);
   output_low(pin_d6);
   output_low(pin_d7);
   t=r%10;
   output_b(digit[t]);
   }

if(h==1 || h==3 || h==5 || h==7 ){
   output_low(pin_d2);
   output_high(pin_d3);
   output_low(pin_d4);
   output_low(pin_d5);
   output_low(pin_d6);
   output_low(pin_d7);
   v=r/10;
   output_b(digit[v]);
   }

}


void main()
{
   setup_timer_2(T2_DIV_BY_4,178,7);      //143 us overflow, 1,0 ms interrupt


   enable_interrupts(INT_RDA);      
   enable_interrupts(INT_TIMER2);
   enable_interrupts(GLOBAL);       

   set_tris_a(0xF0);
   output_a(0x00);
   set_tris_b(0x00);
   output_b(0x00);
   set_tris_a(0x00);
   output_a(0x00);
   set_tris_c(0xFF);
   set_tris_e(0xFF);
   output_high(pin_c4);
   
   z=read_eeprom(0);
   r=read_eeprom(1);
   if(z==1){
   y=1;}
   
   while(TRUE)
   {
if(input(pin_e0)){
z=z+1;
delay_ms(300);
write_eeprom(0,z);
}


if(z==0){
output_low(pin_c4);
display_yaz();
saat();
y=0;
if(e==0){
if(input(pin_c2)){
   d=1;
   e=1;
   }
}
if(f==0){
if(input(pin_c3)){
   d=0;
   f=1;
   }  
}



   }
   if(z==1){
   output_high(pin_c4);
   if(input(pin_c2)){
   y=1;
   }
   if(y==0){
   i=0;
   display_yaz1();
   if(input(pin_a4)){
   delay_ms(300);
   r=r+1;
   write_eeprom(1,r);
   }
   if(input(pin_a5)){
   delay_ms(300);
   r=r-1;
    write_eeprom(1,r);
   }
   if(r==-1){
   r=0;
   write_eeprom(1,r);
   }
   }
 
 
   if(y==1){
   display_yaz();
   saat();
   if(i<5){
   i=i+1;
   }
   if(i==1){
   s=0;
   }
   if(input(pin_c2)){
   delay_ms(50);
   if(input(pin_c2)){
   d=1;
   a2=1;
   
   
   }
   if(a2==1){
   if(!input(pin_c2)){
   delay_ms(50);
   if(!input(pin_c2)){ 
   s=s+1;
   a2=0;
   }
   }
   }
   
      if(s>=r){
   d=0;
   output_low(pin_d7);
   }  
   
   }

   }

}
}
}



burada rda kesmesini knorometreyi uzaktan sıfırlamak için kullandım.
while döngüsü içinde menü yapmıştım, 3 butonla 7 segment displayde menü yapmıştım kendimce bişeyler ayarlanıyordu oradan. birde 2 sensör vardı. onlardan gelen verilere göre knorometre başlıyor yada duruyordu. çok takılacak olursan açıklarım.

proteus ;

http://s9.dosya.tc/server2/t9v4hr/cizim.rar.html

Emre MERMİ

bir de açıklayıcı olması için;

timer kesmesi içindeki ilk if koşulu zamanı saymada 2. if koşulu ise 7 segmentlere yazarken tarama yapmada kullanıyordu.

Emre MERMİ

Alıntı yapılan: emalper - 23 Şubat 2017, 01:37:31
Cok memnun olurum tessekurler. Bu arada bende basit bir sayim devresi yazmayi basardim.Timer olmadan ama butonlari eklemeyi ve timer ile nasil eslestirecegim hakkinda en ufak bir fikrim yok. Birde bu devre ileriye dogru gidiyor)) Geriye dogru gidmesi icin herseyi denedim ama her yol devreyi bozdu. Lutfen kodlari inceleyip fikrinizi belirtirmisiniz?

#include <16f877.h>      
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD 

#use delay(clock=4000000)    

int i,k,c;  

const int digit[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7C, 0x07, 0x7F, 0x6F, 0x77}; 

void main () 
{ 
    
   while(1)    
   { 
      for(i=0;i<=9;i++) 
      { 
         for(k=0;k<=9;k++) 
         { 
        
         for(c=0;c<=9;c++) 
         { 
          output_b(digit[i]); 
          output_d(digit[k]); 
          output_c(digit[c]); 
          delay_ms(500); 
         } 
        } 
      } 
   } 
}


ilk olarak for döngüleri ile yaptığınız bu kodda, denetleyici sürekli delay_ms(500) içinde bekler ve pek bir iş yapmaz. bu yüzden mümkün olduğunca delay kullanmaktan kaçın. timer ile yapın. for döngülerinde arttırdığınız sayacı  timer içinde arttırın. örneğin ;

void saat()
{
if(g==10){
   a=a+1;
   g=0;
   }
   
if(a==100){
   a=0;
   b=b+1;
   }

if(b==60){
   b=0;
   c=c+1;
   }

if(c==100){
   c=0;
   b=0;
   a=0;
   }
}

timer içinde bir sayacı arttırın daha sonra bu sayaca göre salise saniye dakikayı ayarlarsınız

vulture

display taramasını nasıl yaptınız? algoritmasını söyleyebilir misiniz ve kod da tarama işlemi nerede yapılıyor? ben display sürücüsüz 6 tane displayi süremeye çalışıyorum fakat son digit sabit şekilde yanmakta diğerleri yanıp yanıp sönmektedir. bu soruna çözüm arıyorum yardımcı olursanız sevinirim.