telefon ile kontrol devresi hak.

Başlatan malpaslan1979, 08 Temmuz 2010, 15:57:24

malpaslan1979

Merhaba.

http://www.biltek.tubitak.gov.tr/gelisim/elektronik/39.htm

Yukarıdaki linkteki projeyi 8 zil çalması sonrası devreye girecek şekilde değiştirmek istiyorum yalnız Hitech diline çok yabancıyım aşağıya da komut satırlarını yazacağım bu proğram nasıl değiştirilmeli ki devre 8 çalma sonrası devreye girsin.....


// Telefonla uzaktan cihaz kontrolu projesine ait PIC16F84A programi
// CM8870'in Q1-Q4 cikislari PIC16F84A'nin RB0-RB3 pinlerine baglidir.
// StD ucu RB4'e baglidir. Hat acma rolesi RA1'e baglidir.
// Sifre onay LED'i RA2'ye baglidir.
// Zil calma sayisi icin pals devresi RA1'e baglidir.
// Kontrol edilecek cihazlar sirasiyla RB5,RB6,RB7'ye baglidir.

#include <pic.h>
#include <delay.c>

#define StD RB4
#define HAT_ROLE RA1
#define LED RA2
#define PALS RA0

// 4MHz osilator
__CONFIG(XT&WDTDIS&PWRTEN);

unsigned char kontrol=0;
unsigned int CX;

//----------------------------------------------------------
// Timer alt programi
// 15 saniye suresince tusa basilmadiysa hatti kapatmak icin
//----------------------------------------------------------
void interrupt kesme(void){

CX++;
if(CX>15000)kontrol=1;
	
T0IF=0; // bayragi temizle
TMR0=131;
}
//----------------------------------------------------------


//----------------------------------------------------------
// ANA PROGRAM
//----------------------------------------------------------
main(void){

unsigned char i,komut,sifre[5],sayac;

//----------------------------------------------------------
// Port konfigurasyonu
//----------------------------------------------------------
TRISB=0x1F; // PORTB'nin RB5,6,7 pinleri cikis,digerleri giris  
TRISA=0x01; // RA0 giris digerleri cikis
//----------------------------------------------------------

PORTB=0; // cihazlar enerjisiz
PORTA=0; // hat kapali, LED sonuk

//-------------------------------------------------------------
//Timer islemleri (kesme suresi=1ms)
//-------------------------------------------------------------
T0CS=0; // Dahili clock
PSA=0; // Prescaler TMR0 icin ayarli
PS0=0; PS1=1; PS2=0; // Oran 1:8
ei(); // butun kesmeler etkin
T0IE=0; //Baslangicta timer pasif
T0IF=0; // bayrak temizle
//-------------------------------------------------------------

// resetten sonra 1 saniye bekle
for(i=0;i<4;i++)DelayMs(250);

basla:

sayac=0; CX=0;

for(;;){ // zil sayisi belirleme dongusu

while(PALS==1); 

sayac++;

	if(sayac>50){ // Zil sayisi 2 
		HAT_ROLE=1; // Hatti ac

		sifreoku:
		
		for(i=0;i<5;i++){ // sifreyi al 

		//--------------------------------------
		kontrol=0;
		TMR0=131; //  
		T0IE=1; // TIMER ON

		//--------------------------------------

			while(StD==0){	// tusa basilmadi ise bekle
				if(kontrol==1){ // sure>15s ise hatti kapat
				HAT_ROLE=0; goto basla; // basa don
				}
				else {};
			}

		T0IE=0; CX=0; // Tusa basildi ise Timer'i durdur, CX'i sifirla 
			      // Boylece yeni bir 15s'lik ek sure kazanilmis olur
		sifre[i]=PORTB&0x0F; // sifreyi oku

		while(StD==1); // tus basili ise bekle
		}
		//--------------------------------------
		// sifrenin son hanesi * olmalidir
		
		//--------Sifre konrol------------------
		if(sifre[0]==1 && sifre[1]==2 && sifre[2]==3 && sifre[3]==4 && sifre[4]==11){
		// 11 degeri tus takimindaki * tusuna karsilik gelir.

		LED=1; // sifre dogru ise LED'i yak
			
			for(;;){
				while(StD==0); // cihazlar icin komut bekle
							
				komut=PORTB&0x0F; 
	
				if(komut==1)RB5=1; // cihaz 1 ON
				if(komut==2)RB6=1;
				if(komut==3)RB7=1;
				if(komut==4)RB5=0; // cihaz 1 OFF 
				if(komut==5)RB6=0;
				if(komut==6)RB7=0;
	
				if(komut==12){ // # tusuna basildi ise hatti kapat
					HAT_ROLE=0; LED=0; goto basla;
				// Cihazlarin ON/OFF durumlari degismeden kalir.
				}
			}				
				//--------------------------------------
		}
		
		else{ 
		goto sifreoku; //sifre yanlis ise tekrar sifre okumaya git
		}
	}

	else{  // sayac<50 ise
	while(PALS==0);
	}

} // for dongusu

}



BenC

Orjinal kodda zamana dayalı olarak tahmini RING süresi belirlemiş. Her RING geldiğinde RA0 pini 0 a çekilir. Bu yolla gitseydi daha güzel olurdu.  Aşağıdaki kodu ekle.  RA0 ın düşen kenarında sayacı 1 arttırıyor  yani her düşüş gelen her RING (Çalma sayısı)


// if(sayac>50){ // Zil sayisi 2  ifadesini Bununla değiştir if (ZilSayisi(8))


int ZilSayisi(int xDeger)

	{
	 	int Sayac=0;	// RA0 ın her düşen kenarında sayacak olan sayac

		for(;;)			// Sonsuz döngü

			{

				while(PALS==1); 	   	// RA0 1 olduğu sürece while da dön
										// RA0 0 oldu while dan çık.
	
				if (Sayac >= xDeger)		// Sayacı kontrol et, eğer xDeger(yani zil sayacı) Sayaca  eşitse 1 döndür. 
					{
						return 1;		
					}

				Sayac++;				// Sayac xDegerden farklı o nedenle sayacı 1 arttır.
	
				while(PALS==0); 		// RA0 0 olduğu sürece while da dön.

			}

	}


ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!

BenC

Aşağıdaki satırları sil

while(PALS==1); 

sayac++;

	if(sayac>50){ // Zil sayisi 2




Bunu oraya ekle

if (ZilSayisi(8)) { ekle


ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!

BenC

C de goto deyimini kullanmamaya özen göster.

goto ile
şifreoku diye etikete gönderiyorsun. Bunun yerine Şifre konrolü yapan ve sonucunda 1 veya 0 döndüren bir fonksiyon daha güzel olur.
ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!

malpaslan1979

#4
BenC sonsuz teşekkürler. Günün şu saatinde büyük hayır işlediniz. Kandil günüde bir o kadar dua aldınız.

Kodlarda anladığım kadarı ile sizin yaptığınız uyarıları gerçekleştirdim umarım eksik bir yanı yanlış anladığım bir yer yoktur. Bir daha bir kontrol edebilir misiniz?


// Telefonla uzaktan cihaz kontrolu projesine ait PIC16F84A programi
// CM8870'in Q1-Q4 cikislari PIC16F84A'nin RB0-RB3 pinlerine baglidir.
// StD ucu RB4'e baglidir. Hat acma rolesi RA1'e baglidir.
// Sifre onay LED'i RA2'ye baglidir.
// Zil calma sayisi icin pals devresi RA0'e baglidir.
// Kontrol edilecek cihazlar sirasiyla RB5,RB6,RB7'ye baglidir.

#include <pic.h>
#include <delay.c>

#define StD RB4
#define HAT_ROLE RA1
#define LED RA2
#define PALS RA0

// 4MHz osilator
__CONFIG(XT&WDTDIS&PWRTEN);

unsigned char kontrol=0;
unsigned int CX;

//----------------------------------------------------------
// Timer alt programi
// 15 saniye suresince tusa basilmadiysa hatti kapatmak icin
//----------------------------------------------------------
void interrupt kesme(void){

CX++;
if(CX>15000)kontrol=1;
   
T0IF=0; // bayragi temizle
TMR0=131;
}
//----------------------------------------------------------


//----------------------------------------------------------
// ANA PROGRAM
//----------------------------------------------------------
main(void){

unsigned char i,komut,sifre[5],sayac;

//----------------------------------------------------------
// Port konfigurasyonu
//----------------------------------------------------------
TRISB=0x1F; // PORTB'nin RB5,6,7 pinleri cikis,digerleri giris  
TRISA=0x01; // RA0 giris digerleri cikis
//----------------------------------------------------------

PORTB=0; // cihazlar enerjisiz
PORTA=0; // hat kapali, LED sonuk

//-------------------------------------------------------------
//Timer islemleri (kesme suresi=1ms)
//-------------------------------------------------------------
T0CS=0; // Dahili clock
PSA=0; // Prescaler TMR0 icin ayarli
PS0=0; PS1=1; PS2=0; // Oran 1:8
ei(); // butun kesmeler etkin
T0IE=0; //Baslangicta timer pasif
T0IF=0; // bayrak temizle
//-------------------------------------------------------------

// resetten sonra 1 saniye bekle
for(i=0;i<4;i++)DelayMs(250);

basla:

sayac=0; CX=0;

for(;;){ // zil sayisi belirleme dongusu

if (ZilSayisi(8)) { ekle
 // if(sayac>50){ // Zil sayisi 2  ifadesini Bununla değiştir if (ZilSayisi(8))


int ZilSayisi(int xDeger)

   {
       int Sayac=0;   // RA0 ın her düşen kenarında sayacak olan sayac

      for(;;)         // Sonsuz döngü

         {

            while(PALS==1);          // RA0 1 olduğu sürece while da dön
                              // RA0 0 oldu while dan çık.
   
            if (Sayac >= xDeger)      // Sayacı kontrol et, eğer xDeger(yani zil sayacı) Sayaca  eşitse 1 döndür.
               {
                  return 1;      
               }

            Sayac++;            // Sayac xDegerden farklı o nedenle sayacı 1 arttır.
   
            while(PALS==0);       // RA0 0 olduğu sürece while da dön.

         }

   }
      HAT_ROLE=1; // Hatti ac

      sifreoku:
      
      for(i=0;i<5;i++){ // sifreyi al 

      //--------------------------------------
      kontrol=0;
      TMR0=131; //  
      T0IE=1; // TIMER ON

      //--------------------------------------

         while(StD==0){   // tusa basilmadi ise bekle
            if(kontrol==1){ // sure>15s ise hatti kapat
            HAT_ROLE=0; goto basla; // basa don
            }
            else {};
         }

      T0IE=0; CX=0; // Tusa basildi ise Timer'i durdur, CX'i sifirla 
               // Boylece yeni bir 15s'lik ek sure kazanilmis olur
      sifre[i]=PORTB&0x0F; // sifreyi oku

      while(StD==1); // tus basili ise bekle
      }
      //--------------------------------------
      // sifrenin son hanesi * olmalidir
      
      //--------Sifre konrol------------------
      if(sifre[0]==7 && sifre[1]==9 && sifre[2]==8 && sifre[3]==1 && sifre[4]==11){
      // 11 degeri tus takimindaki * tusuna karsilik gelir.

      LED=1; // sifre dogru ise LED'i yak
         
         for(;;){
            while(StD==0); // cihazlar icin komut bekle
                     
            komut=PORTB&0x0F; 
   
            if(komut==1)RB5=1; // cihaz 1 ON
            if(komut==2)RB6=1;
            if(komut==3)RB7=1;
            if(komut==4)RB5=0; // cihaz 1 OFF 
            if(komut==5)RB6=0;
            if(komut==6)RB7=0;
   
            if(komut==12){ // # tusuna basildi ise hatti kapat
               HAT_ROLE=0; LED=0; goto basla;
            // Cihazlarin ON/OFF durumlari degismeden kalir.
            }
         }            
            //--------------------------------------
      }
      
      else{ 
      goto sifreoku; //sifre yanlis ise tekrar sifre okumaya git
      }
   }

   else{  // sayac<50 ise
   while(PALS==0);
   }

} // for dongusu

}




BenC

#5

Rica ederim.

Programı aşağıdaki gibi düzelttim. Sizin gönderdiğinizle karşılaştırın. Sizin yazdığınız da hatalar vardı. Farklar hatalarınız.




// Telefonla uzaktan cihaz kontrolu projesine ait PIC16F84A programi
// CM8870'in Q1-Q4 cikislari PIC16F84A'nin RB0-RB3 pinlerine baglidir.
// StD ucu RB4'e baglidir. Hat acma rolesi RA1'e baglidir.
// Sifre onay LED'i RA2'ye baglidir.
// Zil calma sayisi icin pals devresi RA0'e baglidir.
// Kontrol edilecek cihazlar sirasiyla RB5,RB6,RB7'ye baglidir.

#include <pic.h>
#include <delay.c>

#define StD RB4
#define HAT_ROLE RA1
#define LED RA2
#define PALS RA0

// 4MHz osilator
__CONFIG(XT&WDTDIS&PWRTEN);

unsigned char kontrol=0;
unsigned int CX;

//----------------------------------------------------------
// Timer alt programi
// 15 saniye suresince tusa basilmadiysa hatti kapatmak icin
//----------------------------------------------------------
void interrupt kesme(void){

CX++;
if(CX>15000)kontrol=1;
   
T0IF=0; // bayragi temizle
TMR0=131;
}
//----------------------------------------------------------


int ZilSayisi(int xDeger)

   {
       int Sayac=0;   // RA0 ın her düşen kenarında sayacak olan sayac

      for(;;)         // Sonsuz döngü

         {

            while(PALS==1);          // RA0 1 olduğu sürece while da dön
                              // RA0 0 oldu while dan çık.
   
            if (Sayac >= xDeger)      // Sayacı kontrol et, eğer xDeger(yani zil sayacı) Sayaca  eşitse 1 döndür.
               {
                  return 1;      
               }

            Sayac++;            // Sayac xDegerden farklı o nedenle sayacı 1 arttır.
   
            while(PALS==0);       // RA0 0 olduğu sürece while da dön.

         }

   }



//----------------------------------------------------------
// ANA PROGRAM
//----------------------------------------------------------
main(void){

unsigned char i,komut,sifre[5],sayac;

//----------------------------------------------------------
// Port konfigurasyonu
//----------------------------------------------------------
TRISB=0x1F; // PORTB'nin RB5,6,7 pinleri cikis,digerleri giris  
TRISA=0x01; // RA0 giris digerleri cikis
//----------------------------------------------------------

PORTB=0; // cihazlar enerjisiz
PORTA=0; // hat kapali, LED sonuk

//-------------------------------------------------------------
//Timer islemleri (kesme suresi=1ms)
//-------------------------------------------------------------
T0CS=0; // Dahili clock
PSA=0; // Prescaler TMR0 icin ayarli
PS0=0; PS1=1; PS2=0; // Oran 1:8
ei(); // butun kesmeler etkin
T0IE=0; //Baslangicta timer pasif
T0IF=0; // bayrak temizle
//-------------------------------------------------------------

// resetten sonra 1 saniye bekle
for(i=0;i<4;i++)DelayMs(250);

basla:

sayac=0; CX=0;

	for(;;)

		{ 

			if (ZilSayisi(8)) 
				{ 
 


				  HAT_ROLE=1; // Hatti ac

				  sifreoku:
      
				  for(i=0;i<5;i++){ // sifreyi al 

				  //--------------------------------------
				  kontrol=0;
				  TMR0=131; //  
				  T0IE=1; // TIMER ON

				  //--------------------------------------

					 while(StD==0){   // tusa basilmadi ise bekle
						if(kontrol==1){ // sure>15s ise hatti kapat
						HAT_ROLE=0; goto basla; // basa don
						}
						else {};
			   }

      T0IE=0; CX=0; // Tusa basildi ise Timer'i durdur, CX'i sifirla 
               // Boylece yeni bir 15s'lik ek sure kazanilmis olur
      sifre=PORTB&0x0F; // sifreyi oku

      while(StD==1); // tus basili ise bekle
      }
      //--------------------------------------
      // sifrenin son hanesi * olmalidir
      
      //--------Sifre konrol------------------
      if(sifre[0]==7 && sifre[1]==9 && sifre[2]==8 && sifre[3]==1 && sifre[4]==11){
      // 11 degeri tus takimindaki * tusuna karsilik gelir.

      LED=1; // sifre dogru ise LED'i yak
         
         for(;;){
            while(StD==0); // cihazlar icin komut bekle
                     
            komut=PORTB&0x0F; 
   
            if(komut==1)RB5=1; // cihaz 1 ON
            if(komut==2)RB6=1;
            if(komut==3)RB7=1;
            if(komut==4)RB5=0; // cihaz 1 OFF 
            if(komut==5)RB6=0;
            if(komut==6)RB7=0;
   
            if(komut==12){ // # tusuna basildi ise hatti kapat
               HAT_ROLE=0; LED=0; goto basla;
            // Cihazlarin ON/OFF durumlari degismeden kalir.
            }
         }            
            //--------------------------------------
      }
      
      else{ 
      goto sifreoku; //sifre yanlis ise tekrar sifre okumaya git
      }
   }

   else{  // sayac<50 ise
   while(PALS==0);
   }

} // for dongusu

}









"if(ZilSayısı(8)) { ekle" satırındaki "ekle" yazısını sil sadece uyarı içindi o. Yoksa derleyici hata verir. Ben sildim
ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!

malpaslan1979

#6
BenC size ne kadar teşekkür etsem azdır. Şimdi oldu mu?


// Telefonla uzaktan cihaz kontrolu projesine ait PIC16F84A programi
// CM8870'in Q1-Q4 cikislari PIC16F84A'nin RB0-RB3 pinlerine baglidir.
// StD ucu RB4'e baglidir. Hat acma rolesi RA1'e baglidir.
// Sifre onay LED'i RA2'ye baglidir.
// Zil calma sayisi icin pals devresi RA0'e baglidir.
// Kontrol edilecek cihazlar sirasiyla RB5,RB6,RB7'ye baglidir.

#include <pic.h>
#include <delay.c>

#define StD RB4
#define HAT_ROLE RA1
#define LED RA2
#define PALS RA0

// 4MHz osilator
__CONFIG(XT&WDTDIS&PWRTEN);

unsigned char kontrol=0;
unsigned int CX;

//----------------------------------------------------------
// Timer alt programi
// 15 saniye suresince tusa basilmadiysa hatti kapatmak icin
//----------------------------------------------------------
void interrupt kesme(void){

CX++;
if(CX>15000)kontrol=1;
   
T0IF=0; // bayragi temizle
TMR0=131;
}
//----------------------------------------------------------


//----------------------------------------------------------
// ANA PROGRAM
//----------------------------------------------------------
main(void){

unsigned char i,komut,sifre[5],sayac;

//----------------------------------------------------------
// Port konfigurasyonu
//----------------------------------------------------------
TRISB=0x1F; // PORTB'nin RB5,6,7 pinleri cikis,digerleri giris  
TRISA=0x01; // RA0 giris digerleri cikis
//----------------------------------------------------------

PORTB=0; // cihazlar enerjisiz
PORTA=0; // hat kapali, LED sonuk

//-------------------------------------------------------------
//Timer islemleri (kesme suresi=1ms)
//-------------------------------------------------------------
T0CS=0; // Dahili clock
PSA=0; // Prescaler TMR0 icin ayarli
PS0=0; PS1=1; PS2=0; // Oran 1:8
ei(); // butun kesmeler etkin
T0IE=0; //Baslangicta timer pasif
T0IF=0; // bayrak temizle
//-------------------------------------------------------------

// resetten sonra 1 saniye bekle
for(i=0;i<4;i++)DelayMs(250);

basla:

sayac=0; CX=0;

for(;;){ // zil sayisi belirleme dongusu

if (ZilSayisi(8)) { 
 // if(sayac>50){ // Zil sayisi 2  ifadesini Bununla değiştir if (ZilSayisi(8))


int ZilSayisi(int xDeger)

   {
       int Sayac=0;   // RA0 ın her düşen kenarında sayacak olan sayac

      for(;;)         // Sonsuz döngü

         {

            while(PALS==1);          // RA0 1 olduğu sürece while da dön
                              // RA0 0 oldu while dan çık.
   
            if (Sayac >= xDeger)      // Sayacı kontrol et, eğer xDeger(yani zil sayacı) Sayaca  eşitse 1 döndür.
               {
                  return 1;      
               }

            Sayac++;            // Sayac xDegerden farklı o nedenle sayacı 1 arttır.
   
            while(PALS==0);       // RA0 0 olduğu sürece while da dön.

         }

   }
      HAT_ROLE=1; // Hatti ac

      sifreoku:
      
      for(i=0;i<5;i++){ // sifreyi al 

      //--------------------------------------
      kontrol=0;
      TMR0=131; //  
      T0IE=1; // TIMER ON

      //--------------------------------------

         while(StD==0){   // tusa basilmadi ise bekle
            if(kontrol==1){ // sure>15s ise hatti kapat
            HAT_ROLE=0; goto basla; // basa don
            }
            else {};
         }

      T0IE=0; CX=0; // Tusa basildi ise Timer'i durdur, CX'i sifirla 
               // Boylece yeni bir 15s'lik ek sure kazanilmis olur
      sifre[i]=PORTB&0x0F; // sifreyi oku

      while(StD==1); // tus basili ise bekle
      }
      //--------------------------------------
      // sifrenin son hanesi * olmalidir
      
      //--------Sifre konrol------------------
      if(sifre[0]==7 && sifre[1]==9 && sifre[2]==8 && sifre[3]==1 && sifre[4]==11){
      // 11 degeri tus takimindaki * tusuna karsilik gelir.

      LED=1; // sifre dogru ise LED'i yak
         
         for(;;){
            while(StD==0); // cihazlar icin komut bekle
                     
            komut=PORTB&0x0F; 
   
            if(komut==1)RB5=1; // cihaz 1 ON
            if(komut==2)RB6=1;
            if(komut==3)RB7=1;
            if(komut==4)RB5=0; // cihaz 1 OFF 
            if(komut==5)RB6=0;
            if(komut==6)RB7=0;
   
            if(komut==12){ // # tusuna basildi ise hatti kapat
               HAT_ROLE=0; LED=0; goto basla;
            // Cihazlarin ON/OFF durumlari degismeden kalir.
            }
         }            
            //--------------------------------------
      }
      
      else{ 
      goto sifreoku; //sifre yanlis ise tekrar sifre okumaya git
      }
   }

   else{  // sayac<50 ise
   while(PALS==0);
   }

} // for dongusu

}

BenC

Üstad !

Anladığım kadarıyla C ye baya yabancısınız. Bu sitede C üzerine yazılmış güzel kaynaklar var. Onları biraz inceleyin. 
ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!

malpaslan1979

#8
Evet bunun bende  :-[ farkındayım şu işi bitirirsem ilk işim o olacak yalnız compile yapmaya çalışınca hata mesajı aldım sizce hata nerede acaba. insan bilmediği bir dilde hata arayınca matrixe yeni girmiş neo gibi aptal aptal bakınıyor şu aşamada usta olarakta morpeus siziniz tabi kabul ederseniz hata nerde?  :-[

BenC

Üstad.
Derlediğiniz kodu tam olarak buraya yazın. Ayrıca derleyicinin verdiği hatayı da yazın. Sorunun nedir, beraber çözüm yoluna gidelim
ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!

malpaslan1979

Çok çok teşekkürler....

Önce kodu yazıyorum şimdi derleme hatası geliyor hemen yazıyorum

// Telefonla uzaktan cihaz kontrolu projesine ait PIC16F84A programi
// CM8870'in Q1-Q4 cikislari PIC16F84A'nin RB0-RB3 pinlerine baglidir.
// StD ucu RB4'e baglidir. Hat acma rolesi RA1'e baglidir.
// Sifre onay LED'i RA2'ye baglidir.
// Zil calma sayisi icin pals devresi RA0'e baglidir.
// Kontrol edilecek cihazlar sirasiyla RB5,RB6,RB7'ye baglidir.

#include <pic.h>
#include <delay.c>

#define StD RB4
#define HAT_ROLE RA1
#define LED RA2
#define PALS RA0

// 4MHz osilator
__CONFIG(XT&WDTDIS&PWRTEN);

unsigned char kontrol=0;
unsigned int CX;

//----------------------------------------------------------
// Timer alt programi
// 15 saniye suresince tusa basilmadiysa hatti kapatmak icin
//----------------------------------------------------------
void interrupt kesme(void){

CX++;
if(CX>15000)kontrol=1;
   
T0IF=0; // bayragi temizle
TMR0=131;
}
//----------------------------------------------------------


//----------------------------------------------------------
// ANA PROGRAM
//----------------------------------------------------------
main(void){

unsigned char i,komut,sifre[5],sayac;

//----------------------------------------------------------
// Port konfigurasyonu
//----------------------------------------------------------
TRISB=0x1F; // PORTB'nin RB5,6,7 pinleri cikis,digerleri giris  
TRISA=0x01; // RA0 giris digerleri cikis
//----------------------------------------------------------

PORTB=0; // cihazlar enerjisiz
PORTA=0; // hat kapali, LED sonuk

//-------------------------------------------------------------
//Timer islemleri (kesme suresi=1ms)
//-------------------------------------------------------------
T0CS=0; // Dahili clock
PSA=0; // Prescaler TMR0 icin ayarli
PS0=0; PS1=1; PS2=0; // Oran 1:8
ei(); // butun kesmeler etkin
T0IE=0; //Baslangicta timer pasif
T0IF=0; // bayrak temizle
//-------------------------------------------------------------

// resetten sonra 1 saniye bekle
for(i=0;i<4;i++)DelayMs(250);

basla:

sayac=0; CX=0;

for(;;){ // zil sayisi belirleme dongusu

if (ZilSayisi(8)) { 
 // if(sayac>50){ // Zil sayisi 2  ifadesini Bununla değiştir if (ZilSayisi(8))


int ZilSayisi(int xDeger)

   {
       int Sayac=0;   // RA0 ın her düşen kenarında sayacak olan sayac

      for(;;)         // Sonsuz döngü

         {

            while(PALS==1);          // RA0 1 olduğu sürece while da dön
                              // RA0 0 oldu while dan çık.
   
            if (Sayac >= xDeger)      // Sayacı kontrol et, eğer xDeger(yani zil sayacı) Sayaca  eşitse 1 döndür.
               {
                  return 1;      
               }

            Sayac++;            // Sayac xDegerden farklı o nedenle sayacı 1 arttır.
   
            while(PALS==0);       // RA0 0 olduğu sürece while da dön.

         }

   }
      HAT_ROLE=1; // Hatti ac

      sifreoku:
      
      for(i=0;i<5;i++){ // sifreyi al 

      //--------------------------------------
      kontrol=0;
      TMR0=131; //  
      T0IE=1; // TIMER ON

      //--------------------------------------

         while(StD==0){   // tusa basilmadi ise bekle
            if(kontrol==1){ // sure>15s ise hatti kapat
            HAT_ROLE=0; goto basla; // basa don
            }
            else {};
         }

      T0IE=0; CX=0; // Tusa basildi ise Timer'i durdur, CX'i sifirla 
               // Boylece yeni bir 15s'lik ek sure kazanilmis olur
      sifre[i]=PORTB&0x0F; // sifreyi oku

      while(StD==1); // tus basili ise bekle
      }
      //--------------------------------------
      // sifrenin son hanesi * olmalidir
      
      //--------Sifre konrol------------------
      if(sifre[0]==7 && sifre[1]==9 && sifre[2]==8 && sifre[3]==1 && sifre[4]==11){
      // 11 degeri tus takimindaki * tusuna karsilik gelir.

      LED=1; // sifre dogru ise LED'i yak
         
         for(;;){
            while(StD==0); // cihazlar icin komut bekle
                     
            komut=PORTB&0x0F; 
   
            if(komut==1)RB5=1; // cihaz 1 ON
            if(komut==2)RB6=1;
            if(komut==3)RB7=1;
            if(komut==4)RB5=0; // cihaz 1 OFF 
            if(komut==5)RB6=0;
            if(komut==6)RB7=0;
   
            if(komut==12){ // # tusuna basildi ise hatti kapat
               HAT_ROLE=0; LED=0; goto basla;
            // Cihazlarin ON/OFF durumlari degismeden kalir.
            }
         }            
            //--------------------------------------
      }
      
      else{ 
      goto sifreoku; //sifre yanlis ise tekrar sifre okumaya git
      }
   }

   else{  // sayac<50 ise
   while(PALS==0);
   }

} // for dongusu

}

BenC

Değişikliği yapmamışsınız. main fonksiyonu içerisinde ikinci bir fonksiyon daha yazmışsınız. Ben ZilSayisi() fonksiyonunu main fonksiyonundan öncesine aldım doğrusu bu. C nin yapısını inceleyin.

Kodun son hali bu bunu derleyin.

// Telefonla uzaktan cihaz kontrolu projesine ait PIC16F84A programi
// CM8870'in Q1-Q4 cikislari PIC16F84A'nin RB0-RB3 pinlerine baglidir.
// StD ucu RB4'e baglidir. Hat acma rolesi RA1'e baglidir.
// Sifre onay LED'i RA2'ye baglidir.
// Zil calma sayisi icin pals devresi RA1'e baglidir.
// Kontrol edilecek cihazlar sirasiyla RB5,RB6,RB7'ye baglidir.

#include <pic.h>
#include <delay.c>

#define StD RB4
#define HAT_ROLE RA1
#define LED RA2
#define PALS RA0

// 4MHz osilator
__CONFIG(XT&WDTDIS&PWRTEN);

unsigned char kontrol=0;
unsigned int CX;

//----------------------------------------------------------
// Timer alt programi
// 15 saniye suresince tusa basilmadiysa hatti kapatmak icin
//----------------------------------------------------------
void interrupt kesme(void){

CX++;
if(CX>15000)kontrol=1;
	
T0IF=0; // bayragi temizle
TMR0=131;
}
//----------------------------------------------------------



// EKLENEN FONKSİYON

//--------------------------- ZİL SAYAÇ FONKSİYONU

int ZilSayisi(int xDeger)	

	{	 	
		int Sayac=0;							// RA0 ın her düşen kenarında sayacak olan sayac
		
		for(;;)									// Sonsuz döngü			
			
			{				
			
				while(PALS==1); 	   			// RA0 1 olduğu sürece while da dön										
				
												// RA0 0 oldu while dan çık.					
				
					if (Sayac >= xDeger)		// Sayacı kontrol et, eğer xDeger(yani zil sayacı) Sayaca  eşitse 1 döndür. 			
					
						{						
							return 1;			// Zil Sayısı şartı gerçekleştirdi fonksiyondan çık.							
						}			
					
				Sayac++;						// Sayac xDegerden farklı o nedenle sayacı 1 arttır.	
				
				
				while(PALS==0); 				// RA0 0 olduğu sürece while da dön.			
				
			}
			
	}

//----------------------------------------------------------

//----------------------------------------------------------
// ANA PROGRAM
//----------------------------------------------------------
main(void){

unsigned char i,komut,sifre[5],sayac;

//----------------------------------------------------------
// Port konfigurasyonu
//----------------------------------------------------------
TRISB=0x1F; // PORTB'nin RB5,6,7 pinleri cikis,digerleri giris  
TRISA=0x01; // RA0 giris digerleri cikis
//----------------------------------------------------------

PORTB=0; // cihazlar enerjisiz
PORTA=0; // hat kapali, LED sonuk

//-------------------------------------------------------------
//Timer islemleri (kesme suresi=1ms)
//-------------------------------------------------------------
T0CS=0; // Dahili clock
PSA=0; // Prescaler TMR0 icin ayarli
PS0=0; PS1=1; PS2=0; // Oran 1:8
ei(); // butun kesmeler etkin
T0IE=0; //Baslangicta timer pasif
T0IF=0; // bayrak temizle
//-------------------------------------------------------------

// resetten sonra 1 saniye bekle
for(i=0;i<4;i++)DelayMs(250);

basla:

sayac=0; CX=0;

for(;;){ // zil sayisi belirleme dongusu

//while(PALS==1);			         //  DEĞİŞİKLİK YAPILAN SATIR

//sayac++;					         //  DEĞİŞİKLİK YAPILAN SATIR

//	if(sayac>50){ // Zil sayisi 2    //  DEĞİŞİKLİK YAPILAN SATIR

		if (ZilSayisi(8))		     //  DEĞİŞİKLİK YAPILAN SATIR

		{	

		HAT_ROLE=1; // Hatti ac

		sifreoku:
		
		for(i=0;i<5;i++){ // sifreyi al 

		//--------------------------------------
		kontrol=0;
		TMR0=131; //  
		T0IE=1; // TIMER ON

		//--------------------------------------

			while(StD==0){	// tusa basilmadi ise bekle
				if(kontrol==1){ // sure>15s ise hatti kapat
				HAT_ROLE=0; goto basla; // basa don
				}
				else {};
			}

		T0IE=0; CX=0; // Tusa basildi ise Timer'i durdur, CX'i sifirla 
			      // Boylece yeni bir 15s'lik ek sure kazanilmis olur
		sifre[i]=PORTB&0x0F; // sifreyi oku

		while(StD==1); // tus basili ise bekle
		}
		//--------------------------------------
		// sifrenin son hanesi * olmalidir
		
		//--------Sifre konrol------------------
		if(sifre[0]==1 && sifre[1]==2 && sifre[2]==3 && sifre[3]==4 && sifre[4]==11){
		// 11 degeri tus takimindaki * tusuna karsilik gelir.

		LED=1; // sifre dogru ise LED'i yak
			
			for(;;){
				while(StD==0); // cihazlar icin komut bekle
							
				komut=PORTB&0x0F; 
	
				if(komut==1)RB5=1; // cihaz 1 ON
				if(komut==2)RB6=1;
				if(komut==3)RB7=1;
				if(komut==4)RB5=0; // cihaz 1 OFF 
				if(komut==5)RB6=0;
				if(komut==6)RB7=0;
	
				if(komut==12){ // # tusuna basildi ise hatti kapat
					HAT_ROLE=0; LED=0; goto basla;
				// Cihazlarin ON/OFF durumlari degismeden kalir.
				}
			}				
				//--------------------------------------
		}
		
		else{ 
		goto sifreoku; //sifre yanlis ise tekrar sifre okumaya git
		}
	}

	else{  // sayac<50 ise
	while(PALS==0);
	}

} // for dongusu

}
ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!

malpaslan1979

hata mesajları bunlar benc usta


Çok çok teşekkürler size ne kadar teşekkür etsem azdır sağolun varolun şimdi eski hata mesajını vermiyor sizin kodunuzu yazdıktan sonra ama şu mesajı aldım compile ederken

cant create c:\telefon.map error permisson denied

BenC

Hangi editör ve hangi derleyiciyi kullanıyorsunuz.

Bu hata mesajı yazılımın içeriği ile ilgili değil. derleyici ayarları vs ile ilgili. c:\ telefon.map dosyası oluşturulamadı,bu nedenle erişim hatası veriyor.
ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!

malpaslan1979

#14
BenC size ne kadar teşekkür etsem az. Allahın bu mübarek günü belki on mesaj attınız inanılmaz bir sabır örneği gösterdiniz. Hex dosyasını xp kurulu olan diğer bilgisayarıma  geçerek hazırladım. Demek ki işletim sistemi ile compiler arasında da bir bağ var. Mersinden sonsun teşekkürler herşey gönlünüzse olsun. Şimdi devreyi denemeye geldi sıra.....

compiler dos tabanlı hpdpic onu bulabildim bu yokluk ve bilgisizlikte



Teşekkürler.....