Dış Kesme (External Interrupt) Uygulaması

pr_01_37_max

 

Kesme işlemini günlük hayattan bir örnek vererek açıklayalım. Mesela yemek yiyorsunuz ve telefon çaldı. Ne yaparsınız? Yemek yemeyi bir süre için bırakır, telefona bakar sonra dönüp yemek yemeye devam edersiniz. İşte günlük hayatta karşılaştığınız bir kesme. Asıl işiniz yemek yeme olayı iken ihtiyaçtan (telefon çalması) dolayı asıl işinizi bırakıp diğer bir işi yaptınız (telefona bakma) ve geri dönüp asıl işinizde kaldığınız yerden devam ettiniz.

Mikrodenetleyicilerdeki kesme olayı yukarıdaki örneğe oldukça benzerdir. Kesme, mikrodenetleyicilerin herhangi bir kesme kaynağından gelen sinyal nedeniyle çalışmakta olan programı bırakması ve önceden hazırlanan kesme altprogramını çalıştırması olayıdır. Alt programın çalışması bittikten sonra ana program kaldığı yerden itibaren tekrar çalışmasına devam eder.

Aşağıda verilen örnekte mikrodenetleyiciye ait B0 pininde bir değişiklik olduğunda program mevcut işini bırakır ve kesme alt programınında tanımlanan işlemleri yapar.

Not: Programda verilmiş ama kesme içerisinde delay_ms() komutunu kullanmayınız. Amaç kesmeden hemen çıkmak olmalı ve programınızı bu yönde hazırlamalısınız.

/******************************************************
 PIC16F877 ile Dış Kesme (INT_EXT) Uygulaması
 PIC PROG/DEKA : Port B jumper'ı LED konumunda olmalı
*******************************************************/
#include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#use fast_io(b) //Port yönlendirme komutları B portu için geçerli

int i; // Tamsayı tipinde değişken tanımlanıyor

//****** Dış Kesme Fonksiyonu *****************
#int_ext // Dış (External) RB0/INT kesmesi
void ext_kesmesi () // Dış kesme fonksiyonu
{
 output_high(pin_b1);
 delay_ms(1000);
 output_low(pin_b1);
 delay_ms(3000);

 for (i=0;i<10;i++)
 {
 output_high(pin_b1);
 delay_ms(500);
 output_low(pin_b1);
 delay_ms(500);
 }
}

/********* ANA PROGRAM FONKSİYONU********/

void main ( )
{
 setup_psp(PSP_DISABLED); // PSP birimi devre dışı
 setup_spi(SPI_SS_DISABLED); // SPI birimi devre dışı
 setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı
 setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
 setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok
 setup_adc(ADC_OFF); // ADC birimi devre dışı
 setup_CCP1(CCP_OFF); // CCP1 birimi devre dışı
 setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı

 set_tris_b(0x01); // RB0 pini giriş,diğer uçlar çıkış olarak yönlendiriliyor
 output_b(0x00); // B portu çıkışı ilk anda sıfırlanıyor

 ext_int_edge(H_TO_L); // INT_EXT kesmesinin düşen kenarda aktif olacağını belirtir

 enable_interrupts(INT_EXT); // INT_EXT kesmesini aktif yapar
 enable_interrupts(GLOBAL); // Aktif edilen kesmelere izin ver

 while(1); // Sonsuz döngü
 }

Dış Kesme (External Interrupt) Uygulaması

CCS C Örnekleri kategorisine gönderildi | , ile etiketlendi | Yorum yapın

CCS C ile 7 Segment Sayıcı Uygulamaları

pr_01_37_max

 

/******************************************************
 Uygulama Adı : Display Uygulaması-3(7448 Entegresi ve Buton İle 0-99 Yukarı/Aşağı Sayıcı)
*******************************************************/
#include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

//***********Denetleyici konfigürasyon ayarları************
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay(clock=4000000) // Gecikme fonksiyonu için kullanılan osilatör frekansı belirtiliyor

#use fast_io(a) // Port yönlendirme komutları a portu için geçerli
#use fast_io(b) // Port yönlendirme komutları b portu için geçerli

#define arttir pin_a0 // arttir butonu pin_a0 ile eşleniyor
#define azalt pin_a1 // azalt butonu pin_a1 ile eşleniyor

char birler=0, onlar=0, sayi=0; // int tipinde değişkenler tanımlanıyor

// Ortak katot display için veri değerleri
const int digit[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};

/********* ANA PROGRAM FONKSİYONU********/

void main ()
{
 setup_psp(PSP_DISABLED); // PSP birimi devre dışı
 setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı
 setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
 setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok
 setup_adc(ADC_OFF); // ADC birimi devre dışı
 setup_CCP1(CCP_OFF); // CCP1 birimi devre dışı
 setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı

 set_tris_a(0x03); // RA0 ve RA1 giriş olarak yönlendiriliyor
 set_tris_b(0x00); // B portu tümüyle çıkış olarak yönlendiriliyor

 while(1) // Sonsuz döngü
 {
 output_b(digit[birler]|(0b00010000)); // 1.display aktif, 2.display pasif yapılıyor ve birler basamağı bilgisi B portuna gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 output_b(digit[onlar]|(0b00100000)); // 2.display aktif, 1.display pasif yapılıyor ve onlar basamağı bilgisi B portuna gönderiliyor
 delay_ms(5); // Gecikme veriliyor

 if (input(arttir)) // arttır butonuna basıldığında
 {
 sayi++; // sayi değerini 1 arttır

 birler=sayi%10;; // birler hanesi hesaplanıyor
 onlar=sayi/10; // onlar hanesi hesaplanıyor

 while(input(arttir)) // arttır butonundan el çekilene kadar bekle
 {
 output_b(digit[birler]|(0b00010000)); // 1.display aktif, 2.display pasif yapılıyor ve birler basamağı bilgisi B portuna gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 output_b(digit[onlar]|(0b00100000)); // 2.display aktif, 1.display pasif yapılıyor ve onlar basamağı bilgisi B portuna gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 }
 }

 if (input(azalt)&&(sayi!=0)) // azalt butonuna basıldığında
 {
 sayi--; // sayi değerini 1 azalt

 birler=sayi%10;; // birler hanesi hesaplanıyor
 onlar=sayi/10; // onlar hanesi hesaplanıyor

 while(input(azalt)) // azalt butonundan el çekilene kadar bekle
 {
 output_b(digit[birler]|(0b00010000)); // 1.display aktif, 2.display pasif yapılıyor ve birler basamağı bilgisi B portuna gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 output_b(digit[onlar]|(0b00100000)); // 2.display aktif, 1.display pasif yapılıyor ve onlar basamağı bilgisi B portuna gönderiliyor
 delay_ms(5); // Gecikme veriliyor

 }
 }
 if (sayi==100) // sayi değeri 100 ise değeri sıfırla
 sayi=0;
 }
}

7 Segment Sayıcı Uygulamaları

CCS C Örnekleri kategorisine gönderildi | , , ile etiketlendi | Yorum yapın

CCS C ile DC Motor Uygulaması

pr_01_37_max

 

Bu uygulamada l298 entegresi ile ileri geri motor kontrolü yapılmıştır.

/******************************************************
 PIC16F877 ile DC Motor Uygulaması
*******************************************************/

#include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

// Denetleyici konfigürasyon ayarları
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

// Giriş ve çıkış pinlerine isim atanıyor
#define buton_ileri pin_a0
#define buton_geri pin_a1
#define buton_stop pin_a2
#define input1 pin_b0
#define input2 pin_b1
#define enable_a pin_b2
#define enable_b pin_b3

/********* ANA PROGRAM FONKSİYONU********/

void main ( )
{
 setup_psp(PSP_DISABLED); // PSP birimi devre dışı
 setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı
 setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
 setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok
 setup_adc(ADC_OFF); // ADC birimi devre dışı
 setup_CCP1(CCP_OFF); // CCP1 birimi devre dışı
 setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı

 output_high(enable_a); // Köprü A seçili
 output_low(enable_b); // Köprü B pasif

 while(1) // Sonsuz döngü
 {
 if (input(buton_ileri)) // İLERİ Butonuna basılsı ise
 {
 output_high(input1); // L298 Input1 girişi lojik-1
 output_low(input2); // L298 Input2 girişi lojik-0
 }

 if (input(buton_geri)) // GERİ Butonuna basılsı ise
 {
 output_low(input1); // L298 Input1 girişi lojik-0
 output_high(input2); // L298 Input1 girişi lojik-1
 }
 if (input(buton_stop)) // HIZLI STOP Butonuna basılsı ise
 {
 output_low(input1); // L298 Input1 girişi lojik-0
 output_low(input2); // L298 Input1 girişi lojik-0
 // Hızlı stop için burada her iki girişte lojik-1 olabilirdi.
 // Önemli olan Hızlı Stop için, her iki girişin aynı seviyede olması
 }

 }
}

DC Motor Uygulaması

CCS C Örnekleri kategorisine gönderildi | , , ile etiketlendi | Yorum yapın

CCS C ile Dahili EEPROM Uygulamaları

pr_01_37_max

 

/*****************************************************************
 PIC16F877 ile Dahili EEPROM Uygulaması-1 (Hafızalı Kronometre)
PIC PROG/DEKA : Port B jumper'ı LCD konumunda olmalı
******************************************************************/

#include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

// Denetleyici konfigürasyon ayarları
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#use fast_io(a) //Port yönlendirme komutları A portu için geçerli

#define use_portb_lcd TRUE // LCD B portuna bağlı

#include <lcd.c> // LCD.c dosyası programa ekleniyor

int8 _10ms=0; // Tam sayı tipinde değişken tanımlanıyor
unsigned int8 saniye=0; // İşaretsiz tam sayı tipinde değişken tanımlanıyor

//****************** Timer0 Kesmesi *****************************
#int_timer0 // Timer0 kesmesi. Her 10 msn'de bir kesme oluşur.
void timer0_kesme () // Kesme fonksiyonu ismi
{
 set_timer0(217); // TMR0 değeri belirleniyor

 _10ms++; // _10ms değişkeni değerini 1 arttır

 if (_10ms==100) // _10ms değeri 100 olunca (Geçen süre 1 saniye olunca)
 {
 _10ms=0; // _10ms değişkenini sıfırla
 saniye++; // saniye değişkenini bir arttır
 if (saniye==255) // Eğer saniye değişkeni 999 olursa sıfırla
 saniye=0; // saniye değişkenini sıfırla
 }
}

/********* ANA PROGRAM FONKSİYONU********/
void main ( )
{
 setup_psp(PSP_DISABLED); // PSP birimi devre dışı
 setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı
 setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
 setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok
 setup_adc(ADC_OFF); // ADC birimi devre dışı
 setup_CCP1(CCP_OFF); // CCP1 birimi devre dışı
 setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı

 set_tris_a(0x0F); // RA0, RA1, RA2, RA3 pinleri giriş

 lcd_init(); // LCD kurulumu yapılıyor

 setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256); // Timer0 ayarları yapılıyor
 set_timer0(217); // TMR0 değeri belirleniyor

 lcd_gotoxy(1,1); // İmleç 1.sütun, 1. satırda
 printf(lcd_putc,"Sure=%03u.%02d",saniye,_10ms); // Saniye ve milisaniye LCD'ye yazdırılıyor
 lcd_gotoxy(1,2); // İmleç 1.sütun, 2. satırda
 printf(lcd_putc,"Sonuc=%03u.%02d",read_eeprom(0),read_eeprom(1)); // EEPROM'da saklanan saniye ve milisaniye değerleri LCD'ye yazdırılıyor

 while(1)
 {
 if(input(pin_a3)) // SIFIRLA butonuna basıldı ise
 {
 saniye=_10ms=0;
 write_eeprom(0,saniye); // 0 (0x00) adresine saniye değerini yaz
 write_eeprom(1,_10ms); // 1 (0x01) adresine milisaniye değerini yaz
 lcd_gotoxy(1,1); // İmleç 1.sütun, 1. satırda
 printf(lcd_putc,"Sure=%03u.%02d",saniye,_10ms); // Sıfırlanan süre LCD'ye yazdırılıyor
 lcd_gotoxy(1,2); // İmleç 1.sütun, 2. satırda
 printf(lcd_putc,"Sonuc=%03u.%02d",saniye,_10ms);// Sıfırlanan kayıtlı süre LCD'ye yazdırılıyor
 while(input(pin_a3)); // Butondan el çekilene kadar bekle
 }

 if(input(pin_a0)) // BAŞLA butonuna basıldı ise
 {
 while(!input(pin_a2)) // DUR butonuna basılana kadar döngü dönsün
 {
 enable_interrupts(INT_timer0); // int_timer0 kesmesini aktif yapar
 enable_interrupts(GLOBAL); // Aktif edilen kesmelere izin ver

 lcd_gotoxy(1,1); // İmleç 1.sütun, 1. satırda
 printf(lcd_putc,"Sure=%03u.%02d",saniye,_10ms); // Süre LCD'ye yazdırılıyor
 lcd_gotoxy(1,2); // İmleç 1.sütun, 2. satırda
 printf(lcd_putc,"Sonuc=%03u.%02d",read_eeprom(0),read_eeprom(1)); // EEPROM'da saklanan saniye ve milisaniye değerleri LCD'ye yazdırılıyor

 if (input(pin_a1)) // YAKALA butonuna basılmışsa
 {
 write_eeprom(0,saniye); // 0 (0x00) adresine saniye değerini yaz
 write_eeprom(1,_10ms); // 1 (0x01) adresine milisaniye değerini yaz
 lcd_gotoxy(7,2); // İmleç 7.sütun, 2. satırda
 printf(lcd_putc,"%03u.%02d",read_eeprom(0),read_eeprom(1)); // LCD'de yakalanan zamanı göster
 while(input(pin_a1)); // Butondan elimizi çekene kadar bekle
 }

 lcd_gotoxy(6,1); // İmleç 6.sütun, 1. satırda
 printf(lcd_putc,"%03u.%02d",saniye,_10ms); // Geçen zamanı LCD'de göster
 }
 disable_interrupts(GLOBAL); // Tüm kesmeleri pasif yap.
 }
 }
}

dahili eeprom

CCS C Örnekleri kategorisine gönderildi | , ile etiketlendi | Yorum yapın

CCS C ile Compare Modu Uygulaması

pr_01_37_max

 

/******************************************************
 PIC16F877 ile Compare Modu Uygulaması
 PIC PROG/DEKA : Port B jumper'ı LED konumunda olmalı
*******************************************************/
#include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

// Denetleyici konfigürasyon ayarları
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#use fast_io(b) //Port yönlendirme komutları B portu için geçerli
#use fast_io(c) //Port yönlendirme komutları C portu için geçerli

//*********** CCP1 KESMESİ ******************
#INT_CCP1 // INT_CCP1 kesmesi fonksiyonu
void karsilastir1_kesmesi ()
{
 output_toggle(pin_b0); // RB0 çıkışı tersleniyor
}

//*********** CCP2 KESMESİ ******************
#INT_CCP2 // INT_CCP2 kesmesi fonksiyonu
void karsilastir2_kesmesi ()
{
 set_timer1(0); // TMR1 içeriği sıfırlanıyor
 output_toggle(pin_b1); // RB1 çıkışı tersleniyor
}

/********* ANA PROGRAM FONKSİYONU********/

void main ( )
{
 setup_psp(PSP_DISABLED); // PSP birimi devre dışı
 setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
 setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok
 setup_adc(ADC_OFF); // ADC birimi devre dışı

 set_tris_b(0x00); // B portu komple çıkış
 set_tris_c(0x01); // RC0 pini giriş

 output_b(0x00); // İlk anda B portu çıkışı sıfırlanıyor

 enable_interrupts(INT_CCP1); // INT_CCP1 kesmesi aktif yapılıyor
 enable_interrupts(INT_CCP2); // INT_CCP2 kesmesi aktif yapılıyor
 enable_interrupts(GLOBAL); // Aktif edilen kesmelere izin ver

 setup_ccp1(CCP_COMPARE_INT); // CCP1 birimi COMPARE modunda kullanılacak
 setup_ccp2(CCP_COMPARE_INT); // CCP2 birimi COMPARE modunda kullanılacak

 setup_timer_1(T1_EXTERNAL_SYNC | T1_DIV_BY_1); // Timer1 ayarları yapılıyor

 CCP_1_HIGH=0x00; // CCPR1H kaydedicisi sıfırlanıyor
 CCP_1_LOW=0x05; // CCPR1L kaydedicisine 05h değeri yükleniyor.

 CCP_2_HIGH=0x00; // CCPR2H kaydedicisi sıfırlanıyor
 CCP_2_LOW=0x0A; // CCPR2L kaydedicisine 0Ah değeri yükleniyor.

 set_timer1(0); // TMR1 içeriği sıfırlanıyor

 while(1); // Sonsuz döngü
}

Compare Modu Uygulaması

CCS C Örnekleri kategorisine gönderildi | , ile etiketlendi | Yorum yapın

CCS C Fonksiyonlarını Kullanarak Yazılımsal SPI İletişim İle 25640 Harici EEPROM Uygulaması

pr_01_37_max

 

/******************************************************
 PIC16F877 ile CCS C Dosyalarını Kullanarak Yazılımsal SPI İletişim İle 25640 Harici EEPROM Uygulaması
*******************************************************/

#include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları

#use delay(clock=4000000) // Gecikme fonksiyonu için kullanılan osilatör frekansı belirtiliyor

#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1) // RS232 iletişim ayarları belirtiliyor
#use spi (master, DI=pin_B2, DO=pin_B1, CLK=pin_B0, SAMPLE_RISE, bits=8, MSB_FIRST,IDLE=0) // Yazılımsal SPI iletişim ayarları tanımlanıyor

#include <input.c> // input.c dosyası programa ekleniyor
#include <stdlib.h> // stdlib.h dosyası programa ekleniyor

#define CS PIN_B3 // CS ifadesi PIN_C2 pini yerine atanıyor

int8 _adres[4],veri,adres_high,adres_low; // int8 tipinde değişkenler tanımlanıyor
int16 adres; // int16 tipinde değişken tanımlanıyor
char islem; // char tipinde değişken tanımlanıyor

/******************* ANA PROGRAM FONKSİYONU *************************/
void main ()
{
 setup_psp(PSP_DISABLED); // PSP birimi devre dışı
 setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı
 setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
 setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok
 setup_adc(ADC_OFF); // ADC birimi devre dışı
 setup_CCP1(CCP_OFF); // CCP1 birimi devre dışı
 setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı 

 printf("\n\r***********************************************************");
 printf("\n\r 25LC640 Harici EEPROM Bilgi Okuma ve Yazma Programi ");
 printf("\n\r***********************************************************");
 printf("\n\r");

 output_high(cs); // Harici EEPROM CS ucu lojik-1 yapılıyor

 while(1) // Sonsuz Döngü
 {
 do // do-while döngüsü tanımlanıyor
 {
 printf("\n\r\r\rBelirtilen adresteki veriyi oku (O)");
 printf("\n\rBelirtilen adrese istenen veriyi yaz (Y)>");

 islem=getc(); // RS232 portundan gelen veri alınıyor
 islem=toupper(islem); // Alınan karakter büyük forma getiriliyor (a > A gibi)
 putc(islem); // "islem" değişkeni içeriği RS232 portuna gönderiliyor
 } while ( (islem!='O') && (islem!='Y')); // Girilen karakter O, Y dışında ise döngü başına dön

 if (islem=='O') // Eğer okunan karakter "O" ise
 {
 printf("\n\r\rOkumak istediginiz adresi giriniz>");

 get_string(_adres,4); // Seri porttan gelen adres bilgisi string olarak alınıyor
 adres=atol(_adres); // String olarak alınan adres bilgisi tam sayıya çevriliyor
 adres_high=make8(adres,1); // Adres değerinin 8 bitlik MSB değeri adres_high değişkenine kaydediliyor
 adres_low=make8(adres,0); // Adres değerinin 8 bitlik LSB değeri adres_low değişkenine kaydediliyor

 printf("\n\r\rVeri okunuyor...");

 output_low(cs); // Entegre seçiliyor
 spi_xfer(0x03); // Okuma komutu (READ) gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 spi_xfer(adres_high); // Okunacak adres değerinin 8 bitlik MSB değeri gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 spi_xfer(adres_low); // Okunacak adres değerinin 8 bitlik LSB değeri gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 printf("\n\r\rAdres=%04lu Deger=0x%02X",adres,spi_xfer(0) ); // İstenen adresteki değer okunuyor
 output_high(cs); // Entegre bekleme konumuna getiriliyor
 delay_ms(5); // Gecikme veriliyor
 }

 if (islem=='Y') // Eğer okunan karakter "Y" ise
 {
 printf("\n\r\rBilgi yazmak istediginiz adresi giriniz> ");

 get_string(_adres,4); // Seri porttan gelen adres bilgisi string olarak alınıyor
 adres=atol(_adres); // String olarak alınan adres bilgisi tam sayıya çevriliyor
 adres_high=make8(adres,1); // Adres değerinin 8 bitlik MSB değeri adres_high değişkenine kaydediliyor
 adres_low=make8(adres,0); // Adres değerinin 8 bitlik LSB değeri adres_low değişkenine kaydediliyor

 printf("\n\r\rBilgiyi giriniz> ");
 veri=gethex(); // Yazılacak veri heksadesimal olarak alınıyor
 printf("\n\r\rVeri yaziliyor...");

 output_low(cs); // Entegre seçiliyor
 spi_xfer(0x06); // Yazmaya izin ver komutu (WREN) gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 output_high(cs); // Entegre bekleme konumuna getiriliyor

 output_low(cs); // Entegre seçiliyor
 spi_xfer(0x02); // Yazma komutu (WRITE) gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 spi_xfer(adres_high); // Okunacak adres değerinin 8 bitlik MSB değeri gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 spi_xfer(adres_low); // Okunacak adres değerinin 8 bitlik LSB değeri gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 spi_xfer(veri); // Belirtilen adrese yazdırılacak veri gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 output_high(cs); // Entegre bekleme konumuna getiriliyor
 printf("\n\r\rYazma islemi bitti.");
 }
 }
}

CCS C Fonksiyonlarını Kullanarak Yazılımsal SPI İletişim İle 25640 Harici EEPROM Uygulaması

CCS C Örnekleri kategorisine gönderildi | , , ile etiketlendi | Yorum yapın

CCS C Fonksiyonlarını Kullanarak Donanımsal SPI İletişim İle 25640 Harici EEPROM Uygulaması

pr_01_37_max

 

/******************************************************
 PIC16F877 ile CCS C Dosyalarını Kullanarak Donanımsal SPI İletişim İle 25640 Harici EEPROM Uygulaması
*******************************************************/

#include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları

#use delay(clock=4000000) // Gecikme fonksiyonu için kullanılan osilatör frekansı belirtiliyor

#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1) // RS232 iletişim ayarları belirtiliyor

#include <input.c> // input.c dosyası programa ekleniyor
#include <stdlib.h> // stdlib.h dosyası programa ekleniyor

#define CS PIN_C2 // CS ifadesi PIN_C2 pini yerine atanıyor

int8 _adres[4],veri,adres_high,adres_low,i; // int8 tipinde değişkenler tanımlanıyor
int16 adres; // int16 tipinde değişken tanımlanıyor
char islem; // char tipinde değişken tanımlanıyor

#int_ssp // SPI iletişiminde yazma veya okuma yapıldığında meydana gelen kesme
void SPI_kesmesi()
{
 output_high(pin_c0); // RC0'a bağlı LED yansın
 delay_ms(250); // Gecikme veriliyor
 output_low(pin_c0); // RC0'a bağlı LED sönsün
}

/******************* ANA PROGRAM FONKSİYONU *************************/
void main ()
{
 setup_psp(PSP_DISABLED); // PSP birimi devre dışı
 setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı
 setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
 setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok
 setup_adc(ADC_OFF); // ADC birimi devre dışı
 setup_CCP1(CCP_OFF); // CCP1 birimi devre dışı
 setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı

 setup_spi(spi_master| spi_L_to_H | spi_clk_div_4); // SPI iletişim ayarları belirtiliyor

 enable_interrupts(int_ssp); // SPI kesmesi aktif yapılıyor
 enable_interrupts(GLOBAL); // Aktif edilen tüm kesmelere izin ver 

 printf("\n\r***********************************************************");
 printf("\n\r 25LC640 Harici EEPROM Bilgi Okuma ve Yazma Programi ");
 printf("\n\r***********************************************************");
 printf("\n\r");

 output_high(cs); // Harici EEPROM CS ucu lojik-1 yapılıyor

 while(1) // Sonsuz Döngü
 {
 do // do-while döngüsü tanımlanıyor
 {
 printf("\n\r\r\r1-Belirtilen adresteki veriyi oku");
 printf("\n\r2-Belirtilen adresten itibaren sona kadar tum adresleri oku");
 printf("\n\r3-Belirtilen adrese istenen veriyi yaz");
 printf("\n\r4-Tum bellege ayni veriyi yaz");
 printf("\n\r5-Durum (Status) kaydedicisi degerini oku");
 printf("\n\r\rBir islem seciniz (1,2,3,4,5) >");

 islem=getc(); // RS232 portundan gelen veri alınıyor
 putc(islem); // "islem" değişkeni içeriği RS232 portuna gönderiliyor
 } while ( (islem!='1') && (islem!='2') && (islem!='3') && (islem!='4') && (islem!='5')); // Girilen karakter 1,2,3,4 dışında ise döngü başına dön

 if (islem=='1') // Eğer okunan karakter "1" ise
 {
 printf("\n\r\rOkumak istediginiz adresi giriniz>");

 get_string(_adres,4); // Seri porttan gelen adres bilgisi string olarak alınıyor
 adres=atol(_adres); // String olarak alınan adres bilgisi tam sayıya çevriliyor
 adres_high=make8(adres,1); // Adres değerinin 8 bitlik MSB değeri adres_high değişkenine kaydediliyor
 adres_low=make8(adres,0); // Adres değerinin 8 bitlik LSB değeri adres_low değişkenine kaydediliyor

 printf("\n\r\rVeri okunuyor...");

 output_low(cs); // Entegre seçiliyor
 spi_write(0x03); // Okuma komutu (READ) gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 spi_write(adres_high); // Okunacak adres değerinin 8 bitlik MSB değeri gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 spi_write(adres_low); // Okunacak adres değerinin 8 bitlik LSB değeri gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 printf("\n\r\rAdres=%04lu Deger=0x%02X",adres,spi_read(0) ); // İstenen adresteki değer okunuyor
 output_high(cs); // Entegre bekleme konumuna getiriliyor
 delay_ms(5); // Gecikme veriliyor
 }

 if (islem=='2') // Eğer okunan karakter "2" ise
 {
 printf("\n\r\rOkumaya baslamak istediginiz adresi giriniz>");

 get_string(_adres,4); // Seri porttan gelen adres bilgisi string olarak alınıyor
 adres=atol(_adres); // String olarak alınan adres bilgisi tam sayıya çevriliyor
 adres_high=make8(adres,1); // Adres değerinin 8 bitlik MSB değeri adres_high değişkenine kaydediliyor
 adres_low=make8(adres,0); // Adres değerinin 8 bitlik LSB değeri adres_low değişkenine kaydediliyor

 output_low(cs); // Entegre seçiliyor
 spi_write(0x03); // Okuma komutu (READ) gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 spi_write(adres_high); // Okunacak adres değerinin 8 bitlik MSB değeri gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 spi_write(adres_low); // Okunacak adres değerinin 8 bitlik LSB değeri gönderiliyor
 delay_ms(5); // Gecikme veriliyor

 for(;adres<=0x1FFF;adres++) // Belleğin sonuna gelene kadar döngü dönsün
 {
 printf("\n\r\rAdres=%04lu Deger=0x%02X",adres,spi_read(0)); // İstenen adresteki değer okunuyor
 delay_ms(5); // Gecikme veriliyor
 } 

 output_high(cs); // Entegre bekleme konumuna getiriliyor
 }

 if (islem=='3') // Eğer okunan karakter "3" ise
 {
 printf("\n\r\rBilgi yazmak istediginiz adresi giriniz> ");

 get_string(_adres,4); // Seri porttan gelen adres bilgisi string olarak alınıyor
 adres=atol(_adres); // String olarak alınan adres bilgisi tam sayıya çevriliyor
 adres_high=make8(adres,1); // Adres değerinin 8 bitlik MSB değeri adres_high değişkenine kaydediliyor
 adres_low=make8(adres,0); // Adres değerinin 8 bitlik LSB değeri adres_low değişkenine kaydediliyor

 printf("\n\r\rBilgiyi giriniz> ");
 veri=gethex(); // Yazılacak veri heksadesimal olarak alınıyor
 printf("\n\r\rVeri yaziliyor...");

 output_low(cs); // Entegre seçiliyor
 spi_write(0x06); // Yazmaya izin ver komutu (WREN) gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 output_high(cs); // Entegre bekleme konumuna getiriliyor

 output_low(cs); // Entegre seçiliyor
 spi_write(0x02); // Yazma komutu (WRITE) gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 spi_write(adres_high); // Okunacak adres değerinin 8 bitlik MSB değeri gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 spi_write(adres_low); // Okunacak adres değerinin 8 bitlik LSB değeri gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 spi_write(veri); // Belirtilen adrese yazdırılacak veri gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 output_high(cs); // Entegre bekleme konumuna getiriliyor
 printf("\n\r\rYazma islemi bitti.");
 }

 if (islem=='4') // Eğer okunan karakter "4" ise
 {
 disable_interrupts(GLOBAL); // Tüm kesmeleri pasif hale getirir. Tüm belleğe yazma işlemi daha hızlı yapılsın diye.
 printf("\n\r\rBilgiyi giriniz> ");
 veri=gethex(); // Yazılacak veri heksadesimal olarak alınıyor

 printf("\n\r\rVeri yaziliyor...");

 for(adres=0;adres<8192;adres=adres+32) // Her sayfa (page) yazımı bitince adres değeri diğer sayfa başlangıcı olsun
 {
 adres_high=make8(adres,1); // Adres değerinin 8 bitlik MSB değeri adres_high değişkenine kaydediliyor
 adres_low=make8(adres,0); // Adres değerinin 8 bitlik LSB değeri adres_low değişkenine kaydediliyor

 output_low(cs); // Entegre seçiliyor
 spi_write(0x06); // Yazmaya izin ver komutu (WREN) gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 output_high(cs); // Entegre bekleme konumuna getiriliyor

 delay_ms(5); // Gecikme veriliyor
 output_low(cs); // Entegre seçiliyor
 spi_write(0x02); // Yazma komutu (WRITE) gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 spi_write(adres_high); // Okunacak adres değerinin 8 bitlik MSB değeri gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 spi_write(adres_low); // Okunacak adres değerinin 8 bitlik LSB değeri gönderiliyor
 delay_ms(5); // Gecikme veriliyor

 for(i=0;i<=32;i++) // Her sayfa (page) 32 byte olduğundan
 {
 spi_write(veri); // Belirtilen adrese yazdırılacak veri gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 }
 output_high(cs); // Entegre bekleme konumuna getiriliyor
 delay_ms(20); // Gecikme veriliyor
 }

 printf("\n\r\rYazma islemi bitti.");
 enable_interrupts(GLOBAL); // Aktif edilen tüm kesmelere izin ver
 }

 if (islem=='5') // Eğer okunan karakter "5" ise
 {
 output_low(cs); // Entegre seçiliyor
 spi_write(0x06); // Yazmaya izin ver komutu (WREN) gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 output_high(cs); // Entegre bekleme konumuna getiriliyor

 output_low(cs); // Entegre seçiliyor
 spi_write(0x05); // Durum kaydedicisi okuma komutu (WRSR) gönderiliyor
 delay_ms(5); // Gecikme veriliyor
 printf("\n\r\rDurum (Status) Kaydedicisi Degeri=0x%02X",spi_read(0)); // Durum kaydedicisi değeri okunuyor
 output_high(cs); // Entegre bekleme konumuna getiriliyor
 }
 }
}

CCS C Fonksiyonlarını Kullanarak Donanımsal SPI İletişim İle 25640 Harici EEPROM Uygulaması

CCS C Örnekleri kategorisine gönderildi | , , ile etiketlendi | Yorum yapın

CCS C ile Capture Modu Uygulaması

pr_01_37_max

 

/******************************************************
 PIC16F877 ile Capture Modu Uygulaması
 PIC PROG/DEKA : Port B jumper'ı LED konumunda olmalı
*******************************************************/
#include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

// Denetleyici konfigürasyon ayarları
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#use fast_io(b) //Port yönlendirme komutları B portu için geçerli
#use fast_io(c) //Port yönlendirme komutları C portu için geçerli

int i=0; // Tamsayı tipinde değişken tanımlanıyor

//*********** CCP1 KESMESİ ******************
#INT_CCP1 // INT_CCP1 kesmesi fonksiyonu
void yakala1_kesmesi ()
{
 i++; // i değerini 1 arttır
 output_b(i); // i değerini B portuna gönder
}

//*********** CCP2 KESMESİ ******************
#INT_CCP2 // INT_CCP2 kesmesi fonksiyonu
void yakala2_kesmesi ()
{
 if(i==0) // Eğer i değeri sıfırsa
 i=1; // i değeri içeriği 1 olsun

 i--; // i değerini 1 azalt
 output_b(i); // i değerini B portuna gönder
}

/********* ANA PROGRAM FONKSİYONU********/

void main ( )
{
 setup_psp(PSP_DISABLED); // PSP birimi devre dışı
 setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
 setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok
 setup_adc(ADC_OFF); // ADC birimi devre dışı

 set_tris_b(0x00); // B portu komple çıkış
 set_tris_c(0x07); // RC0, RC1 ve RC2 pini giriş

 output_b(0x00); // İlk anda B portu çıkışı sıfırlanıyor

 enable_interrupts(INT_CCP1); // INT_CCP1 kesmesi aktif yapılıyor
 enable_interrupts(INT_CCP2); // INT_CCP2 kesmesi aktif yapılıyor
 enable_interrupts(GLOBAL); // Aktif edilen kesmelere izin ver

 setup_ccp1(CCP_CAPTURE_DIV_4); // CCP1 kesmesi her 4 yükselen kenarda 1 yakalama yapacak
 setup_ccp2(CCP_CAPTURE_RE); // CCP2 kesmesi her yükselen kenarda 1 yakalama yapacak

 CCP_1_HIGH=0x00; // CCPR1H kaydedicisi sıfırlanıyor
 CCP_1_LOW=0x00; // CCPR1H kaydedicisi sıfırlanıyor

 CCP_2_HIGH=0x00; // CCPR2H kaydedicisi sıfırlanıyor
 CCP_2_LOW=0x00; // CCPR2H kaydedicisi sıfırlanıyor

 while(1); // Sonsuz döngü
}

Capture Modu Uygulaması

CCS C Örnekleri kategorisine gönderildi | , ile etiketlendi | Yorum yapın

CCS C ve Buton İle LED Kontrol Uygulaması

pr_01_37_max

 

/******************************************************
 Uygulama Adı : Buton ile Led Kontrol Uygulaması
 Programın Amacı : Bu program ile B0 portuna bağlı LED, RA0 girişine bağlı buton ile kontrol edilmektedir.
 PIC PROG/DEKA : Port B jumper'ı LED konumunda olmalı
 Yazan : SERDAR ÇİÇEK
*******************************************************/

#include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları

#use fast_io(a) // Port yönlendirme komutları A portu için geçerli
#use fast_io(b) // Port yönlendirme komutları B portu için geçerli

int1 x; // 1 bitlik x adında tamsayı tipinde bir değişken tanımlanıyor.

/********* ANA PROGRAM FONKSİYONU********/

void main ()
{
 setup_psp(PSP_DISABLED); // PSP birimi devre dışı
 setup_spi(SPI_SS_DISABLED); // SPI birimi devre dışı
 setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı
 setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
 setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok
 setup_adc(ADC_OFF); // ADC birimi devre dışı
 setup_CCP1(CCP_OFF); // CCP1 birimi devre dışı
 setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı

 set_tris_a(0b00000001); // RA0 ucu giriş olarak ayarlandı.
 set_tris_b(0x00); // RB0 portu tümüyle çıkış olarak ayarlandı.

 output_b(0x00);

 basla:
 x=input(pin_a0); // RA0 girişi okunuyor, tersleniyor ve x değişkenine aktarılıyor.
 output_bit(pin_b0,x); // x değişkeni değeri RB0 pini çıkışına aktarılıyor.
 goto basla; // basla etiketinin olduğu yere gidilir.
}

Buton İle LED Kontrol Uygulaması

CCS C Örnekleri kategorisine gönderildi | , ile etiketlendi | Yorum yapın

CCS C ve Buton İle BCD Sayıcı Uygulaması

pr_01_37_max

 

/******************************************************
 Uygulama Adı : Buton ile BCD Sayıcı
 Programın Amacı : RA0 butonuna her basışta 0'dan itibaren artan BCD sayılar
 B portuna bağlı LED'lerde görünecektir
 PIC PROG/DEKA : Port B jumper'ı LED konumunda olmalı
*******************************************************/

#include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları

#use delay(clock=4000000) // Gecikme fonksiyonu için kullanılan osilatör frekansı belirtiliyor

#define buton pin_A0 // "buton" adında "pin_A0" kelimesine eşit bir sabit tanımlanıyor

int i=1; // 8 bitlik tamsayı tipinde değişken tanımlanıyor

/********* ANA PROGRAM FONKSİYONU********/

void main ()
{
 setup_psp(PSP_DISABLED); // PSP birimi devre dışı
 setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı
 setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
 setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok
 setup_adc(ADC_OFF); // ADC birimi devre dışı
 setup_CCP1(CCP_OFF); // CCP1 birimi devre dışı
 setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı

 set_tris_a(0x01); // RA0 pini giriş olarak yönlendiriliyor
 set_tris_b(0x00); // RB0 portu tümüyle çıkış olarak yönlendiriliyor

 output_b(0x00); // B portu çıkışları sıfırlanıyor

 while(1) // Sonsuz döngü oluşturuluyor
 {
 if (input(buton))
 {
 delay_ms(15); // Butona basılınca meydana gelen arkın etkisini önlemek için verilen gecikme
 output_b(i); // b portuna i değeri yükleniyor
 i=i+1; // i değeri 1 arttırılıyor
 while(input(buton)); // Buton bırakılana kadar bekle
 if (i==10) // i değeri test ediliyor.i değeri 10 olunca sıfırlanıyor.
 {
 i=0; // i değeri sıfırlanıyor
 }
 }
 }
}

Buton İle BCD Sayıcı Uygulaması

CCS C Örnekleri kategorisine gönderildi | , ile etiketlendi | Yorum yapın