"Karmaşıklığı kontrol etmek Programlamanın en asıl işidir."

c programlama etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
c programlama etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

28 Ağustos 2014 Perşembe

CCS C Toggle uygulaması

0 yorum

output_toggle( )




Sözdizimi:
output_toggle(pin)

Parametreler:
Pinler cihazların .h dosyasında tanımlanır.Gerçek değeri biraz adresidir. #define PIN_A3 43: Örneğin, port (bayt 5) biraz 3 5 * 8 + 3 veya 43'e değerini aşağıdaki gibi bu tanımlanır olurdu.

Dönüş:
Tanımsız

Fonksiyon:
Belirtilen pinin yüksek(high) / düşük(low) durumunu değiştirir. (0 ise 1 -> 1 ise 0) yapar

Durum:
Bütün cihazlar

Gereksinim:
Pin sabitleri .h dosyası cihazlarda tanımlandığı gibidir

Örnek:
output_toggle(PIN_B4);

Örnek Dosya:
Yok





Örnek Uygulama ;

/******************************************************
      PIC16F877 ile Led Toggle Uygulaması

Bu program ile B portuna bağlı 8 LED'i TOGGLE komutu ile
sırayla yakıp söndürmektedir.

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 delay(clock=4000000)   // Gecikme fonksiyonu için kullanılan osilatör frekansı belirtiliyor
#use fast_io(b) // Port yönlendirme komutları B portu için geçerli
/********* 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_b(0x00);    // RB0 portu tümüyle çıkış olarak ayarlandı.

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

   basla:

   delay_ms(500);          // 500 ms'lik gecikme veriliyor
   output_toggle(pin_b0);  // RB0 ucunun çıkış durumu tersleniyor
   delay_ms(500);          // 500 ms'lik gecikme veriliyor
   output_toggle(pin_b1);  // RB1 ucunun çıkış durumu tersleniyor
   delay_ms(500);          // 500 ms'lik gecikme veriliyor
   output_toggle(pin_b2);  // RB2 ucunun çıkış durumu tersleniyor
   delay_ms(500);          // 500 ms'lik gecikme veriliyor
   output_toggle(pin_b3);  // RB3 ucunun çıkış durumu tersleniyor
   delay_ms(500);          // 500 ms'lik gecikme veriliyor
   output_toggle(pin_b4);  // RB4 ucunun çıkış durumu tersleniyor
   delay_ms(500);          // 500 ms'lik gecikme veriliyor
   output_toggle(pin_b5);  // RB5 ucunun çıkış durumu tersleniyor
   delay_ms(500);          // 500 ms'lik gecikme veriliyor
   output_toggle(pin_b6);  // RB6 ucunun çıkış durumu tersleniyor
   delay_ms(500);          // 500 ms'lik gecikme veriliyor
   output_toggle(pin_b7);  // RB7 ucunun çıkış durumu tersleniyor
   delay_ms(500);          // 500 ms'lik gecikme veriliyor

   goto basla;
}

27 Ağustos 2014 Çarşamba

CCS C - Dahili EEPROM Kullanımı

0 yorum
CCS C - Dahili EEPROM Kullanımı

Tanım : EEPROM (Electronically Erasable Programmable Read-Only Memory), küçük boyuttaki verileri kalıcı olarak saklamak için bilgisayar ya da diğer cihazlarda kullanılan bir yongadır. Boyutu daha büyük olan sabit verileri saklamak için ise flaş bellek gibi daha ekonomik yöntemler kullanılır. EEPROM, elektrikle yazılıp silinme özelliğine sahiptir.

write_eeprom (adres, veri) :

EEPROM adresine 1 byte veri yazmak için kullanılır.


int aboo67=2;
     write_eeprom(1,aboo67); // EEPROM'un 0x01 adresine 2 yazıldı

değer = read_eeprom (adres)

EEPROM adresinden 1 byte veri okumak için kullanılır.

int aboo67;
     aboo67 = read_eeprom(1); // EEPROM'un 0x01 adresindeki değer aboo67 degişkenine aktarıldı


Örnek ; 


pic resetlendiğinde 7 segde en son kaldığı sayıyı göstercektir
//------------------------------------------------------------------------------
#include <16F876.h>// Kullanılcak denetleyicinin başlık dosyası tanımlanıyor
#include <stdio.h>
// Denetleyici konfigürasyon ayarları
#FUSES HS                       //High Speed
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection    
#use delay (clock=20000000) // Gecikme fonksiyonu için kullanılan osilatör frekansı
//------------------------------------------------------------------------------
const int digit[10]={0xC0,  // 0
                     0xF9,  // 1
                     0xA4,  // 2
                     0xB0,  // 3
                     0x99,  // 4
                     0x92,  // 5
                     0x82,  // 6
                     0xF8,  // 7
                     0x80,  // 8
                     0x90}; // 9
int sayi=0;
//------------------------------------------------------------------------------
void main () {
setup_spi(SPI_SS_DISABLED); // SPI birimi devre dışı
setup_timer_1(T1_DISABLED); // Timer1 devre dışı
setup_timer_2(T2_DISABLED,0,1); // Timer2 devre dışı
setup_adc_ports(NO_ANALOGS); // ANALOG girdi 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ışı
sayi = read_eeprom(1); // EEPROM'un 0x01 adresi okunuyor
if (sayi>255){
sayi=0;
}
while(1){
if (input(pin_c0)==1){
sayi++;
delay_ms(250);
write_eeprom(1,sayi); // EEPROM'un 0x01 adresine degişken yazılıyor
}
if (sayi>9){
sayi=0;
}
output_b(digit[sayi]);
}
}
//------------------------------------------------------------------------------

CCS C 74HC595 Basitçe Kullanımı

0 yorum


CCS C 74HC595 Basitçe Kullanımı ve Örnek




15,1..7 nolu bacaklar = Paralel Veri Çıkışları

8 nolu bacak = GND (-)

9 nolu bacak = Seri Veri Çıkışı (seri başka bir 74hc595 bağlamak için)

10 nolu bacak Master Reset Ucu = Burası LOW(-)'da tutulmalıdır yoksa 74hc595 kendisini sürekli resetlicektir 

11 nolu bacak shift register clock girişi = clock palse verilir, 14 nolu bacaktan veri kaydırılarak içeri alınır (clock palse vermek için bu bacağa önce 1 sonra 0 verilir)

12 nolu bacak storage register clock girişi = 11 ve 14 nolu bacaklar sayesinde içeri uygulanan clock palse sayesinde paralel veri çıkışlarına verilir

13 nolu bacak output enable ucu = aktif edilmek için LOWda tutulmalıdır

14 nolu bacak = seri veri girişi

16 nolu bacak = VCC(+)

yani kısaca 11 nolu bacağa vurulan clock palse ile 14 nolu bacaktan veri içeri alınır 12 nolu bacak sayesinde çıkışa verilir.

Basit Bir Örnek ; 74hc595 kullanarak 0-99 sayıcı





//==============================================================================
#include <16F876.h>
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected,
#use delay (clock=20000000) 
//==============================================================================
#define hcdata pin_b0
#define hcclock pin_b1
#define hcload pin_b2
//==============================================================================
const int digit[10]={0xC0,  // 0
                     0xF9,  // 1
                     0xA4,  // 2
                     0xB0,  // 3
                     0x99,  // 4
                     0x92,  // 5
                     0x82,  // 6
                     0xF8,  // 7
                     0x80,  // 8
                     0x90}; // 9
int say=0;
int saybirler=0;
int sayonlar=0;
//==============================================================================
void hc595_yolla(unsigned char veri)
{
   unsigned  char i;
   for(i=0x80;i>0;i>>=1)
   {
      if(i&veri)output_high(hcdata);
      else  output_low(hcdata);  
      output_high(hcclock);
      output_low(hcclock);
   } 
}
//==============================================================================
void main () {
while (1){
say=0;
for (say=0;say<99;say++){
sayonlar=say/10;
saybirler=say%10;
hc595_yolla(digit[saybirler]); 
hc595_yolla(digit[sayonlar]);
output_high(hcload);
output_low(hcload);
delay_ms(1000);
}
}
}
//==============================================================================

CCS C - 18B20 Kullanımı

0 yorum
DS18B20 algılayıcısı (Tek Hat Sayısal Termometre) yüksek doğrusallığa sahip sayısal çıkış üreten bir sıcaklık algılayıcısıdır. Dallas/Maxim tarafından geliştirilen tek hat haberleşme protokolü ile haberleşilen bu algılayıcıların her birinin özel ve 64 bitten oluşan

tek bir seri numarası bulunmaktadır (8 bit CRC kodu + 48 bit seri no +8 bit aile kodu ). Böylece tek bir seri hatta bağlanan birden fazla DS18B20algılayıcılarından istenileni ile haberleşilerek ilgili noktadaki sıcaklık ölçülebilir. Bu sıcaklık algılayıcısı 100 metreye kadar herhangi bir ek devre elemanına gerek kalmadan kullanılabilmektedir. DS18B20, -55°C ile +125°C arasında 9, 10, 11 veya 12 bitlik çözünürlükte ölçüm yapabilmektedir. 12 bitlik çözünürlükteki hassasiyeti 0,0625’°C dir. Çözünürlük değeri yapılandırma kaydedicisinin 5. ve 6. bitleri değiştirilerek belirlenmektedir.(320volt.com)

DS18B20 Block Diagram







Uygulama :




ds18b20.c // 18B20 DRİVER


#define ONE_WIRE_PIN PIN_A0
void onewire_reset() 

{
output_low(ONE_WIRE_PIN);
delay_us( 500 ); //1-wire resetleme için sıfıra çekilir
output_float(ONE_WIRE_PIN); //1-wire bir yapılır
delay_us( 500 ); // sensörün hazırlanması için beklenir.
output_float(ONE_WIRE_PIN);
void onewire_write(int data)
{
int count;
for (count=0; count<8; ++count)
{
output_low(ONE_WIRE_PIN);
delay_us( 2 ); // Sensöre yazma işlemine başlamak için  1-wire sıfıra çekilir.
output_bit(ONE_WIRE_PIN, shift_right(&data,1,0)); // yazılacak bilgi 1-wire'da
delay_us( 60 ); // Yazma işlemi zamanı doldurulur.
output_float(ONE_WIRE_PIN); // 1-wire bir yapılır,
delay_us( 2 ); // 1us'den fazla beklenir.
}
int onewire_read()
{
int count, data;
for (count=0; count<8; ++count)
{
output_low(ONE_WIRE_PIN);
delay_us( 2 ); //Sensördem okuma işlemi içinl 1-wire sıfıra çekilir.
output_float(ONE_WIRE_PIN); //1-wire bir yapılır,
delay_us( 8 ); // Sensörün kendine gelmesi beklenir,
shift_right(&data,1,input(ONE_WIRE_PIN)); // sonuc bilgisi alınır.
delay_us( 120 ); //Okuma işlemi zamanı doldurulur.
}
return( data );
float ds1820_read()
{
int8 busy=0, temp1, temp2;
signed int16 temp3;
float result;
onewire_reset();
onewire_write(0xCC);
onewire_write(0x44);
while (busy == 0)
busy = onewire_read();
onewire_reset();
onewire_write(0xCC);
onewire_write(0xBE);
temp1 = onewire_read();
temp2 = onewire_read();
temp3 = make16(temp2, temp1);
result = (float) temp3 / 16.0;
delay_ms(200);
return(result);
main.c


//==============================================================================
//==============================================================================
#include <16F876.h>
#include <stdio.h>
#fuses HS,NOWDT,PROTECT      
#use delay (clock=20000000)
#include "ds18b20.c"
//==============================================================================
//==============================================================================
const int digit[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
int i=0;
int sicaklik=0;
int sicaklik1=0;
int sicaklik2=0;
//==============================================================================
//==============================================================================
void main () {
output_b(digit[0]);
output_c(digit[0]);
while(1){
sicaklik=ds1820_read();
delay_ms(500);
sicaklik1=sicaklik%10;
sicaklik2=sicaklik/10;
output_b(digit[sicaklik1]);
output_c(digit[sicaklik2]);
}

CCS C 7 Seg Display Kullanımı

0 yorum



7 parçalı gösterge 7 adet led den oluşturulmuş bir yapıdır ve elektronik devrelerde numaralar ve bazı karakterleri göstermek için kullanılır.
7 parçadan hariç birde sağ alt köşede nokta görevini yapan bir led daha vardır. bu durumda aslında 8 parçalı gösterge denmesi gerekirken, bu 
parçaların sayısı 16 da olsa adı gene 7 parçalı gösterge olarak kalmıştır.

temel olarak 2 tür gösterge vardır.

1) ortak anot.
2) ortak katot.

1) ortak anot display.

bu yapıda ledlerin anotları birleştirilmiş ve gerekli girişler katottan verilmektedir. bu durumda yanmasını istediğimiz parçaya ait uçtan(-)vermemiz gerekir.

oratk anot displayde girişler 7 parça + 1 decimal nokta için= 8 adet katot ucu ve bir adet de anot ucu olmak için üzere esas istibarıyle 9 uç olacaktır. 

ama yapı itibarıyle göstergelerde ortak olan ucun tek olması sorun oluşturacağı için ve bizlere kolaylık olması için displaylerde ortak olan uçtan hem üstte hemde altta olmak üzere 2 adet bulunur.

2) ortak katot display.

bu yapıda ledlerin katotları birleştirilmiş ve gerekli girişler katottan verilmektedir.bu durumda yanmasını istediğimiz parçaya ait uçtan (+) vermemiz gerekir. 

ortak anot display de de 8 adet anot ucu ve 1 adet de katot ucu olmak üzere esas istibarıyle 9 uç vardır.

(Yukarıda Yer Alan Metin Alıntıdır Devamı Bana aittir)


Örnek Ortak Anotlu bir displayde 0 sayısını göstermek için yukardaki ortak anot display iç yapısna bakaraktan;




--- 0 ---
0 ---- 0 
--- 1 --- 
0 ---- 0 
--- 0 ---

A B C D E F G
0 0 0 0 0 0 1

1 sayısı için ;



--- 1 ---
1 ---- 0 
--- 1 --- 
1 ---- 0 
--- 1 ---

A B C D E F G
1 0 0 1 1 1 1

0-9 Kadar Sayan Basit Bir Sayaç (7 seg Anode)







CCS C Buton Uygulaması

0 yorum

#define ; 2 türlü kullanımı vardır

- Programın bu noktadan verilen metin ve üzerinde kimlik basit bir dize değiştirme sağlamak için kullanılır.

Örnek ; 

#define LED pin_b1 
output_high(LED);

- İkinci formu (C makro) olarak yerel tanımlayıcılar metinde benzer tanımlayıcıları ile eşleştirilir ve kullanıldığı makro geçirilen metin ile değiştirilir.

Örnek ;

#define LED_YAK(pin) output_high(pin)
#define LED_SONDUR(pin) output_low(pin)
while ( 1 ) { 
LED_YAK(pin_b1);
LED_SONDUR(pin_b0);
} 

Basit Bir Buton Uygulaması

input(pin); Pini Okumak İçin Kullanılır Pin durumuna göre 1 veya 0 döner 1 high 0 low

Örnek ;







22 Ağustos 2014 Cuma

CCS C Pic Programlama - 1 Giriş

0 yorum
Pic Nedir ? (Peripheral Interface Controller)





(resimde gördüğünüz gibi çok baçaklı çok işlevsel birşeydir :))

Adından da anlaşılacağı gibi bir ara birim denetleyicisidir(giriş/cıkış)

Çok geniş bir ürün ailesinin ilk üyesi olan PIC16C54 bu ihtiyacın ilk meyvesidir. PIC işlemcileri RISC benzeri işlemciler olarak anılır.

PIC16C54 12 Bit komut hafıza genişliği olan 8 bitlik CMOS bir işlemcidir.18 bacaklı dip kılıfta 13 I/O bacağına sahiptir ve 20 Mhz osilator hızına kadar kullanılabilir. 33 adet komut içermektedir. 512 byte program epromu ve 25 byte RAM`i bulunmaktadır. Bu hafıza kapasitesi birçok insanı güldürmüştür sanırım ama bir risc işlemci olması birçok işin bu kapasitede uygulanmasına olanak vermektedir. 

PIC serisi tüm işlemciler herhangi bir ek bellek veya giriş/çıkış elemanı gerektirmeden sadece 2 adet kondansatör, 1 adet direnç ve bir kristal ile çalıştırılabilmektedir. Tek bacaktan 40 mA akım çekilebilmekte ve entegre toplamı olarak 150 mA akım akıtma kapasitesine sahiptir. Entegrenin 4 Mhz osilator frekansında çektiği akım çalışırken 2 mA stand-by durumunda ise 20uA kadardır. 

CCS C derleyicisi 

CCS-C , “Custom Computer Services” Firmasının PIC Mikro Denetleyicileri için geliştirdiği özel bir C derleyicisidir. Standart C operatörleri yanı sıra PIC’lere özel dahili kütüphaneler ve önişlemci direktifleri de içeren program birçok donanım için hazır kodlar da sunmaktadır.

Basit Bir Örnek Yapalım

SET_TRIS_X = Port pinlerini Giriş veya Çıkış olarak ayarlar

OUTPUT_HIGH = Port'un istenilen bit'i lojik 1 yapılır.

OUTPUT_LOW = Port'un istenilen bit'i lojik 0 yapılır

#fuses *ayar* = sigorta ayarı yapılmasını sağlar( *ayar* cihaza bağlı olarak degişebilir)

Bazı yaygın seçenekler şunlardır;

XT = Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
HS = High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
NOWDT = No Watch Dog Timer
NOPUT = No Power Up Timer
NOPROTECT = Code not protected from reading 
NOBROWNOUT = No brownout reset
NOLVP = No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
NODEBUG = No Debug mode for ICD
NOWRT = Program memory not write protected
NOCPD = No EE protection

#use delay(clock=osilatör frekansı) Örnek Kullanım ; #use delay(clock=20000000) // HS OSC


//==============================================================================
#include <16f876.h> // Kullanılcak denetleyicinin başlık dosyası tanımlanıyor
// Denetleyici konfigürasyon ayarları
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay(clock=20000000)  // Gecikme fonksiyonu için kullanılan osilatör frekansı
//==============================================================================
void main () {
setup_spi(SPI_SS_DISABLED); // SPI birimi devre dışı
setup_timer_1(T1_DISABLED); // Timer1 devre dışı
setup_timer_2(T2_DISABLED,0,1); // Timer2 devre dışı
setup_adc_ports(NO_ANALOGS); // ANALOG girdi 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(0x00); // B portu çıkış olarak ayarlandı
output_b(0x00); // B portu komple 0 yapılıyor
while (1){ // Sonsuz Döngü
output_high(pin_b1); // B1 pin'i LOJİK-1 yapılıyor
}
}




B portunu kullanarak 8 ledi Sırayla yakma

//==============================================================================
#include <16f876.h> // Kullanılcak denetleyicinin başlık dosyası tanımlanıyor
// Denetleyici konfigürasyon ayarları
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay(clock=20000000)  // Gecikme fonksiyonu için kullanılan osilatör frekansı
//==============================================================================
int kaydir; // 8 bitlik bir degişken tanımlandı
int led=1; // 8 bitlik bir degişken tanımlandı
void main () {
setup_spi(SPI_SS_DISABLED); // SPI birimi devre dışı
setup_timer_1(T1_DISABLED); // Timer1 devre dışı
setup_timer_2(T2_DISABLED,0,1); // Timer2 devre dışı
setup_adc_ports(NO_ANALOGS); // ANALOG girdi 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(0x00); // B portu çıkış olarak ayarlandı
output_b(0x00); // B portu komple 0 yapılıyor
while (1){ // Sonsuz Döngü
led=1; // For döngüsünden çıkıldığında ledi 1 yap
for (kaydir=0;kaydir<8;led<<=1){  // KAYDİR 8 olana kadar LED degişkenini sola kaydir 1e eşitle
output_b(led); // LED değerini b portuna aktar
delay_ms(100); // 100 milisaniye bekle
}
}
}



























İletişim Formu

Ad

E-posta *

Mesaj *