Standart SPI Portunu nasıl değiştirebilirim ?

Başlatan orhanc, 26 Nisan 2010, 00:12:13

orhanc

Mplab_C18_Libraries Kitabında yazan aynen şu şekilde

The precompiled versions of these functions use default pin assignments that can be
changed by redefining the macro assignments in the file sw_spi.h, found in the h
subdirectory of the compiler installation:

Daha sonra girip

"sw_spi.h" içindeki

#if defined (SW_SPI_IO_V1)
#define SW_CS_PIN         PORTCbits.RC3      // Chip Select
#define TRIS_SW_CS_PIN    TRISCbits.TRISC3
#define SW_DIN_PIN        PORTCbits.RC4     // Data in
#define TRIS_SW_DIN_PIN   TRISCbits.TRISC4
#define SW_DOUT_PIN       PORTCbits.RC6    // Data out
#define TRIS_SW_DOUT_PIN  TRISCbits.TRISC6
#define SW_SCK_PIN        PORTCbits.RC5     // Clock
#define TRIS_SW_SCK_PIN   TRISCbits.TRISC5

#else
#define SW_CS_PIN         PORTBbits.RB2      // Chip Select
#define TRIS_SW_CS_PIN    TRISBbits.TRISB2
#define SW_DIN_PIN        PORTBbits.RB3     // Data in
#define TRIS_SW_DIN_PIN   TRISBbits.TRISB3
#define SW_DOUT_PIN       PORTBbits.RB7    // Data out
#define TRIS_SW_DOUT_PIN  TRISBbits.TRISB7
#define SW_SCK_PIN        PORTBbits.RB6     // Clock
#define TRIS_SW_SCK_PIN   TRISBbits.TRISB6
#endif

Burdaki ayarları değiştirdim. Bu orjinal hali. Ama inatla B portunda çalışmaya devam ediyor. Ne yapmam lazım ?
i'm doing nothing... Giddy Up  http://www.drorhan.com

CLR

Donanımsal spi portunu kullanıyorsun, değiştiremezsin. Porta göre kendin gönderme/ alma altprogramı yazarsan yapabilirsin.
Knowledge and Experience are Power

orhanc

#2
Peki neden kitapta değiştirip yeniden derlerseniz çalışıyor diyor ? Elinizde hiç örnek kod var mı birden fazla 74hc595 kullanacağım ama kodlar ya eksik yada çalışmıyor . Ben bunu kitabın software kısmından aldım. SPI nın birde donanım bölümü var kitapta
i'm doing nothing... Giddy Up  http://www.drorhan.com

CLR

Donanım bölümünde portta değişiklik yapamazsın, Port pin set/reset ile spi protokolü oluşturulduysa , port pinlerini değiştirebilirsin.
Knowledge and Experience are Power

orhanc

i'm doing nothing... Giddy Up  http://www.drorhan.com

CLR


Aşağıya bir örnek verdim. Ayrıca 595'ler seri bağlanabilir, tek spi ile sürebilirsin


#define	SDA		LATAbits.LATA0 // RA0
#define	SCK		LATAbits.LATA1 // RA1
#define	LOAD	LATAbits.LATA2 //RA2


void
write_595(unsigned char da_ta){
	unsigned char c;
	SCK=0; LOAD=0;
	for(c=0;c<8;c++){
		SDA=0;
		if(da_ta&0x80)
			SDA=1;
		SCK=1;
		SCK=0;
		da_ta<<=1;
	}
	LOAD=1; LOAD=0;
}
Knowledge and Experience are Power

orhanc

#6
Bu kodu birden fazla 595 için kullanmak istersem kaç tane 595 varsa o kadarlık bir döngüye mi sokmam gerekiyor ? Bu konuları daha iyi öğrenmek için önereceğiniz bir kaynak veya site var mı. Bir sürü ingilizce döküman çektim ama çoğu yeterli gelmiyor.

Alıntı Yapif(da_ta&0x80)
Bu kodun açıklaması nedir ?
i'm doing nothing... Giddy Up  http://www.drorhan.com

JKramer

#7
Evet. Dikkat etmeniz gereken da_ta değişkeninin 595 sayısına göre değişeceğidir:

1 595-->8 bit'lik değişken
2 595-->16 bit'lik değişken

Başka bir yöntem de her 595'de olmasını istediğiniz 8 bit'leri ayrı ayrı değişkenlere atıp write_595(unsigned char da_ta) 'yı istenilen sayıda kullanmak. Mesela dört adet göstergede saat ve dakikayı göstereceksiniz. 8 bit'lik değişkenler şöyle olacak: saat_onlar, saat_birler, dakika_onlar, dakika_birler. Daha sonra bağlama şeklinize göre ya sağdan sola ya da soldan sağa doğru sırayla göndereceksiniz.

Ekleme:
0x80 yerine binary olarak yazarsak:

if(da_ta&0b10000000)

Yani 8 bit'lik da_ta değişkeninin sadece en değerli bit'ine bak, 1 ise SDA pinini 1 yap anlamına geliyor. Daha sonra kodda da göreceğiniz üzere da_ta'yı bir bit sola kaydırıp yeni bit'i test ediyor.

orhanc

Mantığı anladım deneyip bilgi vereceğim. Teşekkürler :) bu arada nickiniz Seinfeldeki Kramerden mi geliyor ?
i'm doing nothing... Giddy Up  http://www.drorhan.com

JKramer

Evet :). Yalnız onun adı Cosmo'ydu, ben Julius yaptım :D.

orhanc

Bana PIC konusunda kaynak önerebilirmisiniz? Piyasadaki çoğu döküman işe yaramıyor. interneti aramaktan kafayı yedim :)
i'm doing nothing... Giddy Up  http://www.drorhan.com

CLR

// 5 tane 595 için örnek
unsigned char  HC595[5]={1,2,3,4,5};

for(c=0;c<5;c++) write_595(HC595[c]);
Knowledge and Experience are Power

orhanc

i'm doing nothing... Giddy Up  http://www.drorhan.com