MikroC Dersleri 10

| Haziran 12, 2023 Tarihinde güncellendi
MikroC Dersleri 10

Merhaba elektronik Severler. Biraz ara uzadı umarım bu ara yüzüne mikroC’den uzaklaşmamışsınızdır aksine inşallah kendinizi geliştirmeye çaba sarfetmişsinizdir diye umut ediyoryum. Bir önceki dersimizdeprogramcılık deneyimlerimiz arasına RB4-7kesme değimlerini ve programsal 74hc595 entegresinin kontrolü uygulamamızı gerçekleştirdik.

PCBway Türkiye PCB Manufacturer PCB Assembly

Bu dersimizde kesmenin en sık kullanılan türüne geldik yani TİMER kesmesi. PIClerde donanımsal olarak TIMER0 TIMER1 TIMER2 kesme kaynakları mevcuttur. Biz prensip olarak temel teşkil eden TIMER0 kesmesini öğreneceğiz.

Dersimize başlamadan önce işimize yarayabilecek birkaç kısa bilgi verdikten sonra dersimize geçelim.

  • Pic çıkışlarının sinyal yükseltmesi transistörler aracılığı ile yada opamp entegreleri ile yükseltilmelidir.
  • PCB kartlarda kontrol için kullanılan çeşitli entegrelerin çalışma verimini artırmak için entegrenin hemen yanına 100nf değerinde kondansatör bağlanmalıdır. Bu sayede gerilim düzensizliklerinden entegreler etkilenmemiş olur.
  • Baskı Devreli uygulamanıza çok küçük bir profesyonellik katmaya ne dersiniz. Hani hazır baskı devrelerde yollar lehimle kaplı oluyor ya neden amatör PCB’lerde profesyonel olmasın. Öncelikle kabartma tablo yapan bir yerden folyo bakır alacaksınız sonrasında evde bir köşede atılmış olan bir ütü ya da konukomşudan atıl ütü buluyoruz bu bakır folyo ile düzdün bir şekilde ütünün altını kaplıyoruz. Sonrasında asitten aldığımız PCB kartı kurulayıp üzerine reçine(pasta) beziyoruz krem sürer gibi ince bir tabaka. ısıttığımız ütüyü PCB yüzeyine bastırıyoruz ve ütü tabanına lehim verip güzel ce ütü yapıyoruz işlem sonrasında Baskı devremiz hem lehimlemeye çok daha uygun hale gelecek hemde artık PCB korozyona karşı korunur duruma gelmiş olacaktır.
  • PIC li devrelerimizde PIC besleme yolu üzerine bir adet 1n4001 diyot bağlandığında PIC devremiz ve donanım ters akıma karşı korunmuş olur
  • Programın enerji kesilmesi enerji verilmesi durumunda kararsızlıklarını kaldırmak için POR power on reset BOR Brown outreset seçenekleri açılmalıdır.

KESME ayarlarını yapacağımız İNTCON register bit haritası aşağıda verilmiştir. Buradan diğer kesme kaynaklarında olduğu gibi timer0 kesmesinde de bu regi kullanacağız.

intcon-register-address-0bh-8bh-10bh-18bh-microc-dersleri

Buradaki kısaltmaların her biri bir anlam taşımaktadır. Bu registerin yapısını kullanacak olduğunuz PIC datasheet de bulabilirsiniz.

Bit 7: Bu bitin anlamı Global İnterrupt Enable kelimeleridir.Yani Evrensel Kesme aktif bitidir.

• 1 ise Kesmelere izin verilimiştirBütüm kesmelerde 1 yapılır
• 0 ise kesme programı kullanılmayacaktır.

Bit 6: Peripheral İnterruptEnable bitÇevresel kesmelere izin verme biti

 

Bit5:  TMR0 Overflow Interrupt Enable bit . TMR0 sayacının başlangıca dönmesi sonucu kesme oluşturur.

• 1 ise TMR0 kesmesi aktif yapılır
• 0 olduğunda TMR0 zaman kesmesi kullanılmayacaktır

Bit4: İNTE RB0 Dış kaynak kesmesi

• 1 RB0 Aktif
• RB0 Pasif

Bit3: RBIE RB 4 7 Değişiklik kesmesi( b Portunun 4 ve 7 portları (4 5 6 7 ) Giriş yapılmak zorundadır)
• 1 aktif 0 pasif Biz bu ders bu bitleri ayarlayacağız

Son 3 bit ise ilgili kesmelerin bayraklarıdır her hangibir bayrak 1 iken diğer kesmeler aktif bile olsa kesmeler çalışmaz o yüzden bayraklar kesme programı sonunda 0 yapılmalıdır.

RB0 int kesmesinde kullandığımız option_registerTimer0 kesmesindede kullanılmaktadır. Seçenekler kaydedicisi timer kesmesi Overflow (zaman taşması)ayarı için kullanılacaktır.

TIMER0 kesmesi

Mikro denetleyicilerin en önemli özelliklerinden birisinde donanım yapısında sayıcı/zamanlayıcı birimlerinin bulunmasıdır. Buna timer modülü denilmektedir. Denetleyicilerdeki bu yapı sayıcı olarak kullanılabileceği gibi zamanlayıcı olarakta kullanılabilmektedir. Biz programcılar yapacak olduğumuz işe uygun bir senaryoyu baştan düşünüp belirleriz o sebeple bu senaryoda timer modülünün de rolünü sayıcı yada zamanlayıcı olarak baştan belirlenmelidir.

Ve uygulama yapmadan önce bu donanım özellikleri göz önünde bulundurulup PIC seçimi yapılmalıdır.

Şu günlerde program geliştirmede genel kontrol özelliklerine sahip ve uygun fiyatı olan 16f628A çok yoğun kullanılmaktadır . bu sebeple uygulamamızı 628A ile yapacağız.

16F628A Denetleyicisinde TİMER0 TIMER1 TIMER 2 Modulleri mevcuttur.

Bu sayıcılardan TIMER0 vve TIMER2 8bitlik yani 0 255 değerini PIC enerji verilir verilmez sayarlar TIMER1 Sayıcısı ise 16bitlik sayıcıdır ve bu sayıcıyı PWM modülü ve CAPTURE modu donanımsal olarak kullanır.

Ve 0 65535 sayar. TIMER modulu PIC osilator frekansı/4 saykıl çevriminde bir değer artırılarak yapar yada RA4 T0ICKI girişinden dışarıdan da saydırılabilir. Eğer dış kaynakdan sayaç artırılacaksa sayacın artması için sinyal kenarını seçmek için OPTION registerinin 3.bitini kullanabiliriz.TIMERmodulunun değeri dış kaynaktan artırılırsa modül sayıcı olarak çalıştırılmış olacaktır.

Ya ne anlatıyor bu ders dediğinizi duyar gibiyim … Neyse biraz işi Türkçeleştireyim bu tımer aslında PIC frekansına bağlı olarak yada dışarıdan saydırılan bir sayıcıdır. PIC enerji alır almaz 0dan 255e sayar sonra tekrar sıfıra düşer. Dışarıdan bir butonla yada sistemle bu sayaç artırılır veya PIC frekansının 4de1 frekansının 1saykıl çevriminde de artırılabilir. Örneğin 4MHZ kristalle çalıştırılan bir denetleyicinin TIMER sayıcısının değeri 4MHZ/4=1MHZ yani 1/1000.000 saniyede artar yani 1mikroSaniyede bir artar. Peki artsın artsın da artması ne işimize yarar?

Ne işimize yaradığı kısmı Şu bu sayıcının değeri okunabilir yada programsa olarak doğrudan değer atanabilir(yazılabilir) ve en önemli özelliği sayıcının belli bir sayma değerinden sonra 0a dönerken KESME oluşturur.

Burada bahsi geçen belli bir sayma değerini biz OPTION REGISTERIN ilk 3 biti ile kontol ederiz.

bit-vaule-tmr0-rate-wdt-rate-mikroc

Yukarıdaki tabloda PRESCALER değer tablosu yer almaktadır . Buradan TMR0 oranı için OPTION REGISTERİN ilk üç biti örneğin 000 seçildiğinde TMR0 ORANI ½ seçilmiştir ve TIMER sayacı her iki defa 255e kadar sayıp 0a döneceği sırada kesme oluşturur yani buda demek oluyor ki TIMER sayacı sıfırdan başlatılıp PS değeri ½ seçilirse PSx256x (1/OSC frekansı/4) formulunden
2x256x1MikroSaniyeden 512 Mikrosaniyede bir kesme oluşturulur

Bu şekilde PSA değeri 1/256 seçilirse ve PIC 4mHz de çalışıyor sa 256x256x1us den 65535 us yani 65,5 milisaniyede bir gecikme sağlanır ve bu süre sonunda Program kesme bayrağını çeker ve kesme programına gider . Kesme olgusunun ne olduğunu önceki ikderte anlattığım için tekrar etmeyeceğim.

Yani 4MHZ minimum 2us maksimim 65,5mili saniye gecikmeli kesme oluşturulabilir.

2us değeri için TIMER0 değeri 255 yapılır PSA değeri ½ seçilir bu sayede sayıcı 255den 0 a döner değeri tekrar 255 e döner 2.sıfıra dönüşünde kesme oluşur.

Şimdi bu yazdıklarımı bir örnek üzerinde anlatırsam 🙂

Bir trafik sinyalizasyon sisteminde bir sürü yolların ışıkları sıra ile çalışan bir zaman serisidir.

Dört yol ya da çift yönlü dörtlü kavşak ışık sisteminde ışıklar bir sıra halinde yanarken ara sokaktan yan yola bağlanılan köşede ise bir sarı ışık sürekli yanıp sönmektedir o sırada denetleyicideki ana program diğer yolların ışıklarını belli süreleri bekletip yollara yön verirken nasıl oluyor da ara sokağın lambası o zaman dizisinden bağımsız olarak sürekli yanıp sönmektedir. 🙂 Sanki bir kısmınız ona ayrı flaşör bağlarız diyor gibisiniz 🙂 belki tek bir sokak için dikkat çekmesi amaçlı flaşör koyulabilir ama konumuz nasıl yapabilirizden çok konuyu Timer kesmesine bağlamak.

Evet böyle bir sistemde pıc ana programındaki yönergeler yolların ışıklarını işlerken hikayedeki sokağın sinyal lambasını doğru şekilde ayarlanmış timer kesmesi ile ana program etkilenmecen yakılıp söndürülebilecektir. Yada bir saat derece programında saat çalışırken belli aralıklarla bir sıcaklık sensörü okunup anlık gerçek sıcaklık ölçülüp değerlendirilebilir. Bir başka örnek vereyim bir kayan yazı sisteminde akan yazıyı oluşturmak için saniyede yüzbinlerce sinyal işlemek gerekir buda çok hızlı ve sapmasız çalışan bir algoritma gerektirir böyle bir kayan yazıda ekrandan saat bilgisi kayarak geçecektir ama saat ekrana girip çıkana kadar o anki saniyeyi de gösterecektir nasıl olacak da hem saat bilgisi ekrandan kayacak hemde saniye saniye doğru gösterecek. Programını düşünmekten kaçanlar sadece saat ve dakika gösterip kurtarıyor işi ama saniye bilgisini ekran taranırken zaman kesmesi ile belirli aralıkta saat bilgisi güncellenerek saniye görüntüsü kayarken anlık değişmektedir. Umarım anlatabilmişimdir.

Kesme ayarında kullanacağımız optionregisteri aşağıdadır

option-register-address-81h-181h-microc

Bu registeride bitler halinde tanımlayacak olursak

Bit 7 : RBPU PortB İçten Yukarı çeken (PULL UP) dirençlerini aktif yapma biti
1 pasif
0 aktif yapar.(bu dirençler Buton kontrolünde +5v a bağladığımız 10K lık direnlerin görevini görür)

Bit 6: INTEDG RB0İnt Kesmesini kenar seçme biti
1 iken kesme RB0 bağlı sinyalin Yükselen kenarında (yani Buton bağlı ise butona basılınca)gerçekleşir
0 iken kesme RB0 bağlı sinyalin düşen kenarında(yani Bağlı olan butona baılıp elimiz çekilince)gerçekleşir
Bit5: T0CS TMR0 sayacının saat kaynağının seçim biti
1 ise RA4/T0CKI bacağının her sinyalinde TMR0 sayacı bir artar.
0 ise Saat kaynağı komut çevrim sinyali olun (yani PİC firakansının ¼ ü frekansta bir artar)(bu arada TMR0 PIC ierisinde sürekli olarak 0dan 255e kadar sayan bir sayaçtır ve 255den 0a dönerken keme kurulmuş ise kesme oluşturur)
Bit4: T0SE Eğer TMR0 saat kaynağı dış sayaç seçilmişse bu bit dış sinyalin kenarını seçer.
1 ise TMR0 sinyalin düşen kenarında artar
0 ise TMR0 sinyalin yükselen kenarında artar
Bit3: sayaç ön bölücü seçim biti.
1 Önbölücü WDT(bekçi Köpeği) ayarlandı
0 önbölücü TMR0 A ayarlandı.

Bit 2-0 Önbölücü oran seçme bitleri

Bit değerleri TMR0 kesme oluşturma oranı
000                            ½ (TMR0 sayacının her iki defa 255 saymasından sonra Kesme Oluşturur)
001                             ¼
010                             1/8
011                             1/16
100                            1/32

Örnek olarak uygulamasını gerçekleştirdiğim bir sistemin programı üzerinde tüm detayları yazarak gösterdim.

İlgili programın dosyaları ektedir. Program yazılımı aşağıdadır. Sizlere örnek olması amacı ile programın temel mantık kısmı verilmiştir ticari bir amaç taşımamaktadır.

Haricen birde Derece göstergesi programını yayınlıyorum uğraşacak arkadaşlar Hex kodu elde edeceklerdir. Hex kodunu haricen vermiyorum. Derslerimi takip edenler uygulamaların kolay lokmadan ziyade öğretme amaçlı olarak temelini verdiğimi bilmektedirler.
İlgilendiğiniz kısımları sorarsanız cevap vermeye çalışırım.

Bir sonraki dersimizde ADC modülleri ile analog sinyallerin Programsal değerlendirilmesi üzerine durmayı düşünüyorum. Arayı uzun tutmamaya gayret etmekteyim lakin işlerin yoğunluğundan vakit bulup yazı yazamıyorum.


 /*Programı Hazırlayan Aytaç Dürgen*/
 /*MCU 16f877A*/
 /*çevresel aygıtlar LCD ekran 7segment display gösterge*/
 
#define sinyal  PORTD.B0    /*PORT terminallerine takma ad veriliyor*/
#define cikis   PORTD.B1
#define data0    PORTD.B2
#define data1    PORTD.B3
#define data2    PORTD.B4
#define data3    PORTD.B5
char  keypadPort at PORTC;     /*PORTC ye tuş takımı bağlanacak*/

unsigned int sayi_tablosu[10]={63,6,91,79,102,109,125,39,127,111}  ;
unsigned int i,a,l,x,sayici,benzin1,benzin2,benzin3,lpg1,lpg2,lpg3,mazot1,mazot2,mazot3;
unsigned char *text1= "0.00";        /*karakter tipinde işaretçi tanımlanıyor.İşaretçiler oldukça geniş konudur.sadece * la gösterildiğini bilmek yeterlidir*/
unsigned char *text2= "0.00";
unsigned char *text3= "0.00";
unsigned char *ara_text=0;
unsigned char *ara_text1=0;

sbit LCD_RS at RB2_bit;                    /*LCD bağlantıları ayarlanıyor*/
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;

void spi (unsigned char veri,unsigned char veri1,unsigned char veri2)
{
     unsigned int i;
     unsigned char temp,temp1,temp2;
     temp = veri;
     temp1 = veri1;
     temp2 = veri2;
     i=8;
     while (i>0)
     {
        /**************************/
        if (temp.F7==0)  data0 = 0;
        else             data0 = 1;
        /**************************/
        if (temp1.F7==0) data1 = 0;
        else             data1 = 1;
        /**************************/
        if (temp2.F7==0) data2 = 0;
        else             data2 = 1;
        /**************************/
        temp = temp<<1;
        temp1 = temp1<<1;
        temp2 = temp2<<1;
        sinyal = 1;
        Delay_us(2);
        sinyal  = 0;
        i--;
        }
}

     void goruntule()
     {
     cikis = 1;
     Delay_us(2);
     cikis = 0;
     }
     void benz_don_eeyaz(unsigned int benzin)
     {
     benzin1= benzin%10;
     benzin2=(benzin/10)%10;
     benzin3=(benzin/100)%10;
     EEPROM_Write(0, benzin1);
     EEPROM_Write(1, benzin2);
     EEPROM_Write(2, benzin3);
     text1[0]=benzin3+48;
     text1[2]=benzin2+48;
     text1[3]=benzin1+48;
     }
     void lpg_don_eeyaz(unsigned int lpg)
     {
     lpg1= lpg%10;
     lpg2=(lpg/10)%10;
     lpg3=(lpg/100)%10;
     EEPROM_Write(3, lpg1);
     EEPROM_Write(4, lpg2);
     EEPROM_Write(5, lpg3);
     text2[0]= lpg3+48;
     text2[2]= lpg2+48;
     text2[3]= lpg1+48;
     }
     void mazot_don_eeyaz(unsigned int mazot)
     {
     mazot1= mazot%10;
     mazot2=(mazot/10)%10;
     mazot3=(mazot/100)%10;
     EEPROM_Write(6, mazot1);
     EEPROM_Write(7, mazot2);
     EEPROM_Write(8, mazot3);
     text3[0]= mazot3+48;
     text3[2]= mazot2+48;
     text3[3]= mazot1+48;
     }
     unsigned short saniye,  oldstate = 0;
     unsigned int  cnt;


     void interrupt()    // TMR0 kesmesi sonucu gerçekleşecek dallanma rutini
{cnt++;
if(cnt==32){              //Kesme olgusu 30mili saniyede bir gerçekleşiyor 32 döngü yaklaşık 1sn ye ye denk geliyor
cnt=0;
saniye++;                 /*her 1 saniyede bir değişken (saniye) artırılıyor*/
}
INTCON.T0IF =0;           /*TMR0 bayrağı siliniyor ki tekrar kesme gerçekleşebilsin*/
TMR0=125;                 /*TMR0 sayacı değeri tekrar yükleniyor 0 255 arası*/
/*TMR0 sayacı ismi kendi belirlediğimiz bir ad değil mikroC derleyicisinde belirlenmiş zaman sayacının adıdır*/
}

/*****************************************************************************/
/*****************************************************************************/
void ayarlar(){



  PORTA=0;
  TRISA=0x00;                  // PORTA çıkış yapıldı
  PORTD=0;
  TRISD=0x00;                  // PORTDçıkış yapıldı
  PORTB=0;
  TRISB=0x00;                  // PORTB çıkış yapıldı
  OPTION_REG  = 0x07;          // TMR0 Prescaler değeri 256 seçiliyor
  INTCON.GIE  = 1;             // Genel kesme ayarı aktif yapılıyor
  INTCON.T0IE = 1;             // TMR0 sayıcısı kesmesi aktif yapıldı
  TMR0        =125;            // TMR0 sayıcısı başlangıc değeri atanıyor
  LCD_Cmd(_LCD_CURSOR_OFF);
  LCD_Cmd(_LCD_CLEAR);
  ADCON1     =7;                // Tüm analog portlar dijitale ayarlandı
  CMCON      =0x07;             // Tüm karşılaştırıcı modülleri kapatılıp portlar dijitale ayarlandı
  CCP1CON    =0;                // PWM modülü sıfıra çekiliyor(kapatılıyor)
  Keypad_Init();
  
  

  }
/*****************************************************************************/
void main() {
ayarlar();
TMR0        =125;
cnt=0;
saniye=0;
for(;;){



if(cnt==0){ //1sn de 1 ekran bilgileri tazeleniyor//
spi(sayi_tablosu[EEPROM_Read(0)],sayi_tablosu[EEPROM_Read(3)],sayi_tablosu[EEPROM_Read(6)]);
spi(sayi_tablosu[EEPROM_Read(1)],sayi_tablosu[EEPROM_Read(4)],sayi_tablosu[EEPROM_Read(7)]);
spi(sayi_tablosu[EEPROM_Read(2)],sayi_tablosu[EEPROM_Read(5)],sayi_tablosu[EEPROM_Read(8)]);
goruntule();
}

if(saniye==0){
LCD_Cmd(_LCD_CLEAR);
Lcd_out(1,1,"EKRAN1 :");    /*ekranın 2.satırına sabit yazı 1 karakterden itibaran basılıyor*/
Lcd_out(1,9,text1);
Lcd_out(1,13,"TL");
do ; while(saniye<2);
}
if(saniye==2){
LCD_Cmd(_LCD_CLEAR);
Lcd_out(1,1,"EKRAN2 :");    /*ekranın 2.satırına sabit yazı 1 karakterden itibaran basılıyor*/
Lcd_out(1,9,text2);
Lcd_out(1,13,"TL");
do ; while(saniye<4);
}
if(saniye==4){
LCD_Cmd(_LCD_CLEAR);
Lcd_out(1,1,"EKRAN3 :");   /*ekranın 1.satırına sabit yazı 1 karakterden itibaran basılıyor*/
Lcd_out(1,9,text3);
Lcd_out(1,13,"TL");
do ; while(saniye<6);
}
if(saniye==6){
LCD_Cmd(_LCD_CLEAR);
Lcd_out(1,1,"EKRAN4 :");   /*ekranın 1.satırına sabit yazı 1 karakterden itibaran basılıyor*/
Lcd_out(1,9,text3);
Lcd_out(1,13,"TL");
do ; while(saniye<8);
}
if(saniye==8){
LCD_Cmd(_LCD_CLEAR);
ara_text = "                ***TARSUS LED***PETROL FIYAT GOSTERGESI SISTEMI 2010 ";/*68 karakterlik bilgi satırı Kaydırılıyor*/
for(i=0; i<67; i++)
{
ara_text++;
Lcd_out(1,1,ara_text);
Lcd_out(2,1,ara_text);
delay_ms(80);
}
saniye=0;
cnt=0;
TMR0=125;
}








}
}//~!

Aşağıdaki program eksi sıcaklıkları gösteren dijital termometre entegresi 18B20 entegresinden sıcaklık bilgisini alır 7 segment displayda görüntüler.

Ekteki program MikroC programı Örnekler kütüphanesinden düzenlenmiştir.orjinaldeki program eksi sıcaklıkları göstermezken bu programda eksi sıcaklık bilgisi de değerlendirilmiştir. Ayrıca orijinal program LCD ekrana bilgileri basarken bu program 7 segment göstergelerle SPİ yöntemi ile basılmaktadır.

Bu programdan elde edeceğiniz hex kodu ekteki devrede sorunsuz çalışmaktadır.displaygösteebatını büyük tasarlamak isteyenler 595 çıkışlarını uln2803 ile sürerlerse kanal başı 50 ledi sorunsuz süreceklerdir. 50 ledle tasarlanan 1segmentle 7 segment display tahminim 60 70cmi bulur.buda oldukça büyük meydanlar için bile derece yapmak demektir.Ayrıca elimden geldiğince milli duygularım gereği programı türkçeleştirmeye çalıştım.


#define clock      PORTA.B0  //
#define latch      PORTA.B7  //
#define ds1        PORTA.B6  //
#define reset      PORTA.B1  //
#define ccp        PORTB.B3  //


unsignedintsayi_tablosu[11]={63,6,91,79,102,109,125,7,127,111,64} ;
unsignedintonlar,birler,ondalik1,ondalik2,ara_deger,eksi=0;

voidspi (unsignedchar veri)
{
unsignedint i;
unsignedchartemp=0;
temp = veri;
     i=8;
while (i>0)
{
if (temp.F7==0) ds1 = 0;
else            ds1 = 1;
temp = temp<<1;
        clock = 1;
        clock  = 0;
        i--;
}
}
voidgoruntule()
{latch = 1;
latch = 0;
}


//  Set TEMP_RESOLUTION tothecorrespondingresolution of used DS18x20 sensor:
//  18S20: 9  (defaultsetting; can be 9,10,11,or 12)
//  18B20: 12
unsignedconst TEMP_RESOLUTION = 12;

char *text = "0000";
unsignedtemp;

voidsicaklik_goster(unsignedintds_bilgi) {
unsignedconst RES_SHIFT = TEMP_RESOLUTION - 8;
charara_sicaklik;
unsignedintsicaklik_deger;




if (ds_bilgi& 0x8000) {
ds_bilgi = ~ds_bilgi + 1;
         eksi=1;
}
  else {PORTB.B4=0;
        eksi=0;}
             // Extractonesdigit

ara_sicaklik = ds_bilgi>> RES_SHIFT;
text[1] = (ara_sicaklik/10)%10;             /
text[2] =  ara_sicaklik%10 ;






 onlar=text[1];
 birler=text[2];
text[0]=99;
text[3]=57;



spi(text[3]);
spi(text[0]);
spi(sayi_tablosu[birler]);

if(onlar!=0)
spi(sayi_tablosu[onlar]);
  else if(eksi) spi(64);
else  spi(0);

goruntule();

}

void main() {


  CMCON =0x07;
  TRISA=0;
  PORTA=0;
  TRISB=0;
  PORTB=0;
reset=1;
ccp=0;
Ow_Reset(&PORTA, 2);

  do {

Ow_Reset(&PORTA, 4);                         // Onewireresetsignal
Ow_Write(&PORTA, 4, 0xCC);                   // Issuecommand SKIP_ROM
Ow_Write(&PORTA, 4, 0x44);                   // Issuecommand CONVERT_T
Delay_us(120);

Ow_Reset(&PORTA, 4);
Ow_Write(&PORTA, 4, 0xCC);                   // Issuecommand SKIP_ROM
Ow_Write(&PORTA, 4, 0xBE);                   // Issuecommand READ_SCRATCHPAD
temp =  Ow_Read(&PORTA, 4);
temp = (Ow_Read(&PORTA, 4) << 8) + temp;
Delay_ms(500);


sicaklik_goster (temp);



}while (1);
}

İyi çalışmalar. Uğraşan herkese kolay gelsin.
Not İlgili dosyalar ekte mevcuttur ve Ekteki çalışmalar ticari amaç gütmeksizin bilgi paylaşımı amacı ile yazılıp paylaşılmıştır.

http://www.facebook.com/#!/tarsus.led
[email protected]
[email protected]

Aytaç Dürgen
Elektrik Elektronik Teknolojileri
Teknik Öğretmen

mikroc-dersleri-10

Şifre-Pass: 320volt.com

Yayım tarihi: 2012/01/26 Etiketler: , , , , ,



15 Yorum “MikroC Dersleri 10

  1. Aytaç DürgenAytaç Dürgen

    Uğraşan arkadaşlara yeni Dersim umarım faydalı olur.

    CEVAPLA
  2. SemihSemih

    hocam elinize sağlık.
    yayınlarınız titizlikle takip ediyorum.kaliteli bir eğitim anlayışınızdan dolayı sizi tebrik ediyorum.yazılarınızın ve başarınızın devamını diliyorum.

    saygılarımla…

    CEVAPLA
  3. Umut CanUmut Can

    Hocam çok sağolun gerçekten çok anlaşılır, bir daha ki ders ne zaman gelicek ?

    CEVAPLA
  4. Aytaç DürgenAytaç Dürgen

    11 Ders 15 20 gün sonra hazır olur inşallah

    CEVAPLA
  5. Can ÖzelCan Özel

    Derslerini ilgiyle takip ediyorum elektronik mühendisliğinde okuyorum gerçekten verdiğiniz bilgiler çok anlaşılabilir ve uygulamalarınız çok can alıcı.Hiçbir karşılık beklemeden böyle ulvi bir görev üstlenmeniz gerçekten beni de çalışmaya itiyor.
    Saygılar

    CEVAPLA
  6. abdullah gökerabdullah göker

    hocam verdiğiniz emeklerden dolayı çok teşekkür ederiz. sayenizde bir türlü nerden çalışmaya başlasak sorsusuna cvp bulamamaktan kurtulduk.
    11. dersi heyecanla bekliyoruz

    CEVAPLA
  7. ÖzkanÖzkan

    Hocam süpersiniz, bilgi paylaşımı için teşekkürler. Başka hiçbir yerde bulunamayacak mikroc dokümanları bunlar

    CEVAPLA
  8. Ali ÇETİNKAYAAli ÇETİNKAYA

    Selamlar. Çalışmalarınız çok güzel teşekkür ediyorum. Benim bir sorum olacaktı. Ben microc de timerlerin bir arada olduğu bir program yazmaya çalışıyorum. kullandığım entegre 18f252. timer 0 ile sorunsuzca program işliyor. ve programın o süreçteki while döngüsü içindeki işlemleri yapabiliyorum. Timer1 de başka bir olayı kontrol etmeye çalıştığımda timer 0 çalışıyor ve while döngüsü bu süreçte kilitleniyor. doğal olarak timer1 de çalışmıyor. Benim sormak istediğim. iki timeri veya 18f252 nin içinde bulunan 4 timeri bir arada kullanmak istediğim zaman ne yapmalıyım. veya nasıl bir yol izleyerek timerler birbiri ile çakışmadan sonuç alabilirim. Şimdiden teşekkür ediyorum. iyi günler.

    CEVAPLA
  9. AytaçAytaç

    @ali çetinkaya
    öncelikle yazimi takip ettiğiniz için size ve diğer arkadaşlara teşekkür ediyorum . sorduğunuz soruya askerde olduğum için kısıtlı imkanlarla kaynak doküman program olmaksızın cevapliyacaim o sebeple eksik bilgi yada unuttuğum şeylerden ötürü hatalı olabilir . Ama mantık oluşturursunuz diye umuyorum. Ilk başta t0 intcon kaydedicisi ile tamamen kontrol edilebiliyor . Ama timer 1 2 direkt olarak tek register ile kontrol edilemez önce peıe kaydedicisinden t1i yetkilendirmeniz gerekir. Ve iki farklı donanım kesme sayıcisini kullanacaksanız her gli kesme içinde girip rutinlerine intcon gie bitini 0yapmalısınız ki program bir kesmeyi icra ederken diğer bir kesme oluşup program o kesmeye gitmesin diye bunu yapmalısınız. Karşılıklı çaprazlama gibi düşünüp kesme içerisinde diğer kesmenin yetkisini kaldırmak için kesme bayrağına 1 yazmanız gerekir. Timer 1in bayrağı peıf diye bir kaydedicisi olmalıydı bayrağı da oradan temizleyip yazacaksınız. Böylece kesmeden dolayı program kilitlenmez. Bir başka hususta neden iki ayrı donanım kesmesini kullanıyorsunuz ki t0in içine sayaç kurup sayacın farklı değerlerini ama programda sorgulayıp işlemlerimizi o if bloku içinde yaparsınız olur biter . Bu grafik ekranlarda tarama mantığı var biraz ona benziyor . Ve ana programda işlemler tıkanmadan ve çok daha kolayca halledilir. Ben açıkça şu güne kadar bir çok profesyonel uygulama ,tasarım üretim yaptım daha bir yada iki kes timer1e ihtiyaç duydum. Hemen hemen tüm programlarımı sayıci mantığı ile yazıp üretiyorum . Ayrıca T1 sayıcisi pwm ve capture modülleri tarafından kullanılır programda bunları kullanıyorsanız zaten t1. 16bit saymaya başlar ve süre hesaplamasi içinden çıkılmaz hal alır. Şu an bilgisayar kitap vs olmadığı için kesin veriler kullanamadım kusura bakma asker ocağından cevap yazabilme imkanı bile çok büyük bir imkan . Kolay gelsin iyi çalışmalar

    CEVAPLA
  10. Ali ÇETİNKAYAAli ÇETİNKAYA

    Aytaç Bey Size Hayırlı teskereler diliyorum. Sorunumu çözdüm. Sorunum hakkında söylediklerinizden dolayı teşekkür ederim. pıe kaydedicileri ile iki timeri kullanırken daha dikkatli olmam gerektiğini ve timer ön değerlerini timerlerin kesmelerinde eklemeyi unutmuşum. Sizin gibi internette takip ettiğim başka bir mudicin çalışmaları çalışmama ön ayak oldu. kesmelerde programımın kilitlenmesi kesme içerisinde for gibi işlemleri yaptırdığımdan dolayı imiş. Benim çalışmamda sayıcı mantığı değilde iki timeri da zamanlayıcı olarak kullanmam gerekiyor. timer 1 in 250ms de bir kontrol etmesi gereken bir yapı vardı. bunu kesme için 1ms olarak yaptım. while içerisinde for atıp kesme içerisinde bunun artışını yaptım. programımda bir de pwm olarak timer2′ yi kullanacağım. 18f252 de ki timer3 hariç tüm timerleri kullanacağım. yorumunuz için teşekkür ederim. İyi akşamlar Hayırlı teskereler.

    CEVAPLA
  11. AytaçAytaç

    Sorunun çözüldüğüne sevindim . Tüm kesme rutinleri kısa tutulup belli değişkenlerin değiştirilmesi sağlanıp geri kalan iş main altında yapılmalı zaten . Epey kapsamlı bir çalışma olmalı 3zamanlama kesmeyi kullanmak zorunda olduğumuza göre . Umarım sorunsuz olarak gerçeklersiniz sistemi . Teşekkürler

    CEVAPLA
  12. Ali ÇETİNKAYAAli ÇETİNKAYA

    Ben Teşekkür ederim Aytaç bey evet sistem baya gereksinim isteyen bir düzenek aslında 3 hafta sonraki ödtü robot yarışmalarında kullanılacak bir robot için düşünüyorum aynı olayı. Bakalım kısmet ne kadar randuman tutacağını yarışmalar esnasında görebileceğiz. daha denemelere yeni yeni başlıyoruz. iyi günler.

    CEVAPLA
  13. durmuş serindurmuş serin

    Çalışmalarınızdan dolayı teşekkür ediyorum. Benim sorunum bir butona basılı tutulma süresini hesaplamak istiyorum bunu ekranda yazdırıp üzerinden hesaplama yapmam lazım. bu işlemi nasıl yapacağımı bilemedim.

    iyi çalışmalar tekrar teşekkür ediyorum.

    CEVAPLA

Semih için bir yanıt yazın Yanıtı iptal et

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir