Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Konfigurisanje A/D konvertora u PIC-C kompajleru

[es] :: Elektronika :: Mikrokontroleri :: Konfigurisanje A/D konvertora u PIC-C kompajleru

[ Pregleda: 3439 | Odgovora: 17 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Shaca

Član broj: 72291
Poruke: 18
*.7.EUnet.yu.



Profil

icon Konfigurisanje A/D konvertora u PIC-C kompajleru 26.10.2005. u 14:19 - pre 195 meseci
Pozdrav svima,

Da li neko moze da mi pomogne oko konfigurisanja A/D konvertora? Hteo bih da konfigurisem referentne napone konvertora kao eksterne, pic je PIC16F877..

Hvala
Shaca
 
Odgovor na temu

grabik

Član broj: 32507
Poruke: 311
..nge86-129.btcentralplus.com.



+7 Profil

icon Re: Konfigurisanje A/D konvertora u PIC-C kompajleru 28.10.2005. u 03:19 - pre 195 meseci
A/D convertor ima cetiri registra:
(ADRESH) visi register gde se upisuje visi bajt posle zavrsetka A/D konverzije
(ADRESL) nizi register gde se upisuje nizi bajt
(ADCON0)
(ADCON1)


Znaci upisom u register ADCON0 vrednosti 01000001
u c-u ulavnom moze da izgleda kao
ADCON0=0b01000001;
ukljucujes A/D konvertor bit0
ulaz u A/D konvertor je sa pina RA0 bit5-3
Fosc/8 ako pic radi na 4MHz bit7-6



Upisom u register ADCON1 odredjus koji ce pinovi biti digitalni koji analogni i koji su Vref
ADCON1=0b10001000;
bit7 upisana jedinica sto znaci da ce u register ADRESH biti zapis tipa(rigit justified) 000000HH
nule se ne koriste a u HH je upisana vrednosti dva bita vece vrednosti
u ADRESL su upisana osam bita(nizi bajt) nize vrednosti LLLLLLLL
posle siftovanja i spajanja dobijas 000000HHLLLLLLLL (deset bitnu vrednost).

bit 6-4 se ne koristi
bit 3-0 odredjuje koji pinovi su digitalni koji analogni i koji referentni
konkretno za gore upisanu vrednost pin RA3 je Vref+ a RA2 pin je Vref-
ostali pinovi su svi analogni
moras i u TRISA=0b11111111; da upises da su svi ulazi u ovom slucaju znaci mozes da ih koristis kao ulaze za A/D konverter



ako ne koristis interupt za proveru zavrsetka A/D konverzije moze da se napise:


//pocetak*****************************************************

#include <pic.h>

TRISA=0b11111111; // setovanje pic-a
ADCON0=0b01000001;// A/D konvertor koristi pin RA0 kao ulaz
ADCON1=0b10001000; //pin RA3 je Vref+ a RA2 pin je Vref-

unsigned int rezultat_ad_konverzije; // int u koji upisujes vrednost
unsigned char ad_konverzija;



void main(void){

rezultat_ad_konverzije=0; //upis 0 u int
ad_konverzija_u_toku=1; //upis 1 dajemo dozvolu da pokrene a/d kovertor

while(1){// prtlja u kojoj se vrti pic

if(ad_konverzija_u_toku==1){ //provera da li je pokrenuta a/d //konverzija
ADGO = 1; // pokretanje A/D konvertora
while(ADGO); // ceka da A/D kovertor zavrsi posao
ad_konverzija_u_toku=0; //zavrsena je A/D konverzija
rezultat_ad_konverzije=( ADRESH<<8 | ADRESL); // upis A/D vrednosti u //int
}



}


}



//kraj ******************************************************

Pogledaj mikrochipov PDF imas opsirno objasnjeno kako radi A/D modul.
Mozda postoje greske tri sata ujutro je :)

 
Odgovor na temu

Shaca

Član broj: 72291
Poruke: 18
*.168.EUnet.yu.



Profil

icon Re: Konfigurisanje A/D konvertora u PIC-C kompajleru 28.10.2005. u 11:08 - pre 195 meseci
Hvala na i vise nego dovoljnom odgovoru. Zaboravio sam da napomenem da ga programiram pomocu PIC-C kompajlera. Problem je sto mi je jasno kako se definise hardverski u asembleru ali ne bih hteo da "mesam" C i asembler. PIC-C ima definisane funkcije setup_adc_ports( ),setup_adc( ) i set_adc_channel( ). E sad help kaze :
""
Syntax: setup_adc_ports (value)

Parameters: value - a constant defined in the devices .h file

Function:
Sets up the ADC pins to be analog, digital or a combination. The allowed combinations vary depending on the chip. The constants used are different for each chip as well. Check the device include file for a complete list. The constants ALL_ANALOG and NO_ANALOGS are valid for all chips. Some other example constants:

ANALOG_RA3_REF- All analog and RA3 is the reference

RA0_RA1_RA3_ANALOG- Just RA0, RA1 and RA3 are analog

""
Mene interesuje da li neko zna koja konstanta se koristi za setovanje RA0 kao analognog ulaza, RA3 kao VREF+ i RA2 kao VREF-?
Po nekoj analogiji bilo bi RA0_ANALOG_RA2_RA3_REF ili tako nesto, ali mi kompajler non stop javlja gresku unknown identifier odnosno da ne prepoznaje izraz.

Shaca
 
Odgovor na temu

Shaca

Član broj: 72291
Poruke: 18
*.168.EUnet.yu.



Profil

icon Re: Konfigurisanje A/D konvertora u PIC-C kompajleru 28.10.2005. u 11:14 - pre 195 meseci
Hvala na odgovoru. Koristim PIC-C kompajler i nov sam u tome tako da ne znam bas sta i kako. Postoji li mogucnost da se pomocu setup_adc_ports() ugradjene funkcije odradi nesto slicno?
Treba mi samo konstanta tipa RA0_ANALOG_RA2_RA3_REF ili tako nesto...Help kaze:
""
Syntax:
setup_adc_ports (value)



Parameters:
value - a constant defined in the devices .h file



Returns:
undefined



Function:
Sets up the ADC pins to be analog, digital or a combination. The allowed combinations vary depending on the chip. The constants used are different for each chip as well. Check the device include file for a complete list. The constants ALL_ANALOG and NO_ANALOGS are valid for all chips. Some other example constants:

ANALOG_RA3_REF- All analog and RA3 is the reference

RA0_RA1_RA3_ANALOG- Just RA0, RA1 and RA3 are analog

""
Koristim skoro u potpunosti njegove funkcije a ne bih da mesam asembler i C.. u svakom slucaju hvala.

Shaca
 
Odgovor na temu

grabik

Član broj: 32507
Poruke: 311
..nge86-129.btcentralplus.com.



+7 Profil

icon Re: Konfigurisanje A/D konvertora u PIC-C kompajleru 29.10.2005. u 00:22 - pre 195 meseci
Ovako mozes samo da nagadjas. Otvori kako ti kompajler kaze "the devices .h file" nadji u include ili vec kako se zove taj direktorijum te devices.h fajlove pa otvori sa nekim editorom i pogledaj funkcije i nadji koja definise ref pinove i adc. Verovatno se zove pic16f877.h ili tako nekako ne znam koji kompajler koristis.
A i kompajler ti kaze "Check the device include file for a complete list."
Pretpostavljam da ima i help pa pogledaj.
Koji je kompajler? google pod pic-c izbaci nekoliko kompajlera.


 
Odgovor na temu

Shaca

Član broj: 72291
Poruke: 18
*.152.eunet.yu.



Profil

icon Re: Konfigurisanje A/D konvertora u PIC-C kompajleru 05.11.2005. u 09:46 - pre 195 meseci
Prijatelju hvala na ideji, jer se isplatila. Mislio sam da su funkcije napravljene u asembleru medjutim ispostvilo se da je sve u C-u. Konstanta je definisana tako sto je naveden prvo pin za vref+ pa tek onda za vref- mada je to u opadajucem poretku Ra3-Ra2. Znaci jednostavnom zamenom sam dobio ono sto sam trazio. Kompajler je Custom Computer Services PCW compiler version 3.168.

Shaca
 
Odgovor na temu

grabik

Član broj: 32507
Poruke: 311
..nge86-139.btcentralplus.com.



+7 Profil

icon Re: Konfigurisanje A/D konvertora u PIC-C kompajleru 05.11.2005. u 11:56 - pre 195 meseci
Pretpostavljam da si procitao da razlika izmedju vref+ i vref- ne moze biti manja od 2V(2.5V), zavisno od serije neki iz serije 16f877A rade i sa manjim ref naponom ali proizvodjac ne stoji iza toga.
 
Odgovor na temu

Shaca

Član broj: 72291
Poruke: 18
*.6.eunet.yu.



Profil

icon Re: Konfigurisanje A/D konvertora u PIC-C kompajleru 10.11.2005. u 01:23 - pre 195 meseci
Naravno, jer ne bi ni imalo puno smisla zbog suma i ostalih smetnji ako se zna da je 10bitna rezolucija... Nego vidim da se dosta razumes imam jos jedan problemcic....Posto sam davnijeh dana radio u asembleru i to nekog dinosaurusa a ne da mi se nesto preterano upustati u programiranje pica na taj nacin, kako se vrsi konverzija iz float u int16 tip podataka u Pic-C-u? Da li je dovoljno definisati dve promenljive tih tipova i u programu navesti da ona int16 tipa dobija vrednost float ili ima nekih zackoljica? Zeleo bih da dobijem poprilicno precizan izlaz iz A/D konvertora a koristi se rs232 konekcija po modbus protokolu. Znaci saljem 4 osmobitne cifre koje bi trebale biti vrednost odbirka sa tacnoscu do desetog dela broja. ...231... se tumaci kao 23,1. Hvala jos jednom na sugestiji.

Saca
 
Odgovor na temu

grabik

Član broj: 32507
Poruke: 311
..nge86-129.btcentralplus.com.



+7 Profil

icon Re: Konfigurisanje A/D konvertora u PIC-C kompajleru 10.11.2005. u 02:30 - pre 195 meseci
Pitanje je koliko su A/D precizni u mikrokontrolerima.
Konverzija pretpostavljam zavisi od samog kompajlera probaj:

var_A_je_float=(float)var_B_je_int / var_C_je_int;

trebalo bi deljenjem int sa int da dobijes float.

 
Odgovor na temu

Shaca

Član broj: 72291
Poruke: 18
*.118.eunet.yu.



Profil

icon Re: Konfigurisanje A/D konvertora u PIC-C kompajleru 10.11.2005. u 09:38 - pre 195 meseci
Prijatelju nisi me razumeo pa cu malo poblize da objasnim. Recimo treba da ocitavam temperaturu od 23 pa do 240 stepeni pomocu A/D konvertora. Odbirci iz A/D-a idu od 0-1024 i int16 su tipa. E sad, ocitana temperatura u stepenima celzijusa se dobija kao temp=n*(240/1024)+23, gde je temperatura normalno float a n odbirak iz A/D konvertora int16. Do ove tacke nema problema.
Od float temperature meni treba celi deo koji saljem na rs232. Znaci recimo da je temperatura 25,456 ja sad treba da "otcepim" 25 koji je normalno int tipa. Sad bih to znao kako da uradim u asembleru ali u onoj guzvi od koda ni za glavu ni za rep da se capis. Posto je float 32 bitni a 37 je maksimalna mantisa(valjda?) pretpostavljam da je mantisa 8 bitna dok su ostali bitovi rezervisani za cifre. Onda bi se veoma lako u zavisnosti od vrednosti mantise izdvojilo potrebne cifre ali sad kako je float predstavljen ovde i da li ima jednostavniji nacin.....

Saca
 
Odgovor na temu

Shaca

Član broj: 72291
Poruke: 18
*.31.EUnet.yu.



Profil

icon Re: Konfigurisanje A/D konvertora u PIC-C kompajleru 10.11.2005. u 09:59 - pre 195 meseci
Lapsus ne na osnovu vrednosti mantise vec eksponenta se lako moze odrediti celobrojni deo float broja. Jedan kolega me ubedjuje da upostoje definisane funkcije konverzije iz jednog u drugi tip. Ako neko nesto zna....


Saca
 
Odgovor na temu

grabik

Član broj: 32507
Poruke: 311
..nge86-129.btcentralplus.com.



+7 Profil

icon Re: Konfigurisanje A/D konvertora u PIC-C kompajleru 10.11.2005. u 20:54 - pre 195 meseci
znaci meris od 23 do 240 stepeni
sto bi onda bilo temp=n*(217/1024)+23;

a rezultat je 23,456

float temp;
char rs232;
temp=n*(217/1024)+23;
rs232=temp;

ili rs232=(char)temp;

znaci rs232 je 25




 
Odgovor na temu

grabik

Član broj: 32507
Poruke: 311
..nge86-129.btcentralplus.com.



+7 Profil

icon Re: Konfigurisanje A/D konvertora u PIC-C kompajleru 10.11.2005. u 20:56 - pre 195 meseci
ispravka, hteo sam reci a rezultat je 25,456 a ne 23,456
 
Odgovor na temu

Shaca

Član broj: 72291
Poruke: 18
*.77.eunet.yu.



Profil

icon Re: Konfigurisanje A/D konvertora u PIC-C kompajleru 11.11.2005. u 12:45 - pre 195 meseci
Nesto slicno...recimo da mi je preciznost jako bitna a i javio se potpuno neocekivani "problem".Kompajler je prepun bagova i zao mi je sto mi ga je mentor uvalio...koliko sam te ispratio ti vrsis konverziju u karaktere. Caka je u tome sto temp mora biti definisan u float plus svi brojevi koji se dele moraju imati decimalnu tacku, iz nekog samo njemu poznatog razloga, inace mi daje non stop 23 posto je rezultat celobrojnog deljenja 0.

znaci otprilike ovako
#inclu...

float value;
long int i;

void main() {
i=read_ADC();
value= (float)i;//konverzija longinta u float
value=(value*(217.0/1024.0))+23.0;
n= (long int)value;//konverzija floata u longint
}
Moze se i povecavati tacnost ako se razlomljeni pomnozi sa deset po volji.
Sad to fercera ko pravo ali ostaje problem sa iscitavanjem konvertora. Naime iz meni nepoznatih razloga krs od kompajlera tako setuje konvertor da dobijam tacno petinu vrednosti koja je na ulaznom pinu. Uzeo sam da je naponska referenca interna to jest +5V i masa kao Vref-. Nekim cudom kada na ulaz dovedem +5V kao odbirak umesto 1024 ili bar priblizno nesto preko hiljadu dobijem 206?!? Kako, zasto, zna samo onaj koji je pisao kompajler.
Evo programa za iscitavanje i ispis preko rs232...

#include <16F877.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=18432000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
int16 i;
void main() {

setup_port_a( ALL_ANALOG );//port a svi ulazi analogni i Vref+ 5V Vref- 0V
setup_adc( ADC_CLOCK_INTERNAL );//setovan takt A/D konv. na 2-6us
set_adc_channel( 1 );//ocitava se sa pina RA1

while (TRUE) {
output_high(PIN_C1);//ledovka mi zasvetli
delay_ms(500);//pauza od pola sekunde
i=read_ADC();//konverzija se izvrsava
putc(i);//ispis na rs232
printf("\r\n");//prelazak u novi red
output_low(PIN_C1);//gasi se ledovka
delay_ms(500);
}
}

Ispis u terminalu u HEX obliku je CE 0D 0A, gde je CE- 206 dekadno a 0D 0A je prelazak u novi red kod STRING prenosa. Mentor me ubedjuje da sam spalio cip ali na sva tri koja sam probao je potpuno ista prica sto navodi na zakljucak da to bas i nije tacno. Inace sumnjao sam da mi je impedansa izvora veca od 10K sto je max dopusteno pa sam direktno sa 7805 preko otpornika od 1K doveo 5V na RA1 i ista prica...'Bem ti i kompajler i mene nesposobnog....ne gine mi asembler

Saca
P.S. Probacu i tvoj prvi predlog...

 
Odgovor na temu

grabik

Član broj: 32507
Poruke: 311
..nge86-128.btcentralplus.com.



+7 Profil

icon Re: Konfigurisanje A/D konvertora u PIC-C kompajleru 12.11.2005. u 00:35 - pre 195 meseci
Skinuo sam help sa ccs sajta i malo pogledao imas gresku ADC_CLOCK_DIV_32
probaj ovako:

setup_port_a( ALL_ANALOG );//port a svi ulazi analogni i Vref+ 5V Vref- 0V
setup_adc( ADC_CLOCK_DIV_32);
set_adc_channel( 1 );//ocitava se sa pina RA1

takt konverzije je suvise brz i tu je verovatno greska. Na kojoj frekvenciji ti radi pic?
Probaj i setup_adc( ADC_CLOCK_DIV_8); da li radi

Drugo putc(i);//ispis na rs232 moze da posalje samo 8bitnu vrednost a ti hoces 16bitnu i to NE RADI kako treba.


jesi li siguran da pic uopste moze da radi korektno na 9600 sa tom frekvencijom 18,432MHz


Probaj ovo pa javi dal se nesto promenilo, a pogledaj i primere verovatno postoje vec gotovi u kompajleru



#include <16F877.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=18432000) // jel stvarno koristis 18,432MHz kristal ???!!!!
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
int16 i;// probaj ovde da li prihvata unsigned int
void main() {

setup_port_a( ALL_ANALOG );//port a svi ulazi analogni i Vref+ 5V Vref- 0V
setup_adc( ADC_CLOCK_DIV_32 );//trajanje ADC treba da je oko 30us
set_adc_channel( 1 );//ocitava se sa pina RA1

while (TRUE) {
output_high(PIN_C1);//ledovka mi zasvetli
delay_ms(500);//pauza od pola sekunde
i=read_ADC();//konverzija se izvrsava
printf("ovo je samo provera rs232\n\r");
printf("%2u\n\r",i);// ili printf("%2d\n\r",i);
output_low(PIN_C1);//gasi se ledovka
delay_ms(500);
}
}




 
Odgovor na temu

grabik

Član broj: 32507
Poruke: 311
..nge86-128.btcentralplus.com.



+7 Profil

icon Re: Konfigurisanje A/D konvertora u PIC-C kompajleru 12.11.2005. u 01:35 - pre 195 meseci
Probaj i
printf("%X \n\r",i);
ili
printf("%4X\n\r",i);

 
Odgovor na temu

grabik

Član broj: 32507
Poruke: 311
..nge86-128.btcentralplus.com.



+7 Profil

icon Re: Konfigurisanje A/D konvertora u PIC-C kompajleru 12.11.2005. u 14:57 - pre 195 meseci
skinuo sam ccs kompajler.Probaj ovo dole bez ispravki pa javi




#include <16F877.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=18432000) // jel stvarno koristis 18,432MHz kristal ???!!!!
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
long int i,n,b;
char nizi,visi;
float value,c;
void main() {

setup_port_a( ALL_ANALOG );//port a svi ulazi analogni i Vref+ 5V Vref- 0V
setup_adc( ADC_CLOCK_DIV_32 );//trajanje ADC treba da je oko 30us
set_adc_channel( 1 );//ocitava se sa pina RA1

b=1023;//ovo samo radi provere
c=25.456;//radi provere

while (TRUE) {
output_high(PIN_C1);//ledovka mi zasvetli
delay_ms(500);//pauza od pola sekunde

i=read_ADC();//konverzija se izvrsava
value=(float)217/1024;//ostavi ovako u tri dela jer inace ne radi dobro, marfi
value=(float)i*value;//ostavi ovako u tri dela jer inace ne radi dobro, marfi
value=(float)value+23;//ostavi ovako u tri dela jer inace ne radi dobro, marfi
n=(int)value;
nizi=n;
visi=n>>8;
printf("\r\n ovo je samo provera rs232");
printf("\r\n(long)b = %lu ", b);//provera da li salje 1024
printf("\r\n(float)c = %E\r\n", c);//provera da li salje 25.456
printf("\r\n(long)i = %lu ", i);//salje na rs232 sta je ocitano sa adc-a
printf("\r\n(long)n = %lu ", n);//temp u int formatu
printf("\r\n(float)(long)value = %E\r\n", value);//salje temp. kao float
printf("\r\n(float)value = %E\r\n", value);//salje temp. kao float
//slanje sa putc() na rs232
putc(visi);
putc(nizi);
putc(10);
putc(13);
output_low(PIN_C1);//gasi se ledovka
delay_ms(500);
}
}
 
Odgovor na temu

Shaca

Član broj: 72291
Poruke: 18
*.24.EUnet.yu.



Profil

icon Re: Konfigurisanje A/D konvertora u PIC-C kompajleru 12.11.2005. u 16:17 - pre 195 meseci
Svaka cast na trudu! Znaci ovako, pretabavao sam ponovo sve uz pomoc help-a i u pravu si za putc(). Tu je definitivno greska zbog koje nije mogao da ispise 10 bitni broj. Sa druge strane napisao sam proceduru za ispis u decimalnom zapisu temperature po nekoj varijanti modbus protokola tako da mi je taj putc() u stvari samo trebao cisto radi provere broja koji dobijem.

Kristal je stvarno taj i verovao ili ne postize 9600 bez greske kod mog racunara. Na faksu ima problema dolazi do permutacije cifara prilikom prenosa pa cu probati malo vecu brzinu.

Oni izrazi ti ne rade kako treba jer brojeve kompajler, iz nekog samo njemu poznatog razloga, u slozenom izrazu vidi kao integer. Konverzija u izracunavanju je neispravna i prevazilazi se ubacivanjem decimalne tacke kod celobrojnih vrednosti.

Jos jedna kljucna stvar u celoj prici zbog koje ni tvoj program ne radi kako treba je nedostatak linije #device adc=10 odmah ispod #include<16F877.h>. Naime, mora se predefinisati sa koliko bitova se predstavlja ocitani broj A/D konvertora.Tu je bio glavni problem tako da sada sprava radi kako sam i zamislio. Hvala na pomoci. Ako ti nesto zatreba tu sam...

Saca
 
Odgovor na temu

[es] :: Elektronika :: Mikrokontroleri :: Konfigurisanje A/D konvertora u PIC-C kompajleru

[ Pregleda: 3439 | Odgovora: 17 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.