Hi-Tech Ile Pic Program Lama

Embed Size (px)

Citation preview

n Sz Antik Yunanda ilk kehribarn maddeleri ekmesiyle balayan elektrik serveni tarih iinde bir ok deiik formda bulunmu, deimi, evrim geirmitir. Galvani, Volta, Faraday, Amper ve Ohmun katklaryla bilimsel alanda nemi artmaya balayan elektrik, her dnem kendinden sz ettirmeyi baarmtr. O kadar ki zamann Amerikan bakan Benjamin Franklinden de katklar almtr. 19. ve 20. yzyllarda altn an yaayan elektrik zellikle Tesla, Morse, Edison ve Bellin katklaryla bambaka bir yolda ilerlemeye balamtr. zellikle 2. Dnya savandan sonra g yarnda belirleyici olan enerji faktrnn en nemli esi olan elektrik, 50lerden sonra Shockley ve grubunun transistor bulmasyla bilim adamlarna ve kullanclara bambaka dnyalar aralamtr. zellikle 60 ve 70li yllardan sonra muazzam bir ykselie geen elektronik bylelikle, elektrikten konu itibariyle ayrlmtr, fakat her ne olursa olsun birbirlerinin siyam ikizi olmalarn engelleyememilerdir. Gnmze yaklatka transistorlerin belirli dizilimlerini kullancnn deitirebilmesiyle gelien elektronik 80lerin sonuna doru yeni bir yapy oluturacakt: Mikrodenetleyiciler. Dnya mikrodenetleyici firmalarnn banda gelen Microchipin Pic adn verdii mikrodenetleyiciyi anlatmay planladm derslerde zellikle 1972den bu yana sistem dili olarak kullanlan C temel alnacak, microchipin yakn tarihte satn ald Hi-Tech Pic C derleyicisi zerinde rnekler verilecektir. Frat Deveci Austos 2009 [email protected] Elektrik ve elektronie gnl veren herkese

FxDev.org

Sayfa 1

BLM 1 PIC GR IKI AYARLARI, LED, DOT MATRS VE SEVEN SEGMENT UYGULAMALARI1.1) Hi-Techte Yeni Proje Oluturmak Pic programlamaya balamadan nce ksaca kullanacamz program hakknda bilgi vermek istiyorum. Hi-Tech, Microchipin kullanclara sunduu bir derleyicidir. Tek bana bu derleyici kullanmak mmkn deildir. Onun iin mutlaka bir program yazm editrne ihtiya vardr. Bunun iin en ok kullanlan ara yz programlar ise MPLAB ve Hi-Tidedr. Ben uygulama yaparken zellikle grsel adan ho, kullanmas kola, daha nce program yazanlarn alk olduu Eclipsein bir uyarlamas olan Hi-Tide arayzn kullanacam. Bu derleyici kullanmak isterseniz sitesinden cretsiz indirebilirsiniz. Hi-Tideda proje oluturmak iin ncelikle File/New/Project sekmelerine baslr. Karmza ekil-1 deki gibi bir ekran kmas gerekir. Burada daha nce yklediimiz Hi-Tech versiyonlarn grmemiz mmkndr.

ekil 1 Ykl Derleyiciler

Buraya next dedikten sonra asl derleyicinin seilecei blme gelinir. Biz 16f serisi picler zerine alacamz iin ekil-2de grlen PICC STD (9.60 PL2) seilir. Eer daha st versiyonlar kullanyorsanz yine ayn ekilde yklediiniz derleyiciyi seerek next dememiz yeterli olacaktr.

FxDev.org

Sayfa 2

ekil 2 - Derleyici Seim Ksm

Bu blmden sonra projemizi bilgisayarmzda nereye oluturmak istediimize dair bir pencere bizleri karlayacaktr. Dilediiniz yeri setikten sonra ekil-3teki ekrana da next demeniz yeterli olacaktr.

ekil 3 - Proje Oluturacamz Yeri Seme Ekran

FxDev.org

Sayfa 3

Bu blmden sonra aadaki ekrana next dememiz ve ekil-4teki blme gelmemiz gerekmektedir. Bu blm, bu ksmdaki en can alc noktadr. Hangi pic ile alacaksak onu bu blmden seip next dememiz gerekmektedir. Ben dersler iinde bir tutarllk olmas dolaysyla 16f877a ile almay uygun gryorum. Listeden bu pici seip next diyoruz.

ekil 4 - Pic Seim alan

Daha sonraki blmde ekil-5te grlecei gibi kullandmz picin paket yapsn sememiz gerekmektedir. Bizim kullandmz picler genelde DIP soket olduundan 40DIPi seip finish diyoruz.

ekil 5 - Pic zellikleri ve Paket Yaps

FxDev.org

Sayfa 4

ekil-5teki blme finish dediimizde main dosyamz kendiliinden oluacak ve artk kod yazmaya hazr hale gelecektir.

1.2) Hi-Techde lk Proje lk uygulama olarak klasik led yakp sndrme ilemini yapacaz. ekil-6daki gibi Proteusta devremizi oluturuyoruz.

ekil 6 - lk Deneyimiz

Devremizi oluturduktan sonra ncelikle gecikme yaratarak, ayn zamanda yava yava Cde ilemlerin nasl yrdne dair rnek vereceiz. Gecikme ktphanemiz olan delay.h ve delay.c dosyalarn Program Files\HI-TECH Software\PICC\STD\9.60\samples\delay klasrnden alp (siz derleyiciyi nereye kurduysanz oradan alnz) projemizi oluturduumuz klasrn iine atyoruz. Bu dosyalar proje klasrmze ekledikten sonra Hi-Tide ekranndan proje ismine gelip ekil-7deki gibi refresh yapmamz gerekmektedir.

FxDev.org

Sayfa 5

ekil 7 - Refresh Yapacamz Yer

Bu dosyalarn ne ie yaradna gelince; Cnin en byk zelliklerinden biri ktphane oluturabilmemizdir. Eer bu iki dosyay ap bakarsanz kullanacamz gecikmelerin eitli ifadelerle salandn greceksiniz. Daha sonra kendimiz ktphane oluturduumuzda bu konuyu daha kolay anlayacaksnz fakat imdilik dosyalar oraya atmakla yetinelim. Burada dikkat edilmesi gereken bir konu da delay.h doyas iindeki #define Xtal_FREQ 4MHZ yazan ksmdr; burada setiimiz kristale gre 4MHZ ksmn 8MHZ, 16MHZ eklinde deitirebilirsiniz. Fakat kristal deeriniz 4Mhz ise o ksma dokunmayabilirsiniz. Tm bunlardan sonra artk kodumuzu yazmaya geebiliriz, ilem olarak ledin her yarm saniye de bir yanp snmesi olayn C koduyla gerekletirelim.

FxDev.org

Sayfa 6

#include #include "delay.h"

// Gecikme yaratacak ktphane

void main(void) // Ana fonksiyon alan { TRISB=0x00; // PORTB k olarak ynlendiriliyor PORTB=0x00; // PORTB'nin tm klar sfrlanyor while (1) // Sonsuz dngye giriliyor { RB0=1; // Led yanacak DelayMs(250);DelayMs(250); // Yarm saniye beklenecek RB0=0; // Led snecek DelayMs(250);DelayMs(250); // Yarm saniye beklenecek } }

Kodlarmz ekildeki gibi yazdmzda save tuuna basarak .hex dosyamz oluturmu olacaz. .hex dosyamz proje klasrnde bulunan Release klasrnn iinde olacaktr. Proteustan bu dosyay alp altrdmzda yarm saniyede bir ledin yanp sndn greceksiniz. 1.3) Buton ile Led Kontrol imdi ise devremize bir buton balayarak bastmzda ledin yanmasn, ektiimizde de ledin snmesini salayalm. Bunun iin Proteusta ekil-8deki devreyi kuralm.

ekil 8 - Led Yakp Sndrme Uygulamas Devresi

Bu devrede delay.h ve delay.c dosyalarmz kullanmayacamz iin proje klasrnden silebilirsiniz. Unutmayn ki gereksiz her ktphane ve fonksiyon picde bo yer kaplayacaktr. stediimiz ilemi yapan C kodunu aadaki tabloda grebilirsiniz.

FxDev.org

Sayfa 7

#include void main(void) { ADCON1=0x07; TRISA=0x01; TRISB=0x00; PORTB=0x00; PORTA=0x00; for(;;) { RB0=RA0; } } // Ana fonksiyon alan // // // // // // PORTA dijital olarak ynlendiriliyor RA0 giri olarak ynlendiriliyor PORTB k olarak ynlendiriliyor PORTB'nin tm klar sfrlanyor PORTA'nn tm klar sfrlanyor Sonsuz dngye giriliyor

// RB0 k RA0 giriine eitleniyor

C programlama dilinde sonsuz dngye while(1) eklinde girilebilecei gibi for(;;) eklinde de girilebilir. Ayrca yine bir ok yolla sonsuz dngye girmek de mmkndr. Yukardaki kodlarda ilgin grlebilecek ADCON1, PORTA portunu dijital giri k yapmaya izin verir. Eer bunu yapmasaydk PORTA analog olacak ve dijital olarak giri ve k ilemleri yapamayacaktk. Ayrntl bilgi iin ltfen datasheete ve ileride anlatacamz ADC konusuna gz atnz. 1.4) Karaimek Uygulamas Bu uygulamamzda ise nl Kara imek dizisindeki Kitin nnde bulunan led animasyonunu gerekletireceiz. Ayrca Cnin eitli zelliklerini de bu uygulamamzda grmek maksadyla kodlar biraz daha karmaklatracaz. Devremizi ekil-9daki gibi proteusta kuralm.

ekil 9 - Karaimek Devresi

FxDev.org

Sayfa 8

#include #include "delay.h"

// Gecikme ktphanesi

void main(void) // Ana fonksiyon alan { char led=1; // led eklinde bir sabit tanmlanyor TRISB=0x00; // PORTB k olarak ynlendiriliyor PORTB=0x00; // PORTB'nin tm klar sfrlanyor for(;;) // Sonsuz dngye giriliyor { PORTB=led; // PORTB led deikenine eitleniyor led=led1; // led birimi bir saa kaydrlyor DelayMs(100); // 100ms bekleniyor if(led==0x01) // Eer PORTB=0x01 olursa ikinci sonsuz dngden break; // birinci sonsuz dngye giriliyor } } } }

C kodunda girilen break kodu ierisinde bulunan dngden kmaya yarayan bir C kodudur. leriki derslerde baz uygulamalarda bu kodun olduka yararl olduunu greceksiniz. 1.5) Seven Segment Gsterimi, 0-9 ve 00-99 Sayc Birok uygulamada kullanlan seven segmentler esasen bir araya getirilmi 7 ledden oluur. ekil-10da tek bir seven segmentin balant ekli gzkmektedir.

ekil 10 - Seven Segment

Ben genelde ortak katot seven segment kullanmay tercih ediyorum ve kodlarm buna gre yazyorum. ekil-10da da grlecei zere baz saylar ve harfleri karmak iin eitli kombinasyonlarda ledleri yakmak gerekmektedir. Bu konuda da Cnin bir dier gzel zellii olan diziyi kullanmak yazacamz kod iin gayet kullanl olacaktr.FxDev.org Sayfa 9

Kullanacamz diziyi u ekilde tanmlayabiliriz; const unsigned char segment[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; Bu diziyi tanmladktan sonra devremizi 0dan 9a ve tekrar 0a saydracak ekil-11deki devreyi kurduktan sonra C kodumuzu yazalm.

ekil 11 - 0-9 Sayc

Aadaki C kodunda constant deeri Cde sabitler iin kullanlan bir metottur. Genel itibari ile segment[0] seven segmentte 0 deerini gsteren dizi deeri, segment[1] seven segmentte 1 deerini gsteren dizi deeridir. Tm dizi deerleri bu ekilde ayarlanmtr.#include #include "delay.h" // Gecikme ktphanesi

const unsigned char segment[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; void main(void) // Ana fonksiyon alan { char i; // Herhangi bir deiken tanmlanyor TRISB=0x00; // PORTB k olarak ynlendiriliyor PORTB=0x00; // PORTB'nin tm klar sfrlanyor for(;;) // Sonsuz dngye giriliyor { PORTB=segment[i]; // Seven segment deerleri alnyor i++; // i bir artrlyor DelayMs(250); // 250ms bekleniyor if(i>9) // Eer say 9'dan byk ise 0'a dn i=0; // Deiken 0 yaplyor } }

ekildeki rnei yaptktan sonra tarama metodunu retmek maksadyla 00-99 sayc devresini ekil-12deki gibi tasarlayalm. Bu tasarmda sayma ilemini aa ve yukar butonlarn da katarak etkinlik katalm.

FxDev.org

Sayfa 10

ekil 12 - 00-99 Sayc Devresi

ekil-12deki devreyi kurduktan sonra C kodumuzu yazalm.#include #include "delay.h" // Gecikme ktphanesi

const unsigned char segment[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; void sayi_goster(char i) { PORTC=0x02; PORTB=segment[i/10]; DelayMs(5); PORTC=0x01; PORTB=segment[i%10]; DelayMs(5); } // Say gstermeye yarayan fonksiyon // // // // // // PORTC'de 2 deeri gnderiliyor i'nin 10'a blm gsteriliyor 5ms bekleniyor PORTC'de 1 deeri gnderiliyor i'nin 10'a blmnden kalan gsteriliyor 5ms bekleniyor

void main(void) // Ana fonksiyon alan { int i; // Herhangi bir deiken tanmlanyor ADCON1=0x07; // PORTA dijital yaplyor TRISA=0x03; // PORTA'nn ilk iki pini giri TRISB=0x00; // PORTB k olarak ynlendiriliyor TRISC=0x00; // PORTC k yaplyor PORTA=0x00; // PORTA'nin tm klar sfrlanyor PORTB=0x00; // PORTB'nin tm klar sfrlanyor PORTC=0x00; // PORTC'nin tm klar sfrlanyor for(;;) // Sonsuz dngye giriliyor { if(RA0==0) // RA0'pini 0 m? { while(!RA0); // Buton brakld m diye baklyor i++; // Deiken artrlyor if(i>99) // Eer deiken 99'dan bykse 0 oluyor i=0;

FxDev.org

Sayfa 11

} else if(RA1==0) { while(!RA1); i--; if(iIDLE: 0, IDLE->IDLE':1

extern void spi_init(void); extern void spi_write(unsigned char veri); extern unsigned char spi_read(unsigned char veri);

FxDev.org

Sayfa 69

lk yaplacak ayarlar gz nne yazlan spi.c ise aadaki gibi olacaktr.#include #include "spi.h" void spi_init(void) { //SSPSTAT->SMP,CKE,BF //SSPCON1->WCOL,SSPOV,SSPEN,CKP,SSPM3:SSPM0 SMP=1; SSPBUF=0; BF=0; // Data 8. bitten sonra alnyor // SSPBUF siliniyor. // SSPBUF bo

if(TRANSFER==1) // Transfer aktiften IDLE durumuna geerken olacak CKE=1; else // Transfer IDLE'dan aktif durumuna geerken olacak CKE=0; if(IDLE==1) // IDLE durumun yksek mi dk m olduu belirleniyor CKP=1; else CKP=0; WCOL=0; //Bata alm veya gnderim hatalarnn olmad varsaylyor SSPOV=0; /* Clock 0101: 0100: 0011: 0010: 0001: 0000: */ SSPM3=0; SSPM2=0; SSPM1=1; SSPM0=0; SSPEN=1; } void spi_write(unsigned { BF=0; SSPBUF=veri; while(!BF); } char veri) //BF sfrlanyor //BF=1, SSPBUF dolu //SSPBUF '0' oluncaya kadar bekleniyor // Fosc/64 hz SPI SPI SPI SPI SPI SPI ayar yaplyor... Slave, SS disabled Slave, SS enabled Master, Clk=TMR2/2 Master, Clk=Fosc/64 Master, Clk=Fosc/16 Master, Clk=Fosc/4

//SCK, SDO, SDI, SS ser port pini oldu

unsigned char spi_read(unsigned char veri) { BF=0; //BF sfrlanyor SSPBUF=veri; //SCK gndermek iin tanmlanmam kod gnderiliyor while(!BF); return SSPBUF; }

FxDev.org

Sayfa 70

Burada dikkat edilmesi gereken nokta SSPBUFa yazlan deerlerdedir. SSPBUFa gnderilmek istenen deerler yazld an SPI birimi ayarlamalarmza gre kendi saat sinyalini, IDLE durumunu belirleyerek iletiimi kuracaktr. Alm modunda SSPBUFa veri yazlmasnn nedeni ise yeni bilginin alnmas iin gerekli olan saat sinyalini oluturmaktr. 7.1.1) TC72 ile SPI Uygulamas Bu uygulamada Microchip firmasna ait olan TC72 SPI scaklk sensrn kullanacaz. ekil-60 da DIP soket yaps grlebilecek TC72 scaklk sensr yaklak 7,5MHza kadar kabilen iletiim hzna ve 10 bit znrle sahiptir.

ekil 60 TC72 Pin Yaps

TC72nin yazma okuma zaman tablosu da ekil-61deki gibidir. Bu tablolar datasheetten bire bir alnmtr.

ekil 61 25LC640 Zaman Diyagramlar

FxDev.org

Sayfa 71

ekil-61den de grlecei zere TC72nin IDLE durumu dk seviyededir. Tm bit yazm gnderimleri ise den kenarda gereklemektedir. Bunu spi.h ktphane balk dosyasnda belirtmemiz gerekmektedir. Tm okuma ya da yazm ilemlerinden nce TC72ye belirli komutlar gnderilmelidir. Bu komutlar ekil-62de listelenmitir.

ekil 62 TC72 Komutlar

Tm bunlar dikkate alarak TC72den veri okumak iin; - 0x80 ile kontrol byte olarak 0x04 gnderilerek sensr alr. - Adres bilgisi gnderilir (0x02) - Sonra srasyla scaklk ve kontrol bilgileri alnr. Biz bu uygulamamzda harici TC72 ile scaklk deerini lerek TC72nin kontrol kaydedicisinin deerini LCDde greceiz. ncelikle ekil-63teki devreyi kuruyoruz.

ekil 63 TC72 Uygulamas

FxDev.org

Sayfa 72

stediimizi gerekletiren Hi-Tech kodu ise aadaki gibidir.#include #include #include #include "delay.h" // Gecikme ktphanesi tanmlanyor "lcd.h" // LCD ktphanesi tanmlanyor "spi.h" // SPI ktphanesi tanmlanyor

#define CE RC6 void tc72_init(void) { spi_init(); CE=1; spi_write(0x80); spi_write(0x04); CE=0; } //TC72 ilk yklemeleri yaplyor

void tc72(unsigned char *msb, unsigned char *lsb, unsigned char *control) { CE=1; spi_write(0x02); *msb=spi_read(0xFF); *lsb=spi_read(0xFF); *control=spi_read(0xFF); CE=0; } void main(void) // Ana fonksiyon alan { unsigned char onlar, ondalar, control; TRISB=0x00; // LCD iin k TRISC=0x10; CE=0; lcd_init(); tc72_init(); // LCD ilk ayarlar yaplyor // SPI ilk ayarlar yaplyor

lcd_yaz("Sicaklik:"); for(;;) { lcd_gotoxy(1,11); tc72(&onlar, &ondalar, &control); veri_yolla(onlar/100+48); veri_yolla((onlar%100)/10+48); veri_yolla(onlar%10+48); veri_yolla(0xDF); veri_yolla('C'); lcd_gotoxy(2,1); lcd_yaz("Control : "); veri_yolla(control/16+48); veri_yolla(control%16+48); veri_yolla('H'); } }

// Scaklk ve kontrol // Deerleri alnp // LCD'ye yazdrlyor

FxDev.org

Sayfa 73

Grld zere SPI iletiimini donanm ile yapmak kodlarmz olduka ksaltm ve mikroilemciye yklenen yk azaltmtr. Ayrca LM35tan baka bir scaklk sensrnn daha nasl kullanldn bylelikle grm olduk. 7.2) Hi-Techte I2C letiim lemleri I2C (Inter-Integrated Circuit) seri iletiimi yine SPI iletiim gibi mikrodenetleyicinin dier elemanlarla iletiim kurmasn salayan ve Philips firmas tarafndan gelitirilen bir protokoldr. zellikle hz gerektiren, pin saysnn nemli olduu ilemlerde tercih edilir. Pic 16f877a ierisinde MSSP biriminde bulunan I2C biriminin dier elemanlarla balants ekil64te grlebilir.

ekil 64 TC72 Uygulamas

I C protokolnde bir pin seri giri/k (SDA) grevini stlenirken dier bir pin ise seri saat sinyali (SCL) retmek iin kullanlr. Bu iletiim metodunda cihazlardan biri master olur, master grevinde bulunan cihaz saat sinyalini kendi oluturur. Dier cihaz ise slave olur ve sadece bilgi giri k grevini yerine getirir. I2C protokolnde yava (100kbit/s), hzl (400kbit/s) ve yksek hzl (3,4 Mbit/s) olmak zere eitli hzlarda iletiim salanabilir.

2

ekil 65 I C Veri letim Protokol

2

FxDev.org

Sayfa 74

I2C iletiiminde ekil-65te grlecei zere ilk bata balama biti, ardndan adres bilgisi ve veri bitleri gnderilir. Veri gnderimi stop biti ile son bulur. Her bir byte gnderiminde ise kar taraf bir alnd biti (ACK) geri gnderir. letiim iin gerekli durumlar zetlersek; Yol megul deil Veri transferine bala Veri transferini durdur Geerli veri : SDA ve SCL logic-1 olmaldr. : SCL logic-1 iken, SDA logic-1den logic-0 seviyesine getirilir. : SCL logic-1 iken, SDA logic-0dan logic-1 seviyesine getirilir. : Her bilgi iletimi balama biti ile balar ve stop biti ile son bulur. Her bilgi 1 byte eklinde gnderilir, kardan gelen 9. bit ACK bitidir.

ekil 66 I C Pinleri ve Pull-up direnleri

2

ekil-66da de grlecei zere mikrodenetleyici ile I2C iletiimi yaplacaksa SCL ve SDA ularna yaklak 10k pull-up direnci balanmaldr. I2C protokoln ayarlamak iin Pic 16f877ada SSPSTAT, SSPCON ve SSPCON2 kaydedicileri kullanlr. Bu kaydedicilerin grevleri aada bit bit verilmitir.

SMP CKE D/A P S R/W UA BF

: 1: I2C modunda dk hzlarda (100KHz, 1MHz) slew rate kullanm ddr, 0: I2C modunda yksek (400KHz) hzlarda slew rate kullanm aktiftir : 1: Transfer aktiften IDLE durumuna geerken olacak 0: Transfer IDLE durumundan aktife geerken olacak : I2C modunda veri ve adres bilgilerini gsteren bittir. (1: Data gnderilmi ya da alnm, 0: Adres gnderilmi ya da alnm) : I2C modunda sonlandrma bitidir. (1: Durdurma biti son bulur, 0: Son bulmaz) : I2C modunda balang bitidir. (1: Balang biti son bulur, 0: Son bulmaz) : SPI ya da I2C modunda okuma m yoksa yazma m yaptn belirten bittir. (1: Okuma, 0: Yazma) : 10 bitlik I2C modunda adres gncelleme bitidir. UA=1 ise SSPADD kaydedicisine gnderilen adres gncellenir. : Alm modunda (1: Alm tamamland (SSPBUF dolu), 0: Alm tamamlanmad)

FxDev.org

Sayfa 75

WCOL

: Gnderim yaplrken yazld m (1: Yazld, hata var, 0: Yazlmad) Balangta WCOL=0 yaplmal. SSPOV : Alm yaplrken yeni alm yapld m (1: Yapld, hata var, 0: Yaplmad) Balangta SSPOV=0 yaplmal. SSPEN : 1: SCL, SDA iin ayarland, 0: Normal pin CKP : IDLE seviyesi belirleme biti (1: IDLE yksek seviye, 0: IDLE dk seviye) SSPM3:SSPM0: Mod seim bitleri, aada I2C iin gerekli olan tanmlamalar gsterilmitir.

GCEN ACKSTAT ACKDT ACKEN

RCEN PEN RSEN SEN

: Slave modda genel arma yetkilendirme bitidir. GCEN=1 olduunda 0000h adresi arldnda kesmeye gidilir. : I2C modunda iletim durumunda stat kabul bitidir. (1: Alnan veri kabul edilmemitir, 0: Alnan veri kabul edilmitir) : I2C modunda master alm durumunda veri kabul bitidir. (1: letilen veri kabul edilmemitir, 0: Veri kabul edilmitir) : I2C modunda e zamanl art arda veri alm yetkilendirme bitidir. (1: Yetkilendirme alr ve ACKDT veri biti iletilir, bit donanm tarafndan otomatik temizlenir) : I2C modunda alm yetkilendirme bitidir. (1: I2C modunda alm vaziyetine geilir, 0: Alm modu devre d) : I2C modunda stop durum ayarnn yapld bittir. (1: SDA ve SCL pinleri stop durumu alr, 0: Stop durumu oluturulmaz) : I2C modunda start durumu yenileme bitidir. (1: SDA ve SCL pinlerinin start durumu tekrarlanr, 0: Yenileme olumaz) : I2C modunda start durum ayarnn yapld bittir. (1: SDA ve SCL pinleri start durumu alr, 0: Start durumu oluturulmaz)Sayfa 76

FxDev.org

Slew Rate: Data sinyalleri birer kare dalga gibi dnlrse, yksek hzlarda voltaj tepe noktas ve inen kan kenarlarn dikeylikleri bozulabilir. Slew rate bunu (0-5V, 400KHz) gz nne alarak logic seviyeye karar verilmesini salar. I2C birimi grld zere SPI birimine kyasla olduka karmak bir yapya sahiptir. Biz uygulamalarmzda kolaylk olmas amacyla picimizi master olarak kabul edeceiz. Picin datasheetinde yazanlara gre I2C birimini master ayarlamak iin aadaki admlar srayla izlemeliyiz; - SSPCON kaydedicisinden I2C birimi master olarak ayarlanr. SSPEN=1 - SDA, SCL portlar tanmlanyor CKP=1 - IDLE seviyesi 1 olacak SSPM3:SSPM0=0b1000 - I2C master mode, clock=Fosc/[4(SSPAD+1)] - SSPCON2 kaydedicisinin tm birimleri sonraki kontroller iin sfrlanr. - SSPAD ile standart olan ve ekil -67de grlen hzlardan biri seilir (rn: SSPAD=0x0A). - SMP ayarlanarak slew rate kullanlp kullanlmayaca bildirilir. - CKE ile ykselen veya den kenar seimi yaplr. - Kullanlacaksa kesme bayraklar temizlenir (PSPIF=0, BCLIF=0).

ekil 67 I C Hz Deerleri

2

Tm bu sylediklerimizi bir ktphane haline getirir ekstra fonksiyonlar da yazarsak i2c.h ktphane balk dosyamz aadaki gibi olacaktr./* * * * * * * * * * * * */ www.FxDev.org I2C Kullanm Klavuzu i2c_init(); ile i2c'nin ilk ayarlarn yap i2c_wait(); ile IDLE iin beklenir, yazm yaplmaz i2c_start(); ile SCK ve SDA start durumu alr i2c_restart(); ile SCK ve SDA start durumu tekrarlanr i2c_stop(); ile SCK ve SDA stop durumu alr veri=i2c_read(ack); ile okuma yaplr ack=i2c_write(veri); ile yazma yaplr SSPADD hz ayar i2c.c dosyas ierisinde yaplmaldr. www.FxDev.org TRISC3 TRISC4 // SCK ve SDA ular belirlenir

#define TRIS_SCK #define TRIS_SDA

extern void i2c_init(void); extern void i2c_wait(void);

FxDev.org

Sayfa 77

extern extern extern extern extern

void i2c_start(void); void i2c_restart(void); void i2c_stop(void); unsigned char i2c_read(unsigned char ack); unsigned char i2c_write(unsigned char i2c_data);

Yukardaki ilemleri yerine getiren i2c.c dosyamz ise aadaki gibi olacaktr.#include #include "i2c.h" void i2c_init(void) { TRIS_SCK=1; TRIS_SDA=1;

// SCK ve SDA giri olarak ayarlanyor

SSPCON = 0x38; SSPCON2 = 0x00; // SSPCON2 sonraki ayarlamlar iin temizlniyor /* 4Mhz'de * SSPADD=0x0A: 400KHz * SSPADD=0x0D: 308KHz * SSPADD=0x28: 100Khz */ SSPADD = 0x0A; CKE=0; SMP=1; PSPIF=0; BCLIF=0; } void i2c_wait(void) { while (( SSPCON2 & 0x1F ) | RW ); // IDLE iin beklenir, yazm yaplmaz } void i2c_start(void) { i2c_wait(); SEN=1; } // Slew rate kullanlacak // Kenar: Aktiften IDLE'a // Kesme bayraklar temizleniyor

// IDLE beklenir // SCK ve SDA start durumu alr

void i2c_restart(void) { i2c_wait(); // IDLE beklenir RSEN=1; // SCK ve SDA start durumu tekrarlanr } void i2c_stop(void) { i2c_wait(); PEN=1; }

// IDLE beklenir // SCK ve SDA stop durumu alr

unsigned char i2c_read(unsigned char ack) { unsigned char i2c_data; i2c_wait(); RCEN=1; // IDLE beklenir // Alm vaziyetine geilir

FxDev.org

Sayfa 78

i2c_wait(); i2c_data=SSPBUF; i2c_wait(); if(ack) { ACKDT=1; } else { ACKDT=0; } ACKEN=1; return(i2c_data); }

// IDLE beklenir // Veri alnr // IDLE beklenir // ACK biti durumu // Alm kabul edilmedi

// Alm kabul edildi // ACKDT veri biti iletilir

unsigned char i2c_write(unsigned char i2c_data) { i2c_wait(); // IDLE beklenir SSPBUF=i2c_data; // Veri gnderiliyor return(ACKSTAT); } // 1: Alnan veri kabul edilmemitir // 0: Alnan veri kabul edilmitir

Kodlardan da grlecei zere anlatm karmak da olsa yaplan ilemler olduka basittir. Bu blmden sonra I2C iletiimi kullanlmak istendiinde, ktphane de sadece hz ayarlamas yapmak yeterli olacaktr. 7.2.1) I2C letiim Uygulamas Bu uygulamamzda Atmelin I2C iletiimini kullanan 24C02 harici eepromunu kullanacaz. ekil-68de DIP yaps grlebilecek 24C02, 100Khz ve 400Khz hzlarnda I2C iletiimini kullanabilecek zellie ve 256bytelk hafzaya sahiptir.

ekil 68 24C02 Pin Yaps

ekil-68de de grlecei zere SCL ve SDA pinleri picimizin belirli bacaklarna, Vcc +5Vta, Vss, A0, A1 ve A2 ise toprak hattna balanmaldr. 24C02nin komut yaps olduka basittir bylelikle okuma ve yazma yapmak olduka kolay bir hal alr.

FxDev.org

Sayfa 79

ekil-69dan da grlecei zere 24C02ye yazm yapmak iin ncelikle I2C start verilir, daha sonra slave address denilen komut gnderilir.

ekil 69 24C02ye Yazma Protokol

Slave adress denilen komut ekil-70de grlen yap zerinden kurulur.

ekil 70 24C02Slave Address Kontrol

Grld zere yazm yapmak iin 0xA0, okuma yapmak iin ise 0xA1 komutu kullanlr. Yazm tamamlamak iin ise ncelikle bilginin yazlaca adres ve bilgi gnderilirek I2C stop komutu ile iletiim sonlandrlr ve yaklak 10-15 milisaniye beklenir. Eepromdan bilgi okumak iin ise ekil-71de grlen iletiim metodu kullanlr.

ekil 71 24C02den Okuma Protokol

ncelikle I2C start verilir. Daha sonra slave address olarak 0xA0 gnderilir, daha sonrasnda ise okunacak adres bilgisi gnderilerek I2C tekrar balatlr. kinci kez slave address olarak bu sever okuma yapacamz belirten 0xA1 komutu gnderilerek, istenen adresteki bilgi alnr ve I2C stop komutu ile iletiim sonlandrlr. Biz ktphanemizde tm bu ilemleri tanmladmz iin yapmamz gereken ufak bir fonksiyon yazarak istediimiz ilemi gerekletirmekir.

FxDev.org

Sayfa 80

Bu uygulamada 24C02 eepromunun ilk 0h,8h,10h,18h,20h,28h.. adreslerine ismimizi yazdrp, tekrar eepromun bu adreslerini okuyarak ismimizi LCDye yazdracaz. Uygulamaya gemeden nce ekil-72deki devreyi iziyoruz.

ekil 72 24C02 Uygulamas

ekil-72de de grlecei zere devremiz olduka sadedir. Burada dikkat edilmesi gereken en nemli konu Pull-Up direnleridir. stediimiz ilemi yerine getiren Hi-Tech kodu ise aadaki gibidir.#include #include #include #include "delay.h" // Gecikme ktphanesi tanmlanyor "lcd.h" // LCD ktphanesi tanmlanyor "i2c.h" // I2C ktphanesi tanmlanyor

void write_ext_eeprom(unsigned char address, unsigned char data) { i2c_start(); i2c_write(0xA0); i2c_write(address); i2c_write(data); i2c_stop(); DelayMs(15); } unsigned char read_ext_eeprom(unsigned char address) {

FxDev.org

Sayfa 81

unsigned char data; i2c_start(); i2c_write(0xA0); i2c_write(address); i2c_restart(); i2c_write(0xA1); data=i2c_read(0); i2c_stop(); return(data); } void main(void) { unsigned char i=0; PORTB=0x00; PORTC=0x00; TRISB=0x00; TRISC=0x00; lcd_init(); i2c_init(); // Portlar sfrlanyor // klar ayarlanyor // LCD ve I2C ilk ayarlar yaplyor // Ad eeproma yazdrlyor

write_ext_eeprom(0x00,'F'); write_ext_eeprom(0x08,'I'); write_ext_eeprom(0x10,'R'); write_ext_eeprom(0x18,'A'); write_ext_eeprom(0x20,'T');

// Eepromdaki bilgi LCD'ye yazdrlyor lcd_yaz("Eepromdaki Veri"); lcd_gotoxy(2,1); veri_yolla(read_ext_eeprom(0x00)); veri_yolla(read_ext_eeprom(0x08)); veri_yolla(read_ext_eeprom(0x10)); veri_yolla(read_ext_eeprom(0x18)); veri_yolla(read_ext_eeprom(0x20)); for(;;); }

Grld zere devremiz gibi kodlarmz da olduka sadedir. Yazma ilemimiz bittiinde proteus simlasyonunu duraklatp, eeproma sa tklatp Internal Memory ksmna tklarsanz ekil-73teki hafza yapsn grmeniz mmkndr.

FxDev.org

Sayfa 82

ekil 73 24C02nin Son Hali

Grld zere I2C iletiimini anlamak zor olsa da kullanmay rendikten sonra iletiim kurmak, sadece donanmn zel komutlarn bilmekten daha zor olmamaktadr.

FxDev.org

Sayfa 83

BLM 8 MOTOR UYGULAMALARI8.1) DC Motor DC motorlar sabit bir mknats ve iinde dnen yap olan rotordan oluurlar. Yksek akm ektikleri iin direk mikrodenetleyiciye balanmazlar. Kontrol iin H-Kprs denilen zel bir yaplarla mikrodenetleyicilere balanrlar. Gnmzde bu i iin gelitirilmi, ierisinde HKprs bulunan L293, L298, L6201, L6202 gibi birok entegre mevcuttur. Biz bu blmde ekil-74te grlen L298 entegresini temel alarak uygulamalarmz yapacaz.

ekil 74 L298 Entegresi

L298 entegresine iki adet motor balanp ayr ayr saa, sola dnleri veya hzlca durdurulmalar salanabilir. Biz bu uygulamamzda bir adet DC motoru L298 entegresine balayp, saa, sola dnmesini ya da frenleme yapmasn salayacaz. ncelikle ekil-75teki devreyi proteusta iziyoruz.

ekil 75 DC Motor Uygulamas

ekil-75ten de grlecei zere butonlarmz ykselen kenar iin aktif olacaktr. Bunu dikkate alarak yazdmz Hi-Tech kodu ise aadaki gibi olacaktr.

FxDev.org

Sayfa 84

#include void main(void) { ADCON1=0x07; PORTA=0x00; PORTB=0x00; TRISA=0x07; TRISB=0x00; RB2=1; RB3=0; for(;;) { if(RA0) { RB0=1; RB1=0; } if(RA1) { RB0=0; RB1=1; } if(RA2) { RB0=0; RB1=0; } } }

// PORTA dijital oluyor // Portlar sfrlanyor // RA0, RA1, RA2 giri // PORTB k // A kprs seiliyor

// leri tuuna m basld

// Geri tuuna m basld

// Durdurulmak m isteniyor

Grld gibi kodlarmz olduka sadedir. Ayrca bu motorlardan iki tane yan yana koyarak ve birka yer yn alglayc sensr ile izgi izleyen robot yapm olduka basit hale gelebilmektedir. 8.2) Step MotorStep motorlar genel itibari ile frasz motorlardr. Dier motorlardan fark ise verilen eitli sinyallere gre istenilen ekilde yn alabilmesidir. ekil-76da grlebilecek Step motorun iyapsnda birok bobin ve genelde rotorda ise sabit bir mknats bulunur. eitli bobin iftlerine verilen enerji ile bu mknats istenilen blgeye ynlenir.

ekil 76 Step Motorun Yaps

FxDev.org

Sayfa 85

Step motorlar genellikle 4-5-6 adet uca sahiptirler. Genel uygulamalarda 5 ulu step motorlar tercih edilir. Bu ulardan bir tanesi ortak u iken dierleri sinyalin verilecei ulardr. Step motorlarda dikkat edilmesi gereken bir konu da adm cevab denilen durumdur. Bu step motorun bir admn ne kadar srede aldn belirten bir ifadedir. Eer motora bu sreden daha ksa bir srede sinyal gnderilirse step motor istenildii gibi almayacaktr. DC motorlar gibi step motorlar da miktrodenetleyiciye direk balayarak sremeyiz. Bunun iin gelitirilmi ve ekil-77de i yaps gzken ULN2003, ULN2004 gibi entegreler kullanlr.

ekil 77 ULN2003 Yaps

Step motorlarda bir dier nemli konu da adm asdr. rnein 1,8 derece adm asna sahip bir step motor 200 adm hareket sonra 360 derece dnn tamamlayacaktr. Step motorlar srmek iin eitli metotla gelitirilmitir. Bunlardan en ok kullanlanlar ise tam ve yarm a yntemleridir. Bu metotlar ile 5 ulu step motorun nasl srlecei aadaki tablolarda gsterilmitir. Adm U-1 U-2 U-3 U-4 1 1 0 0 1 2 1 1 0 0 3 0 1 1 0 4 0 0 1 1Tam Adm Metodu

Adm U-1 1 1 2 1 3 0 4 0 5 0 6 0 7 0 8 1

U-2 0 1 1 1 0 0 0 0

U-3 0 0 0 1 1 1 0 0

U-4 0 0 0 0 0 1 1 1

Yarm Adm Metodu

FxDev.org

Sayfa 86

Eer step motorun her adm 1,8 derece ise tam adm metoduyla her adm 1,8 dereceye, yarm adm metodu ile de 0,9 dereceye denk gelecektir. Buradan da grld zere yarm adm metodu ile step motor srldnde admlar daha da hassaslamaktadr. 8.2.1) ULN2003 ile Step Motor KontrolBu uygulamamzda ULN2003 entegresini ve yarm ad metodunu kullanarak step motorun bir adm ileri ya da geri dnmesini salayacaz. ncelikle ekil-78deki devremizi proteusta iziyoruz.

ekil 78 Step Motor Uygulamas

stediimiz ilemi yerine getiren Hi-Tech kodu ise aadaki gibi olacaktr.#include // Yarm adm iin dizi tanmlanyor const unsigned char yarim_adim[]={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09}; void main(void) { char i=0; ADCON1=0x07; PORTA=0x00; PORTB=0x00; TRISA=0x03; TRISB=0x00;

// PORTA dijital oluyor // Portlar sfrlanyor // RA0, RA1 giri // PORTB k

for(;;) { if(RA0) // leri tuuna m basld { PORTB=yarim_adim[i]; while(RA0); if(i==7) i=-1;

FxDev.org

Sayfa 87

i++; } if(RA1) // Geri tuuna m basld { if(i==0) i=8; i--; PORTB=yarim_adim[i]; while(RA1); } } }

Kodlarda dikkat edilmesi gereken yer yarim_adim[] dizisidir. Yarm a tablosunda grlen deerler buraya yazlarak ilemlerin daha kolay gereklemesi salanmtr.

8.2.2) Bilgisayar le Step Motor KontrolBu uygulamamzda bilgisayardan gnderdiimiz komutlarla step motorun saa ya d sola srekli dnmesini salayacaz. ncelikle ekil-79daki devreyi iziyoruz.

ekil 79 Bilgisayar ile Step Motor Kontrol

stediimizi yerine getiren Hi-Tech kodlar ise aadaki gibi olacaktr.#include #include #include #include "delay.h" "usart.h" // printf iin // Gecikme ktphanesi // Seri haberleme iin

// Yarm adm iin dizi tanmlanyor const unsigned char yarim_adim[]={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09}; void main(void) { char i,karakter=0; PORTB=0x00;

FxDev.org

Sayfa 88

TRISB=0x00; usart_init();

// PORTB k

printf("ADIM MOTOR KONTROLU"); printf("\n\rwww.FxDev.org Sunar!"); printf("\n\r\n\rIslem Seciniz:"); printf("\n\r -Saga Dondur (R) ya da (r)"); printf("\n\r -Sola Dondur (L) ya da (l)"); printf("\n\r -Durdur (R),(r),(L),(l) disinda bir tus"); printf("\n\r\n\rYapmak istediginiz islemi seciniz>"); for(;;) { karakter=getch(); putch(karakter); if(karakter=='R'|| karakter=='r') // R ya da r tuuna m basld { printf("\n\rSaga Donuyor"); printf("\n\rYapmak istediginiz islemi seciniz>"); for(;;) { PORTB=yarim_adim[i]; if(i==7) i=-1; i++; DelayMs(100); if(RCIF) { printf("\n\rMotor Durdu"); printf("\n\rYapmak istediginiz islemi seciniz>"); break; } } } if(karakter=='L'|| karakter=='l') // L ya da l tuuna m basld { printf("\n\rSola Donuyor"); printf("\n\rYapmak istediginiz islemi seciniz>"); for(;;) { if(i==0) i=8; i--; PORTB=yarim_adim[i]; DelayMs(100); if(RCIF) { printf("\n\rMotor Durdu"); printf("\n\rYapmak istediginiz islemi seciniz>"); break; } } } } }

FxDev.org

Sayfa 89

Kodlarda da grlecei zere RCIF kesme bayrandan yararlanlmtr. Bunun nedeni baka bilgi gnderildiinde tamponun dolma kesme bayran set etmesidir. Bu kontrol edilerek sonsuz dnglerden break komutuyla klmtr.

8.3) R/C Servo MotorServo motorlar genel itibari ile ierlerinde bir DC motor ve aft konum bilgisi devresi barndrrlar. Bu devre aftn ka derece dndnn alglanmasnda kullanlr. Servo motorlarn i yaps ekil80de gzkmektedir.

ekil 80 Servo Motor Yaps

Servo motorlar 20ms periyotlu, 1msden 2mse kadar deien duty cyclel PWM sinyali ile srlrler. Verilen duty cycle periyotlarna gre servo motorun 0-180 derece aral arasnda alacaklar deerler ekil-81de verilmitir.

ekil 81 Servo Motor Kontrol Sinyalleri

Burada sinyal verilirken rnein 1,5ms ile 1ms aras 90a blnerek istenilen aya gidilebilir. Picin CCP modl genellikle kullandmz 4Mhz kristal iin 50Hzlik PWM sinyalleri retememektedir. Bu yzden yukardaki sinyalizasyonu elle ayarlamamz gerekmektedir.

FxDev.org

Sayfa 90

8.3.1) R/C Servo Motor UygulamasBu blmde kullanacamz servo motaru 0 derece, 90 derece ve 180 dereceye, basacamz butonlarla ynlendireceiz. Sinyalizasyon ilemini hazr delay.h fonksiyonlar ile salayacaz. ncelikle ekil-82deki devremizi Proteusta iziyoruz.

ekil 82 Servo Motor Uygulamas

stediimiz ilemi yerine getiren Hi-Tech kodu ise aadaki gibi olacaktr.#include #include "delay.h" // Gecikme ktphanesi

void main(void) { char i,karakter=0; ADCON1=0x07; // PORTA dijital oluyor PORTB=0x00; TRISA=0x07; // RA0, RA1 ve RA3 giri TRISB=0x00; // PORTB k for(;;) { if(RA0) { for(;;) { RB0=1; // 1ms Gecikme DelayUs(250);DelayUs(250);DelayUs(250);DelayUs(250); RB0=0; // 19ms Gecikme DelayMs(19); if(RA1 | RA2) break; }

FxDev.org

Sayfa 91

} if(RA1) { for(;;) { RB0=1; // 1,5ms Gecikme DelayUs(250);DelayUs(250);DelayUs(250);DelayUs(250); DelayUs(250);DelayUs(250); RB0=0; // 18,5ms Gecikme DelayMs(18); DelayUs(250);DelayUs(250); if(RA0 | RA2) break; } } if(RA2) { for(;;) { RB0=1; // 2ms Gecikme DelayMs(2); RB0=0; // 18ms gecikme DelayMs(18); if(RA0 | RA1) break; } } } }

Simlasyonu altrdmzda 0,1 veya 0,2 derecelik hatalar gzkecektir. Bunlar gecikme fonksiyonlarnn bire bir almamasnn sonulardr. Fakat normal uygulamalarda fark edilmeyecek kadar kk hata paylardr.

FxDev.org

Sayfa 92

BLM 9 1-WIRE (TEK HAT) LETM ve DS18B209.1) 1-Wire (Tek Hat) letiim 1-Wire ya da dier adyla tek hat iletiim Maxim-Dallas firmas tarafndan gelitirilmi ift ynl veri iletiimine izin veren bir protokoldr. Master olan denetleyici ekil-83'te de grlecei zere birden fazla cihaz ayn hattan kontrol edebilir.

ekil 83 Tek Hat Protokol le Birden Fazla Cihaz Kontrol

1-Wire iletiime sahip tm cihazlar kendilerine ait 64 bitlik kayt koduna sahiptirler. Bu kodun ilk dk deerlikli 7 biti cihazn aile kodunu, sonraki 48 bit seri numarasn ve son kalan 8 bit ise hata denetim kodunu ierir. Bylelikle tek hatta bulunan her ayr birim kendi kayt kodu ile arlarak ileme tabi tutulurlar. 1-Wire iletiimde bir dier husus ise 1-Wire iletiimde kullanlacak hattn mutlaka pull-up direnciyle Vdd hattna balanma zorunluluudur. 9.2) 1-Wire (Tek Hat) letiim lemleri 1-Wire iletiimde sfr veya bir bilgisi gnderme, cihaza reset atma gibi ilemler bir kereye mahsus tanmlanr ve tm cihazlar ayn mantk erevesinde bu ilemleri kullanr. Ayrca 1-Wire iletiim ilemleri standart ve yksek hzlarda olabilmektedir. 1-Wire iletiimin standart hz 15kbps iken, yksek hz ise 115kbpsdr. 1-Wire protokolnde zamanlamalar olduka nemli olduu iin biz ilemlerimizi standart hza gre yapacaz. 1-Wire protokol ekil-84te de grlecei gibi u admlarla iler; 1-Wire Hat Reseti verilir ROM komutlar gnderilir Fonksiyon komutlar gnderilir

ekil 84 1-Wire Admlar

FxDev.org

Sayfa 93

9.2.1) Reset lemi ekil-85te zaman diyagram grlecek reset ilemi u admlarla gerekleir; Hat mikroilemci tarafndan logic-0 yaplr, 480 ile 640 mikrosaniye beklenir, Mikroilemci pini giri olarak ayarlanr ve hat pull-up direnci sayesinde logic-1 olur, Yaklak 70 mikro saniye sonra hattaki cihaz, hatt logic-0 yapar Bylelikle hatta cihaz olduu alglanr. Hattn tekrar pullup tarafndan logic-1 olmas ise yaklak 420 mikrosaniye gerektirir.

ekil 85 1-Wire Reset lemi Zaman Diyagram

9.2.2) Yazm veya Okuma lemleri 1-Wire protokoln en can alc noktas hatta bilgi gnderip alma ksmdr. Bunun iin zamanlamalar hatta 0 veya 1 gnderme ya da hattan 0 veya 1 bilgisi alma ksmlarnda zellemektedir. ekil-86dan grlecei gibi hatta 0 veya 1 bilgisi gndermek iin aadaki admlar uygulanmaldr; Hat mikrodenetleyici tarafndan logic-0 konumuna getirilir, Hatta 0 yazlmak isteniyorsa 1-2 mikrosaniye sonra, Hatta 1 yazlmak isteniyorsa yaklak 60 mikrosaniye sonra hat mikrodenetleyici tarafndan okuma konuma getirilerek pull-up direncinin hatt logic-1e getirmesi beklenir. Hattan 0 veya 1 bilgisi okumak iin ise aadaki admlar uygulanr; Hat mikrodenetleyici tarafndan logic-0 yaplr ve 5 mikrosaniye beklenir, Mikrodenetleyici hatt okuma moduna getirir, Eer hat yaklak 10 mikrosaniye sonra pullup tarafndan logic-1 olursa cihazn gnderdii bilgi 1, eer hat bu sre sonunda hala logic-0 ise cihazn gnderdii bilgi logic-0dr, Yaklak 60 mikrosaniye sonra bu iletiim son bulur.FxDev.org Sayfa 94

ekil 86 1-Wire Okuma Yazma Zaman Diyagramlar

Tm bu sylediklerimizi bir ktphane haline getirirsek ileride herhangi bir 1-Wire iletiim protokoln kullanan aygtla iletiim salamak istediimizde kolaylkla hazrladmz dosyay projeye ekleyip istediimizi gerekletirebilir. Yukardaki bilgiler dorultusunda yazdmz ve ek birka zellik daha eklediimiz one_wire.h dosyas aadaki gibi olacaktr./* www.FxDev.org * One Wire Kullanm Klavuzu * onewire_reset(); ile one wire aracna reset atp, * geri dn deeriyle aletin hazr olur olmadn kontrol et * onewire_read_byte(DATA); eklinde veri yazdr veya komut gnder * onewire_read_byte(); eklinde okuma yap * www.FxDev.org */ #define TRIS_W TRISA0 //Balantlar #define WIRE RA0 extern extern extern extern extern unsigned char onewire_reset(void); unsigned char onewire_read_bit(void); void onewire_write_bit(unsigned char veri); unsigned int onewire_read_byte(void); void onewire_write_byte(unsigned char data);

Bu fonksiyonlar altran one_wire.c dosyamz ise aadaki gibi olacaktr.#include #include "one_wire.h" #include "delay.h" unsigned char onewire_reset(void) { unsigned char sonuc;

FxDev.org

Sayfa 95

WIRE=0; TRIS_W=0; DelayUs(250);DelayUs(250); TRIS_W=1; DelayUs(70); sonuc=WIRE; DelayUs(250);DelayUs(250); return sonuc; }

// // // // // // //

Hat sfra ekiliyor Hat k yaplyor 640us>x>480us arasnda bekleniyor Pull-up ykseltmesi bekleniyor 70us bekleniyor 0 Hazr, 1 Hazr deil x>420us'den byk olmal

unsigned char onewire_read_bit(void) { unsigned char veri; WIRE=0; TRIS_W=0; DelayUs(5); TRIS_W=1; DelayUs(10); if(WIRE) veri=1; else veri=0; DelayUs(60); return veri; } void onewire_write_bit(unsigned { if(veri) // { TRIS_W=0; // WIRE=0; DelayUs(5); // TRIS_W=1; // DelayUs(60); // } else // { TRIS_W=0; // WIRE= 0; DelayUs(60); // TRIS_W=1; // } } char veri) 1 gnderiliyor Hat sfrlanyor 5 mikrosaniye bekleniyor Pull-Up'n hatt ykseltmesi bekleniyor 60 mikrosaniye bekleniyor 0 gnderiliyor Hat sfrlanyor 60 mikrosaniye bekleniyor Pull-Up'n hatt ykseltmesi bekleniyor // Hat sfra ekiliyor // 5 mikrosaniye bekleniyor // Pull-Up'n hatt ykseltmesi bekleniyor // 10 mikrosaniye bekleniyor // Hat okunuyor // Okunan veri 1 // Okunan veri 0

unsigned int onewire_read_byte(void) { unsigned char i,veri=0, bitler=1; for(i=0;i