RB4 RB7 ile up down sayıcı

Başlatan a.zorba, 17 Ocak 2011, 11:01:13

a.zorba

      yeni yeni hitech C  ile alıştırma program ları karalıyorum, sorunum aşagıda ki program la birler hanesi dıspley de görunurken onlar basamagı kısa bır sure  gorunup kayboluyor , daha önce dizi ve dıspley kısmı ıle RB0 kesmesiyle  yukarı sayıcı çalışdırmışdım .
İkinci sorunum okdugum yerlerde "delay.h" ı eklememi istıyor ben de ise <delay.c> yapmazsam delay komutunu çalıştıramıyorum .
Üçuncu sorum { } kullanmının kuralları varmıdır  .
Önerileriniz her zaman benim için önemlidir.

isis ve eclıpse
http://www.4shared.com/file/Hl0TwXUo/RB4_RB7_dizi_segmen_2_tane_aag.html

#include <htc.h>
#include <delay.c>
const unsigned char
segment []={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};// DİZİ
       //    0    1     2    3    4     5    6    7    8   9 
void say (char  i)  // sayı göstermeye yarayan fonksıyon
{
PORTC=0x02           ; // portc de 2 degeri gönderiliyor
PORTD=segment [i/10] ;  // i nın 10 a bolumu gosterılıyor
DelayMs (1)          ;
PORTC=0x01           ;
PORTD=segment [i%10] ; // i nın 10 a bolumunden kalan gosterılıyor
DelayMs (1)          ;
}
void main(void)
{
	TRISB=0b11111111 ;
	PORTB=0x00 ;
	TRISC=0x00          ;  // portc cıkış 
	TRISD=0x00          ;  //portd cıkış
	RBIF=0 ; // rb4  rb7 kesme bayragı temızlendı
	RBIE=1 ; //rb4  rb7 kesme ızın verme
	GIE=1  ;  //genel kesme izin verme
    for (;;);
	
}

static void interrupt  // kesme fonksıyonu tanımlandı
isim (void) //kesme fonksıyonua isim verildi
{
char i ;    // kesme fonksıyonuna bir degişken atandı
if (RBIF)
     {
        if (RB4)
        	i++ ;
        else if (RB5)          
        	i-- ;
       if (i>99)
    	   i=0 ;
        say(i);
        PORTB=PORTB  ; // son degişikler için tekrara tara
        RBIF=0 ; // tekrar kesme alabılmek ıcın bayrak temızlendı 
     }
        		
  }


Bilenler bilir . Biz maraşlilar için şehir olarak şubat ay' i bayram ,kurtuluş ,yaz in gelmesiydi. Şimdi karalar in yas in ayı oldu.

mozkan87

Portları sürekli taraman lazım. Bu şekilde olmaz. Tarama fonksiyonunu for döngüsünün içine yaz.Bir de DelayMs leri 5 yap daha iyi olur.

eseneren

Arkadaşım işine yararsa dıye eklıyorum eksiklikleri ve fazlalıkları var fikir bakımından
/* PORTD data PORTC çokdanseçme olarak 6 adet seven segmenti multiplex olarak
 * süren sayıcı devresi. PORTB değişimi kesmesi RB5-6-7 olarak 3 Adet buton var; 
 * Plus , Minus , Function.Sayıcı normal modda ıken plus sayıyı bır artıyor minus bir azaltıyor.
 * functıon a basıp auto moda alınırsa sayı otomatık kendı artıyor.
 * auto modda plus ve minus sayacın artma hızını değiştiriyor.
 * Functiona basılı tutunca sayıyı ve diğer modları resetliyor.
 * 1.buton plus 2.buton minus 3.buton func ise girecegınız 7 haneli sıfre 
 * key  degıskenıne esıt ıse girilirse RB0 a baglı buzzer sınyal verir 
 * ve basit bır anımasyon cıkar show2();
 */

#include <htc.h>
#include "delay.c" 
#define Xtal_FREQ 20MHZ

__CONFIG(HS & UNPROTECT & WDTDIS & LVPDIS & PWRTDIS & BORDIS );

unsigned char i,j,k,x=0,wait=2;
unsigned char Seven_S[]={0x3F,0X06,0X5B,0X4F,0X66,
							0X6D,0X7D,0X07,0X7F,0X6F,0X00,0X00,0X00,0X00,0X00,0X00,0X00};
unsigned char SS[]={254,253,251,247,239,223,191,127,0,};
unsigned char SSC[10];

unsigned int second,minutes,hour,slide=50;
unsigned long a,pass=0,key=1122111,number=123456;

void initialize();
void reset();
void plus();
void minus();
void show();
void show2();


void main(void)
{
initialize(); 
reset();
while(1)
{
show();
if(x==1)
	plus();
}}	// Ana program

static void interrupt
kesme(void)
{

if(RB7==1)
 {
pass=pass*10+1;
pass%=10000000;
if(pass==key)
	show2();


doit7:
	if((x==0)&&(RB7==1))
	{
	show();
	goto doit7; 
	}
	if(x==0)
	plus();
	else if(x==1)
	{
		if(slide>3)
		slide--;
	}
}
if(RB6==1)
{
pass=pass*10+2;
pass%=10000000;
if(pass==key)
	show2();

doit6:
	if((x==0)&&(RB6==1))
	{
		show();
		goto doit6; 
	}
	if(x==0)
		minus();
	else if(x==1)
	{
		if(slide<255)
		slide++;
	}
}	
if(RB5==1)
{

pass=pass*10+3;
pass%=10000000;
if(pass==key)
	show2();

	if(x==0)
		x=1;
	
	else if(x==1)
		x=0;
		
		k=0;
resets:	
if(RB5==1)
{
	if(k>10)
	{
		number=0;
		x=0;
		slide=50;
		goto goon;
	}
	else
	{
			k++;
	}
	show();
	goto resets;
}
}
goon:

j=PORTB;
RBIF=0;
GIE=1;	
}//

void plus()
{
	number++;
}//
void minus()
{
	if(number==0)
		number=999999;
	else
		number--;
}//		
void show()
{
	
	for(i=0;i<slide;i++)
	{
	SSC[0]=(number-(number/10)*10);
	a=number-(number/100)*100;SSC[1]=a/10;
	a=number-(number/1000)*1000;SSC[2]=a/100;
	a=number-(number/10000)*10000;SSC[3]=a/1000;
	a=number-(number/100000)*100000;SSC[4]=a/10000;
	a=number-(number/1000000)*1000000;SSC[5]=a/100000;
	
	PORTD=Seven_S[SSC[0]];
	PORTC=255-1;
	DelayMs(wait);
	
	PORTD=Seven_S[SSC[1]];
	PORTC=255-2;
	DelayMs(wait);
	
	PORTD=Seven_S[SSC[2]];
	PORTC=255-4;
	DelayMs(wait);
	
	PORTD=Seven_S[SSC[3]];
	PORTC=255-8;
	DelayMs(wait);
	
	PORTD=Seven_S[SSC[4]];
	PORTC=255-16;
	DelayMs(wait);
	
	PORTD=Seven_S[SSC[5]];
	PORTC=255-32;
	DelayMs(wait);
	
	}
}		// Seven_segmentde goster(tara)

void show2()
{

	pass=0;	
	int wait2=200;	
	for(i=0;i<5;i++)
	{
	
	PORTB=1;

	PORTD=0b00000001;
	PORTC=255-1;
	DelayMs(wait2);
	PORTD=0b00000010;	
	DelayMs(wait2);
	PORTD=0b00000100;	
	DelayMs(wait2);
	PORTD=0b00001000;	
	DelayMs(wait2);

	

	PORTD=0b00001000;
	PORTC=255-2;
	DelayMs(wait2);
	
	
	PORTD=0b00001000;
	PORTC=255-4;
	DelayMs(wait2);
	
	PORTD=0b00001000;
	PORTC=255-8;
	DelayMs(wait2);
	
	PORTD=0b00001000;
	PORTC=255-16;
	DelayMs(wait2);
	
	PORTD=0b00001000;
	PORTC=255-32;
	DelayMs(wait2);
	PORTD=0b00010000;
	DelayMs(wait2);
	PORTD=0b00100000;
	DelayMs(wait2);
	PORTD=0b00000001;

	PORTB=0;
	
	PORTD=0b0000001;
	PORTC=255-16;
	DelayMs(wait2);

	PORTD=0b0000001;
	PORTC=255-8;
	DelayMs(wait2);

	PORTD=0b0000001;
	PORTC=255-4;
	DelayMs(wait2);
	
	PORTD=0b0000001;
	PORTC=255-2;
	DelayMs(wait2);


	}
}	



void reset()
{
second=50;
minutes=41;
hour=21;
}		// initialize I/O portları vs ayarlar
void initialize()
{
	RBIF=0;
	RBIE=1;
	GIE=1;
	TRISA=0X00;
	TRISB=0XF0;
	TRISC=0x00;
	TRISD=0x00;
	PORTA=0X00;
	PORTB=0X00;
	PORTC=0X00;
	PORTD=0X00;
}		// Bıtıs

Seçim yapmak için durum hakkında bilgi sahibi olmak zorunda değilsin, sonucuna hazır olmak için durum hakkında kaygılanırsın.  http://bit.ly/gixfTk

PARSIC

<delay.c> hi-tech dosyasından "delay.h" ise projenin olduğu dosyadan çağrılır...
********************************************************************HI-TECH*******************************************************************

a.zorba

öncelikli olarak cevablar için sagolun.

şu şekilde taramayı for döngusune alınca RB4 kesmesi ne hiç girmedi
void say (char  i)  // sayı göstermeye yarayan fonksıyon
{

const unsigned char 
segment []={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};// DİZİ
       //    0    1     2    3    4     5    6    7    8   9 
for (;;)
{
PORTC=0x02           ; // portc de 2 degeri gönderiliyor
PORTD=segment [i/10] ;  // i nın 10 a bolumu gosterılıyor
DelayMs (1)          ;
PORTC=0x01           ;
PORTD=segment [i%10] ; // i nın 10 a bolumunden kalan gosterılıyor
DelayMs (1)     ;
}



senerenemre örnek için sagol fxdev hasan ve muzoo arkadaşımızın notlarından yola çıkarak bir şeyler yapmaya çalışıyorum.
elinde az çok açıklama satırlı ornek leri paylaşırsanız sevınırım bir şey yaptıgımdan degil ısınma ve ögrenme amaçlı .
Bilenler bilir . Biz maraşlilar için şehir olarak şubat ay' i bayram ,kurtuluş ,yaz in gelmesiydi. Şimdi karalar in yas in ayı oldu.

mozkan87

Hocam ben aşağıdaki gibi kast etmiştim. Bu kodu bi deneyebilirmisiniz. Kolay gelsin

#include <htc.h>
#include <delay.c>
const unsigned char
segment []={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};// DİZİ
       //    0    1     2    3    4     5    6    7    8   9
//void say (char  i)  // sayı göstermeye yarayan fonksıyon

void main(void)
{
   TRISB=0b11111111 ;
   PORTB=0x00 ;
   TRISC=0x00          ;  // portc cıkış
   TRISD=0x00          ;  //portd cıkış
   RBIF=0 ; // rb4  rb7 kesme bayragı temızlendı
   RBIE=1 ; //rb4  rb7 kesme ızın verme
   GIE=1  ;  //genel kesme izin verme
    for (;;)
	{
	PORTC=0x02           ; // portc de 2 degeri gönderiliyor
	PORTD=segment [i/10] ;  // i nın 10 a bolumu gosterılıyor
	DelayMs (5)          ;
	PORTC=0x01           ;
	PORTD=segment [i%10] ; // i nın 10 a bolumunden kalan gosterılıyor
	DelayMs (5)          ;
	}
	
   
}

static void interrupt  // kesme fonksıyonu tanımlandı
isim (void) //kesme fonksıyonua isim verildi
{
char i ;    // kesme fonksıyonuna bir degişken atandı
if (RBIF)
     {
        if (RB4)
           i++ ;
        else if (RB5)         
           i-- ;
       if (i>99)
          i=0 ;
        say(i);
        PORTB=PORTB  ; // son degişikler için tekrara tara
        RBIF=0 ; // tekrar kesme alabılmek ıcın bayrak temızlendı
     }
              
  }

eseneren

Kesme programın

static void interrupt  // kesme fonksıyonu tanımlandı
isim (void) //kesme fonksıyonua isim verildi

demişsin i yi kesme ıcınde olusturuyorsun ve main ıcınde kullanıyorsun global degısken tanımlasan ve tanımlarken yada bır yerde 0 baslangıc degerını versen
a eşitlesen daha uygun olmazmı ?

segment []={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};// DİZİ
sonuna 0x00 diye bir eleman daha ekleyıp kesme ıcınde

PORTB=segment[10];
DelayMs(250);
DelayMs(250);

versen kesmeye gırıp gırmedıgını test edersın..
Seçim yapmak için durum hakkında bilgi sahibi olmak zorunda değilsin, sonucuna hazır olmak için durum hakkında kaygılanırsın.  http://bit.ly/gixfTk

tyilgin

ilk kodunuzda yaptığınız hata ;
    farkındamısınız, displayleri tarama yöntemi kullanarak sürmek istemişsiniz. Bu yöntemde eşit zaman aralıklarıyla her 2 displayi sürekli taramanız gerekir. Siz displaylerin sürülme işlemini say prosedürü içinde hazırlamışsınız. Say prosedürünüde portb de oluşan kesme sırasında yalnızca 1 kez çalıştırdığınız için onlar basamağına enerji verip 1 ms sonra kesip sonrada birler basamağına enerji veriyorsunuz. Bu işlem tekrarlanmadığı içinde birdaha butona basana kadar onlar basamağı enerjilenmiyor, yani görünmüyor..

ikinci kodununuzda yaptığınız hata ;
    yine kesme içinden say prosedürüne dallanmışsınız. sonra say prosedürü içinde de for ile kısır döngüye girerek portb kesmesinden dahi çıkamamışsınız.

izlemeniz gereken yol ;
     Eğer amaç özellikle kesmeler üzerine çalışmak değilse kesmeleri bu kadar basit işlemler için kullanmayın.
Kesmelerin genel kullanım amacı, çok dallanarak çalışan bir kodda, kodun tamamı boyunca kontrol edilecek bir rutin varsa ve bu rutini her icra edilen prosedürün içinde kontrol etmemek için kullanın. Örneğin sizin say gibi 10 prosedürünüz olsaydı siz bu butonları her prosedürün içinde kontrol etmek zorunda kalacağınız için kesme kullanmanız uygun olurdu. Oysaki sizin sadece bir tane say prosedürünüz var, dolayısı ile kesmeli de yapsanız kesmesiz de yapsanız portb yi sadece 1 yerde kontrol edeceksiniz. Bu nedenle işin içine kesme koymayın boşuna.