Jag testar först tolka dessa som vanliga digitala. Sedan testar jag med SPI interfaceSynesthesia skrev:Ja du kan sätta MOSI, SCK, och MISO som portpinnar (GPIO09..GPIO11) istället för att använda SPI-interfacet och sätta dom höga/låga varför sig som du vill.
Några frågor om MCP3008 ADC
Re: Några frågor om MCP3008 ADC
Re: Några frågor om MCP3008 ADC
Nu har jag lite problem med min kod - tror jag.
Jag får bara 0 på variabeln temperatur, oavsett om jag kopplar CH0 till VCC eller CH1 till GND. Det är som att den inte känner utav. Som jag inte får något svar.
Här är mina filer. Jag kallar dem .plc i filformat här. Det är relativ enkelt kod att fälja. temperatur.plc har en variabel som ska antingen bli 0 eller 1023 beroende på hur jag kopplar kanal CH1 till VCC eller GND. I temperatur.plc finns det en funktion som heter SPI. Denna funktion anropas med argumentet input := FALSE;
I SPI.plc så testas om variabeln input är FALSE i en IF-sats. Om det är så så följ koden. Börja räkna koden igenom en while-sats och kolla om CLK är FALSE eller TRUE. Om CLK går ifrån FALSE till TRUE så ska COUNT adderas med 1, men om CLK går ifrån FALSE -> FALSE eller TRUE -> TRUE så händer det inget med COUNT.
För varje COUNT så betyder det att CLK har just blivit låg och då ska en ny bit skickas eller tas emot.
Efter en array vid namn tempBit som innehåller 11 stycken booleanska värden så skickas den till ASCII.plc där en enkel FOR-loop konverterar 10101011010101 till ett decimaltal.
Här är min koppling.
temperatur.plc
SPI.plc
ASCII.plc
Jag får bara 0 på variabeln temperatur, oavsett om jag kopplar CH0 till VCC eller CH1 till GND. Det är som att den inte känner utav. Som jag inte får något svar.
Här är mina filer. Jag kallar dem .plc i filformat här. Det är relativ enkelt kod att fälja. temperatur.plc har en variabel som ska antingen bli 0 eller 1023 beroende på hur jag kopplar kanal CH1 till VCC eller GND. I temperatur.plc finns det en funktion som heter SPI. Denna funktion anropas med argumentet input := FALSE;
I SPI.plc så testas om variabeln input är FALSE i en IF-sats. Om det är så så följ koden. Börja räkna koden igenom en while-sats och kolla om CLK är FALSE eller TRUE. Om CLK går ifrån FALSE till TRUE så ska COUNT adderas med 1, men om CLK går ifrån FALSE -> FALSE eller TRUE -> TRUE så händer det inget med COUNT.
För varje COUNT så betyder det att CLK har just blivit låg och då ska en ny bit skickas eller tas emot.
Efter en array vid namn tempBit som innehåller 11 stycken booleanska värden så skickas den till ASCII.plc där en enkel FOR-loop konverterar 10101011010101 till ett decimaltal.
Här är min koppling.
Kod: Markera allt
VDD 3.3V
VREF 3.3V
AGND GROUND
CLK GPIO26 - input
DOUT GPIO19 (MISO) - input
DIN GPIO13 (MOSI) - output
CS GPIO17 - output
DGND GROUND
Kod: Markera allt
PROGRAM Temperatur
VAR
// Temperaturvariabel
temperatur: REAL;
input: BOOL;
END_VAR
// Kalla på temperatursensorn hos CH0 på MCP3008.
input := FALSE;
temperatur := SPI(input);
Kod: Markera allt
FUNCTION SPI : INT
VAR_INPUT
input: BOOL;
END_VAR
VAR
temperature: REAL;
// counter
COUNT: INT;
// Array
tempBit: ARRAY [0..11] OF BOOL;
// Flagga
FLAG: BOOL;
END_VAR
// OM CS är FALSE så börjar CLK ticka.
IF input = FALSE THEN
// Börja räkna CLK till 17
// Sätt en räknare och en flagga
COUNT := 0;
FLAG := TRUE;
// Gör så CS är FALSE.
GVL.CS := input;
WHILE COUNT <= 17 DO
IF GVL.CLK = FALSE THEN
// Om CLK är FALSE
FLAG := TRUE; // Lås upp.
IF COUNT = 0 THEN
// Skicka startbit
GVL.MOSI := TRUE;
ELSIF COUNT = 1 THEN
// Skicka SGL/DIFF bit
GVL.MOSI := TRUE;
ELSIF COUNT = 2 THEN
// Skicka D2
GVL.MOSI := FALSE;
ELSIF COUNT = 3 THEN
// Skicka D1
GVL.MOSI := FALSE;
ELSIF COUNT = 4 THEN
// Skicka D0
GVL.MOSI := FALSE;
// COUNT 5 är bara ett mellanrum
ELSIF COUNT = 6 THEN
// Ta emot Null bit
tempBit[0] := GVL.MISO;
ELSIF COUNT = 7 THEN
// Ta emot B9
tempBit[1] := GVL.MISO;
ELSIF COUNT = 8 THEN
// Ta emot B8
tempBit[2] := GVL.MISO;
ELSIF COUNT = 9 THEN
// Ta emot B7
tempBit[3] := GVL.MISO;
ELSIF COUNT = 10 THEN
// Ta emot B6
tempBit[4] := GVL.MISO;
ELSIF COUNT = 11 THEN
// Ta emot B5
tempBit[5] := GVL.MISO;
ELSIF COUNT = 12 THEN
// Ta emot B4
tempBit[6] := GVL.MISO;
ELSIF COUNT = 13 THEN
// Ta emot B3
tempBit[7] := GVL.MISO;
ELSIF COUNT = 14 THEN
// Ta emot B2
tempBit[8] := GVL.MISO;
ELSIF COUNT = 15 THEN
// Ta emot B1
tempBit[9] := GVL.MISO;
ELSIF COUNT = 16 THEN
// Ta emot B0
tempBit[10] := GVL.MISO;
ELSIF COUNT = 17 THEN
// Sätt CS till TRUE - Stäng av
GVL.CS := TRUE;
END_IF
ELSE
// Om CLK är TRUE
IF FLAG = TRUE THEN
COUNT := COUNT + 1; // Räkna
FLAG := FALSE; // Lås!
END_IF
END_IF
END_WHILE
// Nu är data mottaget. Räkna ut det nu!
SPI := ASCII(tempBit);
END_IF
Kod: Markera allt
FUNCTION ASCII : INT
VAR_INPUT
tempBit: ARRAY [0..11] OF BOOL;
END_VAR
VAR
i: INT;
// Summa
SUM: INT;
A: INT;
END_VAR
FOR i := 0 TO 11 BY 1 DO
IF tempBit[i] = TRUE THEN
A := 1;
ELSE
A := 0;
END_IF
SUM := SUM + A*POW(2, 11-i);
END_FOR
ASCII := SUM;
Senast redigerad av Al_Bundy 6 juni 2016, 11:48:52, redigerad totalt 3 gånger.
Re: Några frågor om MCP3008 ADC
Du har troligen missat att SPI kan gå i fyra olika sins emellan mer eller mindre inkompatibla Moder.
https://en.wikipedia.org/wiki/Serial_Pe ... erface_Bus
Det som skiljer dem åt är Klockans polaritet, dvs om den är vilande nolla eller etta samt om data samplas på främre eller bakre flanken.
Du måste alltså fastställa vilken Mode din SPI-krets använder och sedan konfigurera processorn i enlighet med detta (eller om du använder SW-SPI så måste ditt program emulera detta)
https://en.wikipedia.org/wiki/Serial_Pe ... erface_Bus
Det som skiljer dem åt är Klockans polaritet, dvs om den är vilande nolla eller etta samt om data samplas på främre eller bakre flanken.
Du måste alltså fastställa vilken Mode din SPI-krets använder och sedan konfigurera processorn i enlighet med detta (eller om du använder SW-SPI så måste ditt program emulera detta)
Re: Några frågor om MCP3008 ADC
Och hur gör jag det i Codesys?
Jag som trodde SPI var enkelt och inga krångligheter.
Det enda jag gör är att jag sätter CS som låg och sedan så kollar jag om CLK är hög eller låg och där efter räknar när CLK går ifrån låg till hög.

Jag som trodde SPI var enkelt och inga krångligheter.
Det enda jag gör är att jag sätter CS som låg och sedan så kollar jag om CLK är hög eller låg och där efter räknar när CLK går ifrån låg till hög.
Re: Några frågor om MCP3008 ADC
Och är det AD-omvandlaren som är SPI-master? Och därmed ger klockpulserna...
De gångar jag har använd SPI är det alltid µC'n som är mastern och ger klock-pulserna.
SPI är enkelt, det är du som krånglar.
De gångar jag har använd SPI är det alltid µC'n som är mastern och ger klock-pulserna.
SPI är enkelt, det är du som krånglar.
Re: Några frågor om MCP3008 ADC
Vänta lite! Ni menar att det är min paj som ger clockpulser ? Och inte tvärt om?Icecap skrev:Och är det AD-omvandlaren som är SPI-master? Och därmed ger klockpulserna...
De gångar jag har använd SPI är det alltid µC'n som är mastern och ger klock-pulserna.
SPI är enkelt, det är du som krånglar.
ADCn är slaven. Och pajen är mastern.
Jo. Jag vet att jag krånglar.
Re: Några frågor om MCP3008 ADC
Men så min paj ska pulsera till ADCn?
Jag trodde att när CS är låg så börjar ADCN pulsera till CLK på mastern.
Jag trodde att när CS är låg så börjar ADCN pulsera till CLK på mastern.
Re: Några frågor om MCP3008 ADC
Blockdiagrammet på sidan 1 av MCP3008 så ser man pilen innåt på alla utom data out.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: Några frågor om MCP3008 ADC
Jaha. Då är det bara skriva om koden.
Tror ni det går bra om man har 100 ms för varje puls?
Totalt 200 ms för en cykel.
Det står i databladet minst 100 ns, men jag kan inte ha en delay i 100 ns på min plc.
Tror ni det går bra om man har 100 ms för varje puls?
Totalt 200 ms för en cykel.
Det står i databladet minst 100 ns, men jag kan inte ha en delay i 100 ns på min plc.
Re: Några frågor om MCP3008 ADC
SPI kan i princip köras från några få Hz upp till flera MHz, dock får du titta i databladen vilka restriktioner som finns.
Re: Några frågor om MCP3008 ADC
Har inte codesys färdigt exempel för MCP3008?
http://store.codesys.com/codesys-contro ... re=default
Typ:
'c:\Users\<YourWindowsUserName>\CODESYS Control for Raspberry PI\2.1.1.0\MCP3008Temperature.project'
Har du hittat detta? http://forum.codesys.com/viewtopic.php?f=23&t=6247
http://store.codesys.com/codesys-contro ... re=default
Typ:
'c:\Users\<YourWindowsUserName>\CODESYS Control for Raspberry PI\2.1.1.0\MCP3008Temperature.project'
Har du hittat detta? http://forum.codesys.com/viewtopic.php?f=23&t=6247
Re: Några frågor om MCP3008 ADC
Jag har kollat på detta och testat det. Jag har dock inte fått detta fungera för att jag har lagt mer tid på att försöka bygga en SPI ifrån grunden.Micke_s skrev:Har inte codesys färdigt exempel för MCP3008?
http://store.codesys.com/codesys-contro ... re=default
Typ:
'c:\Users\<YourWindowsUserName>\CODESYS Control for Raspberry PI\2.1.1.0\MCP3008Temperature.project'
Har du hittat detta? http://forum.codesys.com/viewtopic.php?f=23&t=6247

Jag har skrivit om min kod och nu så ska jag testa den. Återkommer.
Re: Några frågor om MCP3008 ADC
Kan jag inte köra 100 ms som CLK låg och 100 ms som CLK hög?TomasL skrev:SPI kan i princip köras från några få Hz upp till flera MHz, dock får du titta i databladen vilka restriktioner som finns.
Re: Några frågor om MCP3008 ADC
Det står fortfarande i databladet. Det är ganska säkert angivit minimum och maximum tid/frekvens.