Is het mogelijk om met 'mikroC Pro' met de SPI module een 12 Bits SPI signaal uit te lezen ?
Ik probeer een encoder uit te lezen met een PIC18F4550.
http://www.kutz-b.de/df1sr/df1sre/downloads/encoderhh1212bits.pdf
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Je kunt gewoon 16 bits uitlezen, en de laatste 4 bits weggooien...
(Of voor echt 12 bits de boel bit-bangen, is ook niet erg ingewikkeld)
De Encoder heb ik zo aangesloten:
Pen 21 D2 ----> CS (Encoder 1 vrijgave)
Pen 33 B0 <---- Data (SPI: Data IN)
Pen 34 B1 ----> Clock (SPI: Clock)
D2 en B1 zijn ingesteld als uitgang.
B0 is ingesteld als ingang.
Zo ziet de Code eruit:
1x:
SPI1_Init(); // Initialize SPI module
Daarna telkens:
LATD.F2 = 1; // Encoder actief
SPI1_Read( Encoder ); // Encoder uitlezen
LATD.F2 = 0; // Encoder 2 not actief
Helaas bijft de waarde 0.
Doe ik iets verkeerd ?
Ik ben ook met "SPI1_Init_Advanced" bezig geweest, maar dat kreeg ik ook niet werkend (ik begrijp niet precies hoe ik deze parameters moet instellen).
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
SPI1_Init werkt zeker niet. Die zet clock idle_low en veel te snel...
Probeer dit eens: (clock hangt van oscillator af, maar ..._OSC_DIV64 werkt zeker.)
SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_END, _SPI_CLK_IDLE_HIGH, _SPI_HIGH_2_LOW)
Helaas, er komt nog steeds niets uit.
Geef ik de de Encoder zo goed vrij bij gebruik van de SPI module ?
LATD.F2 = 1; // Encoder actief
SPI1_Read( Encoder ); // Encoder uitlezen
LATD.F2 = 0; // Encoder 2 not actief
Bit-bangen werkt trouwens prima (de Encoder is dus ok).
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Encoder werkt andersom. CS is active low.
Je moet ook 2 bytes uitlezen. (Laatste 4 bits van Byte_L weggooien)
LATD.F2 = 0; // Encoder actief
SPI1_Read( Byte_H ); // Encoder uitlezen
SPI1_Read( Byte_L ); // Encoder uitlezen
LATD.F2 = 1; // Encoder 2 not actief
Helaas, er komt nog steeds niets uit.
Is het mogelijk dat er in de PIC configuratie iets verkeerd staat ?
Dit heb ik nu:
SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_END, _SPI_CLK_IDLE_HIGH, _SPI_HIGH_2_LOW);
LATD.F2 = 0; // Encoder actief
SPI1_Read( Encoder1_H ); // Encoder uitlezen
SPI1_Read( Encoder1_L ); // Encoder uitlezen
LATD.F2 = 1; // Encoder 2 not actiefIs het commando 'SPI_Set_Active' nodig ?
Gebruikt "SPI_Read" de SPI (MSSP) Module, of zou dit ook gewoon Bit-bangen zijn ?
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
De MikroE compiler libraries zijn nogal lastig, omdat er geen sourcecode beschikbaar is. Dat is vaak vervelend, als je wilt weten welke resources een routine precies gebruikt. Je kunt natuurlijk wel in de assemblyfile nakijken wat er gebeurt...
Tja, dat lijkt mij wel een heel gepuzzel.
Heb je in mikroC (pro) al eens de SPI routine gebruikt (en werkte dat goed) ?
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
In MikroBasic (pro). Dat zijn dezelfde libraries. (Die zijn in Pascal geschreven)
Gebruikt voor o.a. SD card. Ik heb ooit ook zo'n soort 12 bits chip gebruikt, maar dat was in assembly...
Zou je het stukje code uit MikroBasic (pro) willen posten (hopelijk zie ik iets waar ik mee verder kan) ?
Ik ben al weer een stuk verder.
Dit lijkt (wel) te werken:
Encoder1_L = SPI1_Read( 0 ); //Encoder uitlezen
Nu nog eens kijken waar de 0 voor staat.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
De Encoder heeft geen 'Ingang', dus die kan niets ontvangen.
Als de 'SPI Data out' pen van de PIC dan wel wordt gebruikt, dan moet ik deze pen vrij houden (en kan ik deze niet voor iets anders gebruiken).
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Je hoeft de uitgang ook niet aan te sluiten, maar het SPI protocol stuurt nu eenmaal altijd iets uit, of dat nu gebruikt wordt of niet. Dus in dit geval maakt het niet uit wat je daar invult, als er maar wat staat...
Je moet de pin op de PIC inderdaad wel vrijhouden in dat geval.
Er worden inderdaad signalen uitgestuurd op de 'SPI Data out' pen.
(deze laat ik dus vrij en gebruik deze niet voor iets anders).
Het werkt nu perfect:
//Init:
SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_END, _SPI_CLK_IDLE_HIGH, _SPI_HIGH_2_LOW);
//Main:
LATD.F2 = 0; //Encoder 1 actief
Encoder1_H = SPI1_Read( 0 ); //Encoder 1 uitlezen
Encoder1_L = SPI1_Read( 0 ); //Encoder 1 uitlezen
LATD.F2 = 1; //Encoder 1 not actief
LATD.F3 = 0; //Encoder 2 actief
Encoder2_H = SPI1_Read( 0 ); //Encoder 2 uitlezen
Encoder2_L = SPI1_Read( 0 ); //Encoder 2 uitlezen
LATD.F3 = 1; //Encoder 2 not actief
Arco, en iedereen die meegedacht heeft bedankt.