Asynkron USART med H48C

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
port513
Inlägg: 182
Blev medlem: 20 februari 2007, 10:16:15

Inlägg av port513 »

Då är min fråga, vad skickar jag för kommando till den för att få tillbaks vRef osv?


/Henke
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Datablad för MCP3204,..

För ett *aktuellt* datablad är det bättre att ta originalet
direkt från Microchip...

MCP'n är ju alltså ett SPI device. Jag ser inte från databladet hur
man bara kan koppla ihop D-in och D-out. Verkar så här lite spontant
vara en ful-koppling för att passa Stamp'arna !?

> tittar man i timingens så borde det fungera.....

Jo det är sant, pinnen D-in är ju "don't care" under utmatningen
av själva mätvärdet på D-out.

> Då är min fråga, vad skickar jag för kommando till den för att få tillbaks vRef osv?

Allt finns i databladet för MCP'n. Det tillsammans med "databladet" för
Parallax-prylen borde räcka för att "få ihop" det.
port513
Inlägg: 182
Blev medlem: 20 februari 2007, 10:16:15

Inlägg av port513 »

Sodjan

Måste erkänna att jag frågade innan jag läst ;)

Tror nu att jag har en lösning som jag ska testa så fort tid blir över.

Tackar och bugar för alla knuffar och sådant som fått mig i rätt riktning.


/Henke
wolfz
Inlägg: 1
Blev medlem: 29 mars 2007, 22:43:34
Ort: Stockholm

Inlägg av wolfz »

Hej! Jag har precis samma problem som port513 dvs. att koppla ihop en H48C med min Atmega16 via SPI. Det jag försöker göra är något slags digitalt vattenpass som visar resultatet för användaren.

Jag har förgäves försökt lista ut det hela själv nu i en vecka till mitt skolarbete men min deadline har redan passerat nu i måndags. Läraren gav mig extra tid för att få ihop det hela men efter 4 dagar har jag fortfarande inte kommit någon vart. När jag frågade honom visste han själv inte så mycket om SPI. Tänkte att det här forumsinlägget är en gudagåva då någon tog upp samma problem som jag har men svaren har inte gett mig nått.

Jag har som Micke_s säger kopplat ihop MOSI via en 10k resistor(prövat 22k, 47k och 100k också, 100k gav ingen signal längre) till DIO. Sen har jag MISO också DIO. SCK är kopplad till CLK och SS till CS. 5V och ground är också kopplade men ZeroG har jag lämnat okopplad.

Jag har först använt en 500KHz klocka för SPI utan något timing för hur ofta jag får läsa av chippet vilket jag sen insåg var begränsat via Noisefiltret till max 200sps. Så det tror jag mig ha löst med en timead interrupt på 180Hz (lite lägre än 200Hz) när det är tillåtet att läsa av.

När jag tog med modulen till skolan för att visa upp projektet fungerade det mirakulöst nog men det var överkännsligt och helt felkalibrerat. Displayen jag använde är på 7 led och idén är att centrerat ska vara 0g. den visade 0g längst i kanten på alla axlar(Z också..?) men genom att höja kretsen i en specifik riktning typ 5-6 grader slog den över till andra sidan. och om man la upp modulen på kanten 90 grader och lutade den över fick man också samma typ av utslag på Z axeln. Så problemet trode jag bara var att den var felkalibrerad. T.ex. så anger de i parallax databladet att konstanten ska vara 0.22 för att få värdet i 0.01g och jag trode jag fick ut det i 1g. Pillade runt lite och försökte få det hela att fungera men utan att lyckas.

Jag försökte då läsa av vad det är för värden jag får av accelerometern för att kunna kalibrera om den. Då upptäckte jag det konstiga. Jag får värden heeelt på måfå! ibland inga alls.. ibland värden som verkar räkna upp och ner och bero på temperatur eller om man petade på själva accelerometern.

T.ex. står det klart och tydligt att vRef bör vara runt samma värde hela tiden dvs 2045 för en 12-bit omvanling men jag får ut ibland det ena ibland det andra och ibland värden som ändras. Samtidigt så ger axlarna helt ologiska värden och inte alls runt 2045 som de borde ge när de ligger helt still utan alltid långt under.

SPI överföringsklockan sänkte jag nu till 62,5 KHz då jag läste att parallax använder det till sina egna processorer. Men det verkar inte ha spelat roll

När jag skickar SPI påbörjar jag signalen med 0: or precis som det står i MCP3204 databladet så att det avlästa värdet hamnar rätt i minnet.

Kod: Markera allt

unsigned int readChannel(char channel){
	unsigned int spiTemp;
	
	while(!ready);					//Väntar på att få läsa av accelerometern

	PORTB =0x00;					//Sätt SS låg för att initiera SPI kommunikation
	
	SPDR = 0b00000110;  			//Skickar startbit + enkanals funktion till acc.
	while(!(SPSR & (1<<SPIF)));		//Vänta på att första 8 bitarna skickats
	spiTemp = SPDR;					//0 ställer transfer complete flaggan genom att kolla i SPDR
			
	SPDR = (channel<<6);			//Skiftar fram för att välja vilken kanal som ska läsas av
	
	//**Accelerometern börjar skicka NULL-sig. + 4 av 12 bitar till AVR samtidigt som master skickar klocka	
	
	while(!(SPSR & (1<<SPIF)));		//Vänta på första 4 bitarnas mottagning 
	spiTemp = SPDR;					//Läser av accelerometerns sänding och 0-ställer SPIF flaggan
	spiTemp &= 0x000F;				//Maskar bort oanvändbara bitar som kan ha uppkommit
	spiTemp *= 256;					//Skiftar första 8 bitarna fram så att nästa 8 bitar får plats

	SPDR = 0x00;					//skickar 0:or för att ge puls till accelerometern
	
	while(!(SPSR & (1<<SPIF)));		//Vänta på att de sista 8 bitarna mottagits
	spiTemp += SPDR;
	
	PORTB =0x10;					//Sätt SS hög för att inaktivera SPI kommunikation

	ready = 0;						//Sätter accelerometern till Busy läge tills nästa interrupt

	return spiTemp;
}

Men avläsningarna blir som sagt olika hela tiden och jag kan verkligen inte förstå varför.. är H48C trasig eller nått? ibland måste man peta igång den.. :(

Och när jag tittar på utsignalen i ett oscilloscop så verkar värdena som genereras stämma med de råa bitarna som jag visar på min display. Förutom att av någon anledning så skickar min AVR en 1:a precis mellan slutet av 2:a byten och början av 3:e som drar upp spänningen liite på accelerometern. Men det här är don't care bits så den borde ju inte reagera.

För att vara så sjuukt grundlig jag bara kan skickar jag med bilder på hur det hela ser ut samt bilder på vad oscilloscopet visar när det är kopplat till resistorn på MOSI sidan och på MISO sidan..

Bild
Bild
Bild

Vore tacksam om någon förstod nått av det här och kunde hjälpa mig.. Annars tar jag det som att jag inte har någon aning om vad jag håller på med och borde leka med lego istället..

/Alex
Skriv svar