SPI mezi DS1722 a PIC16F690-čidlo stále vrací stejné hodnoty

Dobrý den,snažíme se s kolegou rozchodit SPI mezi DS1722 a PIC16F690, dle oscil.jsou odchozí signály do čidla OK, bohužel to nám vrací neustále se opakující 3 hodnoty zcela nesouvisející s teplotou.Nemáte v rukávu nějaký "C"kod pro tuto aplikaci, popř. podobný??Každá rada se hodí, moc děkuji Tim

:arrow_right: administrator: přejmenováno z "SPI DS1722 a PIC16F690"

Budeš sem muset vložit kód, ať vidíme jak to máš napsané.

init DS1722 :question: :question: :question: :question: :question:
dík
initDS1722.txt.txt (1.07 KB)

dobry den,
tento kod jsem nijak zvlast nestudoval ale nemohlo by to delat vypinani modulu spi?? Kdyz ho vypnete modul se odpoji a na pin SCK a SDO ma pristup regist portu. jako prvni bych to zkusil vyremovat.

tohle je poslední varianta kodu, v prvni fazi jsme modul spi nevypínali,hodnoty se vracely pokaždé jiné, po vypínání spi se stale opakují, bohužel žádná z nich nereaguje na změny teploty DS.Datasheet jsme už prošli několikrát a ne a ne najít tu chybičku,kterou děláme.Chtělo by to praktika-odborníka na DS1722 nebo SPI : :frowning:

Jeste bych zkusil dat pauzu na mereni klidne 1s (myslim, ze vycitat data a nedavat cas na mereni neni moudre…) a presvedcil bych se zda je na pinu 7 (SERMODE) privedeno nap napeti .

Zkoušel jsem komunikaci SPI s ATmega16 a teploměrem TC72(nastavení má podobné jako DS1722).

Také mi to stále nechtělo správně fungovat, dokud jsem nenastavil CPHA = 1.

void Init_SPI(void)
{
	DDRB = 0b10110000;					//nastvení PORTB...PB7(SCK) a PB5(SDI),PB4(CE) výstup
										// PB6(SDO) vstup 
	PORTB = 0b00000000;
	CE_Low;								//CE = 0

//SPE = 1;MSTR = 1;CPHA = 1;SCK = 1:16(1MHz). CPHA = 1 - Data vzorkována sestupnou hranou SCK
	SPCR = 0b01010101;
}


int Read_SPI(void)
{
	SPDR = 0x00;						//naplnění registru SPDR 
	SPSR&=~(1<<SPIF);					//nulování příznaku konec přenosu
	while(!(SPSR&(1<<SPIF)));			//čekání na konec přenosu 
	return SPDR;
}

void Write_SPI(unsigned char Wdata)
{
	SPDR = Wdata;						//zápis dat do registru SPI
	SPSR&=~(1<<SPIF);					//nulování příznaku konec přenosu
	while(!(SPSR&(1<<SPIF)));			//čekání na konec přenosu
}


//========================================
//  Hlavní program
//========================================
int main()
{		
	Lcd_Init();							//Inicializace LCD
	Init_SPI();							//Inicializace SPI
//========================================
//	Smyčka					
//======================================== 	
  while(1)
 	{

		CE_High;						//CE = 1
		_delay_us(5);

		Write_SPI(128);					//Adresa pro zápis do TC72
		Write_SPI(0b00000100);			//zapsání controlního byte

		_delay_us(5);
		CE_Low;							//CE = 0

		_delay_ms(200);					//čekání > 150ms(převod teploty)

		CE_High;						//CE = 1
		_delay_us(5);

//Načtení obsahu adres 0x01 a 0x02
		Write_SPI(2);					//Adresa pro čtení 
		MSB = Read_SPI();				//čtení MSB
		LSB = Read_SPI(); 				//čtení LSB

		_delay_us(5);
		CE_Low;							//CE = 0

		teplota = (MSB<<8)|LSB;

Je to sice kód pro ATmega, ale snad to pomůže. :slight_smile:
Test SPI.gif

Tak jsem zkusil připojení TC72 k PIC16F690 a funguje mi to takto zapojené a s přiloženým kódem.
PIC16F690 s TC72(SPI na osciloskopu).gif
Schéma PIC16F690 a TC72(SPI komunikace).gif
SPI_Teplomer.c (7.42 KB)

… tak tomu říkám profesionální odpovědˇ
super ,super, super - moc děkuju
to CPHA jsme v datsheetu četli pořád dokola a nemohli jsme to pořádně pochopit . Jakmile se kolega vratí z dovolené hned to otestujem.
Tento příklad snad uspěšně využijem i v další fázi projektu -
SPI kom. pomocí RFM modulu.Ve výsledku by to měly být dálkové přenosy
teplot do centrály.
Ještě jeden dotaz - v čem to simulujete ???
Mám Multisim 11 , ale v knihovnách je bídná nabídka PICů…
Jěště jednou moc dík za informace, popř i za odpovědˇ

Simulace je pomocí programu Isis Proteus.