ccc c 16f877a ve kesme

Başlatan Atima, 07 Ocak 2022, 20:39:05

Atima

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?

mehmet

07 Ocak 2022, 21:04:58 #1 Son düzenlenme: 08 Ocak 2022, 20:03:21 mehmet
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
     
}
  }
}

Atima

Alıntı yapılan: mehmet - 07 Ocak 2022, 21: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 :)

mehmet


Atima

Alıntı yapılan: mehmet - 08 Ocak 2022, 00:16:13Tamamını mı?
Benim b0 kesmesi hakkinda az bilgim vardi gormustum daha once bundan epey bir farkli o yuzden sordum

mehmet

CCS C bilmiyorum. Ancak bunlar simülasyonda çalışıyor.


/*
 * 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;
    }
}
////////////////////////////////////////////////////////////////////////////////

Atima

Alıntı yapılan: mehmet - 08 Ocak 2022, 20:08:37CCS C bilmiyorum. Ancak bunlar simülasyonda çalışıyor.


/*
 * 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 ?

mehmet

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

Atima

Alıntı yapılan: mehmet - 10 Ocak 2022, 03: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.

mehmet

CCS C ile devam edecekseniz; iyice
öğrenmelisiniz.

sifirzero

Kodlar xc ve mickro c den yazilmis ccs c kodu bolumunde farkli dillerden destek verilmis.

http://www.sifirzero.com

Sitesinden arama yaparak ne istedigini arayabilirsin. Yada ozelden veya mail gonder yardimci olayim. sifirrzero@gmail.com
sifirzero.blogspot.com sifirrzero@gmail.com iman hem nurdur hem kuvvettir

Yasal Uyarı: Picproje.org sitemizde 5651 sayılı kanunun 8. maddesine ve T.C.Knın 125. maddesine göre tüm üyelerimiz yaptıkları paylaşımlardan kendileri sorumludur. Picproje.org hakkında yapılacak tüm hukuksal şikayetleri İletişim sayfamızdan bize bildirdikten en geç 3 (üç) iş günü içerisinde ilgili kanunlar ve yönetmelikler çerçevesinde tarafımızca incelenerek gereken işlemler yapılacak ve site yöneticilerimiz tarafından bilgi verilecektir.