 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
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: Sre Nov 09, 2011 1:30 pm Naslov sporočila: |
|
|
aly je napisal/a: |
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?? |
Jaz nisem študent FRI sem na pedagoški, kjer nisem slišal nič o assembly, c, compilerjih... Vse sem se naučil na svojo roko, kupil sem tudi 5 knjig. Debugger ne dela, ker sem si okolje zastonj postavil sam v Linuxu in debuggerja se nisem usposobil, za JTAG (imam enega Keilovega) pa nisem nasel softwera, ki bi podpiral prav tega, ker za Linux je podpora slaba je sicer nek openocd program ampak mojega JTAGA ne podpira (nebi rad govoril o tem, ker se bo izgubila rdeča nit). Drugače pa sem definiral ADC_DATA_REG v ločeni .h datoteki kot pointer
Koda: |
#define ADC_DATA_REG (*((volatile unsigned int *) 0x13002008)) |
V program sem sedaj dodal tudi masko za branje 10 najnižjih bitov spremenljivke "data" in na začetku sem initializiral "data" z 0. Poleg tega sem dodal while statement, ki preveri ali je zastavica ADC_INT_STATUS v registru ADC_INT_STATUS_REG dvignjena. Dvignjena zastavica pomeni, da je ADC sprožil interrupt, ki pomeni, da je ADC konverzija končana in vrednost naj bi bila pripravljena za branje v registru ADC_DATA_REG. Vendar temu ni tako, saj kljub temu, da obračam potenciometer (napetost sem izmeril in se spreminja od 0V - 3,33V) spremenljivka "data" vedno ostane 0 (torej je vrednost registra ADC_DATA_REG vedno enaka 0), zaradi česar je moja LED stalno prižgana nikoli pa se ne ugasne. Možno, da je register crknil ali nekaj... Moja koda trenutno izgleda takole. No tole je le funkcija v kateri preberem register.
Koda: |
void adc_single_scan(void){
volatile unsigned int data = 0x2FF;
ADC_CON_REG &= ~ADC_CSCAN; //OK izberemo "single scan" način namesto "continuous scan"
ADC_CON_REG |= ADC_START; //OK z zastavico ADC_START zaženemo ADC meritev, ki takoj, ko je meritev pripravljena za branje o tem obvesti z zastavico ADC_INT_STATUS v logični 1
ADC_CON_REG &= ~ADC_START; //OK zastavico ADC_START takoj postavimo na 0, kar nima vpliva, vendar je pomembno, da jo lahko ponovno postavimo v 1
while (!(ADC_INT_STATUS_REG & ADC_INT_STATUS)){ //OK ko zaznamo prekinitev program nadaljuje
}
ADC_INT_CLEAR_REG |= ADC_INT_CLEAR; //OK z zastavico ADC_INT_CLEAR v logični 1 počistimo prekinitev
ADC_INT_CLEAR_REG &= ~ADC_INT_CLEAR; //OK isto zastavico ADC_INT_CLEAR postavimo v 0, kar nima efekta ampak je pomembno, da jo lahko ponovno postavimo v 1
data = ADC_R2_REG;
if ((data & 0x3FF) > 0x1FF){
GPIO_MODE0_SET = 0x4000;
}
else{
GPIO_MODE0_RESET = 0x4000;
}
} |
PS: Lahko odprem svoj topic, sicer pa niti ne bo potrebe, ker še tale ADC naštudiram in je diploma končana, digitalne vhode, izhode, pwm pa sem že naredil in imam že delujoče programe za ARM9.
|
|
Nazaj na vrh |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.62 Kraj: Kranj - struževo
|
Objavljeno: Sre Nov 09, 2011 11:35 pm Naslov sporočila: |
|
|
71GA je napisal/a: |
Jaz nisem študent FRI sem na pedagoški, kjer nisem slišal nič o assembly, c, compilerjih... Vse sem se naučil na svojo roko, kupil sem tudi 5 knjig. Debugger ne dela |
ajej, škoda da si se tako "zaplezal". Vzameš eno komercialno orodje, ki je za male projekte brezplačno, delujočih primerov kode pride zraven na kile, debugger dela da se ti samo smeje, pa še simulator imaš...
Pa še en bolj "enostaven" ARM bi lahko vzel za začetek.
No, pač tvoja odločitev.
Če imaš zadosti IO pinov prostih, predlagam, da iz ADja prebereš vrednost in jo direktno zapišeš na 10 izhodnih pinov.
Torej narediš neskončno zanko:
- poženi AD meritev
- počakaj eno sekundo
- preberi vrednost registra
- zapiši na pine
-> ponovi
Brez preverjanja status bita.
Preveri, če imaš ADC ustrezno inicializiran, če pride sploh sistemski takt do njega, da ima ustrezno (ne previsoko) frekvenco nastavljeno,...
_________________ I'm going to stand outside, so if anyone asks, I'm outstanding  |
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Ned Nov 13, 2011 12:04 pm Naslov sporočila: |
|
|
aly je napisal/a: |
Če imaš zadosti IO pinov prostih, predlagam, da iz ADja prebereš vrednost in jo direktno zapišeš na 10 izhodnih pinov.
Torej narediš neskončno zanko:
- poženi AD meritev
- počakaj eno sekundo
- preberi vrednost registra
- zapiši na pine
-> ponovi
Brez preverjanja status bita. |
Sem si poiskal 10 LED in jih dal na GPIO 11-20. Nato sem v program dodal spodnjo kodo, kjer najprej prižgem vse diode. Vendar pa vedno, ko program prvič premosti funkcijo "delay()" ugasnejo prav vse LED. Sem obračal potenciometer v vse možne smeri in mi nikoli nič ne posveti.
Koda: |
1: GPIO_MODE1_SET = 0x7FE0; //nastavim gpio 20 -11 kot izhode
2: GPIO_MODE0_SET = 0x7FE0; //prižgem vse LED naenkrat
3: while(1){
4: ADC_CON_REG |= ADC_START; //z zastavico ADC_START zaženemo ADC merite
5: ADC_CON_REG &= ~ADC_START; //zastavico ADC_START takoj postavimo na 0
6: delay();
7: data = ADC_R2_REG;
8: if (data & 0x1){GPIO_MODE0_SET |= 0x20;}else{GPIO_MODE0_RESET |= 0x20;}; //gpio 20
9: if (data & 0x2){GPIO_MODE0_SET |= 0x40;}else{GPIO_MODE0_RESET |= 0x40;}; //gpio 19
10: if (data & 0x4){GPIO_MODE0_SET |= 0x80;}else{GPIO_MODE0_RESET |= 0x80;}; //gpio 18
11: if (data & 0x8){GPIO_MODE0_SET |= 0x100;}else{GPIO_MODE0_RESET |= 0x100;}; //gpio 17
12: if (data & 0x16){GPIO_MODE0_SET |= 0x200;}else{GPIO_MODE0_RESET |= 0x200;}; //gpio 16
13: if (data & 0x32){GPIO_MODE0_SET |= 0x400;}else{GPIO_MODE0_RESET |= 0x400;}; //gpio 15
14: if (data & 0x64){GPIO_MODE0_SET |= 0x800;}else{GPIO_MODE0_RESET |= 0x800;}; //gpio 14
15: if (data & 0x128){GPIO_MODE0_SET |= 0x1000;}else{GPIO_MODE0_RESET |= 0x1000;}; //gpio 13
16: if (data & 0x256){GPIO_MODE0_SET |= 0x2000;}else{GPIO_MODE0_RESET |= 0x2000;}; //gpio 12
17: if (data & 0x512){GPIO_MODE0_SET |= 0x4000;}else{GPIO_MODE0_RESET |= 0x4000;}; //gpio 11
18: delay();
19: } |
aly je napisal/a: |
Preveri, če imaš ADC ustrezno inicializiran, če pride sploh sistemski takt do njega, da ima ustrezno (ne previsoko) frekvenco nastavljeno,... |
Trenutno se ukvarjam ravno s tem, ampak je težko ker nikjer ne morem izmeriti frekvence, ki pride do ADC. Trenutno se igram s Clock Generation Unitom in pripadajočimi delilniki pa bom videl, če mi kaj uspe. Predvidevam pa, da je težava res v frekvenci, ker mi je čudno, da je register ADC_R2_REG iz katerega naj bi bral digitalizirano vrednost vedno enak 0.
|
|
Nazaj na vrh |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.62 Kraj: Kranj - struževo
|
Objavljeno: Ned Nov 13, 2011 8:55 pm Naslov sporočila: |
|
|
Ena od možnosti je tudi takole:
Če periferija nima Clock signala (ni pravilno incializirana), potem tudi ne sprejme vrednosti v kontrolnih registrih.
Pri ST-jevem Cortex M3 sem imel podobno zadevo. V "R/W" kontrolni register sem nekaj vpisal (različno od nič), ko sem prebral pa je bila vrednost nič.
Ko sem periferiji pripeljal takt, pa se je v vrednost v kontrolnem registru ohranila. In zadeva je delovala.
_________________ I'm going to stand outside, so if anyone asks, I'm outstanding  |
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Sob Nov 19, 2011 7:19 pm Naslov sporočila: |
|
|
aly je napisal/a: |
Ena od možnosti je tudi takole:
Če periferija nima Clock signala (ni pravilno incializirana), potem tudi ne sprejme vrednosti v kontrolnih registrih.
|
Sem se malo igral z CGU in mi je uspelo naštudirati, kako spreminjam frekvenco, tako da lahko dobim katero koli vrednost. Zato sem nastavil frekvenco clocka na vhodu ADC približno na 4 MHz, kar je manj od 4,7MHz, ki je maximum za ADC. Če meritev merim z digit. osciloskopom (bandwidth = 25 MHz) mi counter pokaže pravo vrednost, medtem ko je krivulja zelo čudna (priloga).
Enkrat sem se sicer s 5V dotaknil vhodnega pina za ADC, na katerem je max 3,3V, bi lahko bil to vzrok za težave? Ali ima kdo kako drugo idejo? Je možno, da je le osciloskop slabo nastavljen?
Opis: |
|
Velikost datoteke: |
2.18 MB |
Pogledana: |
1 krat |

|
|
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 6 dni
Powered by phpBB © 2001, 2005 phpBB Group
|