Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

ccc c 16f877a ve kesme

Başlatan Atima, 07 Ocak 2022, 17: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

#1
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
     }
  }
}
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

Atima

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 :)

mehmet

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

Atima

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

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;
    }
}
////////////////////////////////////////////////////////////////////////////////
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

Atima

Alıntı yapılan: mehmet - 08 Ocak 2022, 17: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
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

Atima

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.

mehmet

CCS C ile devam edecekseniz; iyice
öğrenmelisiniz.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

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 [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir