16F877 Led Toggle Uygulaması

Daha önceki konularımız anlaması daha kolay, port sayısı daha az olan 16F84A modeliydi. Bugün 16F877 modeline geçeceğiz. 16F877 modeli, birçok yönden 16F84A modelinden üstün bir pic tir. Öncelikle 16F877’ten bahsedersek, A,B,C,d ve E olmak üzere 5 tane port vardır ve toplam 40 ayağı bulunur. CCS’te 16F877’yi programlarken,16F84’te tanımlamadığımız birkaç farklı kod olacaktır.

HEX ve Binary sayı sistemlerinden haberdar olmak önemlli ve gereklidir. Hex sayı sistemi, 16’lık tabanda yazılan sayı sistemidir. Binary ise, ‘lik tabanda. Örneğin 0b0001 bir binary sayıdır. 0b kısmı bu sayının binary olduğunu göstermek içindir. Aynı şekilde 0x00 da bir hex sayısıdır. Burada da 0x kısmı bu sayının hexa desimal bir sayı olduğunu göstermek içindir.

16F877 için hazırlamış olduğumuz kodlara bakacak olursak;

#include “C:\Program Files\PICC\Examples\bilg.-3.h”
#fuses xt,nowdt,noprotect,nobrownout,nolvp,noput,nowrt,nodebug,nocpd
#use delay(clock=4000000)
#use fast_io(b)

void main()
{

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);

// TODO: USER CODE!!

setup_CCP1(CCP_OFF); //CCP1 devre dışı bırakılır
setup_CCP2(CCP_OFF); //CCP2 devre dışı bırakılır

set_tris_b(0x00); //RB portu tamamı çıkış

output_b(0x00); // B portu çıkış olarak ayarlanır.

basla:

delay_ms(400); //400ms gecikme
output_toggle(pin_b0); //RB0 ucunun çıkış durumu tersleniyor
delay_ms(400); //400ms gecikme
output_toggle(pin_b1); //RB0 ucunun çıkış durumu tersleniyor
delay_ms(400); //400ms gecikme
output_toggle(pin_b2); //RB0 ucunun çıkış durumu tersleniyor
delay_ms(400); //400ms gecikme
output_toggle(pin_b3); //RB0 ucunun çıkış durumu tersleniyor
delay_ms(400); //400ms gecikme
output_toggle(pin_b4); //RB0 ucunun çıkış durumu tersleniyor
delay_ms(400); //400ms gecikme
output_toggle(pin_b5); //RB0 ucunun çıkış durumu tersleniyor
delay_ms(400); //400ms gecikme
output_toggle(pin_b6); //RB0 ucunun çıkış durumu tersleniyor
delay_ms(400); //400ms gecikme
output_toggle(pin_b7); //RB0 ucunun çıkış durumu tersleniyor
delay_ms(400); //400ms gecikme

goto basla;
}

Aynı programı farklı kodlarla ve farklı şekillerde yapmak isterseniz;

Sırayla binary sayı sayan bir kod;

#include “C:\Program Files\PICC\Examples\bilg.-3.h”
#fuses xt,nowdt,noprotect,nobrownout,nolvp,noput,nowrt,nodebug,nocpd
#use delay(clock=4000000)
#use fast_io(b)
int16 x;// x isminde bir sayı

void main()
{

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);

// TODO: USER CODE!!
setup_CCP1(CCP_OFF); //CCP1 devre dışı
setup_CCP2(CCP_OFF); //CCP2 devre dışı

set_tris_b(0x00); //RB portu tümüyle çıkış

output_b(0x00); // B portu çıkış

basla:

x=0;
a:
if (x<0b1111111)
{
x++;
output_b(x);
delay_ms(100);
goto a;
}

goto basla;
}

Bir başka; sırayla yukardan aşağı doğru sönen bir kod;

#include “C:\Program Files\PICC\Examples\bilg.-3.h”
#fuses xt,nowdt,noprotect,nobrownout,nolvp,noput,nowrt,nodebug,nocpd
#use delay(clock=4000000)
#use fast_io(b)
int16 x;// x isminde bir sayı
int a;
void main()
{

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);

// TODO: USER CODE!!
setup_CCP1(CCP_OFF); //CCP1 devre dışı
setup_CCP2(CCP_OFF); //CCP2 devre dışı

set_tris_b(0x00); //RB portu tümüyle çıkış

output_b(0x00); // B portu çıkış

basla:
a=0b11111111;
x=0;
for(x=0;x<8;x++ )
{
output_b(a);
delay_ms(100);
a=a<<1;
}

goto basla;
}

Görüldüğü üzere, komutlarda oynanarak, aynı devre üzerinde farklı oluşumlar hazırlamak mümkündür. Ben hazırladığım bütün devreleri similatör üzerinde test ettim ve sorunsuz çalışıyor, aynı şekilde sizlerde kodları deneyebilirsiniz.

Başarılar…

Yazar: Ahmet Serdar Güldibi