Sida 3 av 3
Re: Några frågor om MCP3008 ADC
Postat: 6 juni 2016, 15:41:36
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
Re: Några frågor om MCP3008 ADC
Postat: 6 juni 2016, 16:16:17
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
Re: Några frågor om MCP3008 ADC
Postat: 6 juni 2016, 16:52:34
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

Re: Några frågor om MCP3008 ADC
Postat: 6 juni 2016, 17:04:22
av TomasL
Varför har du CS som ingång?
Re: Några frågor om MCP3008 ADC
Postat: 6 juni 2016, 18:00:45
av Al_Bundy
TomasL skrev:Varför har du CS som ingång?
Jag har fått det snörre på riktigt bra nu
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.
Re: Några frågor om MCP3008 ADC
Postat: 6 juni 2016, 18:17:06
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".
Re: Några frågor om MCP3008 ADC
Postat: 6 juni 2016, 18:30:31
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?
Re: Några frågor om MCP3008 ADC
Postat: 6 juni 2016, 19:22:59
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.
Re: Några frågor om MCP3008 ADC
Postat: 6 juni 2016, 20:05:56
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.
Re: Några frågor om MCP3008 ADC
Postat: 6 juni 2016, 22:06:32
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
Re: Några frågor om MCP3008 ADC
Postat: 7 juni 2016, 00:48:58
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.
Re: Några frågor om MCP3008 ADC
Postat: 7 juni 2016, 11:12:24
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.
Re: Några frågor om MCP3008 ADC
Postat: 7 juni 2016, 15:09:26
av Al_Bundy
Jag har fått det fungera nu och jag läser utav en analog emperaturgivare också
Alldeles eget SPI bygge.
Re: Några frågor om MCP3008 ADC
Postat: 7 juni 2016, 17:52:38
av tecno
Alldeles eget SPI bygge
Dela med dig och visa vad du har åstadkommit.
Re: Några frågor om MCP3008 ADC
Postat: 7 juni 2016, 18:54:59
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
