HI-TIDE KULLANIMI RESİMLİ ANLATIM ve ÖRNEK KODLAR

Başlatan muuzoo, 29 Haziran 2007, 19:39:51

cenkishan

onları biliyorum arkadasım pic c ile ses projeleri picc ile iletisim projeleri ve bir kac kitabı izmir hatfonda  var ama bu kitabı cok iyiymis diye duydum olmazsa C dernegin pdf ini bastırıcam.yorumun icin sagol.
Bir bit olsam dolaşsam C de byte byte

muuzoo

Merhaba arkadaşlar. Uzun süredir yazmadığımın farkındayım. Yaz okuluydu,stajdı derken pek vakit ayıramadım. İnşallah okul başladığında daha fazla vakit ayırmaya çalışacağım.Bu aralar aynı zamanda bitimre ödevim ile de uğraştığım için yazılım noktasında bayağı bir ekleme yapmayı düşünüyorum. Bu akşam ekleme olarak bitirme ödevimde kullanmak üzere yazdığım PWM kütüphanesini ekliyorum.PWM kütüphanesinde gerekli değerli kullanmak üzere yazdığım ufak bir bilgisayar programınıda ekte sunuyorum. Program Dev Cpp ile yazılmıştır.Hepsini en sondaki linkten indirebilirsiniz.

NOT: Kodlar denenmiş olmakla beraber hata olmayacağı anlamına gelmez. PWM deger hesaplama programı küsüratlı pwm degerleri için 0.5 ve üstü küsüratları yukarı 0.5 altını ise aşağı yuvarlayarak deger üretmektedir.Programda hatalar olabilir.Hatalar için lütfen benle iletişime geçin.

PWM.C

/*			PWM v0.05	(05.09.2007)
 * 
 * Bu dosya PIC 16F877(A)'da PWM kullanmak için hazırlanmıştır.
 * Geciktirme için "delay.c"  kütüphanesi kullanılmıştır.Önce o eklenmelidir.
 * Kullanabileceğiniz komutlar şunlardır.
 * 
 * 				pwm_init(tmr2_prescaler_degeri,PR2_degeri)
 * 				pwm1_basla(kick_time,pwm1_degeri)
 * 				pwm1_degis(pwm1_degeri)
 * 				pwm1_kapat()
 * 
 * 			pwm1 yerine pwm2 de kullanılabilir.
 * 
 * Kullanacağnız değerleri hesaplamak için ekte ufak bir hesaplama aracı da sunulmuştur.
 * Programdan elde edeceğiniz değerleri burdaki komutlarda kullanabilirsiniz.
 * Kod fiziksel olarak denenmiştir ama bu hata olmayacağı anlamına gelmez.Hata ve 
 * önerileriniz için mail ile ulaşabilirsiniz.
 * 
 * Mehmet Muzaffer KÖSTEN		muuzoo@hotmail.com
 * 
 */
 
void pwm_init(unsigned int tmr2,unsigned int PR2_d)
{
	if(tmr2==1){
		T2CKPS1=T2CKPS0=0;
	}else if(tmr2==4){
		T2CKPS1=0;
		T2CKPS0=1;
	}else if(tmr2==16){
		T2CKPS1=T2CKPS0=1;
	}	
	PR2=PR2_d;
	TMR2ON=1;
}

void pwm1_basla(unsigned int sure,unsigned int pwm1)
{
	if(sure>0){
		RC2=1;
		DelayMs(sure);
		RC2=0;
	}
	di();
	PIE1=0x00;
	CCPR1L=(pwm1 & 1020) >> 2;
	CCP1CON=((pwm1 & 3) << 4);
	CCP1M3=CCP1M2=1;
	ei();
}

void pwm1_degis(unsigned int degis)
{
	di();
	CCP1M3=CCP1M2=0;
	CCPR1L=(degis & 1020) >> 2;
	CCP1CON=((degis & 3) << 4);
	CCP1M3=CCP1M2=1;
	ei();
}

void pwm1_kapat(void)
{
	CCP1M3=CCP1M2=0;
}

void pwm2_basla(unsigned int sure,unsigned int pwm1)
{
	if(sure>0){
		RC1=1;
		DelayMs(sure);
		RC1=0;
	}
	di();
	PIE1=0x00;
	CCPR2L=(pwm1 & 1020) >> 2;
	CCP2CON=((pwm1 & 3) << 4);
	CCP2M3=CCP2M2=1;
	ei();
}

void pwm2_degis(unsigned int degis)
{
	di();
	CCP2M3=CCP2M2=0;
	CCPR2L=(degis & 1020) >> 2;
	CCP2CON=((degis & 3) << 4);
	CCP2M3=CCP2M2=1;
	ei();
}

void pwm2_kapat(void)
{
	CCP2M3=CCP2M2=0;
}



PWM Hesaplayıcı

//PWM Deger Hesaplayıcı v0.05. Yapım Tarihi 05.09.2007
//Mehmet Muzaffer KOSTEN       muuzoo@hotmail.com
     

#include <cstdlib>
#include <iostream>
#include <math.h>

using namespace std;
void binary(int);

int main ()
{
   int secim,i=0;
       for(i=1;i>0;i--)
               secim=1;        
   while(secim!=0){
    cout << "PIC 16F877(A) PWM DEGER HESAPLAYICI" <<endl<<
    "------------2007  v0.05------------"<<endl;
    
    double tmr2=0,pic_frekans=0,pwm_frekans=0,PR2=0,pwm_deger=0,
    pic_periyot=0,pwm_periyot=0,duty_cycle=0,pwm_duty_cycle=0,pwm_cozunurluk=0;
    char tmr2_secim,hexstring[20];
    
    cout << "1-)Pic Calisma Frekansini Girin (MHZ) = ";
    cin >> pic_frekans;
           pic_frekans=1000000*pic_frekans;           
           pic_periyot=(1/pic_frekans);
           
    cout << "2-)Istenen PWM Frekansini Girin  (HZ) = ";
    cin >> pwm_frekans;
           pwm_periyot=(1/pwm_frekans);
           
    cout << "3-)TMR2 Prescaler Degerini seciniz: "<< endl
         <<"         a) 1"<<endl
         <<"         b) 4"<<endl
         <<"         c) 16"<<endl
         <<"Secim (a,b,c) = ";
    cin >> tmr2_secim;
    switch (tmr2_secim)
    {    
           case 'a' : tmr2=1;
                      break;
           case 'b' : tmr2=4;
                      break;
           case 'c' : tmr2=16;
                      break;
           }
    cout << "4-)Dalga Doluluk Orani'ni (Duty Cycle) Giriniz(%) = ";
    cin >> duty_cycle;
    cout <<endl;
    
    pwm_duty_cycle=((duty_cycle*pwm_periyot)/100);    
    
    PR2=(pwm_periyot/(pic_periyot*4*tmr2))-1;
    
    if(duty_cycle!=100)
                       pwm_deger=(pwm_duty_cycle/(pic_periyot*tmr2));
    
    pwm_cozunurluk=(log(pic_frekans/pwm_frekans)/log(2));
    
    if(pwm_cozunurluk>(int)pwm_cozunurluk)
                     pwm_cozunurluk=(int)pwm_cozunurluk+1;
                     
    if(pwm_deger>=((int)pwm_deger+0.5))                 
                     pwm_deger=(int)pwm_deger+1;
    else
                     pwm_deger=(int)pwm_deger;                 
                     
    if(duty_cycle==100)
                      pwm_deger=pow(2,pwm_cozunurluk)-1;
                      
    itoa((int)pwm_deger,hexstring,16);
    
    if(PR2<256 && PR2>=0){
               cout<<"Verdiginiz bilgilere gore olusan sonuclar: "<<endl
               <<"               a)TMR2 Prescaler= "<<tmr2<<endl
               <<"               b)PR2  Degeri   = "<<PR2<<endl
               <<"               c)PWM Degeri(Dec)= "<<pwm_deger<<endl
               <<"               c)PWM Degeri(Hex)= "<<hexstring<<endl
               <<"               c)PWM Degeri(Bin)= ";binary((int)pwm_deger);
               cout<<endl
               <<"               d)Azami PWM Cozunurluk (Bit)= "<<pwm_cozunurluk
               <<endl<<endl<<"Programdan Cikmak icin sifir (0)"<<endl
               <<"Yeni bir hesaplama icin bir (1) giriniz."<<endl
               <<"Seciminiz  = ";
               cin >> secim;
               } 
    else {
         cout<<"Verilen degerlere gore PWM uretilemez!"
          <<endl<<endl<<"Programdan Cikmak icin sifir (0)"<<endl
               <<"Yeni bir hesaplama icin bir (1) giriniz."<<endl
               <<"Seciminiz  = ";
               cin >> secim;
               }              
    
}       
        return 0;

}

void binary(int number) {
	int remainder=0;

	if(number <= 1) {
		cout << number;
		return;
	}

	remainder = number%2;
	binary(number >> 1);    
	cout << remainder;
}


pwm.c ve pwm hesaplayıcı programını indirmek için

http://rapidshare.com/files/54100735/pwm_kutuphane.rar
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

muuzoo

Bir önceki mesajımda verdiğim pwm.c dosyası ile yapılmış örnek bir pwm programını veriyorum.Bu kodda ccp1 pini kullanılmıştır (pwm1).eğer ccp2 pinini kullanmak isterseniz pwm1 yerine pwm2 yazmanız yeterlidir.Bu kod ile %50 doluluk oranına sahip 100Khz frekansa sahip bir pwm dalgası elde ediyoruz.

Alıntı Yap
#include <htc.h>
#include <delay.c>
#include <pwm.c>

void
main(void)
{
   TRISC=0x00;------->PORTC çıkış olarak tanımlanıyor.PWM çıkışı almamız için dikkat edilmeli.
   pwm_init(1,9); ------->TMR2 bölücü değeri 1 olarak tanımlanıyor,PR2 değeri ise 20.Bu sayede 100Khz lik pwm elde ediyoruz.Pic frekansı 4 Mhz.
   pwm1_basla(0,20); ------->Kalkış süresi sıfır verilmiş,%50 doluluk oranı için 20 değerini yüklüyoruz.
   while (1){
      //TODO Auto-generated main function
   }
}

Bu kodda kullanılan değerler pwm hesaplama programı ile elde edilmiştir.
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

muuzoo

DENEMELER-6

Merhaba arkadaşlar. Uzun zamandır bu başlığa yeni eklemelerde bulunamadım.Gerek okul, gerek kendi tembelliğim  :D sebebiyle fazlaca uğraşamadım. Bu akşam bir kodda bir kaç şeyi birden işlemek amacıyla bir kod vereceğim. Belki ilk etapta karışık gelebilir ama adım adım anlatacağım için anlaşılır olacağını düşünüyorum.

Bu kodda dahili eproma veri yazma ve okuma,usart üzerinden seri haberlşeme, pic üzerinde kesme fonksiyonlarının nasıl yazılacağı konularını işeyeceğim. Faydalı olması dileğiyle başlayalım.

*Dahili EEPROM'a veri yazma ve okuma*

HI-TECH içinde eproma erişmek için gerekli fonksiyonlar tanımlanmış ve kullanıma hazırdır.Veri yazmak için

EEPROM_WRITE(adres,veri);


komutunu kullanıyoruz. Bu fonksiyon derleyici içinde tanımlanmış olduğu için işimiz son derece kolay oluyor.

İstediğimiz eprom bölgesindeki veriyi okumak içinse

EEPROM_READ(adres);


komutunu kullanıyoruz. Görüldüğü gibi son derece basit.

*USART ile haberleşme*

USART arabirimi bazı piclerde bulunan haberlşeme donanımıdır. Çeşitli parametreler ile istenen hızlar ve özelliklerde iletişim sağlanabilir. Daha fazla bilgi için mikrodenetleyicinin pdf ini incelemeniz yeterli olacaktır. İLetişim işlemi RC7 ve RC6 bacakları üzerinden gerçekleşmekte.Kodumuzda usart ı kullanabilmek için
Alıntı YapC:\Program Files\HI-TECH Software\PICC\9.50\samples\usart
dizininde bulunan
Alıntı Yapusart.h ve usart.c
dosyalarını
Alıntı YapC:\Program Files\HI-TECH Software\PICC\9.50\include
dizinie kopyalamalıyız. Bu işlemi yaptıktan sonra kullanmamız gereken komutları gösterelim.
İLk olarak usart modülünü kullanıma hazırlamak için

init_comms();


komutunu kullanıyoruz. Bu komut bir kere çalıştırılmalı yani döngü içinde kullanmayın.
Usart üzerinden bilgi gönderebilmek için

putch(veri);


komutunu kullanıyoruz. USART üzerinden veri almak içinse

getch();


komutunu kullanıyoruz. Bu basitçe iletişim içinde. Eğer iletişim hızını değiştirmek isterseniz ya da iletişim için gerekli diğer ayarları elle yapmak isterseniz "usart.h" dosyasını düzenlemeniz gerekmekte. 8 bit ,9 bit iletişim modu, iletşim hızı,mikrodenetleyicinin frekasnı gibi parametrelerle iletişişm biçimi tanımlanmakta. Ön tanımlı olarak hızımız 9600 baud oranına sahip ve mikrodenetleyici frekansı 4Mhz ise çalışacak şekilde ayarlanmış durumda.

*Pic ÜZerinde Kesme Kullanımı*

Kesme kullanmak ilk başta karışık gibi gelse de kullanmaya başladığınızda aslında çok işe yarar bir özellik olduğu görülecektir. Kesme kullanımı sayesinde öncelikli işlerin daha etkin bir şekilde çalışması sağlanacaktır. Bizim örneğimizde önceliklşi işişmiz sayı saymaktır.Fakat usart birimine bilgi geldiğinde yapılacklar ise ikinci işişmizdir. Eğer kesme kullanmadan bunu yapmaya kalksaydık programın döngüsü içinde her seferinde usart üzerinden bilgi gelip gelmediğine bakmamız gerekir ve ardından sayma şişleminiş yapmamız gerekirdi.(Tamam pekte uygun bir benzetim olmadı gibi ama idare edin  :) ). Kodumuzda kullanılan kesme işlemi sayesinde kodumuz sadece sayma işlemini gerçekleştirmekte,sadece gerektiğinde yani usart biriminde kesme oluştuğunda usarta bakmakta ve tekrar ana programa geri dönmektedir. Kesme kullanımı için oluşturmanız gerekn fonksiyon şu şekilde olmalıdır


static void interrupt kesme_adı(void)
{
         kodlar
}



burada kesme işlemini tanımlayan "interrupt" ksımıdır. Onun dışında fonksiyon adı istediğiniz gibi olabilir.

Diğer bir önemli nokta ise kodun başında kesmelerin çalışması için gerekli bayrakların (flag) etkinleştirilmesidir. Eğer ayrıntıya girmeden bütün kesmeleri etkinleşitrmek isterseniz

ei();


kesmelerin hepsini kapatmak isterseniz

di();


komutunu kullanabilirsiniz.Kesmeler temel olarak ikiye ayrılımakta. Dahili olanlar ve harici olanlar.Aslında ayrıntılı bir konu olmakla beraber kısaca değinmemiz gerekirse kesmeleri kontrol etmek için öncelikli olarak INTCON kaydedicisi kullanılmakta.Bu saklayıcıda ki bitlerin anlamlarını kısaca sıralarsak

Bit7-->GIE= Tüm kesmelere izin verilir (0 izin verilmez,1 izin verilir)
Bit6-->PEIE=Çevre arabirimlerinden gelen kesmelere izin verme
Bit5-->TMR0IE=TMR0 sayıcı taşma kesmesine izin verme biti
Bit4-->INTE=RB0/INT ucundan gelen kesmeye izin verme biti
Bit3-->RBIE=PORTB(4,5,6,7 bitleri) değişiklik kesmesine izin verme biti
Bit2-->TMR0IF=TMR0 sayıcı taşma kesmesi bayrağı biti.
Bit1-->INTF=RB0/INT harici kesme bayrağı biti.
Bit0-->RBIF=PORTB (4,5,6,7 bitleri) değişiklik kesmesi bayrağı biti

bu özellikleri verdikten sonra kodumuza geçebilirz.

İlk olarak bilgi gönderen pic için kodu veriyorum



#include <htc.h>
#include <usart.c>
#include <delay.c>

void
main(void)
{
	unsigned int dene=0x01;
	PORTB=0xFF;
	TRISB=0x00;
	TRISC=0xFF;
	init_comms(); //usart ı etkinleştir
	
	while (1){
		if(RB0==0){		
		DelayMs(100);
			putch(dene);  //değeri gönder
			dene=dene+10;
		}		
	}
}



Şimdi ise veriyi alan pic için gerekli kodu veriyorum



#include <htc.h>
#include <delay.c>
#include <usart.c>


void
main(void)
{
	
	unsigned int sayac;
	TRISB=0x00;
	TRISC=0xFF;
	TRISD=0x00;
	PORTB=0x00;
	PORTD=0x00;
	GIE=1; //kesmeleri etkinleştir
	PEIE=1; //çevresel kesmeler etkin
	RCIE=1; //usart kesmesi etkin
	init_comms(); //usart etkinleştiriliyor
	EEPROM_WRITE(0x00,0); //başlangıç için değer sıfırlanıyor

	while (1){
		DelayMs(200);
		PORTD=--sayac;   //geri sayar ve sonucu PORTD ye gönderir.
		PORTB=EEPROM_READ(0x00);   //0x00 adresini okur ve sonucu PORTB ye yazar		
	}
}
static void interrupt kesme(void)  //kesme fonksiyonu
{
	if(RCIF==1){ //eğer usarta veri geldiyse
		EEPROM_WRITE(0x00,getch()); //veriyi 0x00 adresine yaz
		RCIF=0;// yeni veri için bayrağı sıfırla
	}
}


Son olarak ta çalışan kodların proteus ekran görüntülerini veriyorum. Eprom değerlerini okumak için programı duraklatın (pause) daha sonra yukarıdaki menülerden "DEBUG" menüsüne girin. En alttaki iki "PIC CPU" yazısından alttakini seçin (U2 diye gözüken olmalı çünkü bendeki dosyada U2 eprom yazım işlemi yapıyor) açılan meünden eprom u seçin içeriği görünecektir.



Bilgi gönderildikten sonra



Ekte hex kodları,c kodları ve proteus benzeşim dosyası verilmiştir.Proteus 7.1 Sp2 kullanılmıştır.
Alıntı Yaphttp://rapid-share.com/files/75249327/karisik.rar

"-" işaretini kaldırın

NOT: Akşam için biraz uzunca bir yazı oldu. Hatalarım varsa affola.iyi çalışmalar.
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

tyilgin

Çok güzel bir anlatım olmuş. Paylaşımınız için teşekkürler.

Derlemeye başlamak için toolbarda 4. buton olan mavi renkli, balık yüzgecini andıran ikonumu tıklamak gerekiyor ?

Ayrıca daha önce yapılmış bir c dosyasını açmak için file menüsü altında "Open" gibi bir şey göremedim. Yanlış yeremi bakıyorum ?

muuzoo

gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

muuzoo

Alıntı yapılan: "tyilgin"Çok güzel bir anlatım olmuş. Paylaşımınız için teşekkürler.

Derlemeye başlamak için toolbarda 4. buton olan mavi renkli, balık yüzgecini andıran ikonumu tıklamak gerekiyor ?

Ayrıca daha önce yapılmış bir c dosyasını açmak için file menüsü altında "Open" gibi bir şey göremedim. Yanlış yeremi bakıyorum ?


Derlemeyi başlamak için kaydetmeniz yeterli. Kaydet tuşuna bastığınızda kodunuz derlenerek hex dosyası oluşturuluyor. O balık yüzgeçi gibi olan mavi şey bir çeşit kod sihirbazı. Pic konfigurasyonları kod yazmadan ayarlamaya yarıyor. Açıkçası çok kullandığım bir şey değil ama ilerde anlatımını sunarım.

File menüsüne girdiğinizde hemen baştan  2. seçenek "Open File" yazar. Oradan istediğiniz dosyayı açabilirsiniz. Kolay gelsin. iyi çalışmalar.
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

tayyar

Eline saglık hocam bu anlattıklarını ufak bir pdf yapalın indirmesi okuması basması kolay olsun sınavlarım bitsin ilgilenicem izin verirsen?
--EGEMENLİK KAYITSIZ ŞARTSIZ MİLLETİNDİR--

muuzoo

Alıntı yapılan: "tayyar"Eline saglık hocam bu anlattıklarını ufak bir pdf yapalın indirmesi okuması basması kolay olsun sınavlarım bitsin ilgilenicem izin verirsen?

Çok güzel olur. Hepsinin bir arada düzenli bir biçimde erişilebilir olması faydalanmak isteyen arkadaşlar için kolaylık sağlayacaktır. Aslına bakarsanız neden benim aklıma gelmedi  :D  diye düşündüm bu mesajınızı görünce. Eğer bir aksilik çıkar da uğraşamazsanız haber edin ben yapayım. Ama önce finalleri atlatmam gerek. Size de sınavlarınızda başarılar dilerim. Kolay gelsin.
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

bilalkaraaslan

merhaba arkadaşlar yeni bir proje oluşturduğumda project explorer kısmında proje isminin üzerinde ünlem işareti oluşuyor. ve kaydet e bastığımda hex dosyası oluşmuyor. ayrıca outline kısmında delay gibi kütüphaneleri nasıl ekleyeceğiz. teşekkürler..

anil43

arkadaşlar aradan baya bi zaman geçmiş ama cevaplarsanız sevinirim. proğramı indirdim ama java 1,5.0.03 sürümünü bulamadım link de kırılmış yardımcı olursanız sevinirim

KAZIMUGUR

Hi-Tide kurarken son aşamada , java kurayım mı ? diye sorar , kutuyu işaretle ve onayla , kendisi indirip kurar.
Bunu atladıysan sil yeniden kur , mesela .

Bir yerlerde resimli kurulum da olacaktı ama nerelerde hatırlamıyorum.

anil43

cevap verdğiniz için t.şekkürler.Çok kere denedim resimli anlatımla yapıyorum zaten en sonunda server 404 hatası veriyor illaki java 1.5.0.03  istiyor bulursanız sevinirim

muuzoo

Uzun zaman olmuş verdiğim dosyaların çoğu silinmiş. Neyse aradığınız dosyayı şuradan bulabilirsiniz:

http://www.filehippo.com/download_java_runtime/tech/3446/
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

anil43

arkadaşım merhaba gecenin bu yarısında cevap verdiğin için sağol bana ms n de yardımcı olursan çok müteşekkir olurum akotomasyon@hotmail.com