TC72 Hatası / Çözüldü

Başlatan FxDev, 10 Temmuz 2009, 00:44:17

FxDev

Arkadaşlar bugün pic'in SPI bileşenini kullanmak için denemeler yapıyordum ve proteusta SPI iletişim yapan TC72 ile denemeler yapmak istedim fakat bir türlü kontrol regsiterini değiştiremedim...
Daha sonra elle kodu yazdım fakat değişen bir şey olmadı, maalesef kontrol registerinde bir değişiklik yapamadım. Çevrim başlatmak için kontrol registerine entegrenin çalışması için emir verilmeli, fakat veremediğim için bir türlü çevrimi başlattıramıyorum...
Daha önce bu entegreyle çalışmış olan arkadaşlar bir göz atarlarsa sevinirim, CCS C'nin hazır fonksiyonlarını kullanmamışsanız onun kodlarına da bakmak işime yarayabilir?
Gerçekten 2 saattir ne yaptıysam çözemedim...

Yardımcı olan arkadaşlara şimdiden teşekkürler...

Kodlarım;

tc72.h

#define SCK RC0
#define CE	RC1
#define SDI RC2
#define SDO RC3

#define TRIS_SDO TRISC3

extern void write_byte(unsigned char veri);
extern unsigned char read_byte(void);
extern void tc72_control(unsigned char veri);
extern unsigned char tc72_read(unsigned char veri);
extern unsigned char tc72(void);


tc72.c

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

void write_byte(unsigned char veri)
{
	unsigned char i;
	CE=1;
	DelayUs(2);
	for(i=0;i<8;i++)
	{
		SDI=((veri>>i)&0x01);
		DelayUs(2);
		SCK=1;
		DelayUs(2);
		SCK=0;
		DelayUs(2);
	}
	SCK=0;
	DelayUs(2);
	CE=0;
	DelayUs(2);
}

unsigned char read_byte(void)
{
	unsigned char i,veri;
	TRIS_SDO=1;
	DelayUs(2);
	CE=1;
	DelayUs(2);
	for(i=0;i<8;i++)
	{
		if(SDO==1)
			veri=veri|(1<<i);
		else
			veri=veri|(0<<i);
		SCK=1;
		DelayUs(2);
		SCK=0;
		DelayUs(2);
	}
	SCK=0;
	DelayUs(2);
	CE=0;
	DelayUs(2);
	TRIS_SDO=0;
	DelayUs(2);
	return veri;
}

void tc72_control(unsigned char veri)
{
	write_byte(0x00);
	write_byte(veri);
}

unsigned char tc72_read(unsigned char veri)
{
	write_byte(veri);
	return read_byte();
}

unsigned char tc72(void)
{
	unsigned char MSB, LSB;
	write_byte(0x80);
	write_byte(0x04);
	write_byte(0x02);
	DelayMs(150);
	MSB=read_byte();
	LSB=read_byte();
	
	return MSB;
}

arslan74

Merhaba,

Hangi PIC'i kullanıyorsunuz. Zira birçok PIC modelinde donanımsal SPI mevcut ve sorunsuz çalışıyor. Yazılımsal SPI ile uğraşmayın. Kodunu biraz inceledim ve bazı mantık hataları yapmışsın. Ama en başta donanımsal SPI kullan ve TC72 kullanmadan önce datasheet'ini iyi incele ve haberleşme protokolünü öğren. Ondan sonra kod aktarması çok kolay olur. Takıldığın yerde yardım ederiz.

Selamlar

arslan74

Merhaba,

SPI alma  kodu hatalı yazılmış. SPI gönderme yaparken aynı zaman almda yapıyorsun. SPI alma mantığın 0xff gönderdikden sonra bufferi okumak.

örnek kod:

void spi_ilet (unsigned char ch ){

	BF	= 0;
	SSPBUF = ch;
	
	while( !BF ){;}
	
}


unsigned char spi_send_receive (unsigned char ch ){
		
	BF	= 0;	
	SSPBUF = ch;
	
	while( !BF );
	
	return SSPBUF;

}


Selamlar

arslan74

Çalışan düzgün kodunu da yayınla ihtiyacı olan başkalarınında işine yarasın.

PARSIC

bir sorum olacaktı sspstat bitlerine neden müdahele edemiyoruz mesela hi-tech de bf bitini tanımıyor bütün sspstat bitlerinde,  "undefined identifier: bf" hatası veriyor neden olabilir acaba...
********************************************************************HI-TECH*******************************************************************

izwirlee_35

@fxdev bu yazdıgınız kodu kullandım sonra dedimki 1 tane daha tc72 koyup tekrar deneyim tabiki yazılım da gereken değişiklikleri yaptım fakat işin içine chipselect girince işin içinden çıkamadım nasıl bi yol önerir siniz?
keep learning . . .

izwirlee_35

#6
teşekkürler fxdev yalnız aynı dedigin mantıkta ilerledim ama osiloskoptan da izlediğim üzere bi kilitlen me oluyor kodlarımı bi aktarayım isterseniz
zaten spi kütüphanesi sizin yadıgınız kütüphane yani spi.c spi.h aynı bu da benim main kod
nerede hata yaptıgımı tam olarak bulamadım ?
#include <pic.h>
#include "delay.h" // Gecikme kütüphanesi tanımlanıyor
#include "lcd.h" // LCD kütüphanesi tanımlanıyor
#include "spi_ugur.h" // SPI kütüphanesi tanımlanıyor
#define CE1 RD0
#define CE2 RD1

unsigned char buf1[8];
unsigned char buf2[8];
unsigned char buf3[8];
unsigned char buf4[8];
unsigned char buf5[8];
unsigned char buf6[8];



unsigned char *msb1=buf1,*msb2=buf4;
unsigned char *lsb1=buf2,*lsb2=buf5;
unsigned char *control1=buf3,*control2=buf6;
unsigned char olc_ok;

void chip_on(unsigned char cs1)
{
if(cs1==1){CE1=1;}//CE2=0;}
if(cs1==2){CE2=1;}//CE2=1;}
}
void chip_off(unsigned char cs2)
{
if(cs2==1)CE1=0;
if(cs2==2)CE2=0;
}

void sicaklik_olc1()
{
	unsigned char i;
	olc_ok=0;
	spi_init();
//chip uyandırma	
	chip_on(1);
	DelayUs(20);
	spi_write(0x80);
	spi_write(0x04);
	chip_off(1);
	DelayUs(20);

//sicaklik okuma 
	chip_on(1);
	DelayUs(20);
	spi_write(0x02);
	for(i=0;i<8;i++)
	{
	buf1[i] =spi_read(0xFF);
	buf2[i] =spi_read(0xFF);
	buf3[i]=spi_read(0xFF);
	}
	chip_off(1);
	DelayUs(20);
	olc_ok=1;
	lcd_gotoxy(1,4);
	veri_yolla(*msb1/100+48);
	veri_yolla((*msb1%100)/10+48);
	veri_yolla(*msb1%10+48);
}
void sicaklik_olc2()
{
	unsigned char i;
	olc_ok=0;
	spi_init();
//chip uyandırma	
	chip_on(2);
	DelayUs(20);
	spi_write(0x80);
	spi_write(0x04);
	chip_off(2);
	DelayUs(20);

//sicaklik okuma 
	chip_on(2);
	DelayUs(20);
	spi_write(0x02);
	for(i=0;i<8;i++)
	{
	buf4[i]=spi_read(0xFF);
	buf5[i]=spi_read(0xFF);
	buf6[i]=spi_read(0xFF);
	}

	chip_off(2);
	DelayUs(20);
	olc_ok=1;
	lcd_gotoxy(1,12);
	veri_yolla(*msb2/100+48);
	veri_yolla((*msb2%100)/10+48);
	veri_yolla(*msb2%10+48);
}
void main(void) // Ana fonksiyon alanı
{	unsigned char i;
	ADCON1=0x07;
	TRISB=0x00; // LCD için çıkıs
	TRISC=0x10;
	TRISD=0x00;PORTD=0x00;
	chip_off(5);
	lcd_init(); // LCD ilk ayarları yapılıyor

	lcd_yaz("S1:");lcd_gotoxy(1,9);lcd_yaz("S2:");

	for(;;)
	{
	sicaklik_olc1();
	sicaklik_olc2();
	
	}
}


birde sizin yaptıgınız da da yine birini secip birini okuyoruz yanlış anlamadıysam ben lcd de baktıgımda sicaklik1=29 sicaklik2=33 ü görmek istiyorum ama su an gerçekleştiremedim.

keep learning . . .

izwirlee_35

haklısın ama deniyorum deniyorum olmuyo böle şeyler de koyayım her seferinde tekrar ayar yapılsın dedim.birde birinci sensörden okuduktan sonra DelayMs(250); koyuyorum sonra ikinci sensörden okumaya çalışıyorum ama yine olmuyor acaba lcd ye yazdırırken mi sorun var ?
keep learning . . .

izwirlee_35

bakan okuyan fikir verecek birisi yok mu acaba?
keep learning . . .

MUSHACK

Kodunuza biraz baktımda main fonk. da kullanmış olduğunuz chip_off(5); kodunuzda bir deadlock a neden olabilir. çünkü chip_off() fonk. 1 ve 2 için tanımlamışsınız. ;)
Vatan için kan lazımsa eğer; Dünyanın şah damarını keseriz.......C*_C*_C*

StDarg

merhaba;
TC72 sıcaklık sensörü ile uygulama yapıyorum fakat şu olayları anlayamadım
-idle durumu nedir? TC72 sensörünün idle durumu düşük seviyedeymiş bunu nasıl anladık bu konularda yardımcı olursanız sevinirim.