SPI Haberlesmeli Uygulama Ornegı

Başlatan M_B, 25 Nisan 2008, 18:11:14

M_B

Merhaba arkadaslar
Elime MC14499P entegresiyle yapılmış 4 dijitli 7 Segment li Display kartı gecti ve bende bunu degerlendirmek istedim. formumuzdan yararlanarak Hi-TecH C de ufak bir ( amatorce ) program yazdım ve calıstırdım.
Bu sayede SPI haberleşme ve Timer İnt. Hakkında biraz daha bilgi sahibi oldum ve benim gibi diger arkadaslar da yararlansın  diye buraya kodu yazıyorum. Semayı koyamıyacam cunkı cızmedım. Ama MC14499P datashettinde semayla aynı  
Not: Entegre piyasada var mı yok mu ? Bilgi sahibi değilim.
Kolay gelsın
M_B

Not: Ayrıca Hi-Tech C dersi veren Arslan74  Hocamıza teşekkür ederım.
Sayesınde H-TecH C yi sevdim.  

// 25.04.2008 
// PIC16F628 ile MC14499P entegresi yardımıyla 0-255 sayıcı 
// SPI yontemiyle yapılan uygulama  (20 bit veri gonderiliyor )

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

#define DATA RB1
#define CLK  RB0
#define ENB  RB2

// sigorta ayarları yapılıyor.
__CONFIG(INTIO & MCLRDIS & WDTDIS & LVPDIS & PWRTEN & BOREN );

volatile unsigned char sayac = 0;

// *****************************************************

void gonder(int veri) 
{
  int i;
    for(i = 0; i<4; i++) 
		{  
    		if((veri & 0x08 ) == 0x08 )
      			DATA =1;
    		else
      			DATA =0;
   				veri<<=1;
   				CLK =0;
				DelayUs(20);
   				CLK =1;
  		}
}  
  
// *********************************************************
// ana program
main(void)
{
	TRISA = 0b00000000;
	TRISB = 0b00000000;

	PORTA = 0b00000000;
	PORTB = 0b00000000;

	OPTION = 0b00000001; // PullUp dirençleri devreye sokar.

	CMCON = 0x07;		 // PORTA analog pinlerini kapatır. PortA Dijitale dönüştür.
	
	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)
			{ 					// program döngüsü	
			sayac++;			// Sayacı bir artır.		
			DelayMs(250);		// 250 ms bekle.
			}
		
}

static void interrupt 
isr(void)									// Here be interrupt function - the name is
{
	if(T0IF) 
	{											// timer interrupt
		unsigned char d1 , d3 , d4 ;		
		unsigned char d2 ;			
		  d1 = sayac % 10 ;
		  d2 = (sayac/10)%10;
		  d3 = (sayac/100 );
		  d4 = 0 ;
		
			ENB = 0;
		  	gonder(0);	// point digit 
			gonder(d4);	// 1 digit	 
			gonder(d3);	// 2 digit   
			gonder(d2);	// 3 digit	 
			gonder(d1);	// 4 digit	 
			DelayUs(10);
			ENB = 1; 
    		T0IF = 0;						// clear the interrupt flag
	}
		
	if(INTF) 
		{								// did we see a button press?
		INTF = 0;						// clear the interrupt
		}
}
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

arslan74

Merhaba,

Burada SPI göndermeyi timer kesmesi altında gödermeniz gereksiz. Hatta timer kesmesini bile kullanmanız gereksiz diyebilirim. Cünkü ekran taramasını sizin kullandığınız entegre yapiyor. O yüzden ekrana yazma fonskiyonun main programın içinde kullanabilirsiniz. sayacı artırdıktan sonra bilgiyi ekrana bir sefer sürmeniz yetecektir.

Ancak bu entegreyi bulmakta zorlanabilirler. Onun yerine 4 tane shift register entergresi( Örneğin 74hc595 veya 4094) kullanmanız malzeme temin acısından daha iyi olur. Gerisi yazılıma kaliyor.

Selamlar

M_B

Merhaba
Yorumunuz ıcın Tesekkur ederım Hocam.

SPI gondermeyı aslında timer altında yapmayacaktım ama denemek ıcın yapmak ıstedım.  (Haklısınız zaten taramayı entegre yapıyor)

Bu entegre piyasada varmı yokmu bılmıyorum benım elime hazır dısplay katı olarak gecti bende degerlendirmek istedim. ( Calıstırmak ve mantıgını kavramak  icin İlerde hazır dısplay olarak kullanırım dıye )

Saygılar
M_B
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet