pic16f1826 RB1 pininden harici kesme alma ccs c ile nasıl yapılır ?

Başlatan alexsi, 11 Mayıs 2015, 16:32:09

alexsi

Arkadaşlar merhaba elimde bir tane pic16f1826 ile cizilmiş bir kart(PCB)var. Bu kartın RB0/ext  girişi ext_interrupt  için kullanılıyor.
RB1 portunu da baska bir amaçla harici giriş olarak kullanmam gerekiyor.( interrupt oluşturmam lazım. Hızlı tepki için mutlaka interrupt olmalı) Kısacası pic16f1826 ile ve CCS C derleyicisi ile RB1 pinine gelen sinyali/datayi harici kesme olarak nasıl oluşturabilirim? Öneri ve yardımlarınız için şimdiden teşekkürler. Donanımsal olarak değişiklik yapamam (PCB kart çizilmiş)..

Aşağıdaki gibi bişeyler olacak anladığım kadarıyla ancak  ccs c de interrupt nasıl oluşturcam? Başlangıç ayarlarını nasıl yapmalıyım biraz sıkıntı yaşıyorum. CCS C yide çat pat biliyorum. Yardım edebilir misiniz arkadaşlar !
(INTCON: INTERRUPT CONTROL REGISTER 0. bit, IOCIF: Interrupt-on-Change Interrupt Flag bit)
http://www.kontrolarge.com/ Bildiklerimiz öğrendiklerimiz kadardır. Ya bilmediklerimiz ..?

mehmet

PIC16F1826/27 (41391D) 13. bölümü inceleyiniz...
Tablo 13.1 hangi kaydedicilerin kullanılması gerektiğini
belirtiyor.
Mesela; ilgili pin dijital I/O moduna alımalı, kesme tipi seçilmeli
(yükselen/düşen ya da her ikisi) pin değişim kesme aktif edilmeli,
genel kesmeler aktif edilmeli. Kesme alt yapısı içerisinde de
değişim kesme bayrağı kontrol edilmeli, gereken işlem yapıldıktan
sonra da bu bayrak temizlenmeli...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

RaMu

PortB değişimi kesmesini kullanabilirsin,
external interrupt sadece RB0 pini için var.

C:\Program Files\PICC\Examples klasöründeki
Ex_pbutt.c
örneğini inceleyebilirsin.

Aşağıya sadeleştirilmiş halini ekliyorum.

#include <16F1826.h>
#device ADC=16

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES PUT                      //Power Up Timer
#FUSES MCLR                     //Master Clear pin enabled
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOCPD                    //No EE protection
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOCLKOUT                 //I/O function on OSC2
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES NOWRT                    //Program memory not write protected
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES BORV19                   //Brownout reset at 1.9V
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(crystal=20MHz)


//Yazar : RaMu || uCanEL  ucanel@outlook.com
#include <main_ioc.h>

unsigned int8 durum=0;
#int_rb                     //PORTB değişimi kesmesi
void int_rb_isr(void) 
{ 
durum = input_b();          //portb yi okuyup değerine bak işlem yap
delay_ms(1); 
} 

void main()
{
//port_b_pullups(0b00000010); // RB1 dahili pull up aktifleştirebilirsin
//delay_us(10);               // pull up ayarı için bekle

   enable_interrupts(INT_RB1_L2H); // 
   //veya enable_interrupts(INT_RB1_H2L); //pin high dan low a geçer-se/ken interrupt ver
   enable_interrupts(INT_RB1); //Rb1 interrupt aktifleştir
   input_b();                  //ihtiyat 
   clear_interrupt(INT_RB);    //ihtiyat
   enable_interrupts(GLOBAL);  //ayarlanan tüm kesmeleri aktifleştir

   while(TRUE)
   {
      //TODO: User Code
   }

}


RaMu
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

mehmet

1826 biraz maharetli mcu. B portunun pinleri tek tek kesme üretebiliyor...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

RaMu

Alıntı yapılan: RaMu - 13 Mayıs 2015, 03:23:34
PortB değişimi kesmesini kullanabilirsin,
external interrupt sadece RB0 pini için var.

Buna istinaden diyorsan,
aslında haklısın.
1826 daki IOC hem harici kesmeye benziyor hemde portb değişikliği kesmesine.
Portb değişikliği kesmesinden farklı çünkü
herbir pinin kendine ait kesme bayrağı var.
Ama yinede datasheet buna external interrupt dememiş.
Ve sadece RB0 da external interrupt gösteriyor.



CcsC de INT_ext kabul ediyor ama
#INT_ext
void int_ext_isr(void)
{
}

int_ext1 kabul etmiyor,
#INT_ext1
void int_ext1_isr(void)
{
}


Bilmiyorum belki başka bir şekilde kullanılıyordur ama bulamadım.

En kolay ayar ilk mesajımda belirttiğim gibi ayarlayıp
daha sonra kesme bayraklarını kontrol etmek olabilir gibi geliyor.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

ferit06

Alıntı yapılan: alexsi - 11 Mayıs 2015, 16:32:09


Aşağıdaki gibi bişeyler olacak anladığım kadarıyla ancak  ccs c de interrupt nasıl oluşturcam? Başlangıç ayarlarını nasıl yapmalıyım biraz sıkıntı yaşıyorum. CCS C yide çat pat biliyorum. Yardım edebilir misiniz arkadaşlar !
(INTCON: INTERRUPT CONTROL REGISTER 0. bit, IOCIF: Interrupt-on-Change Interrupt Flag bit)

INTCON registerindeki (INTCON.7=GIE, INTCON.3=IOCIE) ayarladıktan sonra datasheets te 13. bölümde " Interrupt-On-Change Registers" lar
( REGISTER 13-1: IOCBP: INTERRUPT-ON-CHANGE POSITIVE EDGE REGISTER
REGISTER 13-2: IOCBN: INTERRUPT-ON-CHANGE NEGATIVE EDGE REGISTER
REGISTER 13-3: IOCBF: INTERRUPT-ON-CHANGE FLAG REGISTER)
var onları ayarlamanız gerekir.
CCS te nasıl yaparsınız bilmiyorum. Ben proton kullanıyorum orada  örnek olarak;
INTCON.7=1
INTCON.3=1 ve
IOCBP.1=1 dersem RB1 in 0 dan 1 e değişiminde interrupt üretir  ve INTCON.0=1 ile IOCBF.1=1 olur.

pwm.c

CCS'de register kullanmıyoruz.

portB1 kesmesi için:
#INT_RB
void  RB_isr(void)  
{
     //kesme kodları
}

void main()
{
   enable_interrupts(INT_RB1); //sadece portb1 
   enable_interrupts(GLOBAL);

   while(TRUE)
   {
      //Kullanıcı kodları
   }

}
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-