Sida 4 av 4
Postat: 2 februari 2006, 17:16:11
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?
Postat: 2 februari 2006, 18:36:40
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 ??
Postat: 2 februari 2006, 18:45:43
av jack
Haha, kopplingsexemplet känns som definintionen av ett fulhack

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..
Postat: 2 februari 2006, 18:49:48
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....
Postat: 2 februari 2006, 19:09:00
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 ?
Postat: 2 februari 2006, 19:23:03
av jack
Mjukvaru SPI, av någon anledning.
Ska testa hårdvaru istället. För just nu så funkar det skitskumt.
Postat: 2 februari 2006, 19:26:16
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...
Postat: 2 februari 2006, 19:45:26
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..
Postat: 2 februari 2006, 20:01:13
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...
Postat: 2 februari 2006, 20:55:01
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?

Postat: 2 februari 2006, 21:04:42
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 !
Postat: 2 februari 2006, 21:15:25
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?
Postat: 2 februari 2006, 21:27:17
av jack
Icecap, har jag berättat att du är en säker jäkel?
Det första exemplet funkade alldeles utmärkt. Det andra var för marigt för mig
Tack!
Postat: 2 februari 2006, 23:35:49
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!