şu programın interrupt kısmını bir incelermisiniz ...?

Başlatan picman, 20 Aralık 2008, 17:08:33

picman

arkadaş klavye kontrollü kayan yazı uygulaması yapmaya çalışıyorum fakat bir türlü almadı. daha önce pbp ile yazdığım programı c diline dönüştürdüm ama bir çok hata meydana geldi . program çalışıyor gibi ama interrupt kısmında rb0 int ve tmr0 int te problem var . rc7 bağlı butun basılı değilken programın bormal kaydırma modunda yazıyı kaydırması lazım . ilk başta eprma veri yüklemek için rc7 ucundaki butona basılınca ana progrtam da onu test edip eproma iki üç karakter yazdırdım. bunu denemek için yaptım normalde yapmak istediğim bu değil neyse . sonra butonu brakıp proteusta programı durdurup yeniden başlattığımda . tarama işlemi belli bir yere kadar gidiyor . bekliyor sonra tarama işlemi normal devam ederek kaymaya başlıyor . neden o beklemeyi yaptığını hiç anlayamadım. birde programda rb0 int ve tmr int birbirine karışıyor . program aşağıda biraz uzun ama hiç olmaz sa interrupt kısmını incelerseniz çok sevinirim..
//yazi.c dosyasi
#include <pic.h>
#include "macro_bit.h"
#include "delay.h"

__CONFIG(WDTDIS & HS); 
static bit reset @ (unsigned)&PORTA*8+0;
static bit clk   @ (unsigned)&PORTA*8+1;
static bit data  @ (unsigned)&PORTA*8+2;

static bit kclk_pin  @ (unsigned)&PORTB*8+0;
static bit kdata_pin @ (unsigned)&PORTB*8+1;

#define pals ((clk=1),(clk=0)); //74164 için pals..

unsigned char sutun[50]; 
unsigned char veri =0;                                                                     
unsigned char karakter =0XFF;                                                                    
unsigned char sayici =0;                                                                       
unsigned char sira_no =0;                                                                   
unsigned char sutun_sayisi  =0;                                                              
unsigned char sutun_sayac =0;                                                                
unsigned char ofset =0;                                                                        
unsigned char line  =0;                                                                      
unsigned char i,j;           
unsigned char temp1,temp2,temp3;     
unsigned char durum=0;    
unsigned char bit_say=0;  
unsigned char scan_data=0;
                 
bit program=0;
bit bosluk=0;

const char TABLO1[255] = {  0X00,0X00,0X00,0X00,0X00,		//bosluk 4
		        			0X00,0X00,0X7D,			     	//!    7
		        			0X14,0X7F,0X14,0X7F,0X14,		//#    12
		      				0X24,0X2A,0X7F,0X2A,0X12,		//0X    17
							0X23,0X13,0X08,0X64,0X62,		//%    22
							0X5,0X22,0X55,0X49,0X36,		//&    27
							0X00,0X60,0X50,			    	//'    30
							0X00,0X41,0X3E,			     	//(    33
							0X00,0X3E,0X41,				    //)    36
							0X15,0XE,0X1F,0XE,0X15,			//*    41
							0X08,0X08,0X3E,0X08,0X08,		//+    46
							0X00,0X06,0X05,			    	//,    49
							0X08,0X08,0X08,0X08,0X08,		//-    54
							0X00,0X03,0X03,			    	//.    57
							0X20,0X10,0X08,0X04,0X02,		///    62
							0X3E,0X51,0X49,0X45,0X3E,		//0    67
							0X01,0X7F,0X21,			    	//1    70
							0X31,0X49,0X45,0X43,0X21,		//2    75
							0X46,0X69,0X51,0X41,0X42,		//3    80
							0X04,0X7F,0X24,0X14,0X0C,		//4    85
							0X4E,0X51,0X51,0X51,0X72,		//5    90
							0X06,0X49,0X49,0X29,0X1E,		//6    95
							0X60,0X50,0X48,0X47,0X40,		//7   100
							0X36,0X49,0X49,0X49,0X36,		//8   105
							0X3C,0X4A,0X49,0X49,0X30,		//9   110
							0X00,0X1B,0X1B, 	        	//:   113
							0X00,0X36,0X35,	        		//;   116
							0X14,0X14,0X14,0X14,0X14,		//=   121
							0X30,0X48,0X45,0X40,0X20,		//?   126
							0X32,0X49,0X55,0X49,0X3E,		//@   131
							0X3F,0X48,0X48,0X48,0X3F,		//A   136
							0X36,0X49,0X49,0X49,0X7F,		//B   141
							0X22,0X41,0X41,0X41,0X3E,		//C   146
							0X3E,0X41,0X41,0X41,0X7F,		//D   151
							0X41,0X49,0X49,0X49,0X7F,		//E   156
							0X40,0X48,0X48,0X48,0X7F,		//F   161
							0X2E,0X49,0X49,0X41,0X3E,		//G   166
							0X7F,0X08,0X08,0X08,0X7F,		//H   171
							0X41,0X7F,0X41,           		//I   174
							0X40,0X7E,0X41,0X01,0X02,		//J   179
							0X41,0X22,0X14,0X08,0X7F,		//K   184
							0X01,0X01,0X01,0X01,0X7F,		//L   189
							0X7F,0X20,0X10,0X20,0X7F,		//M   194
							0X7F,0X04,0X08,0X10,0X7F,		//N   199
							0X3E,0X41,0X41,0X41,0X3E,		//O   204
							0X30,0X48,0X48,0X48,0X7F,		//P   209
							0X3D,0X42,0X45,0X41,0X3E,		//Q   214
							0X31,0X4A,0X4C,0X48,0X7F,		//R   219
							0X26,0X49,0X49,0X49,0X32,		//S   224
							0X40,0X40,0X7F,0X40,0X40,		//T   229
							0X7E,0X01,0X01,0X01,0X7E,		//U   234
							0X7C,0X02,0X01,0X02,0X7C,		//V   239
							0X7E,0X01,0X0E,0X01,0X7E,		//W   244
							0X63,0X14,0X08,0X14,0X63,		//X   249
							0X70,0X08,0X07,0X08,0X70   };   //Y   254



const char TABLO2[198] = { 0X61,0X51,0X49,0X45,0X43,	    //Z   4
							0X41,0X41,0X7F, 			   	//[   7
							0X7F,0X41,0X41, 				//]   10
							0X1F,0X15,0X15,0X15,0X2,        //a   15
							0XE,0X11,0X11,0X9,0X7F,         //b   20
							0X2,0X11,0X11,0X11,0XE,         //c   25
							0X7F,0X9,0X11,0X11,0XE,         //d   30
							0XC,0X15,0X15,0X15,0XE,         //e   35
							0X20,0X40,0X48,0X3F,0X8,        //f   40
							0X1E,0X25,0X25,0X25,0X18,       //g   45
							0XF,0X10,0X10,0X8,0X7F,         //h   50
							0X1,0X5F,0X11,                  //i   53
							0X5E,0X11,0X1,0X2,0X0,          //j   58
							0X11,0XA,0X4,0X7F,0X0,          //k   63
							0X1,0X7F,0X41,                  //l   66
							0XF,0X10,0XC,0X10,0X1F,         //m   71
							0XF,0X10,0X10,0X8,0X1F,         //n   76
							0XE,0X11,0X11,0X11,0XE,         //o   81
							0X8,0X14,0X14,0X14,0X1F,        //p   86
							0X3F,0X18,0X28,0X28,0X10,       //q   91
							0X8,0X10,0X10,0X8,0X1F,         //r   96
							0X2,0X15,0X15,0X15,0X9,         //s   101
							0X2,0X1,0X11,0X7E,0X10,         //t   106
							0X1F,0X2,0X1,0X1,0X1E,          //u   111
							0X1C,0X2,0X1,0X2,0X1C,          //v   116
							0X1E,0X1,0X6,0X1,0X1E,          //w   121   
							0X11,0XA,0X4,0XA,0X11,          //x   126
							0X1E,0X5,0X5,0X5,0X18,          //y   131
							0X11,0X19,0X15,0X13,0X11,       //z   136
							0X24,0X42,0X43,0X42,0X3c,       //Ç   141
							0X16,0X65,0X61,0X61,0X1e,       //Ğ   146
							0X1e,0X61,0X21,0X61,0X1e,       //Ö   149
							0X21,0X7f,0X21,                 //İ   154
							0X1e,0X41,0X01,0X41,0X1e,       //Ü   159
							0XC,0X52,0X53,0X53,0X24,        //Ş   164
							0X4,0X22,0X23,0X22,0X1C,        //ç   169
							0X1E,0X65,0X65,0X65,0X18,       //ğ   174
							0XE,0X51,0X11,0X51,0XE,         //ö   179
							0X1F,0X42,0X1,0X41,0X1E,        //ü   184
							0X1,0X1F,0X11,                  //ı   187
							0X4,0X2A,0X2B,0X2A,0X12,        //ş   192
							0X7F,0X41,0X41,0X41,0X7F  } ;   //tanımsız 197



const char tablo_0[77] = { "q1   zsaw2  cxde43   vftr5  nbhgy6   mju78   k o09   .l p*=  i  -       ,   <" };
const char tablo_1[77] = { "Q!   ZSAW'  CXDE+^   VFTR%  NBHGY&   MJU/(   KIO=)   :L P?=  I  _       ;   >" };
const char tablo_2[77] = { "Q1   ZSAW2  CXDE43   VFTR5  NBHGY6   MJU78   KIO09   .L P*=  I  -       ,   <" };
const char tablo_3[77] = { "q!   zsaw'  cxde+^   vftr%  nbhgy&   mju/(   k o=)   :l p?=  i  _       ;   >" };
const char tablo_4[21] = { "1 47   0,2568   +3-*9" };


unsigned char ascii_data_convert(unsigned char scan_data, unsigned char status)
{
	static unsigned char ascii_data=0;
	switch(status)
	{
		case 0: ascii_data = tablo_0[scan_data-21];  break;
		case 1: ascii_data = tablo_1[scan_data-21];  break;
		case 2: ascii_data = tablo_2[scan_data-21];  break;
		case 3: ascii_data = tablo_3[scan_data-21];  break;
	}
    	//	if( bit_test(status,2) )
		//	 { ascii_data = tablo_4[scan_data-105]; }

return(ascii_data);
}



//*****Bu fonksiyon girilen parametre ile**************** 
//*****istenen saniyede zaman gecikmesi oluşturur*******
wait(unsigned char time) //zaman gecikmesi oluşturma ....
{
	for(i=0; i < (time*4); i++)
	{ DelayMs(250); }
}
//*******************************************************


//girilen dizi başlangıç adresi ve boyutu ile
//dizi temizleme işlemi yapar..
void array_clear(char *array, unsigned char size)
{
	for(i=0; i < size; i++)
	{ *array=0; array++; }
}


//dahili epromun tüm adreslerine 
//0xFF verisini yazar epromu temizler...

void eprom_clear()
{
	EEPROM_WRITE(0,65);
	EEPROM_WRITE(1,66);
}



//display tarama işlemini yapar.....
void display_scan() //ekran taraması yapılır.....
{
  reset=1; data=1;		            
  pals; 
  data=0; reset=1;
  for(i=0; i<50; i++)
  { 
   	pals;
     PORTD=sutun[i];                            
     DelayMs(2);
     PORTD=0;     
  }
  PORTD=0;                //PORTd yi sıfırla
  reset=0;
}    

//epromdan alınan karakterin hangi harfe ait olduğunu tespit eder
//tespit edilen harfe göre karakterleri ekranda oluşturmak için 
//karakter tablosundan veri okumaya hangi satırdan başlayacağının bilgisini 
//sira_no degiğkenine yükler...
void sentez()
{    
                                               
if( karakter==0XFF ) 
{
	veri=0; sutun_sayisi=0;  line=0; sutun_sayac=0; karakter=255; 
        j=0; sira_no=0; ofset=0; 
}
else
{
  switch( karakter )
  {
    case 32: sira_no=4;	    break; //boşluk
    case 33: sira_no=7;     break; //!
    case 35: sira_no=12;    break; //# 
    case 36: sira_no=17;    break; //0X 
    case 37: sira_no=22;    break; //% 
    case 38: sira_no=27;    break; //& 
    case 39: sira_no=30;    break; //'
    case 40: sira_no=33;    break; //( 
    case 41: sira_no=36;    break; //) 
    case 42: sira_no=41;    break; //* 
    case 43: sira_no=46;    break; //+ 
    case 44: sira_no=49;    break; //, 
    case 45: sira_no=54;    break; //- 
    case 46: sira_no=57;    break; //. 
    case 47: sira_no=62;    break; /// 
    case 48: sira_no=67;    break; //0  
    case 49: sira_no=70;    break; //1 
    case 50: sira_no=75;    break; //2
    case 51: sira_no=80;    break; //3
    case 52: sira_no=85;    break; //4
    case 53: sira_no=90;    break; //5
    case 54: sira_no=95;    break; //6  
    case 55: sira_no=100;   break; //7
    case 56: sira_no=105;   break; //8  
    case 57: sira_no=110;   break; //9
    case 58: sira_no=113;   break; //: 
    case 59: sira_no=116;   break; //; 
    case 61: sira_no=121;   break; //= 
    case 63: sira_no=126;   break; //? 
    case 64: sira_no=131;   break; //@ 
    case 65: sira_no=136;   break; //A
    case 66: sira_no=141;   break; //B
    case 67: sira_no=146;   break; //C
    case 68: sira_no=151;   break; //D
    case 69: sira_no=156;   break; //E
    case 70: sira_no=161;   break; //F
    case 71: sira_no=166;   break; //G
    case 72: sira_no=171;   break; //H
    case 73: sira_no=174;   break; //I
    case 74: sira_no=179;   break; //J
    case 75: sira_no=184;   break; //K
    case 76: sira_no=189;   break; //L
    case 77: sira_no=194;   break; //M
    case 78: sira_no=199;   break; //N
    case 79: sira_no=204;   break; //O 
    case 80: sira_no=209;   break; //P 
    case 81: sira_no=214;   break; //Q 
    case 82: sira_no=219;   break; //R 
    case 83: sira_no=224;   break; //S  
    case 84: sira_no=229;   break; //T  
    case 85: sira_no=234;   break; //U  
    case 86: sira_no=239;   break; //V 
    case 87: sira_no=244;   break; //W 
    case 88: sira_no=249;   break; //X 
    case 89: sira_no=254;   break; //Y
    case 90: sira_no=4;     break; //Z
    case 91: sira_no=7;     break; //[ 
    case 93: sira_no=10;    break; //]  
    case 97: sira_no=15;    break; //a  
    case 98: sira_no=20;    break; //b 
    case 99: sira_no=25;    break; //c
    case 100: sira_no=30;   break; //d
    case 101: sira_no=35;   break; //e
    case 102: sira_no=40;   break; //f  
    case 103: sira_no=45;   break; //g
    case 104: sira_no=50;   break; //h
    case 105: sira_no=53;   break; //i 
    case 106: sira_no=58;   break; //j 
    case 107: sira_no=63;   break; //k   
    case 108: sira_no=66;   break; //l
    case 109: sira_no=71;   break; //m
    case 110: sira_no=76;   break; //n
    case 111: sira_no=81;   break; //o  
    case 112: sira_no=86;   break; //p  
    case 113: sira_no=91;   break; //q
    case 114: sira_no=96;   break; //r
    case 115: sira_no=101;  break; //s
    case 116: sira_no=106;  break; //t 
    case 117: sira_no=111;  break; //u
    case 118: sira_no=116;  break; //v
    case 119: sira_no=121;  break; //w
    case 120: sira_no=126;  break; //X
    case 121: sira_no=131;  break; //y  
    case 122: sira_no=136;  break; //z  
    case 199:sira_no=141;   break; //Ç
    case 208:sira_no=146;   break; //Ğ
    case 214:sira_no=151;   break; //Ö
    case 221:sira_no=154;   break; //İ
    case 220:sira_no=159;   break; //Ü
    case 222:sira_no=164;   break; //Ş   
    case 231:sira_no=169;   break; //ç
    case 240:sira_no=174;   break; //ğ
    case 246:sira_no=179;   break; //ö
    case 252:sira_no=184;   break; //ü
    case 253:sira_no=187;   break; //ı
    case 254:sira_no=192;   break; //ş  
    default: sira_no=197;   break; //TANIMSIZ KARAKTER... (KARE)..  
  }

  if( (karakter==33) || (karakter==39)  || (karakter==40)  || (karakter==41)    ||
    (karakter==44)   || (karakter==46)  || (karakter==49)  || (karakter==58)    ||
    (karakter==59)   || (karakter==73)  || (karakter==91)  || (karakter==93)    ||
    (karakter==105)  || (karakter==108) || (karakter==221) || (karakter==253) )  
    { sutun_sayisi=3; }
  else 
    { sutun_sayisi=5;  }

}     
} 


//interrupt alt programından gelern süre ile display bilgisini
//bir sola kaydırır......
void kaydir()
{	
    temp1=50;  temp2=49;   
    for(i=0; i < 50; i++)
    { 
        sutun[temp1] = sutun[temp2];
        temp1--;       temp2--;
    } 
    sutun[0] = veri; 
}



void ortak_islem()  
{
	sutun_sayac++;
  	ofset = ( sira_no - line ); 
 	if( karakter < 90) 
		{ veri = TABLO1[ ofset ]; }
  	else	 
 		{ veri = TABLO2[ ofset ]; }
 	kaydir();
  	line++;
}


void veri_goster()
{      
  if( sutun_sayac < 1 ) //sadece sutun_sayac 0 sa karakter_al ve sentez fonksiyonları çalışır..
  { 
	karakter = EEPROM_READ(j);
	sentez(); 
  }          
       
  if(karakter != 0XFF) 
  { 
        ortak_islem();                         
        if( sutun_sayac == sutun_sayisi )            //sutun sayac , sutun sayısı na eşitmi  
	{                                                                                                                                 
            sutun_sayac=0;                           //sutun sayac değişkenini sıfırla                  
            line=0;                                                                                    
            j++;
            bosluk=1;   
        }
   }                                                                                                                                                                       
}


void main() //ana program ......
{	//eğer program tuşuna basılı tutulurken enerji verilmişse program moduna geçilir 
	//aksi takdirde oprtion ve intcon register ler ayarlanır normal kaydırma moduna geçilir 
  ADCON1=7;
  TRISA=0;              //porta çıkış olarak ayarlanıyor
  TRISD=0;              //portD çıkış olarak ayarlanıyor
  PORTD=0;              //portD yi sıfırla
  PORTA=0;              //porta yı sıfırla
  TRISC=255;            //PORTC GİRİŞ 
  PORTC=0;              //PORTC SIFIRLANIYOR 
  TRISB=255;            //PORTB GİRİŞ
  PORTB=0;              //PORTB SIFIRLANIYOR 
TRISE=0;
PORTE=0;

	array_clear(&sutun, (sizeof sutun) );

	if( !RC7 ) 
	{
		OPTION = 0X05;
		INTCON = 0XD0; //rb0 kesmesi aktif 
		EEPROM_WRITE(0,65);
		EEPROM_WRITE(1,66);
		EEPROM_WRITE(2,67);
		EEPROM_WRITE(3,68);
	
	}
	else
	{
	OPTION = 0X15;
	INTCON = 0XA0; //tmr0 kesmesi aktif	
	}	

		
	while(1) 
	{ 
		display_scan();
	}         		


} //ANA PROGRAM SONU 




static void interrupt  isr(void)		            	
{
if(TMR0IF==1) 
{
	TMR0IE=0;
	// tmr0 int işlemleri..
  	sayici++;                     //sayıcı değişkenini bir artır
  	if( sayici <= 20 ) goto int_cik;
     	sayici=0;                  //evet sayıcıyı sıfırla

//---------------------------------------
    	if( bosluk==1 )             //sutun sayac , sutun sayısı na eşitmi
		{
     	 veri=0; bosluk=0; 
     	 kaydir();                 //evet , kaydır alt programına git                                                                            
     	 goto int_cik;                                                                                 
    	}   
//-----------------------------------
 		veri_goster();              //veri göster alt programına git 
int_cik:
TMR0IE=1;
TMR0IF=0;
;
} //tmr0 int son..

if(INTF==1)
{ //RB0 BAŞLANGIÇ
	INTE=0;
	PORTE=255;
	if( bit_say < 10 )		 //bit_say 10 den küçük olduğu sürece her interrupt ta bit oku .....
	{
		switch(bit_say)
		{
			case 0:  break;   	//start biti atlanır 
			case 8:  break; 	//prty biti atlanır 
			case 9:  break; 	//stop biti 
			default: {		//1-2-3-4-5-6-7-8 inci bitlerde bu kısım çalışır.. (tuş kodu)
					if(kdata_pin)
					{ bit_set(scan_data,i);   }
					else
					{ bit_reset(scan_data,i); }
				 } //	default son
		} //switch son

		if(bit_say > 0) bit_say++; //scan_data değişkeninin 0. bitine ulaşmak için bu işlem yapılır..
	} 
	else
	{
		PORTE=255; //TEST 
		bit_say=0;
		if(scan_data > 104)  bit_set(durum,2); //KEY PAD TUŞLARI İÇİN 

		switch( temp3 )
		{
			case 0xF0:   bit_say=0;            break;	//tuş bırakıldı..
			case 0x71:                         break;
			case 0x66:                         break;
			case 0x5A:                         break; 
			case 0x12:   toggle(durum,0);      break;       //shift tuşu 
			case 0x59:   toggle(durum,0);      break;       //shift tuşu 
			case 0x58:   toggle(durum,1);      break;       //caps_lock tuşu 
			default: {
					karakter = ascii_data_convert(temp3,durum);      //karakter tuşuna basılmışsa.. 
					EEPROM_WRITE(j,karakter);       // KLAVYEDEN GİRİLEN KARAKTER EPROMA KAYDEDİLİR ...

					if( sutun_sayac < 1 ) sentez();
					for(i=0; i<sutun_sayisi; i++) 
					{                          
   						ortak_islem();                          //   ;eğer harfin ilk sutunu okunduysa 
						if( sutun_sayac == sutun_sayisi )           //        ;sutun sayac , sutun sayısı na eşitmi                
						{                                                                                                                       
     							 sutun_sayac=0;                        //   ;sutun sayac değişkenini sıfırla                   
     							 line=0;                                                                                    
      							 j++;  
						} 
					}
					veri=0; kaydir();                           // HARFLER ARASI BOŞLUK İÇİN BİR SOLA KAYDRI 
				} //default son..
		} //switch son

	
	 
	}
INTE=1;
INTF=0;
} //rb0 int son.
 
}

/*******************************AÇIKLMAA*************************************************************/
/* PROGRAMI YAZAN: YUSUF YİĞİT																		*/
/* PROJE TANIMI:   KLAVYE KONTROLLÜ KAYAN YAZI TASARIMI 											*/

yardımlarınızı bekliyorum..
Bilgi paylaştıkça artar..

arslan74

Merhaba,

Yaptığın programı isis simulasyonu ile birlikte proje olarak gönderirsen sorunun daha iyi inceleme şansınımız olur.

Ben hi-tech eğitim dökümanında ekran tarama mantığı ile örnek proje yayınlamıştm onu hiç incelediniz mi?


Selamlar,

picman

evet dediğiniz doğru . yada siz bana bir interrupt fonksiyonunda nelere dikkat etmek gerekir . interrupt fonksiyonuna dışardan bir başka fonksiyon çağırdığımızda dışarıdan çağırılacak fonksiyonları nasıl tanımlarız . onlar hakkında birkaç bilgi verin ben kendim hallederim sanırım. hi tech derleyicisini yeni kullanmaya başladım oyüzden birşeyleri gözümden kaçırıyorum sanırım . ama yinede ben projeyi proteus şemasıyla birlikte göndermeye çalışıcam ..
ilginiz için teşekkür ederim
Bilgi paylaştıkça artar..