Problem med SPI mellan Pic18 och MAX6675

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
Henke9216
Inlägg: 19
Blev medlem: 6 maj 2013, 22:46:17

Problem med SPI mellan Pic18 och MAX6675

Inlägg av Henke9216 »

Tjenare
Sitter och skriver kod till min krets men har kört fast på SPI. Jag får igång kommunikationen men får inte ut rätt temperatur när kör simuleringar. Eftersom MAX6675 skickar två byte varav bara 12 bit innehåller mätdata så måste jag bit-shifta vilket jag inte får att fungera. Har försökt läsa på så mycket som möjligt och när jag kollar med en SPI debugger i simuleringen så får jag inte ut något rimligt värde på temperaturen.
Vad gör jag för fel?
Om jag sätter en temp på 177 så motsvarar det 200 i picen och en temp på 279 motsvarar 300.
Men om jag sätter "Ambient Temp." i max6675 till 0 istället för 25 så får jag ett spel på ca +4 grader.

Min kod:

Kod: Markera allt

void init_temp(void) 
{ 
	TC_CS =0;	// Slave select 
	TC_DATA =0;	
	TC_CLK =0;
	OpenSPI(SPI_FOSC_64, MODE_01, SMPEND);
	TC_CS =1;	// Slave select
	read_temp();
} 

void read_temp(void) 
{ 
	unsigned int Data,Temp;
	unsigned char DataH,DataL;

	
	TC_CS =0;	// Slave select  
	DelayMs(16);
	DataH = ReadSPI();
	DataL = ReadSPI();
	TC_CS =1;	// Slave select
	DelayMs(1);
	Data = ((unsigned int)DataH << 8) +DataL;
	Data = Data>>3;
	Temp = (unsigned int)(Data/4);
	
	if(Temp == 200){
		LED = 1;
	} 
	else LED = 0;
}
monstrum
Inlägg: 620
Blev medlem: 13 januari 2005, 05:38:32
Ort: Göteborg

Re: Problem med SPI mellan Pic18 och MAX6675

Inlägg av monstrum »

Att få 200 då temperaturen är 177 grader låter ju rimligt. 177 + rumstemp borde ju kunna vara 200.
Samma med att läsa av 300 vid 279 grader.

Vad menar du med att du sätter "Ambient Temp." i kretsen?
monstrum
Inlägg: 620
Blev medlem: 13 januari 2005, 05:38:32
Ort: Göteborg

Re: Problem med SPI mellan Pic18 och MAX6675

Inlägg av monstrum »

Henke9216 skrev:

Kod: Markera allt

void init_temp(void) 
	if(Temp == 200){
		LED = 1;
	} 
	else LED = 0;
}
Verkar skumt att jämföra med exakt 200. Låter som att det kan vara svårt att testa i praktiken.
Henke9216
Inlägg: 19
Blev medlem: 6 maj 2013, 22:46:17

Re: Problem med SPI mellan Pic18 och MAX6675

Inlägg av Henke9216 »

Har endast kört simuleringar på kretsen än så länge därav led delen. Ska bara läsa av temperaturen men leden är ett sätt att kontrolera om det stämmer vid simulering och inte i praktiken.
monstrum
Inlägg: 620
Blev medlem: 13 januari 2005, 05:38:32
Ort: Göteborg

Re: Problem med SPI mellan Pic18 och MAX6675

Inlägg av monstrum »

Ja då är det ju en annan sak. Hade ingen aning om att man kunde simulera en PIC körandes kod mot hårdvara.
Men eftersom det funkar med 25 grader rumstemp så är det ju i alla fall inte fel på din kod då den inte ens har någon möjlighet att ha kännedom om den.
Du bör testa detta på riktigt hårdvara istället.
Henke9216
Inlägg: 19
Blev medlem: 6 maj 2013, 22:46:17

Re: Problem med SPI mellan Pic18 och MAX6675

Inlägg av Henke9216 »

Jag använder Proteus ISIS 7 Professional.
Den max6675 mäter ju spänningen från termoelementet och kompenserar bort olika faktorer genom att mäta temperaturen på sig själv," Ambient temp". Den gör sedan om detta till celcius som skickas via spi till picen.

Har testat mig fram lite och sett att det måste vara något fel i min kod.
Datan som fås ur max6675 är via teoretisk beräkning motsvarar inte den som fås i temp variabeln på picen.
Någon som har en ide om vad som är fel med bit-shiftingen?
monstrum
Inlägg: 620
Blev medlem: 13 januari 2005, 05:38:32
Ort: Göteborg

Re: Problem med SPI mellan Pic18 och MAX6675

Inlägg av monstrum »

Förutsätter att klockpolaritet osv stämmer.

Det ser dock märkligt ut i din init-funktion. Varför håller du på och togglar CS-pinnen sådär? Den borde sättas till idle-state och vara så tills du ropar på read_temp.
Det finns nu ingen delay från att du sätter CS hög tills du drar den låg igen.

Det ser även helt onödigt ut att ha en delay efter att du läst ut temperaturen ur chippet.
Henke9216
Inlägg: 19
Blev medlem: 6 maj 2013, 22:46:17

Re: Problem med SPI mellan Pic18 och MAX6675

Inlägg av Henke9216 »

Delayen du önskar är på 16ms. Chipet är inversen av du beskriver, den skickar data när cs är låg. Ok blir att slopa den lilla delayen. Ska gå igenom bit-shiftningen steg för steg för hand och se om det är något fel.
Användarvisningsbild
SeniorLemuren
Inlägg: 8371
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Problem med SPI mellan Pic18 och MAX6675

Inlägg av SeniorLemuren »

Kolla denna länk. Där finns även fler länkar om MAX6675
Användarvisningsbild
baron3d
EF Sponsor
Inlägg: 1352
Blev medlem: 1 oktober 2005, 23:58:43
Ort: Torestorp

Re: Problem med SPI mellan Pic18 och MAX6675

Inlägg av baron3d »

Du sätter inte CS till utgång någon stans.
Du skriver inte något , WriteSPI(), till innan ReadSPI().

Om du lägger till detta så kanske det fungerar.
(Tips: RTFM)
Henke9216
Inlägg: 19
Blev medlem: 6 maj 2013, 22:46:17

Re: Problem med SPI mellan Pic18 och MAX6675

Inlägg av Henke9216 »

Nu när du nämner det då är det helt möjligt att TC_DATA är satt till en utgång :oops:
Henke9216
Inlägg: 19
Blev medlem: 6 maj 2013, 22:46:17

Re: Problem med SPI mellan Pic18 och MAX6675

Inlägg av Henke9216 »

Verkar som jag har löst problemet nu :D Funkar vid simulering iallafall.
Hade missat att sätta TC_DATA till en ingång och det verkar som att spi debuggern i programmet fungerar kasst.
Nu har jag kontrollerat 10 temp från 0 till 1000 och får någon grad fel på de högre i simuleringen vilket verkar helt rimligt.

Tack för hjälpen!
Skriv svar