Några frågor om MCP3008 ADC

Övriga diskussioner relaterade till komponenter. Exempelvis radiorör, A/D, kontaktdon eller sensorer.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Några frågor om MCP3008 ADC

Inlägg av Al_Bundy »

Icecap skrev:Det står fortfarande i databladet. Det är ganska säkert angivit minimum och maximum tid/frekvens.
Fast nu sitter jag på en Codesys PLC jag jag tror inte manskap ange någon sådan frekvens i programmet. Man får helt enkelt köra med klassisk algoritm.

Jag startade programmet nu och jag märkte att det fungerade inte. Det mest konstiga var att CLK är konstant TRUE hela tiden. Jag testade sätta en delay på 5 sekunder för att kolla om lampan blinkar. Nej. Den lyser med fast sken.

CS och CLK är TRUE hela tiden, vilket är märkligt. Oavsett om jag sätter T#100MS till T#5S så är det samma sak hela tiden. Jag får inga errors eller liknande. COUNT är fortfarande 0.

Kod: Markera allt


FUNCTION SPI : INT
VAR_INPUT
	input: BOOL;
END_VAR
VAR
	// Räknare
	COUNT: INT;
	// Array tempBit
	tempBit: ARRAY [0..11] OF BOOL; 
	// Delay
	DELAY: TON;
	DELAY_Start: BOOL;
END_VAR
 


// OM CS är FALSE så börjar CLK ticka. 

IF input = FALSE THEN	
	// Sätt CS till FALSE.
	GVL.CS := input;
	// Skapa en räknare
	COUNT := 0;
	
	// Loppa 17 gånger
	WHILE COUNT <= 17 DO
		// Sätt CLK till FALSE.
		GVL.CLK := FALSE;
		
		IF COUNT = O THEN
			// Sätt MOSI till TRUE - Startbit
			GVL.MOSI := TRUE;
		ELSIF COUNT = 1 THEN
			// Sätt MOSI till TRUE - SGL/DIFF
			GVL.MOSI := TRUE;
		ELSIF COUNT = 2 THEN
			// Sätt MOSI till FALSE - D2
			GVL.MOSI := FALSE;
		ELSIF COUNT = 3 THEN
			// Sätt MOSI till FALSE - D1
			GVL.MOSI := FALSE;
		ELSIF COUNT = 4 THEN
			// Sätt MOSI till FALSE - D0
			GVL.MOSI := FALSE;
		ELSIF COUNT = 5 THEN
			// Utför inget
		ELSIF COUNT = 6 THEN
			// Null bit
			tempBit[0] := GVL.MISO;
		ELSIF COUNT = 7 THEN
			// B9
			tempBit[1] := GVL.MISO;
		ELSIF COUNT = 8 THEN
			// B8
			tempBit[2] := GVL.MISO;
		ELSIF COUNT = 9 THEN
			// B7
			tempBit[3] := GVL.MISO;
		ELSIF COUNT = 10 THEN
			// B6
			tempBit[4] := GVL.MISO;
		ELSIF COUNT = 11 THEN
			// B5
			tempBit[5] := GVL.MISO;
		ELSIF COUNT = 12 THEN
			// B4
			tempBit[6] := GVL.MISO;
		ELSIF COUNT = 13 THEN
			// B3
			tempBit[7] := GVL.MISO;
		ELSIF COUNT = 14 THEN
			// B2
			tempBit[8] := GVL.MISO;
		ELSIF COUNT = 15 THEN
			// B1
			tempBit[9] := GVL.MISO;
		ELSIF COUNT = 16 THEN
			// B0
			tempBit[10] := GVL.MISO;
		ELSIF COUNT = 17 THEN
			// Sätt CS som TRUE.
		    GVL.CS := TRUE;
		END_IF
		
		// Vänta 100 ms
		DELAY(IN := DELAY_Start, PT:= T#100MS); 
		// Sätt CLK till TRUE.
		GVL.CLK := TRUE;
		// Vänta 100 ms
		DELAY(IN := DELAY_Start, PT:= T#100MS); 
		
		// Räkna
		COUNT := COUNT + 1;
	END_WHILE
	
	// Nu är data mottaget. Räkna ut det nu!
	SPI := ASCII(tempBit);
END_IF



Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Några frågor om MCP3008 ADC

Inlägg av Magnus_K »

IF COUNT = O THEN

Det ser ut som bokstaven O och inte siffran 0. Det kanske orsakar att räknaren inte startar?

EDIT: Rättstavning
Senast redigerad av Magnus_K 6 juni 2016, 16:55:24, redigerad totalt 1 gång.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Några frågor om MCP3008 ADC

Inlägg av Al_Bundy »

Magnus_K skrev:IF COUNT = O THEN

Det ser ut som bokstaven O och inte siffran 0. Det kanske orsakar räknaren att inte starta?
Tyvärr. Jag slant med fingret. Det blir samma sak när jag har en nolla där :) men tackar för upplysningen.

Jag satt in en while loop på temperature.plc..Nu verkar det hända något :)
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46931
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Några frågor om MCP3008 ADC

Inlägg av TomasL »

Varför har du CS som ingång?
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Några frågor om MCP3008 ADC

Inlägg av Al_Bundy »

TomasL skrev:Varför har du CS som ingång?
Jag har fått det snörre på riktigt bra nu :tumupp:

Men dessvärre så svarar inte min ADC något. Jag tror med att jag har antagit att en digital GPIO kan spotta ut 3.3 volt. Det kunde den tydligen inte.

När jag brukar tända lysdioder så brukar jag sätta en GPIO som input. Sedan en LED mellan en GIPO och VCC.

Men jag kanske har fel?

Just nu så är CS en output. Jag har testat satt en LED mellan CS och GND och det händer inget. Men jag ser på min datorskärm att CS blir sant och falsk.
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Några frågor om MCP3008 ADC

Inlägg av Icecap »

Nej, du ser inte att CS växlar läge, du ser att den registerbit som ska vara CS växlas.

Jag är ganska säker på att du helt enkelt inte gör det som ska göras för att kretsen ska svara.
När jag är i det läge verifierar jag att pinnarna gör exakt som jag har tänkt, detta sker med oscilloskop eller LED.
Därefter testar jag input för att se om de ändrar läge i avläsningen.

När dessa saker är verifierat - och det fortfarande inte fungerar - kan jag skylla resten på att jag har gjort fel i programmeringen varför jag tar tag i datablad och går igenom steg för steg.

Din kod framstår för mig som djupt olämplig och något som kan minskas ner till fattbara funktioner - men det är ditt val, jag har försökt att ge tips tidigare och för att ta ett dansk uttryck: "Det er spildte Guds ord på Balle-Lars".
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Några frågor om MCP3008 ADC

Inlägg av Al_Bundy »

Icecap skrev:Nej, du ser inte att CS växlar läge, du ser att den registerbit som ska vara CS växlas.

Jag är ganska säker på att du helt enkelt inte gör det som ska göras för att kretsen ska svara.
När jag är i det läge verifierar jag att pinnarna gör exakt som jag har tänkt, detta sker med oscilloskop eller LED.
Därefter testar jag input för att se om de ändrar läge i avläsningen.

När dessa saker är verifierat - och det fortfarande inte fungerar - kan jag skylla resten på att jag har gjort fel i programmeringen varför jag tar tag i datablad och går igenom steg för steg.

Din kod framstår för mig som djupt olämplig och något som kan minskas ner till fattbara funktioner - men det är ditt val, jag har försökt att ge tips tidigare och för att ta ett dansk uttryck: "Det er spildte Guds ord på Balle-Lars".
Jaha. Så det jag ser på skärmen behöver inte nödvändigtvis hända i verkligheten?

Jag är mycket säker på att jag inte har rätt kommunikation.

Okej. Steg 1 för mig är att verifiera om signalerna ändras med tiden, precis som på skärmen.

Hur skulle du skriva programmet som?
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Några frågor om MCP3008 ADC

Inlägg av Icecap »

"Hur skulle du skriva programmet som?"

Det är sånt jag tar betalt för att göra.

Men lite tips:
Om man reserverar t.ex. en WORD (16 bit variabel) kan man enkelt läsa in värdet i den: (C-kod, enkelt att Pascal'isera)

Kod: Markera allt

WORD Result;
Result = 0;
for(X = 0; X < 11; X++)
  {
  Clk = true;
  Result <<= 1;
  if(Din) Result++;
  Clk = false;
  }
Förutsättning:
11 bits ska läsas in.
Kommando till AD-omvandlaren skickas separat.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Några frågor om MCP3008 ADC

Inlägg av Al_Bundy »

Jag tror jag har hittat problemet varför det inte fungerar för mig.

Om jag hör en enkel while loop.

While True DO
Lampa hög.
Vänta 5 sekunder
Lampa låg
Vänta 5 sekunder
End while

Då tänds lampan konstant eller släks konstant.

Men skulle jag bara säga lampa hög , utan while loopen, så tänds lampan och jag kan enkelt ändra värdet på lampan från hög till låg.

Jag misstänker att programmet fungerar så att det måste köras klart först innan den kan säga åt till PLC "okej. Jag har gått igenom programmet och så här lyder det. Åh 1 och 2 Hej och hå *militärparadmusik*"

Eller vad tror ni? Jag kan manuellt redigera variablernas värden. Det känns ju inte som det skulle vara något för mig. Jag vill ju bränna in koden i min PLC och sedan se på skärmen om vad dom händer.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Några frågor om MCP3008 ADC

Inlägg av Al_Bundy »

Nu har jag fått svar på mitt problem.

Om jag tar ett exempel. PLC programmering fungerar lite annorlunda. Hos min PLC så finns det ett program som heter Task. Det programmet anropar andra typer av program i följdordning och dessa program anropas vid vissa intervaller.

Det fungerar inte att sätta en while loop mitt i programmet och sedan vidareutvecklar man kod i den loopen, precis som man gör i Arduino/AVR.

Det fungerar inte heller att jag har ett program som loopar 1 gång per sekund. Programmet säger lampa PÅ. Samtidigt som jag har ett annat program som också loopar 1 gång per 5te sekund, fast i prioritet 2, som säger lampa AV.

Då blir det "Chanel Application.GPIO17 is already used in another task. Signal May be overwritten".

Alltså måste jag tänka lite annorlunda här än klassisk C programmering.

Orsak: ringrostig
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46931
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Några frågor om MCP3008 ADC

Inlägg av TomasL »

Orsak är nog okunnighet, om det mesta.
Nej man behöver inte tänka annorlunda, eftersom det är logiken som skapar programmet, oavsett vilket språk man skriver i.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Några frågor om MCP3008 ADC

Inlägg av Al_Bundy »

Jag hade gjort en while loop som sköter exakt allt istället för att dela upp programmet i olika delar.

Typ ett program som ständigt skickar hög och låg signal till ADCN.t.ex klockan CLK.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Några frågor om MCP3008 ADC

Inlägg av Al_Bundy »

Jag har fått det fungera nu och jag läser utav en analog emperaturgivare också :) :D

Alldeles eget SPI bygge.
Användarvisningsbild
tecno
Inlägg: 27248
Blev medlem: 6 september 2004, 17:34:45
Skype: tecnobs
Ort: Sparreholm, Södermanland N 59° 4.134', E 16° 49.743'
Kontakt:

Re: Några frågor om MCP3008 ADC

Inlägg av tecno »

Alldeles eget SPI bygge
Dela med dig och visa vad du har åstadkommit.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Några frågor om MCP3008 ADC

Inlägg av Al_Bundy »

tecno skrev:
Alldeles eget SPI bygge
Dela med dig och visa vad du har åstadkommit.
Det ska jag!
Jag har faktiskt en blogg där jag lägger upp mina saker. Jag kan länka några bilder ifrån den när jag har lagt upp det.

Just nu så ska jag ersätta min LM35 med PT100 och INA128 :)
Skriv svar