Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

8li Sayıcı

Başlatan ahmet2004, 08 Haziran 2009, 12:48:02

ahmet2004



#include <18F452.h>

#fuses H4,NOWDT,NOLVP,NOPROTECT
#use delay(clock=40000000) // 40Mhz Kristal

#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)

unsigned int32 sayacDeger;
int  dijit;
int Segment[]={0x7E,0x0C,0xB6,0x9E,0xCC,0xDA,0xFA,0xE,0xFE,0xCE};
char OrtakKatod[8];
        
void main()
{
  dijit=0;
  sayacDeger=0;

  set_tris_A(0b11111111);
  set_tris_B(0b00000001);
  set_tris_C(0b00000000);
  set_tris_D(0b00000000);
  set_tris_E(0b00000000);
    
  while(1)
  {
      OrtakKatod[7]=(sayacDeger/10000000);
      OrtakKatod[6]=(sayacDeger/1000000%10);
      OrtakKatod[5]=(sayacDeger/100000%10);
      OrtakKatod[4]=(sayacDeger/10000%10);
      OrtakKatod[3]=(sayacDeger/1000%10);
      OrtakKatod[2]=(sayacDeger/100)%10;
      OrtakKatod[1]=(sayacDeger/10)%10;
      OrtakKatod[0]=sayacDeger%10;
     
      sayacDeger++;
      if(sayacDeger>=10000000) sayacDeger=0;

   if(dijit== 7){
        output_b( Segment[OrtakKatod[7]]);
        output_bit(PIN_C7,0);
        delay_ms (2);
        output_bit(PIN_C7,1);
        delay_us(100);
      }

   if(dijit== 6){
        output_b( Segment[OrtakKatod[6]]);
        output_bit(PIN_C6,0);
        delay_ms (2);
        output_bit(PIN_C6,1);
        delay_us(100);
      }

   if(dijit== 5){
        output_b( Segment[OrtakKatod[5]]);
        output_bit(PIN_C5,0);
        delay_ms (2);
        output_bit(PIN_C5,1);
        delay_us(100);
      }

   if(dijit== 4){
        output_b( Segment[OrtakKatod[4]]);
        output_bit(PIN_C4,0);
        delay_ms (2);
        output_bit(PIN_C4,1);
        delay_us(100);
      }

   if(dijit== 3){
        output_b( Segment[OrtakKatod[3]]);
        output_bit(PIN_C3,0);
        delay_ms (2);
        output_bit(PIN_C3,1);
        delay_us(100);
      }
   if(dijit== 2){
        output_b( Segment[OrtakKatod[2]]);
        output_bit(PIN_C2,0);
        delay_ms (2);
        output_bit(PIN_C2,1);
        delay_us(100);
      }

    if(dijit== 1){
        output_b( Segment[OrtakKatod[1]]);
        output_bit(PIN_C1,0);
        delay_ms (2);
        output_bit(PIN_C1,1);
        delay_us(100);
      }

    if(dijit == 0){
        output_b( Segment[OrtakKatod[0]]);
        output_bit(PIN_C0,0);
        delay_ms (2);
        output_bit(PIN_C0,1);
        delay_us(100);
      }

    dijit ++;
    if(dijit >=8 ) dijit=0;
  }
  // 8li Sayaç
}

M_B

Paylaşımınız için Teşekkürler ahmet2004 hocam;

Bende kurulu olan CCS C 4.023 versiyonda deneme yapayım dedim ve derleme yaptı.
Sonra şemayı Proteust 7.4 sp3 kurup denemek istedim.
Çalıştırdığımda ise en sağdaki dijitler aynı kronemetredeki gibi saymaya başladı. Yanındaki dijitler ise normal şekilde saydılar. Yalnız ekranda displayler sabit kalmıyor hareketli.
Bu bahsetmiş olduğum bilg. ve Proteus tan kaynaklanıyor olabilir mi ?.
Bu uygulamayi merakımdan ve bir şeyler öğrenmek için  denedim.
Teşekkürler
M_B
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

ahmet2004

Dikkat ettiysen hiç bir bekleme komutu yok.Kristal frekansına göre

her döngü yaklaşık (8*2mS)+(8*100uS) sürüyor.O yüzden son haneler öyle.

Displeyin özelliklerinden 0.0001ms ye düşürebilirsin süreyi.

Sadece displey'e çıkış verme ve gösterim mantığını anlamak adına

yardımcı olsun diye verilen bir kod.

ahmet2004

Bu kod da Geri sayım yapar.

#include <18F452.h>

#fuses H4,NOWDT,NOLVP,NOPROTECT
#use delay(clock=40000000) // 40Mhz Kristal

#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)

unsigned int32 sayacDeger;
int  dijit;
int Segment[]={0x7E,0x0C,0xB6,0x9E,0xCC,0xDA,0xFA,0xE,0xFE,0xCE};
char OrtakKatod[8];
        
void main()
{
  dijit=0;
  sayacDeger=99999999;

  set_tris_A(0b11111111);
  set_tris_B(0b00000001);
  set_tris_C(0b00000000);
  set_tris_D(0b00000000);
  set_tris_E(0b00000000);
    
  while(1)
  {
      OrtakKatod[7]=(sayacDeger/10000000);
      OrtakKatod[6]=(sayacDeger/1000000%10);
      OrtakKatod[5]=(sayacDeger/100000%10);
      OrtakKatod[4]=(sayacDeger/10000%10);
      OrtakKatod[3]=(sayacDeger/1000%10);
      OrtakKatod[2]=(sayacDeger/100)%10;
      OrtakKatod[1]=(sayacDeger/10)%10;
      OrtakKatod[0]=sayacDeger%10;
     
      sayacDeger--;
      if(sayacDeger<0) sayacDeger=99999999;

   if(dijit== 7){
        output_b( Segment[OrtakKatod[7]]);
        output_bit(PIN_C7,0);
        delay_ms (2);
        output_bit(PIN_C7,1);
        delay_us(100);
      }

   if(dijit== 6){
        output_b( Segment[OrtakKatod[6]]);
        output_bit(PIN_C6,0);
        delay_ms (2);
        output_bit(PIN_C6,1);
        delay_us(100);
      }

   if(dijit== 5){
        output_b( Segment[OrtakKatod[5]]);
        output_bit(PIN_C5,0);
        delay_ms (2);
        output_bit(PIN_C5,1);
        delay_us(100);
      }

   if(dijit== 4){
        output_b( Segment[OrtakKatod[4]]);
        output_bit(PIN_C4,0);
        delay_ms (2);
        output_bit(PIN_C4,1);
        delay_us(100);
      }

   if(dijit== 3){
        output_b( Segment[OrtakKatod[3]]);
        output_bit(PIN_C3,0);
        delay_ms (2);
        output_bit(PIN_C3,1);
        delay_us(100);
      }
   if(dijit== 2){
        output_b( Segment[OrtakKatod[2]]);
        output_bit(PIN_C2,0);
        delay_ms (2);
        output_bit(PIN_C2,1);
        delay_us(100);
      }

    if(dijit== 1){
        output_b( Segment[OrtakKatod[1]]);
        output_bit(PIN_C1,0);
        delay_ms (2);
        output_bit(PIN_C1,1);
        delay_us(100);
      }

    if(dijit == 0){
        output_b( Segment[OrtakKatod[0]]);
        output_bit(PIN_C0,0);
        delay_ms (2);
        output_bit(PIN_C0,1);
        delay_us(100);
      }

    dijit ++;
    if(dijit >=8 ) dijit=0;
    
  
  }
  // 8li Sayaç
}

kadirbas

Selamlar ahmet2004,

Kodunuzu inceledim ve birkaç şeyin yanlış olduğunu düşündüm. Bunları da sizinle paylaşmak istedim.

Her iki kodunuzda da "while" döngüsü içerisinde "sayacDeger" değişkeni ile "dijit" değişkenini her döngüde değiştiriyorsunuz. Dolayısıyla, sayıları atlayarak gösterdiğinizi düşünüyorum.

Bir de ikinci kodunuzda, işaretsiz tam sayı olarak tanımladığınız "sayacDeger" değişkeninin sıfırdan küçük olup olmadığını kontrol ediyorsunuz. Bunun da bir hataya neden olabileceğini düşünüyorum.

Kolay gelsin..

ahmet2004

*kadirbas*

ikinci dediğin doğru ama kodla çalışan zaten kendine göre düzenleme yapar diye düşünmekteyim.

kadirbas arkadaşımızı kırmayalım.Yeni kodlar ekleyip devam edelim.

Yavaş sayım da eklendi.

#include <18F452.h>

#fuses H4,NOWDT,NOLVP,NOPROTECT
#use delay(clock=40000000) // 40Mhz Kristal

#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)

int bekleme;
int32 sayacDeger;
int8  dijit;
int Segment[]={0x7E,0x0C,0xB6,0x9E,0xCC,0xDA,0xFA,0xE,0xFE,0xCE};
char OrtakKatod[8];
        
void main()
{
  dijit=0;
  bekleme=1;
  sayacDeger=30;

  set_tris_A(0b11111111);
  set_tris_B(0b00000001);
  set_tris_C(0b00000000);
  set_tris_D(0b00000000);
  set_tris_E(0b00000000);
    
  while(1)
  {
   bekleme --;  
   if(bekleme == 0){
      OrtakKatod[7]=(sayacDeger/10000000);
      OrtakKatod[6]=(sayacDeger/1000000%10);
      OrtakKatod[5]=(sayacDeger/100000%10);
      OrtakKatod[4]=(sayacDeger/10000%10);
      OrtakKatod[3]=(sayacDeger/1000%10);
      OrtakKatod[2]=(sayacDeger/100)%10;
      OrtakKatod[1]=(sayacDeger/10)%10;
      OrtakKatod[0]=sayacDeger%10;


      if(sayacDeger <= 0) sayacDeger=100000000;
      sayacDeger--;
   
     bekleme=200;
   }


   if(dijit== 7){
        output_b( Segment[OrtakKatod[7]]);
        output_bit(PIN_C7,0);
        delay_ms (2);
        output_bit(PIN_C7,1);
        delay_us(100);
      }

   if(dijit== 6){
        output_b( Segment[OrtakKatod[6]]);
        output_bit(PIN_C6,0);
        delay_ms (2);
        output_bit(PIN_C6,1);
        delay_us(100);
      }

   if(dijit== 5){
        output_b( Segment[OrtakKatod[5]]);
        output_bit(PIN_C5,0);
        delay_ms (2);
        output_bit(PIN_C5,1);
        delay_us(100);
      }

   if(dijit== 4){
        output_b( Segment[OrtakKatod[4]]);
        output_bit(PIN_C4,0);
        delay_ms (2);
        output_bit(PIN_C4,1);
        delay_us(100);
      }

   if(dijit== 3){
        output_b( Segment[OrtakKatod[3]]);
        output_bit(PIN_C3,0);
        delay_ms (2);
        output_bit(PIN_C3,1);
        delay_us(100);
      }
   if(dijit== 2){
        output_b( Segment[OrtakKatod[2]]);
        output_bit(PIN_C2,0);
        delay_ms (2);
        output_bit(PIN_C2,1);
        delay_us(100);
      }

    if(dijit== 1){
        output_b( Segment[OrtakKatod[1]]);
        output_bit(PIN_C1,0);
        delay_ms (2);
        output_bit(PIN_C1,1);
        delay_us(100);
      }

    if(dijit == 0){
        output_b( Segment[OrtakKatod[0]]);
        output_bit(PIN_C0,0);
        delay_ms (2);
        output_bit(PIN_C0,1);
        delay_us(100);
      }

    dijit ++;
    if(dijit >=8 ) dijit=0;
    
  
  }
  // 8li Sayaç
}

M_B

Hocam İzninizle bende Hi-Tech C de yapmış olduğum uygulamayı aktarayım.  




/********************************************************* 
  PIC16F877 ile 99999999  sayici uygulaması
  Derleyici : Hi-Tech C   
  Yayinlayan: M_B                          
  versiyon  : 1.0                       
  Aciklama  : Display sürmede Timer interrup kullanildi.
 ********************************************************/ 

#include	<pic.h>
#include	<stdio.h>
#include	"delay.h"


#define S1	RC0
#define S2	RC1
#define S3	RC2
#define S4	RC3
#define S5	RC4
#define S6	RC5
#define S7	RC6
#define S8	RC7

// Global degiskenler
unsigned int sayac ;
const unsigned char dijit[] = {	0b01111110, // 0
								0b00001100, // 1
								0b10110110, // 2
								0b10011110, // 3
								0b11001100, // 4
								0b11011010, // 5
								0b11111010, // 6
								0b00001110, // 7
								0b11111110, // 8
								0b11011110, // 9
							  };							  
unsigned char OrtakKatod[8]; 





void main(void){ // Ana program
	
	
	TRISA = 0b00000000; 
	TRISB = 0b00000000;
	TRISC = 0b00000000;

	PORTA = 0b00000000;
	PORTB = 0b00000000;
	PORTC = 0b00000000;

	OPTION = 0b00000010;	// PullUp dirençleri devreye sokar.  Ön bölücü 1/4 secildi.
	
	TMR0 = 0;	// TMR0 sayacını sıfırla.
	T0IF = 0;	// interrupt flagini sıfırla

	T0IE = 1;	// RB0 interuprunu devreye sok.
	GIE  = 1;	// Acık olan bütün interupları devreye sok.  
	
	while (1)
		{ 	
		DelayMs(250);	// 250 ms bekle.
		sayac++;

		    OrtakKatod[7]=(sayac/10000000); 
      		OrtakKatod[6]=(sayac/1000000%10); 
      		OrtakKatod[5]=(sayac/100000%10); 
      		OrtakKatod[4]=(sayac/10000%10); 
      		OrtakKatod[3]=(sayac/1000%10); 
      		OrtakKatod[2]=(sayac/100)%10; 
      		OrtakKatod[1]=(sayac/10)%10; 
      		OrtakKatod[0]=sayac%10; 
		}
}


static void interrupt
isr(void)	
			
{	
	if(T0IF)
 	{		
			
	
		static unsigned char hane = 1; 		// Ekrana gösteregek haneyi tutar.
	
		PORTC =	0;						 
		if (hane == 1)
			{
				hane++;		
			   	PORTB = dijit[OrtakKatod[0]];
				S1 = 1; 
			}
			else if (hane == 2) 
					{	
					hane++;		
					PORTB = dijit[OrtakKatod[1]];	
					S2 = 1; 
					}						
					else if (hane == 3) 
							{ 									
							hane++;									
							PORTB =  dijit[OrtakKatod[2]];	
							S3 = 1;
							}
					else if (hane == 4) 
							{ 									
							hane++;									
							PORTB =  dijit[OrtakKatod[3]];	
							S4 = 1;
							}

					else if (hane == 5) 
							{ 									
							hane++;									
							PORTB =  dijit[OrtakKatod[4]];	
							S5 = 1;
							}

					else if (hane == 6) 
							{ 									
							hane++;									
							PORTB =  dijit[OrtakKatod[5]];	
							S6 = 1;
							}
					else if (hane == 7) 
							{ 									
							hane++;									
							PORTB =  dijit[OrtakKatod[6]];	
							S7 = 1;
							}

					else if (hane == 8) 
							{ 									
							hane++;									
							PORTB =  dijit[OrtakKatod[7]];	
							S8 = 1;
							}
					else {		
					    	hane = 1;
						 }
			T0IF = 0;		// clear the interrupt flag
	}
}
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet