Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Tor Nov 08, 2011 8:19 am Naslov sporočila: Branje 10-bitnega registra v 32-bitnem sistemu (C) |
|
|
Lep pozdrav!
Trenutno se ukvarjam s programiranjem 10-bitnega ADC znotraj mikrokrmilnika LPC3141. Mikrokrmilnik je 32 biten in ima jedro na osnovi ARM9. 10-bitni ADC ima 10-bitni register ADC_DATA_REG, kamor ADC shranjuje 10-bitne vrednosti, katere moram prebrati in primerjati z 32-bitno konstanto.
Kako bi to lahko naredil v C programu?
|
|
Nazaj na vrh |
|
 |
Dorijan Član



Pridružen-a: Ned 22 Jun 2008 10:48 Prispevkov: 2564 Aktiv.: 12.37 Kraj: južnoprimorska
|
Objavljeno: Tor Nov 08, 2011 8:57 am Naslov sporočila: |
|
|
kakšna je pa vrednost konstante?
Načeloma prebereš vrednost potem jo pa lahko "zashiftaš" << in >> tja kjer jo rabiš(npr. b = a << 22;)
_________________ Če nekaj deluje, razstavi in ugotovi zakaj. |
|
Nazaj na vrh |
|
 |
MitjaN Član

Pridružen-a: Sre 17 Avg 2011 15:40 Prispevkov: 91 Aktiv.: 0.54 Kraj: Ljubljana
|
Objavljeno: Tor Nov 08, 2011 9:13 am Naslov sporočila: |
|
|
Če je mikrokrmilnik 32 biten, še ne pomeni, da je register v katerem se nahaja rezulat ADC-ja tudi 32 biten. V kolikor je potem je koda od Dorijana precej dober zgled. Če pa je register kjer se nahaja rezultat ADC-ja 16 biten, potem boš moral pred "shiftanjem" pretvoriti tip ("castanje")
LP, Mitja
|
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Tor Nov 08, 2011 9:58 am Naslov sporočila: |
|
|
MitjaN je napisal/a: |
Če je mikrokrmilnik 32 biten, še ne pomeni, da je register v katerem se nahaja rezulat ADC-ja tudi 32 biten. V kolikor je potem je koda od Dorijana precej dober zgled. Če pa je register kjer se nahaja rezultat ADC-ja 16 biten, potem boš moral pred "shiftanjem" pretvoriti tip ("castanje")
LP, Mitja |
No saj register ADC_DATA_REG je 10 biten. Da še odgovorim dorijanu, konstanta je ravno polovica 10-bitne vrednosti torej 10^n - 1 = 1023 in polovica tega je 511 kar je v šestnajstiškem zapisu 0x1FF.
Moja dosedanja koda za prebiranje registra in primerjavo je izgledala takole:
Koda: |
unsigned int data;
data = ADC_DATA_REG;
if (data > 0x1FF){
//sem pride koda za prižiganje LED
}
else{
//sem pride koda za ugašanje LED
} |
No v glavnem moja koda ni delala, najbrž zato, ker je data 32 bitna vrednost, ADC_DATA_REG pa 10 bitna. Mi lahko še kdo prilepi primer kode, ki pa bi mi mogoče deloval. Priznam malo sem lenuh .
|
|
Nazaj na vrh |
|
 |
Waldo Član

Pridružen-a: Pet 02 Nov 2007 10:50 Prispevkov: 316 Aktiv.: 1.47 Kraj: Maribor
|
Objavljeno: Tor Nov 08, 2011 11:41 am Naslov sporočila: |
|
|
Čeprav je register 10-bitni, ne bi smelo biti težav z operacijami, če so željeni podatki desno poravnani. V primeru, da nulti bit željenih podatkov ni na nultem bitu registra, ga moraš ustrezno maskirati in zašiftati. Morda bi moral preveriti tudi "endianness", čeprav je na eni platformi načeloma vseposod enaka.
Če vrednosti iz adc izpisuješ, imajo smisel ali so kr-neki?
|
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Tor Nov 08, 2011 12:26 pm Naslov sporočila: |
|
|
Waldo je napisal/a: |
Če vrednosti iz adc izpisuješ, imajo smisel ali so kr-neki? |
Na mikrokontrolerju še nisem uspel vspostavit komunikacije s PC tako da ne morem nikjer izpisovat vrednosti. Težko rečem ali so vrednosti smiselne ali ne, se mi pa dogaja, da program deluje pravilno vse do točke kjer preberem 10-bitno vrednost.
|
|
Nazaj na vrh |
|
 |
žrepko Član

Pridružen-a: Tor 23 Mar 2010 20:12 Prispevkov: 700 Aktiv.: 3.76 Kraj: Ptuj-Maribor
|
Objavljeno: Tor Nov 08, 2011 12:45 pm Naslov sporočila: |
|
|
Kot prvo vspostavi UART in se ga nauči uporabljati.
To ti bo v prihodnje prišlo neštetokrat prav!
|
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Tor Nov 08, 2011 1:20 pm Naslov sporočila: |
|
|
žrepko je napisal/a: |
Kot prvo vspostavi UART in se ga nauči uporabljati.
To ti bo v prihodnje prišlo neštetokrat prav! |
To verjamem ja ampak najprej ADC . JE pa UART naslednji korak da da .
|
|
Nazaj na vrh |
|
 |
chaos Član


Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.65 Kraj: Zagorje ob Savi
|
Objavljeno: Tor Nov 08, 2011 2:13 pm Naslov sporočila: |
|
|
ADC beres isto kot katerikoli drugi 32-bitni register. Kako so pa poravnani podatki, pa pise v user manual-u - so samo dve opciji ali na MSB ali pa na LSB. Torej poskusi se zashiftati podatke v desno.
LP!
|
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Tor Nov 08, 2011 2:24 pm Naslov sporočila: |
|
|
chaos je napisal/a: |
ADC beres isto kot katerikoli drugi 32-bitni register. Kako so pa poravnani podatki, pa pise v user manual-u - so samo dve opciji ali na MSB ali pa na LSB. Torej poskusi se zashiftati podatke v desno.
LP! |
Na žalost nič ne piše ali je MSB/LSB. Spodaj sem nalepil celotni opis omenjenega registra.
Opis: |
|
Velikost datoteke: |
39.74 KB |
Pogledana: |
9 krat |

|
|
|
Nazaj na vrh |
|
 |
chaos Član


Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.65 Kraj: Zagorje ob Savi
|
Objavljeno: Tor Nov 08, 2011 2:26 pm Naslov sporočila: |
|
|
Seveda pise: bit 9:0.
LP!
|
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Tor Nov 08, 2011 2:33 pm Naslov sporočila: |
|
|
chaos je napisal/a: |
Seveda pise: bit 9:0.
LP! |
Če se ne motim je tole LSB (Least Signifficant Bit), ker so le najnizji biti. To pomeni, da moram zashiftat v desno ali v levo in za koliko ???
|
|
Nazaj na vrh |
|
 |
S53DZ Član



Pridružen-a: Čet 28 Apr 2011 9:27 Prispevkov: 951 Aktiv.: 5.51 Kraj: Ljubljana
|
Objavljeno: Tor Nov 08, 2011 4:12 pm Naslov sporočila: |
|
|
1. bit (9:0) pomeni 10 LSB bitov, torej je binarni rezultat že poravnan.
2. naredi izpis podatkov na UART ali na Display in preveri rezultat ADC pretvorbe.
EDIT: Za najenostavnejši prikaz pa na en output pin mikrokontrolerja LED preko tranzistorja in upora in prižigaj LEDico glede na vrednost ADC.
|
|
Nazaj na vrh |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.62 Kraj: Kranj - struževo
|
Objavljeno: Tor Nov 08, 2011 7:12 pm Naslov sporočila: |
|
|
Malo si na papir nariši registre in številke, pa vpisuj vrednosti.
Glede na to, da to delaš za diplomo, bi se pa že lahko malo bolj potrudil in tudi kakšno stvar sam preizkusil in naštudiral.
Ko jaz vem, na faksu v zadnjem času učijo tudi C, a ne? Si sedel na ušesih?
Če ne drugega, si dol potegneš skripto za C ali obe dve in jih naštudiraš.
Da ugotoviš, kako deluje branje ADC registra, potebuješ natanko dva poskusa pisanja kode. A Debugger ti pa ne dela ali kaj? Softverski simulator tudi ne?
p.s.
Glede na to, da je polovica foruma samo tvojih vprašanj, ki imajo po večini en ali dva odgovora - kaj ko bi vse skupaj držal v eni sami svoji temi??
_________________ I'm going to stand outside, so if anyone asks, I'm outstanding  |
|
Nazaj na vrh |
|
 |
Waldo Član

Pridružen-a: Pet 02 Nov 2007 10:50 Prispevkov: 316 Aktiv.: 1.47 Kraj: Maribor
|
Objavljeno: Tor Nov 08, 2011 8:42 pm Naslov sporočila: |
|
|
Že dolgo nisem nič delal v C-ju, pa vseeno.
ADC_DATA_REG verjetno vsebuje naslov registra, ti pa potrebuješ njegovo vsebino. Preštudiraj pointerje, operaciji * in &.
Preveri tudi "endianness", to je kako se shranjujejo spremenljivke v pomnilnik (najprej MSB ali najprej LSB). Lahko da boš moral zamenjati bajte oz worde med sabo.
OT: ali kdo ve, kako se slovensko imenuje "endianness"?
|
|
Nazaj na vrh |
|
 |
|