Prevod dvou registru na cislo int.

Zdravim,

nevedel by nekdo jak se da prevest cislo nachazejici se ve dvou registrech A/D prevodniku na cislo int v jazyku C? Bud mi neco unika, nebo jsem uz vycerpany, nebo oboji :smiley: Jde konkretne o registry A/D prevodniku ADRESL a ADRESH. Vysledek prevodu by mel byt cislo int.

čau, nevim přesně jestli dobře rozumim tvojí otázce, ale jestli máš dva registry kde máš vícjak osmi bitový číslo, tak todle číslo už je reprezentovaný jako číslo int . Ale jestli to potřebuješ néjak převést do proměný v C tak mě napadá jedině že uděláš něco takovýdleho:
A = ADRESL + (ADRESH*256).
kde A je proměná tipu int

Jde to i takto:

[code]int ad;

ad = adresh;
ad<<= 8;
ad += adresl;[/code]

Nic proti ale pokud pouziva compiler microchipu tak proc ne takhle?

[code]int ad;

ad = adres;[/code]

Ahoj, diky za odpoved. Zkousel jsem ten tvuj zpusob, ale neco se mi na tom nezda. Kdyz se pak podivam, jak je ulozeno to cislo, ktere jsem tvym zpusobem dal do promene int “final” je neco v neporadku. To cislo zobrazuju na pripojenych LEDkach (fce. Lo vrati 0…7 bit, fce. Hi vrati 8…15 bit). Kdyz pouziju PORTD = ~Lo(final) je vsechno OK, ale kdyz pouziju fci. PORTD = ~Hi(final) sviti porad jen jedna LEDka, coz znamena, ze se cislo na bitech 8,9 nemeni. To by se ale melo menit pri otaceni potenciometru na vstupu A/D prevodniku.

final = ADRESH;

final <<= 8;

final += ADRESL;

PORTD = ~Hi(final);

»= posunutí bitů doprava a přiřazení výsledku levému operandu «=
posunutí bitů doleva a přiřazení výsledku pravému operandu

Nemoze to byt tymto

V mikroC se pise:

we have 10 different compound assignment operators: +=, -=, *=, /=, %=, &=, |=, ^=, <<=, and >>=. All of these associate from right to left. Spaces separating compound operators (e.g. + =) will generate error.

Je tam napsano from right to left, tak bych rekl, ze to nebude tim.

:arrow_right: administrator: příspěvek byl upraven

Nemůže být problém jinde?
V PIC procesorech se moc nevyznám, ale u Atmelu bývá A/D převod deseti bitový.
Těch deset bitů lze zarovnat jak doprava, tak i doleva.
V tom druhém případě by samozřejmě ten převod na integer
výše zmíněnými postupy nevyšel správně.

Ja myslim, ze to je zarovnane dobre. V registru ADRESL je spodnich 8 bitu prevodniku a v ADRESH je v bitech 1 - ulozen 10 bit a v 0 - 9 bit.

:arrow_right: administrator: příspěvek byl upraven

Ahoj vsem,

a ted trosku jiny problem. Mam nejake cislo, nebo znak v char a potrebuju to hodit na port, rekneme A. Na hornich 4 linkach portu A ( 7/4 ) mam pripojeny display, ktery komunikuje tak, ze nejdriv musim poslat horni 4 bity prikazu (nebo znaku) a v dalsi vlne musim poslat dolni 4 bity. Chtel jsem udelat neco takoveho, ale nefunguje mi to.

RS = 1; // vybiram datovy registr (toto je irelevantni pro muj problem)

char znak = ‘A’; // toto chci poslat

E = 1; // vysilani hornich 4 bitu

PORTA = znak; // vlozim cely znak (cislo do portu A, jelikoz jsou vodice pripojeny
// na piny 7/4 tak se uplatni pouze hornich 4 bitu.)

E = 0; // kontroler na displaji prijme data na linkach

E = 1; // vysilani dolnich 4 bitu

PORTA = (znak<<4); // posun 4 nejnizsich bitu na nejvyssi

E = 0;

Misto toho musim udelat neco takoveho:

RS = 1; // vybiram datovy registr

char znak = ‘A’; // toto chci poslat

E = 1; // vysilani hornich 4 bitu promenne znak

PORTA.F7 = znak.F7; // 7. bit promene “znak” priradim 7 bitu portu A
PORTA.F6 = znak.F6; // podobne
PORTA.F5 = znak.F5; // atd.
PORTA.F4 = znak.F4; // jeste jednou

E = 0; // kontroler na displaji prijme data na linkach

E = 1; // vysilani dolnich 4 bitu promenne znak

PORTA.F7 = znak.F3; // 3. bit promene “znak” priradim 7 bitu portu A
PORTA.F6 = znak.F2; // podobne
PORTA.F5 = znak.F1; // atd.
PORTA.F4 = znak.F0; // 0. bit promene “znak” priradim 4 bitu portu A

E = 0;

Poslednim uvedenym zpusobem to funguje, tim predchozim ne. Otazka je proc?

A ked to simuluješ co to posiela :slight_smile:

unsigned char znak;

znak='A';
PORTA= znak;
PORTA = (znak<<4);

,mne to posiela dobre :slight_smile:

mozno by si mal… PORTA=0b11110000&znak neviem

Zkusto zapsat takto:

PORTA = (znak<<=4); // posun 4 nejnizsich bitu na nejvyssi

Diky za odpovedi, zkusim to vecer. Ted nemam pristup k microchipu.

Kdyby si me ted zabil, fakt nevim co to posila :slight_smile: ale vecer na to kouknu jeste jednou a promerim vsechny piny portu. Ale rozhodne to neposila to co ma, to vidim na displaji. Nemuze to byt tim “unsigned char” ?? ja to mam deklarovane jako “char”. Pouzivam kompilator od mikroEletroniky (mikroC) a tam je napsano, ze kdyz napisu char, tak se mysli implicitne unsigned char. Radeji mu to ale jeste zduraznim :slight_smile:

No tak jsem castecne prisel na to, proc mi to nechce fungovat ta komunikace PICu s displayem. Prirazeni PORTA = znak teda funguje tak jak ma, ale zapomel jsem, ze mam na portu A jeste pripojene vodice (na dolnich bitech, ktere nevyuzivam jako datove) ovladani registru displaye :frowning: a tak ackoli prirazeni PORTA = znak funguje tak jak ma, stejne vysledek byl ten, ze se to na display nezobrazilo. Takze jsem to resil tak, ze jsem dolni 4 bity zamaskoval:

PORTA = (znak & 0x0f) | (PORTA & 0xf0);

Tohle teda ponecha dolni 4 bity portu A nezmenene a secte s hornimi 4 mi bity promene znak. Tohle funguje.

Ted posilam dolni 4 bity promene znak. Myslel jsem treba takhle.

PORTA = (znak<<4) | (PORTA & 0xf0);

Tento zpusob ale nejde. Je nekde nejaka zrada v bitovem posunu. Asi mu spatne rozumim.

Jeste by me zajimalo. Nevite o nejakem simulatoru PICu 18F4450 ?? Ja to totiz ladim primo na nem.

som ti psal skus takto:

nacitat stav portu A do reg a

vunulovat 4horne bity v a registri

v znaku vynulovat spodne stryri bity

urobit sucet a|znak a vozit do PortA.

Masslim ze pre procesor ta tvoja povodna a funkcna veria je najrychlesjsia. tj jednotlive priradenie bitov.

JA pouzivam origo prekladac od mikrocipu tak zel ladim simulujem priamo V MPlabe + ICD2.

Ja to zkusim jak pises. Ja jsem chtel pouzit simulator od Oshon-u, ale bohuzel nepodporuje PIC18F4450 na kterem ted pracuju. Zkusim to v MPlabu,

Asi se mi budete smat, ale nejak mi nefunguje ten bitovy posun. Vypada to, ze se nepresouva tak jak by mel.

Priklad.

pismeno R = 0b0101 0010

‘R’<<1 = 0b1010 0100 … posun OK

‘R’<<2 = 0b0100 1000 … to je taky OK

‘R’<<3 = 0b1001 0000 … ma byt, ale je 0b1000 0000

Jiny priklad

pismeno X = 0b0101 1000

‘X’<<1 = 0b1011 0000 … ma byt, ale je 0b1010 0000 :open_mouth:

Proste jednicka ctvrteho bitu se neprenese do bitu pateho. Vzdy se prenese pouze nula. Co s tim? Setkal se nekdo s tim?

Jeste na doplneni, ten prenos jednicky nefunguje pokud mam to cislo, ci znak v promene napr. char znak. Kdyz udelam primo neco takoveho

0b0101 0010<<3 = 0b1001 0000 coz je OK, takze s konstantou to funguje

Já se setkal s něčím podobným.
Bylo to však na klasických Atmelech.
Pokud jsem provedl jakoukoliv operaci a výsledek jsem si ze střadače okamžitě použil,
pak bylo vše OK.
Problém nastal, když jsem mezi operaci a použitím výsledku vložil ještě jinou operaci,
tak se mi výsledek v ACC “zdeformoval” zapsáním log. 0 na jeho 4 bit.
Zbylé bity zůstaly jak měly, ale pouze ten 4. se prostě vymazal.

Př. 1 : Bez problémů

ORL    A,R0
MOV    P3,A

Př. 2: Havárie

ORL    A,R0
DEC    R0
MOV    P3,A

Taktéž, když jsem chtěl použít hodnotu ze střadače 2x po sobě,
došlo k deformaci.

Př. 3: Havárie

ORL    A,R0
MOV    P3,A
MOV    P0,A         ;sem se mi již zapisuje deformovaná hodnota

Nevím, zda to má co dělat s tvým případem, ale víc ti bohužel neporadím.