Вы находитесь на странице: 1из 29

PICC DERS NOTLARI 

 
// Program Adı 
#include<16F84A.h> 
#fuses XT,NOWDT,PUT,NOPUT,NOPROTECT   //LP,XT,HS,RC,NOWDT,WDT,PUT,NOPUT,PROTECT,NOPROTECT 
 
// Değişken Tanımlamalar 
 
#byte Porta = 0x05 
int8 t[10]; 
int1 x; 
int u; 
int8 y; 
int16 w; 
float z; 
 
// Ana Program 
 
void main (void){ 
 
// IO Tanımlamalar ve İlklendirmeler 
 
   while(TRUE){ 
 
// Sonsuz Döngü veya Koşullu Döngü 
 
   } 

 
1. Komutlar 
 
input() : Pin to read. Pins are defined in the devices .h file.  
 
value=input(pin) 
 
if (!input(PIN_B0) )     // B0=0 mı? 
 
if ( input(PIN_A0) )     // A0=1 mi? 
 
 
input_x( ) : Inputs an entire byte from a port.  
 
value = input_a()  
value = input_b()  
 
set_tris_x( ) : These functions allow the I/O port direction. Value is a 8 bit int. 
 
set_tris_a (value)  
set_tris_b (value)  
 
set_tris_b(0x0F)    // B7,B6,B5,B4 are outputs ‐ B3,B2,B1,B0 are inputs  
output_x( ) : Output an entire byte to a port. Value is a 8 bit int. 
 
output_a (value)  
output_b (value)  
 
output_b(0xF0)  
 
output_bit( ) : Pins are defined in the devices .h file. Value is a 1 or a 0.  
 
output_bit (pin, value)  
 
output_bit( PIN_B0, 0) 
 
bit_test( ) : Var may be a 8 bit variable. Bit is a number 0‐ 7 representing a bit number, 0 is the least 
significant bit.  
 
value = bit_test (var, bit)  
 
if( bit_test(x,3) || !bit_test (x,1) )  
 
bit_set( ) : Var may be a 8 bit variable. Bit is a number 0‐ 7 representing a bit number, 0 is the least 
significant bit. 
 
bit_set(var, bit)  
 
bit_set(x,3);  
bit_clear( ) : Var may be a 8 bit variable. Bit is a number 0‐ 7 representing a bit number, 0 is the least 
significant bit. 
 
bit_clear(var, bit)  
 
bit_clear(x,2);  

delay_us( ) / delay_ms( ) : time ‐ a variable 0‐65535(int16) or a constant 0‐65535. (#USE DELAY)


 
delay_ms (time)  
delay_us (time)  
 
#use delay (clock=20000000)  
delay_ms( 2 ) 
 
2. Şartlı Akış 
 
if (Koşul){ 
 
// Komutlar 
 

else{ 
 
// Komutlar 
 

 
3. Tekrarlı Akış 
 
while (Koşul){ 
 
//Komutlar 
 

 
4. Operatörler 
 
+ Addition Operator
+= Addition assignment operator, x+=y,isthe same as x=x+y
[] Array subscrip operator
&= Bitwise and assignment operator, x&=y, is the same as x=x&y
& Bitwise and operator
^= Bitwise exclusive or assignment operator, x^=y, is the same as x=x^y
^ Bitwise exclusive or operator
l= Bitwise inclusive or assignment operator, xl=y, is the same as x=xly
l Bitwise inclusive or operator
/= Division assignment operator, x/=y, is the same as x=x/y
/ Division operator
== Equality
> Greater than operator
>= Greater than or equal to operator
!= Inequality
 
<<= Left shift assignment operator, x<<=y, is the same as x=x<<y
< Less than operator
<< Left Shift operator
<= Less than or equal to operator
&& Logical AND operator
! Logical negation operator
ll Logical OR operator
*= Multiplication assignment operator, x*=y, is the same as x=x*y
* Multiplication operator
~ One's complement operator
>>= Right shift assignment, x>>=y, is the same as x=x>>y
>> Right shift operator
-> Structure Pointer operation
-= Subtraction assignment operator, x-=y, is the same as x=x- y
- Subtraction operator
 
 
 
 
 
 
 
Örnek 1: PIC 16F84A ‘nın A portuna bir LED bağlayarak bu led’in periyodik olarak yanıp sönmesini 
sağlayan programı PICCI dilinde gerçekleştiriniz. 
 
// Örnek 1 
#include<16F84A.h> 
#fuses XT,NOWDT,PUT,NOPUT,NOPROTECT   
#use delay (clock=4000000) 
 
#byte PortA = 0x05  
 
void main (void){ 
 
set_tris_a(0x00); 
 
   while(TRUE){ 
 
       bit_set(PortA,0); 
    delay_ms(1000); 
       bit_clear(PortA,0); 
    delay_ms(1000); 
 
   } 

 
Örnek 2: PIC 16F84A ‘nın B portuna ortak katodlu display bağlayarak 1 ile 9 arasındaki rakamların 
periyodik olarak yazılmasını sağlayan programı PICC dilinde gerçekleştiriniz. 
 
// Örnek 2 (Versiyon 1) 
#include<16F84A.h> 
#fuses XT,NOWDT,PUT,NOPUT,NOPROTECT   
#use delay (clock=4000000) 
 
void main (void){ 
 
set_tris_b(0x00); 
 
   while(TRUE){ 
 
       output_b(0x06); 
    delay_ms(1000); 
       output_b(0x5B); 
    delay_ms(1000); 
       output_b(0x4F); 
    delay_ms(1000); 
       output_b(0x66); 
    delay_ms(1000); 
 
   } 

 
 
 
// Örnek 2 (Versiyon 2) 
#include<16F84A.h> 
#fuses XT,NOWDT,PUT,NOPUT,NOPROTECT   
#use delay (clock=4000000) 
 
int8 rakam[10]; 
int8 i; 
 
void main (void){ 
 
set_tris_b(0x00); 
 
rakam[1]=0x06; 
rakam[2]=0x5B; 
rakam[3]=0x4F; 
rakam[4]=0x66; 
rakam[5]=0x6D; 
rakam[6]=0x7D; 
rakam[7]=0x07; 
rakam[8]=0x7F; 
rakam[9]=0x6F; 
i=0; 
 
   while(TRUE){ 
     
    i=i+1; 
 
    if (i==10){ 
      i=1;} 
 
       output_b(rakam[i]); 
    delay_ms(1000); 
 
   } 

 
Örnek  3:  PIC  16F84A  ‘nın  A  portunu  giriş,  B  portunu  çıkış  olarak  tanımlayınız.  Aşağıdaki  koşulları 
içeren Assembler dilinde bir program gerçekleştiriniz. Ayrıca bu koşulları sağlayabilecek PIC devresini 
çiziniz. 

i) A  portuna  bir  buton,  B  portuna  bir  led  bağlayınız.  Butona  basıldığında  led  yanacak, 
basılmadığında led sönecektir. 
ii) A portuna iki buton (start,stop), B portuna bir led bağlayınız. Start butona basıldığında led 
yanacak, stop butonuna basıldığında led sönecektir. 

 
 
 
 
 
 
// Örnek 3_i 
#include<16F84A.h> 
#fuses XT,NOWDT,PUT,NOPUT,NOPROTECT   
#use delay (clock=4000000) 
 
#byte PortA = 0x05  
#byte PortB = 0x06  
 
void main (void){ 
 
set_tris_a(0x1F); 
set_tris_b(0x00); 
 
output_b(0x00); 
 
   while(TRUE){ 
 
       if (bit_test(PortA,0)){ 
      bit_set(PortB,0);} 
    else{ 
      bit_clear(PortB,0);} 
 
   } 

 
// Örnek 3_ii 
#include<16F84A.h> 
#fuses XT,NOWDT,PUT,NOPUT,NOPROTECT   
#use delay (clock=4000000) 
 
#byte PortA = 0x05  
#byte PortB = 0x06  
 
void main (void){ 
 
set_tris_a(0x1F); 
set_tris_b(0x00); 
 
output_b(0x00); 
 
 
   while(TRUE){ 
 
       if (bit_test(PortA,0)){ 
      bit_set(PortB,0);} 
       if (bit_test(PortA,1)){ 
      bit_clear(PortB,0);} 
 
   } 

 
 
Örnek 4:  PIC 16F84A ‘nın B portunu çıkış tanımlayarak bir adet ortak katodlu display, A portunu giriş 
tanımlayarak,  dört  adet  anahtar  bağlayınız.    A  portundan  girilen  2  tabanlı  verinin  Hekzadesimal 
karşılığını B portundaki display’ den gösteren programı PICC dilinde gerçekleştiriniz. 

// Örnek 4 
#include<16F84A.h> 
#fuses XT,NOWDT,PUT,NOPUT,NOPROTECT   
#use delay (clock=4000000) 
 
int8 rakam[16]; 
int8 veri; 
 
void main (void){ 
 
set_tris_a(0x1F); 
set_tris_b(0x00); 
 
rakam[0]=0x3F; 
rakam[1]=0x06; 
rakam[2]=0x5B; 
rakam[3]=0x4F; 
rakam[4]=0x66; 
rakam[5]=0x6D; 
rakam[6]=0x7D; 
rakam[7]=0x07; 
rakam[8]=0x7F; 
rakam[9]=0x6F; 
rakam[10]=0x77; 
rakam[11]=0x7C; 
rakam[12]=0x39; 
rakam[13]=0x5E; 
rakam[14]=0x79; 
rakam[15]=0x71; 
 
   while(TRUE){ 
     
       veri = input_a(); 
    output_b(rakam[veri]); 
 
   } 

 
 
 
 
 
 
 
 
 
 
Örnek  55:    PIC  16F8
84A  ‘ya  7x5
5  dot‐matrixx  display  baağlayınız.  Do
ot‐Matrix  dissplayden  ‘E’  harfinin 
yazılmassını sağlayan programı PICC dilinde geerçekleştiriniz. 

#includee<16F84A.h>> 
#fuses XT,NOWDT,PUT,NOPROTECT   
#use delay (clock=40 000000) 
 
int8 A[5]]; 
int8 B[5]]; 
int8 i; 
 
void maiin (void){ 
set_tris__a(0x00); 
set_tris__b(0x00); 
 
A[1]=0x007;   A[2]=0x0B;  A[3]=0x0D;    A[4]=00x0E; 
B[1]=0x33F;   B[2]=0x0 06;   B[3]=0xx5B;    B[4]=00x4F;   
 
i=0; 
while(1){ 
    i=i+1; 
   if (i==55){ 
      i=1;} 
   outputt_a(A[i]); 
   outputt_b(B[i]); 
   delay__ms(10);      
   }   

Örnek 6: PIC 16F84A ‘nõn A portunda 2 adet buton ve B portunda 8 adet led bulunmaktadõr.
Butonlardan birine basõldõ õnda 8 bit binary ileri saydõrma, di erine basõldõ õnda 8 bit binary geri
saydõrma i lemlerini yapan programõ PICC ile yazõnõz. (Her iki butona basõlmadõ õnda sayõcõ en son
hangi sayõda kaldõysa o sayõyõ koruyacaktõr.)

******************************************************
// Örnek 6
#include<16F84A.h>
#fuses XT,NOWDT,PUT,NOPUT,NOPROTECT
#use delay (clock=4000000)

#byte Porta = 0x05

int8 sayici;

void main (void){

set_tris_a(0x03);
set_tris_b(0x00);

sayici=0;

while(TRUE){

if ( bit_test(Porta,0)){
sayici=sayici+1;}

if ( bit_test(Porta,1)){
sayici=sayici 1;}

output_b(sayici);
delay_ms(300);
}
}
******************************************************
// Örnek 6
#include<16F84A.h>
#fuses XT,NOWDT,PUT,NOPUT,NOPROTECT
#byte Porta = 0x05

int8 sayici;
int1 z;

void main (void){

set_tris_a(0x03);
set_tris_b(0x00);

sayici=0;
z=0;
while(TRUE){

if ( bit_test(Porta,0) && (z==0)){


sayici=sayici+1;
z=1;}

if ( bit_test(Porta,1) && (z==0)){


sayici=sayici 1;
z=1;}

if (!bit_test(Porta,0) && !bit_test(Porta,1)){


z=0;}

output_b(sayici);
}
}

Örnek 7: ( ifreli Kilit Uygulamasõ) A portuna ba lõ 4 adet 2 konumlõ anahtar bulunmaktadõr. Bu 4


anahtarlara uygun kombinasyonla basõlmasõyla PORTB.0 ‘da bulunan ledi yakan programõ yazõnõz.
( FRE=b’1010’=d’10’)

// Örnek 7
#include<16F84A.h>
#fuses XT,NOWDT,PUT,NOPUT,NOPROTECT
#byte Porta = 0x05
#byte Portb = 0x06

int8 sifre,veri;

void main (void){

set_tris_a(0x0F);
set_tris_b(0x00);

sifre=10;
veri=0;
output_b(0x00);

while(TRUE){

veri = input_a();

if (veri==10){
bit_set(Portb,0);}
else{
bit_clear(Portb,0);}
}
}
Örnek 8: Port B’ ye ba lanmõ 8 led’ in yürüyen õ õk uygulamasõ

// Örnek 8
#include<16F84A.h>
#fuses XT,NOWDT,PUT,NOPUT,NOPROTECT
#use delay (clock=4000000)

int8 veri,a;

void main (void){

set_tris_b(0x00);

veri=1;
a=1;

while(TRUE){

if (a==1){
veri=veri << 1;}

if (a==2){
veri=veri >> 1;}

if (veri==1){
a=1;}

if (veri==128){
a=2;}

output_b(veri);
delay_ms(400);
}
}

Örnek 9: 3 ortak katotlu displayde kayan yazõ uygulamasõ ile ekrana ERSOY yazdõrõnõz.

#include<16F84A.h>
#fuses XT,NOWDT,PUT,NOPROTECT
#use delay (clock=4000000)

int8 A[4];
int8 B[6];
int8 i,k,veri;

void main (void){


set_tris_a(0x00);
set_tris_b(0x00);

A[1]=0x04; A[2]=0x02; A[3]=0x01;


B[1]=0x79; B[2]=0x50; B[3]=0x6D; B[4]=0x3F;
B[5]=0x6E;
i=0;
k=0;
while(1){
i=i+1;
if (i==44){
k=k+1;
i=1;}

if (k==55){
k=0;
veri==B[1];
B[1]==B[2];
B[2]==B[3];
B[3]==B[4];
B[4]==B[5];
B[5]==veri;}

outputt_a(A[i]);
outputt_b(B[i]);
delay__ms(10);
}
}
OPTION REEGISTER (Ad
dres : 0x81)) 
 

 
 
Bit 7  RRBPU    PortB Pull‐Up yetki bbiti 
  11 :     PortB Pull‐Up dirençlleri pasif 
  00 :    PortB Pull‐Up dirençlleri aktif 
 
Bit 6  IINTEDG   RB0/INT Kesme kenaar seçme biti
  11 :     RB0/INT olay kesmessi yükselen kkenar algılam
ma 
  00 :    RB0/INT olay kesmessi düşen kenaar algılama
 
Bit 5  TT0CS    Timer0 saat (Clock) kkaynağı seçm me biti 
  11 :     Timer0 saat işaretini  RA4/T0CKI p pininden alıyyor 
  00 :    Timer0 saat işaretini  iç saatten (C
CLOCKOUT) a alıyor 
 
Bit 4  TT0SE    TMR0 ka
aynak kenar sseçme biti 
  11 :     RA4/T0C
CKI pini düşenn kenar algılaamalı 
  00 :    RA4/T0C
CKI pini yükseelen kenar allgılamalı 
 
Bit 3  PPSA    Çarpan tayin etme biiti 
  11 :     Çarpanla
ar WDT için aayarlandı. 
  00 :    Çarpanla
ar Timer0 içinn ayarlandı
 
Bit 2‐0  P
PS2:PS0  oranı seçme  bitleri 
Çarpan o
 

                                            
 
Pull‐Up d dirençlerini aaktif etmek için; 
 
bcf   OPTTION,RBPU     bcf   OPTION
b ,7        bcf   0x81,7 
b
 
port_b_p pullups(TRUE); 
 
Timer0 ssaat (Clock) kkaynağını RA A4/TOCKI pin inden almassı için (Timer’’ ı sayıcı yapm
mak için); 
 
bsf   OPTTION,TOCS     bsf   OPTION
b ,5        bsf   0x81,5 
b
 
setup_co ounters(RTCC_EXT_H_TO O_L); 
 
 
INT
TCON REGISSTER (Adre
es: 0x0B, 0x8
8B) 
 

 
 
Bit 7  GGIE    Global ke
esme yetki bbiti 
  11 :     Bütün keesmeler aktiff 
  00 :    Bütün keesmeler pasiff 
 
Bit 6  EEEIE    E2PROM yazma tamaamlandı kesm
mesi yetki bitti 
2
  11 :     E PROM yazma tamaamlandı kesm
mesi aktif 
  00 :    E2PROM yazma tamaamlandı kesm
mesi pasif 
 

 
Şekkil 1. PIC16F884A’ nın Kesm
me Lojik Devvresi 
 
Bit 5  TT0IE    Timer0 taşma kesmeesi yetki biti
  11 :     Timer0 taşma kesmeesi aktif 
  00 :    Timer0 taşma kesmeesi pasif 
 
Bit 4  IINTE    RB0/INT olay kesmessi yetki biti 
  11 :     RB0/INT olay kesmessi aktif 
  00 :    RB0/INT olay kesmessi pasif 
 
Bit 3  RRBIE    RB port d
değişim kesm
mesi yetki bitti 
  11 :     RB port d
değişim kesm
mesi aktif 
  00 :    RB port d
değişim kesm
mesi pasif 
 
Bit 2  TT0IF    Timer0 taşma kesmeesi bayrak bitti 
  11 :     Timer0’d
da taşma old u (Yazılım ile
e silinmeli) 
  00 :    Timer0’d
da taşma olm
madı 
 
Bit 1  IINTF    RB0/INT olay kesmessi bayrak biti 
  11 :     RB0/INT pininde olayy kesmesi old
du 
  00 :    RB0/INT pininde olayy kesmesi olm
madı 
 
Bit 0  RRBIF    RB port d
değişim kesmmesi bayrak b biti 
  11 :     RB7:RB4 bitlerinden en az birinde ğişimi oldu (YYazılım ile silinmeli) 
e durum değ
  00 :    RB7:RB4 bitlerinin hi çbirinde durrum değişimi olmadı 
 
Global Kesmeyi aktif etmek için; 
 
bsf   INTCON,GIE     bsf   INTCON,7        bsf   0x0B,7    bsf   0x8B,7    
 
enable_interrupts(GLOBAL);   //GLOBAL,   INT_EXT,   INT_RB,   INT_TIMER0,   INT_EEPROM 
 
Herhangi bir Kesmeyi (Örneğin RB0/INT olay kesmesini) aktif etmek için; 
 
bsf   INTCON,INTE     bsf   INTCON,4        bsf   0x0B,4    bsf   0x8B,4    
 
enable_interrupts(INT_EXT);  
 
 
Örnek 10:  PIC 16F84A’ nın RB0 pinini olay kesmesi olarak tanımlayarak bu pine 1 adet lojik “1” aktif 
buton bağlayınız. Ayrıca B portuna 1 adet Ortak katotlu display bağlayınız. Displayde 0‐9 arası sayılar 
periyodik  olarak  görünecektir.    Butona  basıp  bıraktığımızda  sayı  değeri  “1”  (bir)  artmalıdır.  Sayı 
butonu bıraktığımızda güncellenmelidir. 
 
#include<16F84A.h> 
#fuses XT,NOWDT,PUT,NOPROTECT   
 
const int8 Goster[10]={0x7E,0x0C,0xB6,0x9E,0xCC,0xDA,0xFA,0x0E,0xFE,0xDE}; 
#byte PortB=0x06 
int8 i,kod; 
 
#INT_EXT 
void extkesme(){ 
   i=i+1; 
   if (i==10){ 
      i=0;} 

 
void main (void){ 
 
set_tris_a(0x00); 
set_tris_b(0x01); 
 
enable_interrupts(INT_EXT);  
ext_int_edge(H_TO_L);       // H_TO_L,    L_TO_H 
enable_interrupts(GLOBAL); 
 
i=0; 
kod=0; 
while(1){ 
   output_a(i); 
   kod=Goster[i]; 
   #asm  
      movf  kod,W 
      movwf PortB 
   #endasm 
      } 

 
Örnek 11:  Örnek 10’da verilen soruyu PIC166F84A’da bulunan sayıcıyı kullanarak  çözünüz. 
 
************* Versiiyon 1 ***** **********
#includee<16F84A.h>> 
#fuses XT,NOWDT,NOPUT,NOPR ROTECT   
 
const intt8 Goster[10 C,0xB6,0x9E ,0xCC,0xDA,0xFA,0x0E,0xFE,0xDE}; 
0]={0x7E,0x0C
int8 i; 
 
void maiin (void){ 
 
set_tris__a(0x10); 
set_tris__b(0x00); 
 
setup_co ounters(RTCC_EXT_H_TO O_L,RTCC_DIIV_1);   
 
i=0; 
while(1){ 
   i=get_ttimer0(); 
      if (i===10){ 
         set__timer0(0);} 
   outputt_b(Goster[i]]); 
      } 

 
************ Versiyon 2 ************** 
#include<16F84A.h> 
#fuses XT,NOWDT,NOPUT,NOPROTECT   
const int8 Goster[10]={0x7E,0x0C,0xB6,0x9E,0xCC,0xDA,0xFA,0x0E,0xFE,0xDE}; 
int8 i; 
 
#INT_TIMER0  
void timer0kesme(){ 
   set_timer0(245); 

 
void main (void){ 
 
set_tris_a(0x10); 
set_tris_b(0x00); 
setup_counters(RTCC_EXT_H_TO_L,RTCC_DIV_1);   
 
i=0; 
set_timer0(245); 
while(1){ 
   i=get_timer0()‐245; 
   output_b(Goster[i]); 
      } 

 
************ Versiyon 3 ************** 
#include<16F84A.h> 
#fuses XT,NOWDT,NOPUT,NOPROTECT   
const int8 Goster[10]={0x7E,0x0C,0xB6,0x9E,0xCC,0xDA,0xFA,0x0E,0xFE,0xDE}; 
int8 i; 
 
#INT_TIMER0  
void timer0kesme(){ 
   set_timer0(245); 

 
void main (void){ 
 
set_tris_a(0x10); 
set_tris_b(0x00); 
setup_timer_0(T0_EXT_H_TO_L | T0_DIV_1);   
enable_interrupts(INT_TIMER0);  
enable_interrupts(GLOBAL); 
 
i=0; 
set_timer0(245); 
while(1){ 
   i=get_timer0()‐245; 
   output_b(Goster[i]); 
      } 

 
Örnek 1 12: PIC 16F8
84A ‘nın B portuna ortakk katodlu dissplay bağlaya arak 1 ile 9 aarasındaki ra
akamların 
periyodik  olarak  yaazılmasını  sa ağlayan  proogramı  PICC C  dilinde  geerçekleştiriniiz.  Gecikmeyi  Timer 
kullanaraak gerçekleştiriniz. 
 
#includee<16F84A.h>> 
#fuses XT,NOWDT,PUT,NOPUT,N NOPROTECT
const intt8 Goster[100]={0x3F,0x06 6,0x5B,0x4F,,0x66,0x6D,0 0x7D,0x07,0xx7F,0x6F}; 
 
int8 i; 
 
#INT_TIM MER0  
void timer0kesme(){ 
   i=i+1; 
   if (i==110){ 
      i=0;} 

 
void maiin (void){ 
set_tris__b(0x00); 
 
setup_timer_0(T0_IN NTERNAL | T T0_DIV_256) ; 
enable_iinterrupts(IN NT_TIMER0);;  
enable_iinterrupts(GLOBAL); 
 
 
i=0; 
while(TR RUE){ 
   outputt_b(Goster[i]]); 


 
Örnek  113:  PIC1616 6F84A’  nın  pull‐up 
p direençlerini  aktif  hale  getirip  pinlere  buton  bağlayınız.  B 
portundan aldığınız b bilgiyi A porttundan göndderiniz. 
 

 
 
#include<16F84A.h> 
#fuses XT,NOWDT,PUT,NOPUT,NOPROTECT 
 
void main (void){ 
set_tris_a(0x00); 
set_tris_b(0xFF); 
 
port_b_pullups(TRUE); 
 
while(TRUE){ 
   output_a(input_b());; 


 
Örnek 14: PIC1616F84A ile bir motor periyodik olarak çalıştırılacaktır. Start butonuna basılması ile bir 
sistem  değişkeni  aktif  olacak  ve  motor  çalışmaya  başlayacaktır.  Motor  t1  süre  çalışıp,  t2  süre 
duracaktır. Bu işlem stop butonuna basılana kadar periyodik olarak devam edecektir. 
 
************ Versiyon 1 ************** 
#include<16F84A.h> 
#fuses XT,NOWDT,PUT,NOPROTECT 
 
#bit  Start    =  0x05.0 
#bit  Stop     =  0x05.1 
#bit  Sistem   =  0x06.0 
#bit  Motor    =  0x06.1 
int8 i; 
 
#INT_TIMER0  
void Timer0Kesme(){ 
   i=i+1; 
   if (i>=10){ 
      i=0;} 

 
void main (void){ 
set_tris_a(0xFF); 
set_tris_b(0x00); 
 
setup_timer_0(T0_INTERNAL | T0_DIV_256); 
enable_interrupts(INT_TIMER0);  
enable_interrupts(GLOBAL); 
 
Sistem=0; 
Motor=0; 
output_b(0x00); 
while(TRUE){ 
   if (Start==1){ 
      Sistem=1; 
      i=0;} 
       
   if (Stop==1){ 
      Sistem=0;} 
       
   if (sistem==1){ 
      if (i<5){ 
         Motor=1;} 
         else{ 
            Motor=0;}} 
       else{ 
         Motor=0;} 


 
 
************ Versiyon 2 ************** 
#include<16F84A.h> 
#fuses XT,NOWDT,PUT,NOPROTECT 
 
#bit  Start    =  0x05.0 
#bit  Stop     =  0x05.1 
#bit  Sistem   =  0x06.0 
#bit  Motor    =  0x06.1 
int8 i; 
 
#INT_TIMER0  
void Timer0Kesme(){ 
   i=i+1; 
   if (i>=10){ 
      i=0;} 

 
void main (void){ 
set_tris_a(0xFF); 
set_tris_b(0x00); 
setup_timer_0(T0_INTERNAL | T0_DIV_256); 
enable_interrupts(INT_TIMER0);  
enable_interrupts(GLOBAL); 
Sistem=0; 
Motor=0; 
output_b(0x00); 
while(TRUE){ 
   Sistem=(Start || Sistem) && (!Stop); 
   if (Start==1){ 
      i=0;} 
       
   if (sistem==1){ 
      if (i<5){ 
         Motor=1;} 
         else{ 
            Motor=0;}} 
       else{ 
         Motor=0;} 


 
 
 
 
 
 
 
 
 
 
 
 
Örnek 155: Aşağıdaki zaman diyaggramı verilenn sistemin prrogramını PIC
CC ile yazınızz. Mikrodene
etleyici 
olarak 166F84A kullan
nılacaktır. 
 

 
 
#includee<16F84A.h>> 
#fuses XT,NOWDT,PUT,NOPROTECT 
 
#bit  Start     =  0x05.0 
#bit  Stop      =  0x05.1 
#bit  Sisttem    =  0x06 6.0 
#bit  Mo otor1    =  0x0
06.1 
#bit  Mo otor2    =  0x0
06.2 
 
int8 T1ETT,T1PT,T2ETT,T2PT; 
int1 T1IN N,T1Q,T2IN,TT2Q; 
 
#INT_TIM MER0  
void Tim mer0Kesme(){{ 
    
   if (T1IN N==1){ 
      if (T11ET<T1PT){ 
         T1EET=T1ET+1; 
         T1Q Q=0;} 
      if (T11ET>=T1PT){ 
            T11ET=T1PT; 
            T11Q=1;}} 
      else{ 
         T1EET=0; 
         T1Q Q=0;} 
   if (T2IN N==1){ 
      if (T22ET<T2PT){ 
         T2EET=T2ET+1; 
         T2Q Q=0;} 
      if (T22ET>=T2PT){ 
            T22ET=T2PT; 
            T22Q=1;}} 
      else{ 
         T2EET=0; 
         T2Q=0;}           

 
void main (void){ 
set_tris_a(0xFF); 
set_tris_b(0x00); 
 
setup_timer_0(T0_INTERNAL | T0_DIV_256); 
enable_interrupts(INT_TIMER0);  
enable_interrupts(GLOBAL); 
 
T1PT=2; 
T2PT=3; 
Sistem=0; 
Motor1=0; 
Motor2=0; 
output_b(0x00); 
 
while(TRUE){ 
   if (Start==1){ 
      Sistem=1;} 
       
   if (Stop==1){ 
      Sistem=0;} 
       
   if (Sistem==1){ 
      T1IN=1;} 
      else{ 
         T1IN=0;} 
          
   if ((Sistem==1) && (T1Q==1)){ 
      Motor1=1;} 
      else{ 
         Motor1=0;} 
  
    if (T1Q==1){ 
      T2IN=1;} 
      else{ 
         T2IN=0;} 
    
   if ((T1Q==1) && (T2Q==0)){ 
      Motor2=1;} 
      else{ 
         Motor2=0;} 


Örnek 16: Bir buton ile 3 motorun kontrolü yapılacaktır. Butona; 
1. kez basıldığında 1 nolu motor çalışacaktır. 
2. kez basıldığında 2 nolu motor da devreye girecektir. 
3. kez basıldığında 1 ve 2 nolu motor devreden çıkacak 3 nolu motor devreye girecektir. 
4. kez basıldığında 3 nolu motor devreden çıkacak ve sistem başa dönecektir.  
Mikrodenetleyici olarak 16F84A kullanılacaktır. Gerekli programı PICC dili ile yazınız. 
#include<16F84A.h> 
#fuses XT,NOWDT,NOPUT,NOPROTECT   
 
int8 i; 
 
void main (void){ 
 
set_tris_a(0x10); 
set_tris_b(0x00); 
 
setup_timer_0(T0_EXT_H_TO_L | T0_DIV_1);   
 
i=0; 
set_timer0(0); 
output_b(0b00000000); 
while(1){ 
   i=get_timer0(); 
    
   switch (i){ 
      case 1   :output_b(0b00000001); 
                     break; 
      case 2   :output_b(0b00000011); 
                     break; 
      case 3   :output_b(0b00000100); 
                     break; 
      case 4   :output_b(0b00000000); 
                     set_timer0(0); 
                     break;                
               } 
      } 

 
Örnek 17: Bir buton ile 3 motorun kontrolü yapılacaktır. Butona; 
1. kez basıldığında 1 nolu motor çalışacaktır. 
2. kez basıldığında 2 nolu motor da devreye girecektir. 
3. kez basıldığında 1 ve 2 nolu motor devreden çıkacak 3 nolu motor devreye girecektir. 
4. kez basıldığında 3 nolu motor devreden çıkacak ve 4 nolu motor devreye girecektir. 4 nolu motor 
t1 kadar süre çalışıp devreden çıkacak ve sistem başa dönecektir.  
 
Mikrodenetleyici olarak 16F84A kullanılacaktır. Gerekli programı PICC dili ile yazınız. 
#include<16F84A.h> 
#fuses XT,NOWDT,PUT,NOPROTECT 
 
#bit  Buton     =  0x05.0 
int8 T1ET,T1PT,sayici; 
int1 T1IN,T1Q,z; 
 
#INT_TIMER0  
void Timer0Kesme(){ 
    
   if (T1IN==1){ 
      if (T1ET<T1PT){ 
         T1ET=T1ET+1; 
         T1Q=0;} 
      if (T1ET>=T1PT){ 
            T1ET=T1PT; 
            T1Q=1;}} 
      else{ 
         T1ET=0; 
         T1Q=0;}    

 
void main (void){ 
set_tris_a(0xFF); 
set_tris_b(0x00); 
setup_timer_0(T0_INTERNAL | T0_DIV_256); 
enable_interrupts(INT_TIMER0);  
enable_interrupts(GLOBAL); 
T1PT=2; 
z=0; 
sayici=0; 
output_b(0x00); 
while(TRUE){ 
    
   if ((Buton==1) && (z==0) && (T1IN==0)){ 
      sayici=sayici+1; 
      z=1;} 
   if (Buton==0){ 
      z=0;} 
       
   switch (sayici){ 
      case 1   :output_b(0b00000001); 
                break; 
      case 2   :output_b(0b00000011); 
                break; 
      case 3   :output_b(0b00000100); 
                break; 
      case 4   :output_b(0b00001000); 
                T1IN=1; 
                break;} 
    
 
   if (T1Q==1){ 
      output_b(0x00); 
      T1IN=0; 
      sayici=0; 
      T1Q=0;}          


//////// Standard Header file for the PIC16F84A device //////////////// 
#device PIC16F84A 
#nolist 
//////// Program memory: 1024x14  Data RAM: 68  Stack: 8 
//////// I/O: 13   Analog Pins: 0 
//////// Data EEPROM: 64 
//////// C Scratch area: 0C   ID Location: 2000 
//////// Fuses: LP,XT,HS,RC,NOWDT,WDT,PUT,NOPUT,PROTECT,NOPROTECT 
////////  
////////////////////////////////////////////////////////////////// I/O 
// Discrete I/O Functions: SET_TRIS_x(), OUTPUT_x(), INPUT_x(), 
//                         PORT_x_PULLUPS(), INPUT(), 
//                         OUTPUT_LOW(), OUTPUT_HIGH(), 
//                         OUTPUT_FLOAT(), OUTPUT_BIT() 
// Constants used to identify pins in the above are: 
 
#define PIN_A0  40 
#define PIN_A1  41 
#define PIN_A2  42 
#define PIN_A3  43 
#define PIN_A4  44 
 
#define PIN_B0  48 
#define PIN_B1  49 
#define PIN_B2  50 
#define PIN_B3  51 
#define PIN_B4  52 
#define PIN_B5  53 
#define PIN_B6  54 
#define PIN_B7  55 
 
////////////////////////////////////////////////////////////////// Useful defines 
#define FALSE 0 
#define TRUE 1 
 
#define BYTE int8 
#define BOOLEAN int1 
 
#define getc getch 
#define fgetc getch 
#define getchar getch 
#define putc putchar 
#define fputc putchar 
#define fgets gets 
#define fputs puts 
 
 
 
 
 
 
 
////////////////////////////////////////////////////////////////// Control 
// Control Functions:  RESET_CPU(), SLEEP(), RESTART_CAUSE() 
// Constants returned from RESTART_CAUSE() are: 
#define WDT_FROM_SLEEP  3      
#define WDT_TIMEOUT     11     
#define MCLR_FROM_SLEEP 16     
#define MCLR_FROM_RUN   27     
#define NORMAL_POWER_UP 27     
#define BROWNOUT_RESTART 26    
 
 
////////////////////////////////////////////////////////////////// Timer 0 
// Timer 0 (AKA RTCC)Functions: SETUP_COUNTERS() or SETUP_TIMER_0(), 
//                              SET_TIMER0() or SET_RTCC(), 
//                              GET_TIMER0() or GET_RTCC() 
// Constants used for SETUP_TIMER_0() are: 
#define T0_INTERNAL   0 
#define T0_EXT_L_TO_H 32 
#define T0_EXT_H_TO_L 48 
 
#define T0_DIV_1      8 
#define T0_DIV_2      0 
#define T0_DIV_4      1 
#define T0_DIV_8      2 
#define T0_DIV_16     3 
#define T0_DIV_32     4 
#define T0_DIV_64     5 
#define T0_DIV_128    6 
#define T0_DIV_256    7 
 
 
#define T0_8_BIT      0      
 
#define RTCC_INTERNAL   0      // The following are provided for compatibility 
#define RTCC_EXT_L_TO_H 32     // with older compiler versions 
#define RTCC_EXT_H_TO_L 48 
#define RTCC_DIV_1      8 
#define RTCC_DIV_2      0 
#define RTCC_DIV_4      1 
#define RTCC_DIV_8      2 
#define RTCC_DIV_16     3 
#define RTCC_DIV_32     4 
#define RTCC_DIV_64     5 
#define RTCC_DIV_128    6 
#define RTCC_DIV_256    7 
#define RTCC_8_BIT      0      
 
// Constants used for SETUP_COUNTERS() are the above 
// constants for the 1st param and the following for 
// the 2nd param: 
 
 
////////////////////////////////////////////////////////////////// WDT 
// Watch Dog Timer Functions: SETUP_WDT() or SETUP_COUNTERS() (see above) 
//                            RESTART_WDT() 
// WDT base is 18ms 
// 
 
#define WDT_18MS        8    
#define WDT_36MS        9    
#define WDT_72MS       10    
#define WDT_144MS      11    
#define WDT_288MS      12    
#define WDT_576MS      13    
#define WDT_1152MS     14    
#define WDT_2304MS     15    
 
 
////////////////////////////////////////////////////////////////// INT 
// Interrupt Functions: ENABLE_INTERRUPTS(), DISABLE_INTERRUPTS(), 
//                      CLEAR_INTERRUPT(), INTERRUPT_ACTIVE(), 
//                      EXT_INT_EDGE() 
// 
// Constants used in EXT_INT_EDGE() are: 
#define L_TO_H              0x40 
#define H_TO_L                 0 
// Constants used in ENABLE/DISABLE_INTERRUPTS() are: 
#define GLOBAL                    0x0B80 
#define INT_RTCC                  0x000B20 
#define INT_RB                    0x00FF0B08 
#define INT_EXT_L2H               0x50000B10 
#define INT_EXT_H2L               0x60000B10 
#define INT_EXT                   0x000B10 
#define INT_EEPROM                0x000B40 
#define INT_TIMER0                0x000B20 
 
#list 
PICC KOMUTLAR

KOMUT AÇIKLAMA KOMUT KULLANIM ÖRNE


input() Bit okuma i lemi yapar. nput(PIN_A0)
input_x( ) Port okuma i lemi yapar. nput_a()
set_tris_x( ) Port yönlendirme i lemi yapar. set_tris_a(0xFF)
output_x( ) Port’tan dõ arõ bilgi gönderir. output_a(0xFA)
output_bit( ) Belirtilen pin’den dõ arõ 1 bitlik bilgi gönderir. output_bit(PIN_A0,1)
bit_test( ) Belirtilen pin’i test eder. bit_test(h,0)
bit_set( ) Belirtilen pin’ i Lojik’1’ yapar. bit_set(y,0)
bit_clear( ) Belirtilen pin’ i Lojik’0’ yapar. bit_clear(g,0)
delay_ms() Belirtilen süre kadar milisaniye cinsinden gecikme yapar. delay_ms(1000)
Belirtilen interrupt’ õ (kesmeyi) aktif hale getirir. 16F84A’da dört
adet kesme bulunmaktadõr.
enable_interrupts() Bunlar; INT_EXT , INT_TIMER0 , INT_RB , INT_EEPROM’ dõr. enable_interrupts(INT_EXT)
Bir de tüm kesmeleri aktif hale getiren GLOBAL kesme sinyali
bulunur.
Kesmenin kenar tipini seçmek için kullanõlõr.
ext_int_edge() Komut için kullanõlacak iki kenar tipi ( L_to_H , H_to_L ) ext_int_edge(L_to_H)
bulunmaktadõr.
set_timer0() Timer 0 zamanlayõcõsõnõn ba langõç de erini belirlemek için kullanõlõr. set_timer0(5)
get_timer0() Timer 0 zamanlayõcõsõnõn içeri ini okumak için kullanõlõr. get_timer0()
Timer 0 zamanlayõcõsõnõ kurmak (setup) için kullanõlõr. Kurmak için
parantez içine iki bilgi girmek gerekir.
1) Saat i aretinin nereden geldi i bilgisi :
T0_INTERNAL , T0_EXT_L_TO_H , T0_EXT_H_TO_L
setup_timer_0() setup_timer_0(T0_EXT_H_TO_L | T0_DIV_1)
2) Timer 0 Çarpanõ bilgisi :
T0_DIV_1 , T0_DIV_2 , T0_DIV_4 , T0_DIV_8 ,
T0_DIV_16 , T0_DIV_32 , T0_DIV_64 , T0_DIV_128
T0_DIV_256
set_RTCC() Sayõcõnõn (counter) ba langõç de erini belirlemek için kullanõlõr. set_RTCC(5)
get_RTCC() Sayõcõnõn içeri ini okumak için kullanõlõr. get_RTCC()
Sayõcõyõ kurmak (setup) için kullanõlõr. Kurmak için parantez içine iki
bilgi girmek gerekir.
1) Saat i aretinin nereden geldi i bilgisi :
RTCC_INTERNAL , RTCC_EXT_L_TO_H , RTCC_EXT_H_TO_L setup_counters(RTCC_EXT_H_TO_L,RTCC_DIV_1)
setup_counters()
2) Timer 0 Çarpanõ bilgisi :
RTCC_DIV_1 , RTCC_DIV_2 , RTCC_DIV_4 , RTCC_DIV_8 ,
RTCC_DIV_16 , RTCC_DIV_32 , RTCC_DIV_64 , RTCC_DIV_128
RTCC_DIV_256

PIC 16F84A ile LG L GENEL B LG LER


16F84A’ nõn Özel Register’ larõ OPTION REGISTER (Adres : 0x81)

INTCON REGISTER (Adres: 0x0B, 0x8B)

STATUS REGISTER (Adres : 0x03, 0x83)

õ
õõ

Вам также может понравиться