HITECH C de Port Tanımlama NASIL YAPILIR?

Başlatan BenC, 04 Mayıs 2009, 11:42:39

arslan74

Merhaba,

Necati Ergin Hocanin C kitabını baştan sona okumanızı tavsiye ediyorum. Hatta içindeki kodları yazıb kendinizde deneyiniz. Size cok faydası olacaktır. Bu forumda linkini bulabilirsiniz.

Senin soruna gelince;

Bu I2C haberleşmesi için özel olarak yapılmış bir kodu. Kaynağınıda Protesun "Samples/VSM for PIC16/ PIC Serial Memory Example" örneğinin içindeki koddan almıştım. Yanlız orada ASM kodları vardı ben onları C koduna dönüştürdüm. O projeyi incelerseniz belki daha iyi anlarsınız.

Burada böyle yapılmasını asıl mantığı sudur:

IIC haberleşmesinde Data ve Clock hattında bacaklardan 5 volt verilmek süretiyle lojik1 yapılmiyor. Bu iki hattada Pullup direncleri bağlıdır. Eğer bu cıkışı boşa alırsan Pullup direnci bunu 5Volta cekecekdir. Bende o bacağı Lojik 1 yapmak için,  SCL = 1 yapmak yerinde Bu Pini giriş yapiyorum, yani SCL_TRIS = 1. Dolaysıyla bu pin otomatik boşa cıkacak ve  Pullup direncide onu lojik1 yapacakdır. Şimdi bu cıkışı sıfıra cekebilmek için tekrar giriş olan pin'i cıkış yapmam gerekir yoksa sıfıra cekemem.

void set_clk_low ( void ){ 
    
   SCL = 0;       // cıkış 0 oldu.
   SCL_TRIS = 0;  // giriş olan pin cıkış olarak ayarlandı. bu koddan sonra sıfır olur.
    
}


Çalışmalarınz da başarılar

BenC

Anladım hocam. Ben Pull-Up direnci bağladığım için o sizin yazdığınızın tam tersini yapınca çalıştı. Daha doğrusu sizin  yazmış olduğunuz o kodu DS1307 için birazcık değiştirdim. şuanda gayet sağlıklı çalışıyor.

Yaptığım değişiklik aşağıda hocam.

Main Program:::::

#include	<htc.h>
#include    <stdio.h>

__CONFIG(HS & WDTEN & PWRTDIS & BORDIS & LVPDIS & WRTEN & DEBUGEN & DUNPROT & UNPROTECT );


#ifndef XTAL
 #define XTAL 20000000
 
#endif

#ifndef BAUD_RATE
 #define BAUD_RATE 19200
#endif


#define   SEG1		RA0
#define   SEG2		RA1
#define   SEG3		RA2
#define   SEG4		RA3
#define   SEG5		RA4
#define   SEG6		RA5

#define	  PcINT		RB0
#define	  TmpSNS	RB1
#define	  LedKIR	RB2
#define	  PB3		RB3
#define	  xPB4		RB4
#define	  xPB5		RB5
#define	  PB6		RB6
#define	  PB7		RB7

#define	  PcTXD		RC0
#define	  PcRXD		RC1
#define	  xPC2		RC2
//#define	  DsSCL		RC3
//#define	  DsSDA		RC4
//#define	  SCL		PORTC3
//#define	  SDA		PORTC4
#define	  xPC5		RC5
#define	  xPC6		RC6
#define	  xPC7		RC7

#define   SegA		RD0
#define   SegB		RD1
#define   SegC		RD2
#define   SegD		RD3
#define   SegE		RD4
#define   SegF		RD5
#define   SegG		RD6
#define   SegH		RD7

#define   ButUP		RE0      
#define   ButDOWN	RE1      
#define   ButSET	RE2      

#define   Sutun		PORTD                               
#define   Satir		PORTA      

#define   ON		1
#define   OFF		0

#include    "delay.h"
#include    "serial.c"
#include    "DS1307.c"




char Yil,Ay,Gun,Saat,Dakika,Saniye;
char I2CBuffer[8];

char addr,ack;






void main(void)
	
	{

    	INTCON=	0b00000000;
		ADCON1= 0b00000110;	
		TRISD = 0b00000000;
		//TRISB = 0b00000000;
		TRISA0 = 0x00;
		TRISA1 = 0x00;
		TRISA2 = 0x00;
		TRISA3 = 0x00;
		TRISA4 = 0x00;
		TRISA5 = 0x00;
		TRISE0 = 0x01;
		TRISE1 = 0x01;
		TRISE2 = 0x01;
     	TRISC0 = 0x00;
		TRISC1 = 0x01;
		
		printf("\rDS1307 CALISMASI\n");



DS1307_ZamanAyarla(0x00,0x00);
DS1307_ZamanAyarla(0x01,0x58);
DS1307_ZamanAyarla(0x02,0x22);
DS1307_ZamanAyarla(0x04,0x29);
DS1307_ZamanAyarla(0x05,0x12);
DS1307_ZamanAyarla(0x06,0x09);


		
        while(1)
		
			{
 	









Saniye=DS1307_ZamanOku(0x00);
Dakika=DS1307_ZamanOku(0x01);
Saat  =DS1307_ZamanOku(0x02);
Gun   =DS1307_ZamanOku(0x04);
Ay    =DS1307_ZamanOku(0x05);
Yil   =DS1307_ZamanOku(0x06);


 printf("\rZAMAN %02X.%02X.20%02X %02X:%02X:%02X\n",Gun,Ay,Yil,Saat,Dakika,Saniye);

					
					LedKIR=ON;
                      
					DelayBigMs(450);
					
					
				    LedKIR=OFF;

					DelayBigMs(450);
					

  				}




	}



DS1307.h Dosyası ::::::::::

#ifndef   _DS1307_H 
#define   _DS1307_H 

#define DS1307_W 0xD0
#define DS1307_R 0xD1

#define bitset(var,bitno) ((var) |= 1 << (bitno)) 
#define bitclr(var,bitno) ((var) &= ~(1 << (bitno))) 


#define   SCL      RC3   //-- The SCL output pin 
#define   SDA      RC4   //-- The SDA output pin 

#define   SDA_TRIS   TRISC4   //-- The SDA output pin 
#define   SCL_TRIS   TRISC3   //-- The SCL output pin 


//************** DS1307 FONKSİYONLARI **************
unsigned char DS1307_ZamanOku(unsigned char addr);
unsigned char DS1307_ZamanAyarla(unsigned char addr,unsigned char xByte);

//unsigned char DS1307_Ayarla(unsigned char addr);
unsigned char DS1307_ByteOku(void); 
void DS1307_ByteYaz ( unsigned char xByte );

void DS1307_Basla(void); 
void DS1307_Dur(void); 
void DS1307_TekrarBasla(void); 

unsigned char DS1307_Ack( void ); 
void DS1307_Nack( void ); 

void Bekle_CeyrekBit (void); 
void Bekle_YarimBit (void); 


#endif



DS1307.c Dosyası::::::::::::

#include <pic.h> 
#include "DS1307.h" 


unsigned char DS1307_ZamanOku(unsigned char addr)

	{
		unsigned char ByteVeri;	
		
		
		 DS1307_Basla();
		 
         DS1307_ByteYaz(DS1307_W);
		
         if (DS1307_Ack()) 
		      return 1; 
		
		 DS1307_ByteYaz(addr);
		 
		 if (DS1307_Ack()) 
		      return 1; 
		 	
		 DS1307_Basla();

		 DS1307_ByteYaz(DS1307_R);
		 
		 if (DS1307_Ack()) 
		      return 1; 
		 
		 ByteVeri=DS1307_ByteOku();
		 DS1307_Dur();
		
		 return ByteVeri;			

	}


unsigned char DS1307_ZamanAyarla(unsigned char addr,unsigned char xByte)
{
  unsigned char xByteVeri;

  DS1307_Basla();
  DS1307_ByteYaz(DS1307_W);
 
  if (DS1307_Ack()) 
      return 1; 
  
  DS1307_ByteYaz(addr);

  if (DS1307_Ack()) 
      return 1; 
  
  DS1307_ByteYaz(xByte);
 
 if (DS1307_Ack()) 
      return 1; 
   
  DS1307_Dur();

  DelayMs(10);

return 0;

}












unsigned char DS1307_ByteOku(void)

{ 
 
   unsigned char ByteVeri=0; 
    
   unsigned char ByteBit; 

   for ( ByteBit=0 ; ByteBit < 8 ; ByteBit++ )

   { 
       
      SDA_TRIS = 1;    
      SDA = 0;    
 
      SCL_TRIS = 0; 	 
      SCL = 0;    
	 
      Bekle_YarimBit(); 
             
      SCL_TRIS = 0;  
      SCL = 1;    

      Bekle_CeyrekBit(); 
    
      if (SDA)
		{    
          bitset(ByteVeri,(7-ByteBit)); 
		}
      else 
        {         
	      bitclr(ByteVeri,(7-ByteBit)); 
	      Bekle_CeyrekBit(); 
	       
	      SCL_TRIS = 0; 	 
	      SCL = 0;    
		}       
   } 
    
   return ByteVeri; 
    
} 

    


void DS1307_ByteYaz( unsigned char xByte )

{ 
   unsigned char ByteBit; 

   for ( ByteBit=0 ; ByteBit < 8 ; ByteBit++ )
   
   { 
    
      if ( xByte & (1 << (7-ByteBit)) )   // 
         
		 {
	         Bekle_CeyrekBit(); 
	         SDA_TRIS = 1;    
	         SDA = 0;    
	 
	         Bekle_CeyrekBit(); 
	         SCL_TRIS = 0;  
	         SCL = 1;    
	
	         Bekle_YarimBit(); 
	         SCL_TRIS = 0; 	 
	         SCL = 0;    
         }

      else 
         
         {
	         Bekle_CeyrekBit(); 
	         SDA_TRIS = 0;  
	         SDA = 0;    
	
	         Bekle_CeyrekBit(); 
	         SCL_TRIS = 0;  
	         SCL = 1;    
	    
	         Bekle_YarimBit(); 
	         SCL_TRIS = 0; 	 
	         SCL = 0;    

         } 	
 
   } 

} 





void DS1307_Basla(void) 
{ 
   SCL_TRIS = 0;  
   SCL = 1;    
 
   Bekle_YarimBit(); 

   SDA_TRIS = 0;  
   SDA = 0;    

   Bekle_YarimBit (); 

   SCL_TRIS = 0; 	 
   SCL = 0;    

   Bekle_YarimBit (); 
   Bekle_YarimBit (); 
   Bekle_YarimBit (); 
} 


void DS1307_Dur(void) 
{ 
   Bekle_YarimBit(); 

   SCL_TRIS = 0; 	 
   SCL = 0;    

   Bekle_YarimBit(); 

   SDA_TRIS = 0;  
   SDA = 0;    

   Bekle_YarimBit(); 

   SCL_TRIS = 0;  
   SCL = 1;    
 
   Bekle_YarimBit(); 

   SDA_TRIS = 1;    
   SDA = 0;    

   Bekle_YarimBit(); 
} 

void DS1307_TekrarBasla(void) 
{    
   SCL_TRIS = 0;  
   SCL = 1;    

   Bekle_YarimBit(); 
    
   SDA_TRIS = 0;  
   SDA = 0;    

   Bekle_YarimBit (); 
    
   SCL_TRIS = 0; 	 
   SCL = 0;    

   Bekle_YarimBit (); 
   Bekle_YarimBit (); 
   Bekle_YarimBit (); 
} 

/******************************************************************************************/ 





unsigned char DS1307_Ack( void )

{ 
  unsigned char Ack_Degeri; 

  Bekle_CeyrekBit(); 
    
  SDA_TRIS = 1;    
  SDA = 0;    

  Bekle_CeyrekBit(); 
    
  SCL_TRIS = 0;  
  SCL = 1;    
  
  Bekle_CeyrekBit(); 

  if (SDA)    
     Ack_Degeri = 1; 
  else 
     Ack_Degeri = 0; 

   Bekle_CeyrekBit(); 
    
   SCL_TRIS = 0; 	 
   SCL = 0;    
   
   Bekle_CeyrekBit(); 

   return Ack_Degeri; 
} 


void DS1307_Nack( void )
{ 
   SCL_TRIS = 0; 	 
   SCL = 0;    

   Bekle_YarimBit(); 
    
   SDA_TRIS = 1;    
   SDA = 0;    

   Bekle_YarimBit(); 
    
   SCL_TRIS = 0;  
   SCL = 1;    

   Bekle_YarimBit(); 
    
   SCL_TRIS = 0; 	 
   SCL = 0;    

   Bekle_YarimBit(); 
   Bekle_YarimBit(); 
} 






void Bekle_YarimBit (void)
{ 
  DelayUs(180); 
} 


void Bekle_CeyrekBit (void)
{ 
  DelayUs(90); 
}



Şuan için sorunsuz çalışıyor hocam.  Çalışmaya devam edeceğim.
Bu arada söylediğiniz kişinin pdf nin çıktısını alıp kitap halinde yaptım. Yanı başımda duruyor. Her zaman o kitaba başvuruyorum.

Yardımlarınız için teşekkür ederim @arslan74 hocam.
Görüşmek dileğiyle...
ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!

arslan74

Merhaba,

Seni tebrik ederim. Acıkcası beni şarıttın diyebilirim. Başaracağını ummamıştım. Demek ki azim edince yapılabiliyormuş.

Başarılarının devamının gelmesi dileğiyle,

BenC

Teşekkür ederim @arslan74 üstad. Daha devamı gelecek. azmin elinden kim kurtulmuş. :) Şimdi de DS18B20 nin protokolü ile meşgulum. O biraz daha karmaşık geldi bana. Tek hat olması biraz da ince ayar istiyor. Tam 15 kez protokolün üzerinden geçtim. Yavaş yavaş çalışma şekli belli olmaya başladı. PBP da olsaydı fazla uğraşmazdım. C ye geçmek için fırsat kolluyordum sonunda geçebildim. PBP nin yüzüne bile bakmıyorum desem yeridir. Sadece eski yazdığım kodlara bakıyorum.

Şuan yaptığım çalışma termo metreli 7 segment taramalı ve bilgisayardan da izlenebilen set edilebilen bir çalışma. Aynısını PBP de yazdım sorunsuz çalışıyor. Birde   aynı çalışmayı C de yazıp burda yayınlayacağım. Belki arkadaşlar  C nin gücünü görebilir. Ve ona göre dil seçerler. Ben seçimimi HITECH C den tarafa kullandım ve şuan diğer derleyicilerle olan farkını gördüm. En büyük farkıda donanıma daha fazla hitap edebildiğimi gördüm. Tabi bu sayede de C dilini kavramaya başladım. Normalde C öğrenmeye kalksam kolay olmazdı ama MCU seviyesinde uğraşınca  bunun yanında elektronik ve PIC ler konusunda yeterince bilgiye sahip olunca KOLAY olmaya başladı.

Neyse hocam ben sizi daha fazla meşgul etmeyeyim. Çalışmaya devam.  :)
Saygılarımla....
ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!