C och skiftregister (PIC)

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
jack
EF Sponsor
Inlägg: 2059
Blev medlem: 5 oktober 2004, 17:32:27

Inlägg av jack »

Hittade inget vettigt, sodjan.

En till C-fråga:
Hur gör jag för att vända en hel variabel? På ett snyggt sätt.
Dvs har jag '1100' så ska den bli '0011'.
Det är ett 16-bitarstal.

EDIT: Jag är dum jag vet. Var ju bara lite subtraktion :)

EDIT2: Nej, det var det nog inte?

EDIT3: Nej. Kör jag subraktion så inverterar jag ju bara talet. Så hur gör jag för att vända?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Hittade inget vettigt...

Nä, spelar ju ingen roll, manueln säger att man ska anänvda F0-F7 (eller om det var F1-F8...).

> Hur gör jag för att vända en hel variabel? På ett snyggt sätt.

He he, det här är en "klassiker" som ofta dyker upp i kodningstävligar o.s.v.

Det finns flera olika lösningar. Om maximal prestanda krävs (och har gått om lediga I/O pinnar),
så kan man koppla t.ex PORTB0 -> PORTC.7, PORTB1 -> PORTC.6 o.s.v.
Snabbare går det nog inte, men som sagt, det tar många I/O pinnar.

Det vanliga är en loop med "shift through carry", alltså att man shiftar ut det
ena registret i carry flaggan, och sedan shiftar in bitarna åt andra hållet
i det andra registret.

Här har du tre exempel att studera : http://www.piclist.com/techref/microchi ... evbits.htm

Slutligen, *varför* behöver du kasta om bitarna i variabeln ??
Användarvisningsbild
jack
EF Sponsor
Inlägg: 2059
Blev medlem: 5 oktober 2004, 17:32:27

Inlägg av jack »

Haha, kopplingsexemplet känns som definintionen av ett fulhack :D Tyvärr har jag inte riktigt så mångar portar över, samt att det känns bättre och lösa det i kod.

Ska kolla exemplen, men Asm är tyvärr inte min starka sida. Så om någon ha C-exempel så är jag tacksam för dem också.

> "Slutligen, *varför* behöver du kasta om bitarna i variabeln ??"

Det där var nog faktiskt en riktigt bra fråga :) Håller på och leker med en SPI-DAC och fick för mig att de lästes "tvärtom". Men nu blev jag lite osäker, när jag kollade igen.

Här är databladet:
http://pdfserv.maxim-ic.com/en/ds/MAX541-MAX542.pdf
Måste jag vända eller inte?

EDIT: Jag använder en färdig SPI-funktion från MikroC. Men annars kanske man bara kan göra en egen funktion och läsa ut dem från andra hållet? Om jag nu måste vända dem..
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Om du bit-bangar kan du ju skifta åt vilket håll du vill...

x <<= 1 betyder att x skiftas 1 steg åt vänster.
x >>= 1 betyder att det är 1 steg åt höger som gäller.

Sen för att setta en bit till 1 kan du ju OR (|) med 0x80 eller 0x01 beroende på vilket håll du skiftar....
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> men Asm är tyvärr inte min starka sida.

Aj aj aj, dags att studera lite... :-)
Bara att läsa texten på sidan jag länkade till är "a true joy" ! :-)

Jag skulle vilja påstå att just en sådan här rutin passar utmärkt att koda som en
snutt inline-assembler så att man kan optimera den ordentligt.
Man kan säkert lösa det med C också, om man tänker till lite...

> Måste jag vända...

Nej. Jämför datablad för DAC'en och för PIC'en så ser du det.

> Jag använder en färdig SPI-funktion från MikroC.

mjukvaru-SPI eller hårdvaru-SPI ?
Användarvisningsbild
jack
EF Sponsor
Inlägg: 2059
Blev medlem: 5 oktober 2004, 17:32:27

Inlägg av jack »

Mjukvaru SPI, av någon anledning.

Ska testa hårdvaru istället. För just nu så funkar det skitskumt.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

OK, generellt bör man väll använda hårdvara, om man har det.
Finns ingen anledning att "lasta ner" processorn med onödigt jobb...
Användarvisningsbild
jack
EF Sponsor
Inlägg: 2059
Blev medlem: 5 oktober 2004, 17:32:27

Inlägg av jack »

Hmmm.. Vänta lite nu. Kan det vara så att jag missuppfattat halva SPI?

Om jag nu vill skriva ett 16-bitars värde till DACen. Hur gör jag då?
Jag trodde det bara var att cleara CS, skicka iväg värdet med den färdiga funktionen och sedan sätta CS.

Men riktigt så enkelt kanske det inte var? Såg nåt exempel i manualen där de valde platsen på värdet som skulle skriva och sedan skrev själva värdet.

Tacksam om någon kunde förklara..
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Shit, en DAC vad det ja. Du ska alltså *SKRIVA* till den.
Varför skrev du tidigare "och fick för mig att de **lästes** "tvärtom""...
Du lurade mig lite där... :-)

Hur som helst...

PIC-SPI enheten är 8 bitars, så du ska naturligtsvis skriva två
gånger till SPI enheten (innan du sätter CS). Vilken ordning som du
ska skriva det höga resp låga värdet framgår av DAC databladet
(jag har kollat...).

Men du kan alltid köra MSSP modulen "för hand" genom att skriva
direkt till aktuella registren från MikroC...

Kolla även tråden där JimmyAndersson (tror jag att det var)
körde en TI SPI-DAC from MikroBasic. Lite liknande problem...
Användarvisningsbild
jack
EF Sponsor
Inlägg: 2059
Blev medlem: 5 oktober 2004, 17:32:27

Inlägg av jack »

Sodjan, har jag berättat att du är en säker jävel? :)

Nu ser verkligen allt ut att fungera exakt så bra så det bör. Har bara testat med mjukvaru SPIn ännu, men det borde ju inte vara några problem att köra med hårvarun nu.

Som vanligt ett stort tack.

Vågar jag smyga in en fråga till? Jag testar:
Hur delar jag upp ett 16-bitarstal i två 8-bitars? :)
Användarvisningsbild
JimmyAndersson
Inlägg: 26578
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Hittade min DAC-tråd. Den ligger här.

Vet inte hur lika de "inbyggda" rutinerna är för MicroC och MicroBasic...


Kul att det fungerar jack !
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

I C kan man dela upp fler-byte tal som följer:
union
{
int The_16_bit;
char The_8_Bit[2];
} The_Var;

Åtkomst till variablerna:
The_Var.The_16_Bit = 16 bitaren
The_Var.The_8_Bit[0] = den ena byten av samma tal
The_Var.The_8_Bit[1] = den andra -"-

Det finns andra sätt men de är ganska förvirrande att läsa:
int Variabel_X; // Är en int
char Variabel_Y; // är en char

Variable_Y = (char)*(&Variabel_X); // Variabel_Y = low byte av Variabel_X
Variabel_Y = (char)*(&Variabel_X + 1); // Variabel_Y = high byte av Variabel_X

Lite marigt att läsa eller hur?
Användarvisningsbild
jack
EF Sponsor
Inlägg: 2059
Blev medlem: 5 oktober 2004, 17:32:27

Inlägg av jack »

Icecap, har jag berättat att du är en säker jäkel? :D

Det första exemplet funkade alldeles utmärkt. Det andra var för marigt för mig :)

Tack!
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Nej, det har du inte berättat förut....men jag vet om det! ;-)

Frugan är oerhört medveten om det :-/

Men sen levar jag ju på det också....

Men jag har sagt det förut och jag säger det igen: att läsa andras C-kod kan vara en bitch!
Skriv svar