Sari la conținut
ELFORUM - Forumul electronistilor

Probleme de incepatori


Postări Recomandate

daca setez ADC-ul pe referinta interna i-mi indica 145 sa zicem si relativ stabil daca il setez pe Avcc o ia raza rau si-mi afiseaza 40, de acea presupun ca functioneaza.

care din referinte ai vrea as folosesti pana la urma?cat e VCC?cat e AVCC?in ce domeniu vrei sa masori (in volti reali ma refer).cate canale ADC folosesti?cat e frecventa clock-ului procesorului?cat e frecventa clock-ului ADC-ului?ai condensator de decuplare intre AVCC si GND?ai condensator de decuplare intre AREF si GND?se poate o schema?
Link spre comentariu

daca setez ADC-ul pe referinta interna i-mi indica 145 sa zicem si relativ stabil daca il setez pe Avcc o ia raza rau si-mi afiseaza 40, de acea presupun ca functioneaza.

care din referinte ai vrea as folosesti pana la urma?cat e VCC?cat e AVCC?in ce domeniu vrei sa masori (in volti reali ma refer).cate canale ADC folosesti?cat e frecventa clock-ului procesorului?cat e frecventa clock-ului ADC-ului?ai condensator de decuplare intre AVCC si GND?ai condensator de decuplare intre AREF si GND?se poate o schema?
Referinta interna, de aici a plecat discutia, fiind pe portul a si nu pin separat am dubii cu setarea insa trecem mai departe, deocamdata nu sint acasa, dupa masa schema si altele, deocamdata ce i-mi aduc aminte, o sa masoare tensiuni de zeci/sute de volti, folosesc doua canale ADC (tensiune curent), 8Mhz frecventa interna implicita a Mcului, frcventa ADC nu stiu si nici nu stiu a o seta, condensatori de decuplare sint. Ca si soft, valoarea citita de ADC o citesc de 300 de ori si o impart inapoi la 300 in idea de a face o medie ca sa o pot stabiliza astfel o tensiune de 21,5V redresata si nefiltrata o afisaza intre 21,4V, 21,5V, 21,6V, asta e cea mai buna valoare obtinuta cu ADC referinta interna, prescaler 64 (nu pe AUTO), si divizarea cu 8 a Mc-ului dezactivata.Astfel ADC-ul afisat e 215 si prin "formatare" il fac 21.5V, e valoare mica insa astfel pot citi tensiuni mari (sute de volti), nu mai stiu ce tensiune reala am la pinul ADC (masurata cu voltmetru) in cazul acesta dar parca la 5V max pe pin ADC o sa masor 500V? sau 5000V? nu tin minte...L.E. AVcc nu are...post-9441-139829385835_thumb.jpg
Link spre comentariu

Salut. Ai trei posibilităţi pentru referinţă:

- Vcc (PA0 folosit ca pin obişnuit);

- Referinţă externă (o tensiune conectată la PA0);

- Referinţă internă (1.1V, PA0 folosit ca intrare în ADC).

 

În DIDR0 trebuie să scrii 1 pentru fiecare intrare pe care o foloseşti, deci inclusiv pentru PA0, care e referinţa. În caz contrar pinul e folosit ca pin normal, ceea ce nu-i va prea plăcea lu' tanti referinţa externă.

Link spre comentariu

Salut. Ai trei posibilităţi pentru referinţă:

- Vcc (PA0 folosit ca pin obişnuit);

- Referinţă externă (o tensiune conectată la PA0);

- Referinţă internă (1.1V, PA0 folosit ca intrare în ADC).

 

În DIDR0 trebuie să scrii 1 pentru fiecare intrare pe care o foloseşti, deci inclusiv pentru PA0, care e referinţa. În caz contrar pinul e folosit ca pin normal, ceea ce nu-i va prea plăcea lu' tanti referinţa externă.

Am incercat sa setez pinul a.0 in toate starile fara vreun efect "vizibil" in cea ce priveste referinta, si ca intrare si ca iesire si 1 si 0, pur si simplu referinta merge, adica softul citeste fara probleme cu "Reference = Internal ", cum e in Bascom, bineinteles ca pinul e in aer, am incercat sa-i pun un cond de decuplare pe pin de asemenea fara alte efecte.... trecind peste asta (adica nu stiu daca am setat corect insa totusi functioneaza...) am alta problema, daca masor o tensiune redresata si filtrata functioneaza corect, afisajul este "inghetat", indica "limpede", am valoare ADC = 195 sa zicem iar dupa "formatare" devine 19.5 V, daca insa masor o tensiune doar redresata se schimba total, "fuleaza" intre maxim si minim, dupa ce am "studiat" problema am ajuns la concluzia ca defapt asa e normal!!!, in fractiunea de secunda cind citeste tensiunea si aceasta avind forma de "jumate de sinus" (fiind redresata) sau cum se numeste, citeste oriunde pe forma unui singur dinte/parabola deci poate sa ia orice valoare intre 0 si 19.5. ACeasta problema am incercat sa o remediez citind de mai multe ori ADC-ul si adunind-ul cu sine insasi si sa-l impart la "nr de adunari" adica:

for x = 1 to 300

volt = volt + getadc(1)

next x

volt = volt / 300

 

Perfect, o perioada asta a fost solutia, dupa ce am terminat aproape tot softul mi-am dat seama ca astfel nu reusesc sa citesc tensiune decit pina pe la max 21.8V, daca maream tensiunea valoarea ADC o lua de la "0", stupoare!!! asa am aflat ca valoarea ADC undeva pe la 65500 face "overflow" sau cum se numeste, am incercat sa scad la 100 bucla for next, pina la aceasta valoare e capabil sa citeasca si sa afiseje corect insa astfel pot masura doar 65500/100= 655 , deci pot citi max 65.5V iar eu doresc sa masor minim 310V.

Acum intrebari, de ce face "overflow" la acea valoare, cine i-i dicteaza acel "maxim", in functie de ce?

Ce solutii recomandati, sa filtrez totusi tensiunea si sa o "ajustez" din soft nu merge, adica merge insa daca la aceleasi borne de masura conectez o alta tensiune filtrata de data asta o sa am un alt "rezultat".

Sa incerc sa trec intrarea printr-un AO, un "filtru" sa zic asa?

Sau sa pun un comutator de care Mc sa tina seama si sa reaca pe "CC" sau "CA" ca la multimetrle de masura insa in cazul acesta mi-ar mai trebui pini (1), ii am pe toti ocupati.

 

Sper ca nu va plictisesc, dar marea mea intrebare e totusi de ce poate doar pina la acel 65500 (aproximativ)

Link spre comentariu

Eu banui ca nu ADC-ul genereaza overflow (ADC-ul da overflow cand valoarea la intrarea masurata e mai mare decat referinta, caz in care valoarea citita din ADC va fi 1023 - 2^10), ci variabila ta volt "se umple". Banuiesc ca e un intreg, pe 16 biti. 2^16 (2 la puterea 16) e 65535. Eu vad 2 solutii:- numar mai mic de masuratori- alt tip de variabila pentru volt, pe mai multi biti - trebuie sa te uiti in manualul bascomului ce poate si sa vezi daca "te tine" controllerul (variabila in sine si operatiile cu ea vor consuma mai multe resurse).

Link spre comentariu

Grijă mare cu for-ul ăla. Cum ADC-ul e pe 10 biţi, "volt" poate fi doar pe 32 biţi. Dacă înmulţeşti 0x03FF cu 300 îţi dă 0x0012BED4, adică o valoare pe mai mult de 16 biţi. Cu alte cuvinte, "volt" ar trebui să fie un unsigned long. Dacă e pe orice altceva, va avea minim un overflow.

 

Dacă vrei să filtrezi valoarea mai rapid, eu aş face aşa:

// Initialiezi sumasuma_uint32 = 0x00000000L;// Faci 256 de masuratori conescutivefor ( i = 0;      i <= 0xFF;      i++    ){  // Faci o conversie si citesti rezultatul  volt_uint16 = read_adc(pin);  // Adaugi valoarea citita la suma  sum_uint32 += volt_uint16;} // end for (i = 0...// Imparti suma la 256, adica shift la dreapta cu 8filtered_result_uint16 = (unsigned short int)(sum_uint32 >> 8); 

De asemenea, referinţa externă poate fi de cel mult egală cu tensiunea de alimentare.

Valori pentru regiştri:

ADMUX = 0b01000001 = 0x41; // referinţă externă, intrarea pe ADC1ADCSRA = 0b11000110 = 0xC6; // ADCSRB = 0b00000000 = 0x00;DIRD0 = 0b11111100 = 0xFC; // ADC0 şi ADC1 sînt folosiţi, restul nu.
Link spre comentariu

O sa incerc din nou sa redefinesc variabilei dupa masa.... acum este de tip WORD, urmatoarea e de tip LONG, nu stiu precis ce efect au, o sa studiez... insa parca totusi am incercat si nu este acceptata in sirul de calcule si conversii, o sa vad precis dupa masa...

ADMUX = 0b01000001 = 0x41; // referinţă externă, intrarea pe ADC1ADCSRA = 0b11000110 = 0xC6; // ADCSRB = 0b00000000 = 0x00;DIRD0 = 0b11111100 = 0xFC; // ADC0 şi ADC1 sînt folosiţi, restul nu.
ma descurc greu cu acest limbaj de programare (banuiesc a fi asm) eu "cunoscind" doar bascom si de acea nu cunosc ce inseamna "ADMUX, ADCSRA, ADCSRB, DIRD0".In Bascom registrii pot fi scrisi doar cu Config porta.0 = input/output sau DDRA = B&11111100 , sper sa fi scris corect.......
Link spre comentariu

Codul lui ratza e C, da' "cuvintele" pe care nu le intelegi n-au nici un sens ascuns in C, ci sunt numele registrilor controllerului. Nume pe care le "descoperi" citind data-sheetul. Ceea ce-ti recomand (cititul adica) indiferent de limbajul in care programezi.

 

@ratza: chestia aia cu doo egaluri pe un rand e "acceptata" de compiler (adica o folosesti in mod normal in cod), sau are scop didactic pentru forum?

 

LE Am testat cu gcc si da eroare.

Link spre comentariu

Sper sa nu transformam discutia intr-o "bucla infinta", cu o pagina in urma am postat si ma repet ca am citit datashet-ul si tot acolo intrebam ce si cum inseamna acel ADMUX sau cum il pot programa. Cum anume am acces la acel ADMUX ? nu stiu cum sa fac asta in Bascom, sau poate stiu dar nu-mi dau seama....

Link spre comentariu

In Bascom registrii pot fi scrisi doar cu Config porta.0 = input/output sau DDRA = B&11111100 , sper sa fi scris corect.......

Cum anume am acces la acel ADMUX ? nu stiu cum sa fac asta in Bascom, sau poate stiu dar nu-mi dau seama

Exact ca la DDRA, doar că schimbi valoarea.
Link spre comentariu
  • 1 lună mai târziu...
  • 2 săptămâni mai târziu...

Iar am inceput sa ma dau cu capul de pereti.

Am un mega8L si un LCD 16x2 cu urmatorul program:

 

$regfile = "m8def.dat"$crystal = 1000000Config Lcd = 16 * 2Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portd.5 , Db6 = Portb.7 , Db7 = Portb.6 , E = Portd.7 , Rs = Portb.0Do  Cls  Locate 1,1  Lcd "test"  Locate 2 , 1  Lcd "test linie 2"  Waitms 200LoopEnd

Dupa cum se vede, folosesc ultimii 6 pini de pe partea stanga a uC-ului (Pinii 9-14) dupa cum urmeaza:

 

9 - Db7

10-Db6

11-Db5

12-Db4

13-E

14-Rs

 

Am verificat, este semnal pe fiecare pin fata de masa, si se schimba valoarea tensiunii, deci uC-ul functioneaza intr-un fel. Am testat cu 2 display-uri dintre care unul stiu sigur ca functioneaza iar celalalt a fost nou.

Orice as face, ramane linia de sus "aprinsa". Am mai avut in trecut aceiasi problema cu un alt display, dar in cazul respectiv problema era la pinii de date, se exfoliase cablajul. Lucru nevalabil in cazul de fata.

 

Acum intrebarile ar fi:

- Este posibil sa nu-i convina faptul ca am ADC-ul alimentat, desi nu-l folosesc in acest program?

- Este posibil sa nu-i convina ca folosesc pinii pentru cristal? Fusebitii sunt cei default, deci internal clock.

- Este posibil sa nu-i convina ca AIN0 si AIN1 sunt folositi ca pini output?

 

 

Multumesc anticipat.

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum
×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări