merhabalar, elimdeki projede input lojik 1 olduğunda sistem çalışmalı, input lojik 0 olduğu sürece sistem durmalı.
fakat bu lojik 1 ve 0 değerlerini hareket sensörüyle alıyorum. 16f877a gecikmeli çalışıyor. bunun için ne önerirsiniz. kesme kullanmalısın derseniz örnek kod verebilir misiniz?
Sadece örnek olması açısından yazdım. Kendinize
göre uygunlaştırıp deneyiniz.
Kaynak:
http://eng-serve.com/pic/pic_interrupts.html
/*
* Example Source Code For PIC Interrups
* This creates the basic structures for interrupts
*
* Barton Dring
* Dring Engineering Services
* www.eng-serve.com
*
* Example only! Use any code at your own risk.
*/
volatile unsigned char durum = 0;
#define CALIS 1
#define DUR 0
// Interrupt Handler
void interrupt()
{
// RB0/INT External Interrupt
if(INTCON.INTF == 1) // if the RB0/INT External Interrupt flag is set...
{
if(PORTB.RB0 == 1)
{
durum = CALIS;
OPTION_REG.INTEDG = 0; //düşen kenarda kesme oluşsun
}
else
{
durum = DUR;
OPTION_REG.INTEDG = 1; // yükselen kenarda kesme oluşsun
}
INTCON.INTF =0;
}
}
// code starts here...
void main()
{
OPTION_REG.INTEDG = 1;// yukselen kenarda kesme oluşacak şekilde başla
// Set Interrupt Enable bits
INTCON.INTE = 1; // bit 4 RB0/INT External Interrupt Enable
//Set global Interrupt Enable bits
INTCON.GIE = 1; // global interrput enable
while(1) //endless loop
{
if(durum == CALIS)
{
//sistemi çalıştıran kodlar
}
else if(durum == DUR)
{
//sistemi durduran kodlar
}
}
}
Alıntı yapılan: mehmet - 07 Ocak 2022, 18:04:58Sadece örnek olması açısından yazdım. Kendinize
göre uygunlaştırıp deneyiniz.
Kaynak:
http://eng-serve.com/pic/pic_interrupts.html
/*
* Example Source Code For PIC Interrups
* This creates the basic structures for interrupts
*
* Barton Dring
* Dring Engineering Services
* www.eng-serve.com
*
* Example only! Use any code at your own risk.
*/
volatile unsigned char durum = 0;
#define CALIS 1
#define DUR 0
// Interrupt Handler
void interrupt()
{
// RB0/INT External Interrupt
if(INTCON.INTF == 1) // if the RB0/INT External Interrupt flag is set...
{
durum = CALIS;
OPTION_REG.INTEDG = 0; //düşen kenarda kesme oluşsun
INTCON.INTF =0;
}
else
{
durum = DUR;
OPTION_REG.INTEDG = 1; // yükselen kenarda kesme oluşsun
INTCON.INTF =0;
}
}
// code starts here...
void main()
{
OPTION_REG.INTEDG = 1;// yukselen kenarda kesme oluşacak şekilde başla
// Set Interrupt Enable bits
INTCON.INTE = 1; // bit 4 RB0/INT External Interrupt Enable
//Set global Interrupt Enable bits
INTCON.GIE = 1; // global interrput enable
while(1) //endless loop
{
if(durum == CALIS)
{
//sistemi çalıştıran kodlar
}
else if(durum == DUR)
{
//sistemi durduran kodlar
}
}
}
anlamamış olmam normal midir :)
Tamamını mı?
Alıntı yapılan: mehmet - 07 Ocak 2022, 21:16:13Tamamını mı?
Benim b0 kesmesi hakkinda az bilgim vardi gormustum daha once bundan epey bir farkli o yuzden sordum
CCS C bilmiyorum. Ancak bunlar simülasyonda çalışıyor.
(https://i.ibb.co/vxh3PLg/Ekran-g-r-nt-s-2022-01-08-17-06-05.png) (https://ibb.co/vxh3PLg)
/*
* File: main.c
* Author: mehmet
*
* Created on 08 Ocak 2022 Cumartesi, 15:58
*
* Kaynak:
* http://eng-serve.com/pic/pic_interrupts.html
*
*/
// PIC16F877A Configuration Bit Settings
// 'C' source line config statements
// CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = ON // Data EEPROM Memory Code Protection bit (Data EEPROM code-protected)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = ON // Flash Program Memory Code Protection bit (All program memory code-protected)
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
#include <xc.h>
#include <stdint.h>
#define _XTAL_FREQ 8000000
/*
* MCU Hazırlığı
*/
void mcu_Init(void)
{
PORTA = 0x00;
PORTB = 0x00;
PORTC = 0x00;
PORTD = 0x00;
PORTE = 0x00;
ADCON1bits.PCFG = 0b0110; // Tüm pinler dijital G/Ç
TRISA = 0x00;
TRISB = 0b00000001; //RB0(INT) giriş
TRISC = 0x00;
TRISD = 0x00;
TRISE = 0x00;
OPTION_REGbits.INTEDG = 0b1; // yukselen kenarda kesme oluşacak şekilde başla
// Set Interrupt Enable bits
INTCONbits.INTE = 0b1; // bit 4 RB0/INT External Interrupt Enable
//Set global Interrupt Enable bits
INTCONbits.GIE = 0b1; // global interrput enable
}
/*
* Ana Döngü
*/
void main(void)
{
mcu_Init();
while(1) //endless loop
{
PORTCbits.RC0 = 0b1;
__delay_ms(500);
PORTCbits.RC0 = 0b0;
__delay_ms(500);
}
}
/*
* Kesme
*/
void interrupt ISR(void)
{
// RB0/INT External Interrupt
if(INTCONbits.INTF == 0b1) // if the RB0/INT External Interrupt flag is set...
{
if(PORTBbits.RB0 == 0b1)
{
//sistemi çalıştıran kodlar
PORTDbits.RD0 = 0b1;
OPTION_REGbits.INTEDG = 0b0; //düşen kenarda kesme oluşsun
}
else //if(PORTBbits.RB0 == 0b0)
{
//sistemi durduran kodlar
PORTDbits.RD0 = 0b0;
OPTION_REGbits.INTEDG = 0b1; // yükselen kenarda kesme oluşsun
}
INTCONbits.INTF = 0b0;
}
}
////////////////////////////////////////////////////////////////////////////////
Alıntı yapılan: mehmet - 08 Ocak 2022, 17:08:37CCS C bilmiyorum. Ancak bunlar simülasyonda çalışıyor.
(https://i.ibb.co/vxh3PLg/Ekran-g-r-nt-s-2022-01-08-17-06-05.png) (https://ibb.co/vxh3PLg)
/*
* File: main.c
* Author: mehmet
*
* Created on 08 Ocak 2022 Cumartesi, 15:58
*
* Kaynak:
* http://eng-serve.com/pic/pic_interrupts.html
*
*/
// PIC16F877A Configuration Bit Settings
// 'C' source line config statements
// CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = ON // Data EEPROM Memory Code Protection bit (Data EEPROM code-protected)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = ON // Flash Program Memory Code Protection bit (All program memory code-protected)
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
#include <xc.h>
#include <stdint.h>
#define _XTAL_FREQ 8000000
/*
* MCU Hazırlığı
*/
void mcu_Init(void)
{
PORTA = 0x00;
PORTB = 0x00;
PORTC = 0x00;
PORTD = 0x00;
PORTE = 0x00;
ADCON1bits.PCFG = 0b0110; // Tüm pinler dijital G/Ç
TRISA = 0x00;
TRISB = 0b00000001; //RB0(INT) giriş
TRISC = 0x00;
TRISD = 0x00;
TRISE = 0x00;
OPTION_REGbits.INTEDG = 0b1; // yukselen kenarda kesme oluşacak şekilde başla
// Set Interrupt Enable bits
INTCONbits.INTE = 0b1; // bit 4 RB0/INT External Interrupt Enable
//Set global Interrupt Enable bits
INTCONbits.GIE = 0b1; // global interrput enable
}
/*
* Ana Döngü
*/
void main(void)
{
mcu_Init();
while(1) //endless loop
{
PORTCbits.RC0 = 0b1;
__delay_ms(500);
PORTCbits.RC0 = 0b0;
__delay_ms(500);
}
}
/*
* Kesme
*/
void interrupt ISR(void)
{
// RB0/INT External Interrupt
if(INTCONbits.INTF == 0b1) // if the RB0/INT External Interrupt flag is set...
{
if(PORTBbits.RB0 == 0b1)
{
//sistemi çalıştıran kodlar
PORTDbits.RD0 = 0b1;
OPTION_REGbits.INTEDG = 0b0; //düşen kenarda kesme oluşsun
}
else //if(PORTBbits.RB0 == 0b0)
{
//sistemi durduran kodlar
PORTDbits.RD0 = 0b0;
OPTION_REGbits.INTEDG = 0b1; // yükselen kenarda kesme oluşsun
}
INTCONbits.INTF = 0b0;
}
}
////////////////////////////////////////////////////////////////////////////////
kesmeyi oluşturdum bende fakat rb0 kesmesi lojik 1 olunca gerçekleşiyor. fakat elimde hareket algılayınca lojik0 veren sensör var. kesmeyi lojik 0 durumda aktifleştirme gibi bir durum var mıdır ?
50. satır => OPTION_REGbits.INTEDG = 0b0; // yukselen kenarda kesme oluşacak şekilde başla
87. satır => OPTION_REGbits.INTEDG = 0b0; // düşen kenarda kesme oluşsun
93. satır => OPTION_REGbits.INTEDG = 0b1; // yükselen kenarda kesme oluşsun
Alıntı yapılan: mehmet - 10 Ocak 2022, 00:32:3450. satır => OPTION_REGbits.INTEDG = 0b0; // yukselen kenarda kesme oluşacak şekilde başla
87. satır => OPTION_REGbits.INTEDG = 0b0; // düşen kenarda kesme oluşsun
93. satır => OPTION_REGbits.INTEDG = 0b1; // yükselen kenarda kesme oluşsun
fakat benim ccs c de kodum böyle
#include <16F877A.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000)
int i;
#int_ext
void dis_kesme()
{
output_high(pin_b1);
}
void main()
{
ext_int_edge(L_TO_H);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
delay_ms(2000);
output_low(pin_b1);
}
kesme olunca basit şekilde b1 pininde led yanıyor.
CCS C ile devam edecekseniz; iyice
öğrenmelisiniz.
Kodlar xc ve mickro c den yazilmis ccs c kodu bolumunde farkli dillerden destek verilmis.
http://www.sifirzero.com (http://www.sifirzero.com)
Sitesinden arama yaparak ne istedigini arayabilirsin. Yada ozelden veya mail gonder yardimci olayim. sifirrzero@gmail.com