HITECH C de Port Tanımlama NASIL YAPILIR?

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

BenC

arkadaşlar öncelikle merhaba aranıza katılmaktan ve Picproje sitesine üye olmaktan çok memnun kaldım.

daha önc pbp da yazıyordum. Ama yetersiz kaldığı yerler olduğu için tercihimi c den yana değiştirdim. daha öncede c de birkaç bişey yazmıştım ama hitech c ve c konusundaki bilgim fazla değil o nedenle sizden üstadlarımdan bu konuda yardımcı olmalarını istiyorum.

gelelim benim şuan ki sorunuma

****** ana program    anaprg.c  ******

#include <htc.h>
#include <stdio.h>
#include "MyPort.c"

void main(void)
   {
unsigned char  Port;
unsigned char  deger;

     while(1)
       
       TRISB0=0;
       Port=PORTB0; veya Port=RB0;
       deger=1;
       MyLed(Port,deger); <--- burdaki portu nasıl bildirebilirim fonksiyona ???

    }
   




************ fonksiyonun bulunduğu c file MyPort.c*************

MyLed(xport,deger)
{
xport=deger;

}


Soru şu sayın üstadlar, genel amaçlı kullanmayı düşündüğüm bir fonksiyonum var diyelim. Ama bu fonksiyon Pic in portlarını kullanıyor diyelim. Bu fonksiyon ilgili porta ilgili degeri ataması gerekiyor. Bu Fonksiyona hangi portu kullanacağını nasıl bildirebilirim??

Yardımcı olursanız sevinirim.
ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!

Logan

Aramıza hoşgeldin BenC. Kullanmakta olduğun fonksiyon içerisinde "xport" değişkenine atadığın sayıyı switch-case komutunu kullanarak ilgili porta yönlendirebilirsin. Örnek;

void main (void)
{
    myled(1,0x0f);
}

MyLed(xport,deger) 
{ 
  switch (xport)
  {
     case 1:
         PORTA=deger; break; 
     case 2:
         PORTB=deger; break;
     case 3:
         PORTC=deger; break;
     case 4:
         PORTD=deger; break;
     case 5:
         PORTE=deger; break;
   }
}


şeklinde olabilir.
İmza.

arslan74

Merhaba,

Sana örnek kod yolluyorum.

void MyLed(volatile unsigned char *xport,unsigned char bitno, unsigned char bit_val) 
{
	
	if (bit_val == 1)
	{
	//	bitset(*xport,bitno);
		(*xport) |= 1 << (bitno);
	}
	else
	{
	//	bitclr(*xport,bitno);
		(*xport) &= ~(1 << (bitno));
	}
	

}


Fonksiyon cağırısınıda şu şekilde yapabilirsin.

volatile unsigned char * Port;

	Port= &PORTD; // Kullancağın Portu sec.
	

	MyLed(Port,2,0); // İlgili portun 2. bitini bir yap.
	MyLed(Port,2,1); // İlgili portun 2. bitini sıfır yap. 
	MyLed(&PORTE,0,1); // PORTE nin portun 0. bitini bir yap.


Kendim test ettim kod çalışıyor. Yanlız anlatırken genel bir porta birşey yazmak istemişsin gibi anlatmişsin. Ancak kodlarından port'un ilgili pinlerini set veya clear etmek için ilgili örnek bir kod istediğini anladım. Ona göre kod yazdım.

Çalışmalarında başarılar.

BenC

Teşekkür ederim @logan ve @aslan74 . kac gündür ugraşıyordum ama bir türlü Herhangi bir portu değişken gibi tanımlayıp işlem yaptıramadım. normal olarak bir fonksiyondan diğerine gerek pointer veya başka şekilde veri aktarımı yapabildim ama iş fiziksel portları değişken gibi tanımlayıp veri aktarmayı başaramamıştım. teşekürler.
ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!

BenC

@arslan74 hocam vermiş olduğunuz kodu denedim çalıştırdım.  Teşekkür ederim yardımlarınız için.

Bir sorum daha olacak ben PBP da bir portu (örnek: Buton    var  PORTA:2) gidi tanımladığımda  yazılımın herhangi bir yerinde Buton durumunu öğrenebiliyordum. C de ise fonksiyonel yapısı nedeniyle,özelliklede Portlarla ilgili atamaları programın başında atamam gerekiyor gibi (örnek: #define   Buton RA2). C de de aynı şekilde ana programın herhangi bir yerinde (yada herhangi bir fonksiyonda ) Buton atamasını kullanabiliyorum. Sorun şu aynı yukarıda vermiş olduğunuz örnekte olduğu gibi genel amaçlı bir fonksiyonum var diyelim. Ve ben bu fonksiyondan belirttiğim porttaki degeri okuyup vermesini isteyeceğim. 3 saattir uğraşıyorum başka örneklere bakıyorum bir türlü çözemedim. Size vermiş olduğum Led örneğinde ve bu örnekte portu PORT ve BIT olarak değilde aynen değişken şekilde nasıl tanımlayabilirim. (RA2 veya PORTA2) gibi. yapmak istediğim şu programın değişik yerlerinde fonksiyonu çağırıp ilgileneciğin port şu bana değerini ver. Bunu nasıl yapabilirim.  
(Global Olarak Tanımlıyorum)
volatile unsigned char Buton;

şeklinde tanımlayıp daha sonra herhangi bir yerde

Buton=RA2; veya Buton=PORTA2;  gibi atama yapıyorum fakat olmuyor.

Sorun ne olabilir.
Şimdiden yardımlarınız için teşekkür ederim.
Saygılarımla..
ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!

arslan74

Merhaba,

Sanırsam sen olaya cok farklı yaklaşiyorsun. O yüzden problemi çözmen de zorlaşiyor. Bu kadar uzun yazından anladığım kadarıyla senin yapmak istediğin. bir fonksiyonla hangi tuşa basılmış ise o tuş değerini elde etmek istiyorsun. Doğru mu anladım. O zaman bu kadar karışık göstermene gerek yok. Yapmak istediğini belirtirsen sana daha iyi yol gösteririz. Baştan yanlış yerler de uğraşmamış olursun.

Sorunun cevabına gelince:

Ben daha önceleri burada eğitim dökümanı yayınlamıştım onları inceleyiniz. Ayrıca forumda tuş okuma diye aratırsanız bununla ilgili cok ayrıntılı bilgilere ulaşabilirsiniz.

Eğer bulamasanız o zaman bunu belirtin. Size yardımcı olalım.

Çalışmalarınızda başarılar.

BenC

hocam benim asıl yapmak istediğim portları okuyabilecek veya portlara yazabilecek bir fonksiyon yazmak. burdaki asıl sorunum. fonksiyon içerisinde öyle bir değişken tanımlayım ki ana programdan bu fonksiyonun bu değişkenine atama yapmak. Yani kullanmak istediğim bu fonksiyonu ana programın  değişik yerlerinden değişik Portlarla çağırıp işlem yaptırmak. Sizin eğitim bölümünde verdiğiniz örnekleri inceledim. çoğunluğunda da sizin vermiş olduğunuz bilgilerden faydalanıyorum. Ama ordakilerde buna benzer birşeye rastlamadım. Neyse ben biraz daha araştırma yapayım hocam. Teşekkür ederim
ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!

arslan74

Alıntı yapılan: "BenC"hocam benim asıl yapmak istediğim portları okuyabilecek veya portlara yazabilecek bir fonksiyon yazmak. burdaki asıl sorunum. fonksiyon içerisinde öyle bir değişken tanımlayım ki ana programdan bu fonksiyonun bu değişkenine atama yapmak. Yani kullanmak istediğim bu fonksiyonu ana programın  değişik yerlerinden değişik Portlarla çağırıp işlem yaptırmak. Sizin eğitim bölümünde verdiğiniz örnekleri inceledim. çoğunluğunda da sizin vermiş olduğunuz bilgilerden faydalanıyorum. Ama ordakilerde buna benzer birşeye rastlamadım. Neyse ben biraz daha araştırma yapayım hocam. Teşekkür ederim

Merhaba,

Benim anlamadığım asıl konu şu. Böyle birşeyi bir amac için yapmak istiyorsundur. Bunu neden istediğinin amacını hala anlamış değilim. Örnekle acıklarsanız Amacınızı daha iyi anlamış olurum. Programcılığın birinci temeli; olayları kurgulamak ve sonra onu koda aktarmakdır. Sizin kurgunuzu anlamış değilim. Kullanım amacınızı anlarsam olayı cözebiliriz.

Selamlar

BenC

hocam amacım Hitech C yi (daha doğrusu C'yi) öğrenmek. C nin fonksiyonel yapısı Basic ten daha güzel. Bu da benim çok hoşuma gidiyor. Burdaki asıl yapmak istediğim konu; örnek vererek anlatayım, DS1307 saat entegresinden zaman verilerini almak istiyorum diyelim. Sonucta bu entegrenin bir iletişim protokolü var. Bende bu protokolü biliyorum diyelim. Sadece bu DS1307 için kütüphane oluşturayım diyorum. Buna benzer birsürü cihazın vs nin kütüphanesini oluşturup ileriki zamanlarımda bunu hem ben hemde merak eden arkadaşlarım kullansın istiyorum. Bir bakıma CCS gibi hazır kütüphaneler oluşturmak. Eminim incelemişsinizdir orda birçok cihaza ait kütüphaneler mevcut. Ama geri planda nasıl çalıştığını ne kadar yer kapladığını,güvenirliliğini vs bilemiyoruz. Bu da yazdığınız kodun sizin elinizde değilde başkalarının elinde olması gibi bişey. Bende böyle olmasını istemiyorum. Pic te kullandığım bir kaç özellik varki bunları genelde bütün yazdığım kodlarda kullanıyorum. hepsini tek tek yeniden yazmaktansa c deki gibi kütüphane oluşturup kullanmak. Mesela Picin PC ile haberleşmesi,DS1307,DS18B20,LCD vs vs uzayıp gidiyor.

Şimdilik ilk etapta DS1307 ile başladım. Bunun için öyle bir fonksiyon yazayım ki. Kullanacağım zaman sadece Bağlı olduğun port şu bana zaman verilerini ver(veya Saatini şu zamana ayarladım) diyebileyim. Burdaki ilk sorunum Port=Şu diyebilmek. Ana programda DS1307 portları şunlar diye tanımlayıp işi halledebiliyorum ama eğer iki adet ds1307 varsa ne yapacağım her ikisi içinde aynı fonksiyonu tekrar takrar yazmak mı zorundayım. yoksa birtane fonksiyon yazıp sadec bağlı olduğu portları değişken yapıp kullanmak mı daha iyi.
Şöyle özetleyeyim. Yaptığınız kartta 2 adet DS1307 var. (Niye var diye sormayın :) konunun anlaşılması için) . Sizde ds1307 için bir fonksiyon(okuma yazma vs) yazdınız diyelim.  Bu tek fonksiyonu her iki DS1307 için nasıl kullanırdınız? Veya aynı fonksiyonu sadece port bilgilerini değiştirip iki kez mi yazardınız?

Yapmak istediğim;


#define PortDS1307A PORTB2;
#define PortDS1307B PORTC3;
....
......
......
........
Port=PortDS1307A
DS1307OKU(Port,Veri) ' Bu birinci DS1307
............
.......
....
Port=PortDS1307B
DS1307OKU(Port,Veri)' Bu da ikinci DS1307

bu.

Hagi portu kullanacağını fonksiyona bildirmek. Ama PIC portlarını değişken gibi tanımlayıp yaptıramadım. Sizin verdiğiniz örnek hariç. Sorunum bu.
ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!

M_B

Merhaba BenC  
DS1307  RTC entegresi i2c (SDA ,SCL )  protokolu ile çalışan bir entegre.
Onceliklle i2c sistemini araştırıp ögrenmeni öneririm.
1 den fazla DS1307 yi de sonra istersen SDA ve SCL ( Port ayaklarını ) bir sivic entegresine baglarsın. bir baska pin lede cıkısı yonlendırırsın.
Normalde i2c  protokolu ile çalışan entegrelerin kendi bünyeside adresleri ve ayriyeten de dısardan adresi degiştirmek için 1-2 tanede adres secme pinleri olur.  

Kolay gelsin.
M_B
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

arslan74

Merhaba,

Sizin yapmak istediğiniz biraz anladım gibi. Ancak bazı hata veya gözardı ettiğiniz noktalar olduğunu düşünüyorum. En başta yazdığınız program doğrudan PIC e yükleyip çalıştıracak şekilde kod yaziyoruz. Yani içinde bir işletim sistemi yok. Dolaysıyla tanımlamalarımızı en başta sabit yapmamızda hiç bir hata yok ve bence daha doğru olur. Acıklamak gerekirse programı yazmadan önce örneğin DS1307 için bacaklarının neyere bağlanacağını baştan belirtirsin. Yani programın ortasında saat entegresini cıkartib başka bir yere takmassın diye düşünüyorum. O herzaman tasarladığın karta sabit olarak kalır. O yüzden çalışma zamanında bunun hangi bacaklara bağlanacağını belirlemek gereksiz bir lüks ve PIC için extra bir program maliyeti getirmekten başka bir işe yaramaz.

Gelelim diğer problemine.
Alıntı Yap
Şöyle özetleyeyim. Yaptığınız kartta 2 adet DS1307 var. (Niye var diye sormayın  konunun anlaşılması için) . Sizde ds1307 için bir fonksiyon(okuma yazma vs) yazdınız diyelim. Bu tek fonksiyonu her iki DS1307 için nasıl kullanırdınız? Veya aynı fonksiyonu sadece port bilgilerini değiştirip iki kez mi yazardınız?

Bunun birkaç çözümü olabilir. Akla gelen en basid çözüm sizin belirtiğiniz gibi geliyor. Ancak kod acısından sağlıklı değil. Genel amaclı bir kod yazmak daha mantıklı gibi gözüküyor. Bunun için en başta donanımsal tasarımı iyi bilmek ve doğru bir donanımsal tasarım yapmak gerekir.
Şimdi Ds1307 IIC haberleşme prokololünü kullaniyor. Bu prokololü Philips geliritridi. En büyük avantajı tek bir hatta bir sürü cihaz bağlayabiliyorsunuz. Herbir cihazın kendine ait adres bilgisi var. Hangi cihazla haberleşme istiyorsan yapman gereken sadece IIC haberleşme cihazın adres bilgisini girmektir. O zaman doğrudan adresi belirtiğin cihazla konuşmuş olursun. Bunun için NXP'in web sitesinde IIC haberleşmesini anlatan dökümanları ve kullandığınız IC nin datasheetlerinde daha ayrıntılı bilgi vardir. Ancak aynı devre de iki tane DS1307 kullanmak tasarım hatası gibi gözüküyor ama iki veya daha fazla 24C16 veya DS1307 ile 24C16'yı tek bir hatta bağlandığınzda bunun için iki tane farklı IIC protokolü hazırlamanız gerekmemektedir. Sadece DS1307 haberleşeceğınız zaman onun adresini belirteceksiniz.  24C16 ile haberleşeceğınız zaman onun onun adresini IIC haberleşmesinde kullanmanız yeterli olur.

Program şeması şöyle birşey olmalı.
     IIC haberleşme protokolü
        |          |         |
     DS1307      24C16     24C16

Gibi bir şey daha mantıklıdır.

DS1307 haberleşme protokolünü yazmadan önce sizin yazmanız gereken IIC haberleşmeşmisini yazmakdir.

IIC haberleşme prokolünü iki şekilde yazabilirsin.
1) Bazı PIClerin içinde donanımsal IIC haberleşme donanıma sahib. Bu donanımı kullanarak cok dah basid IIC haberleşmesi yapabliyorsun.
2)Yada kendin istediğin bir portla yazılımsal IIC haberleşesini yazabilirsin. Bu yazılım olarak seni ilk başta zorlayabilir. PIC donanımı kullanırsan kod acısından daha basit bir kod yazmış olursun.
Ancak ben 16F877 de IIC donımsal iç yapısını çalıtırmayı başaramamıştım. Onun yerine yazılımsal IIC haberleşmesi yapmıştım.


Bu yazdıklarımı yaparsan sonrası kendiliğinden gelecektir.

Umarım bu bilgiler sizin için yeterince aydınlatıcı olmuştur.

BenC

@arslan74 hocam yardımcı olduğunuz için teşekkür ederim. Sanırım ne yapmak istediğimi size anlatabildim....

Alıntı yapılan: "arslan74"Acıklamak gerekirse programı yazmadan önce örneğin DS1307 için bacaklarının neyere bağlanacağını baştan belirtirsin. Yani programın ortasında saat entegresini cıkartib başka bir yere takmassın diye düşünüyorum. O herzaman tasarladığın karta sabit olarak kalır. O yüzden çalışma zamanında bunun hangi bacaklara bağlanacağını belirlemek gereksiz bir lüks ve PIC için extra bir program maliyeti getirmekten başka bir işe yaramaz.


Evet haklısınız kartı birkez tasarlayacağım. Gerek Ds1307 gerekse de Pic portları baştan biliniyor. Daha sonra kartta donanımsal bişey yapmayacağım. Benim değişkenlik özelliği gösterecek olan ise sadece Fonksiyonum olacak. Aynı fonksiyonu parametreleri (Portlarla ilgili olanı) değiştirerek farklı I2C de kullanmak. Burdaki niyetim aynı fonksiyonu aynı protokole sahip birden fazla cihaz için tekrar tekrar YAZMAMAK.

Şimdilik sizin yayınlamış olduğunuz eğitim dokümanlarını inceliyorum hocam. İlk halletmem gereken Bu değişken PORT kullanan basit bir fonksiyon yazmak. Daha sonra I2C protokolü geliyor.

C de yeniyim, o nedenle ilk başta C nin sözdizimini vs ni öğrenmem gerek. Protokol vs için henüz erken. :)
ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!

BenC

@arslan74 hocam denemelere başladım.

Bu yazdığım kodda hata veriyor.

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


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


#ifndef XTAL
  #define XTAL 20000000
#endif

#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   ButUP	    RE0      
#define   ButDOWN	RE1      
#define   ButSET	RE2  

volatile unsigned char *LedPort; 
unsigned char   LedPortBit;


void MyLed(unsigned char *Port,unsigned char Pin,unsigned char Deger)

{

volatile   bit  XPORT    @ (unsigned)&(*Port)*8+Pin;   

  if (xDeger == 1) 
   { 
   
	XPORT = 1;

   //   bitset(*xport,bitno); 
   //  (* xPORT) |= 1 << (xPIN); 
   } 
   else 
   { 
   
   XPORT=0;

    //   bitclr(*xport,bitno); 
   //   (* xPORT) &= ~(1 << (xPIN)); 
   } 
    

}



void main(void)
	
	{

   INTCON=0b00000000;
   ADCON1= 0b00000110;	
   TRISD = 0b00000000;
   TRISB = 0b00000000;
   TRISE0 = 0x01;
   TRISE1 = 0x01;
   TRISE2 = 0x01;
 		
        while(1)

               {
 	
                 LedPort=&PORTB;
                 LedPortBit=2;
            
			     MyLed(LedPort,LedPortBit,1);
			
			     DelayBigMs(500);
            
			     MyLed(LedPort,LedPortBit,0);
            
			     DelayBigMs(500);
		
				}



	}



Hocam derlediğimde

Error   [314] D:\PROJECTS\SAAT\C\MainSaat.c; 76.20 ";" expected


hatasını alıyorum. TXPORT u tanımladığım yerden hata mesajı veriyor. Üstelik deyimin sonunda ";" işaretini koyduğum halde. Sebep nedir sizce???
ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!

arslan74

Merhaba,

Beni yanlış anlamayın ama size bir tavsiyede bulunmak istiyorum. Hi-Tech C öğrenmeden önce normal C yi en başta öğrenmeniz lazım. Gördüğüm kadarıyla sizin C bilginiz cok az. Bu bilgilerle birşeyler yapmanız cok zor olur. Fazla C bilgisine gerek kalmadan program yazmak istiyorsanız o zaman CCS veya MicroC gibi herşeyi hazır derleyicileri kullanmanızı tavsiye ediyorum.

Eğer C bilginiz iyi ise Hi-Tech tercih etmenizi şiddetle tavsiye ederdim. Ama fazla C bilgisi olmayana CCS veya MicroC'yi tavsiye edebilirim. İçinde bircok şeyi hazırlamışlar size sadece onu alıb kullanmak kalıyor. Ama kodların içini göremiyorsunuz. Sadece Header kısmında acıklamardan veya help den yaralanabiliyorsunuz.

Ama eğer C yi cok iyi birşekilde öğrenmek istiyorsanız size Tavsiyem C Kursu veren yerler var onlara gidin.

Örneğin, İstanbul'da C derneği var cok iyi C yi öğretiyorlar. Size tavsiyem bu kurslara gidin. Yok ben kendi başıma öğrenmek istiyorum diyorsanız o kısım cok zor oluyor, ama azim ederseniz başarabilirsiniz. İyi bir C kitabı alın Onu baştan sona kadar okuyun ve örneklerin hepsini yapın. C kitabı konusunda ben Daha önceleri acıklama yapmıştım ve hatta bu sitede bazı kitabları yayınlamıştım. forumun arama kısmını kullanırsanız istediğiniz bilgilere ulaşabilirsiniz.

Selamlar,





Neden böyle dediğimi acıklayım ki yanlış anlalışmasın.

Hatalar:
1.
volatile   bit  XPORT    @ (unsigned)&(*Port)*8+Pin;    


Bu kod hatalı olduğunu bütün C bilenler bilir. Nedeni, tanımlamayı çalışma zamanında yapamassın. Derleyici ilgilendiren bir konudur. Derleyiciye baştan sabit bir değerle belirtmelisin.

2.
if (xDeger == 1)


Bu xDeger dediğin nedir hiçbiryerde. tanımlamamışsın.

3.
if (xDeger == 1) 
   { 
    
   XPORT = 1; 

   //   bitset(*xport,bitno); 
   //  (* xPORT) |= 1 << (xPIN); 
   } 
   else 
   { 
    
   XPORT=0; 

    //   bitclr(*xport,bitno); 
   //   (* xPORT) &= ~(1 << (xPIN)); 
   }


Burada xDeger'in ne olduğunu bilmediğimiz bir sorgusu yapılmış. Ona görede XPORT set etmişsin. Burada ki kuulanım amaclarını anlamış değilim.

BenC

Haklısınız hocam. C bilgim çok iyi değil. Birde bunun üzerine Basic gibi bir dilden C gibi bir dile geçiorsanız öğrenmeniz ( oturmuş kalıpları değiştirmek) çok zor.

Ama azim ettim C yi öğreneceğim. Kurs olayı malesef şimdilik düşünmüyorum. Söylemiş olduğunuz C derneğini yakından takip ediyorum Ankarada olmadığı için katılamıyorum o kursa. Ankarada da iyi bir şekilde Standart C yi öğretecek bir yer varmı bilmiyorum bir ara araştırmıştım faso fiso yani. İş başa düştü, kendim bir şekilde öğreneceğim.

Kaynak dokümanlarım fazlasıyla var. Ama tripleri vs leri oluyor malum. hoca olmayınca da onları öğrenmek zahmetli oluyor zaman alıyor. Sizin yazdığınız yazıları takip ediyorum. Gayet memnunum.

Hazır yeri gelmişken bişey soracağım hocam.

https://www.picproje.org/index.php/topic,18861&highlight=i2c linkinde vermiş olduğunuz kodda bişey dikkatimi çekti.


void set_clk_low ( void ){ 
    
   SCL = 0;    
   SCL_TRIS = 0; 
    
}


burda portu 0 veya 1 yapmak için önce o portu yönlendirmesini ayarlamamız gerekmiyor mu?

sizin yazdığınız kodda ise tam tersi. Burdaki maksat nedir. Biraz kafam karıştı hocam.
ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!