Haberler:

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

Ana Menü

CCS interrupt

Başlatan acetiner, 05 Mayıs 2007, 10:26:03

acetiner

Asagıdaki kodda kesme geldigi anda(tusa basıldıgında)    for(k= 0; k < SIZE - 1; ++k)       dongusu içerisindeki 'x' degiskenin degerinin 1 atrmasını istiyorum. Kod derlenebiliyor fakat istedigi mi goremiyorum yardımcı olursanız sevinirim








#include <16F877.h>
#include <ctype.h>
#include <stdlib.h>


#define      SIZE      16
#define      BUTTON      PIN_C7

#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#include <lcd.c>

BYTE pressed = 0;

int* myputs(int* ptr);
int* myputs_len(int* ptr, int len);


#int_ext
void button_isr()
{
   delay_ms (10);

   if(!input(BUTTON))
      pressed = 1;
}

void main() {




   int x= 1;
   int k;
   int buf[SIZE] = {};
   int *temp;
   int line_x = 16;
   int line_y = 1;

   set_tris_c(0x07);

   srand(15);

   for(k = 0; k < SIZE; ++k)
   {
      buf[k] = (int)(rand() % 10);


   }


   temp = buf;

   lcd_init();


   for(k= 0; k < SIZE - 1; ++k)
   {

   enable_interrupts(global);

   enable_interrupts(int_ext);

   ext_int_edge( H_TO_L );



   if(pressed)
      x++;

   lcd_gotoxy(1, 1);

   printf(lcd_putc,"%d", x);

   lcd_gotoxy(line_x, line_y);

   myputs_len(temp, 10);

   delay_ms(100);

   printf(lcd_putc, "\f");

   line_x--;

   }

}

/*
int* myputs(int* ptr)
{
   while(*ptr)
   {
      printf(lcd_putc, "%d", *ptr);
         ptr++;

   }
}
*/

int* myputs_len(int* ptr, int len)
{
   while(len)
   {
      printf(lcd_putc, "%d", *ptr);
         ptr++;
         len--;

   }
}

mcan

butonu yanlış yere bağlamışsınız,kullandığınız kesme için rb0 pinine bağlamayı deneyin.bağlayıp demedim ve ekranda bir yazı kayıyor.kodu incelemedim fakat pini değiştirince en azından ekranda birşeyler gözüküyor.

acetiner

mcan ilgilendigin icin cok teşekkür ederim dedigin gibi RB0 pinine bagladım ve butona her basmamda x degeri 1 artyor (lcd deen sol taraftaki sayı) ama lcd bazen basılan tusa cevap vermiyor bazende gec cevap veriyor yani artmıyor bazen de gerektigi gibi calısıyor bu olagan birsey mi??tekrar teşekkürler

acetiner

cok efektif calısmaması olagan birsey mi proteusta

Ziya

butona basıldığını tespit ettikten sonra en az 50 ms gecikme koy. 10 ms az.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

acetiner

benim yazdıgım kodun son halinde RB0 pini her topraga cekildiğinde kesme calısıyor fakat her for dongusu icin yalnızca 1 kesme yapabiliyorum, ben ise donguden bağımsız kesmeler istiyorum bu problemi nasıl aşabilirim


#include <16F877.h>
#include <ctype.h>
#include <stdlib.h>


#define      SIZE      16
#define      BUTTON      PIN_B0

#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#include <lcd.c>

BYTE pressed = 0;

int* myputs(int* ptr);
int* myputs_len(int* ptr, int len);


#int_ext
void button_isr()
{
   if(!input(BUTTON))
      pressed = 1;
}

void main() {




   int x= 1;
   int k;
   int buf[SIZE] = {};
   int *temp;
   int line_x = 16;
   int line_y = 1;

   set_tris_c(0x07);

   srand(15);

   for(k = 0; k < SIZE; ++k)
   {
      buf[k] = (int)(rand() % 10);
   }


   temp = buf;

   lcd_init();


   for(k= 0; k < SIZE - 1; ++k)
   {


   enable_interrupts(global);
   enable_interrupts(int_ext);


   ext_int_edge( H_TO_L );



   if(pressed)
   {
   
      x++;
      pressed = 0;

      if(x == 10)
      x = 0;
   }

   lcd_gotoxy(1, 1);

   printf(lcd_putc,"%d", x);

   lcd_gotoxy(line_x, line_y);

   myputs_len(temp, 10);

   delay_ms(200);

   printf(lcd_putc, "\f");

   line_x--;


   }   

}

/*
int* myputs(int* ptr)
{
   while(*ptr)
   {
      printf(lcd_putc, "%d", *ptr);
         ptr++;

   }
}
*/

int* myputs_len(int* ptr, int len)
{
   while(len)
   {
      printf(lcd_putc, "%d", *ptr);
         ptr++;
         len--;

   }
}

acetiner

Problemin delay_ms isimli fonksiyonda oldugu kanısına vardım. Bu fonksiyonu (dongu içerisinden) kaldırdıgımda kesmelerim istedigim gibi calısıyor. Peki bekleme anında kesme nasıl yapılabilir...

acetiner

RB0 haricinde kullanabileceğim bir kesme pini var mı ayrıca bir buton daha bağlamak istiyorum