Sari la conținut
ELFORUM - Forumul electronistilor

Problema de rezolvat cu uC.


Vizitator

Postări Recomandate

Pentru ca tot este cam liniste pe aici,
(si) pentru weekend.
Se da:
- un uC (PIC sa zicem) la 2 Mhz frecventa maxima de clock.
- un semnal digital care trebuie interpretat (S) de 1.8 - 1.9 Mhz.

Se cere:
- sa se numere 1000 de impulsuri din semnalul S dupa care sa se aprinda un LED.

Nu se permit divizoare sau alte asemenea. Semnalul S intra direct intr-un pin al uC.
 

Link spre comentariu
  • Răspunsuri 22
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

djvas: la 16F18877 TMR0 e pe 16 biti si are si posibiltatea sa comute un pin la overflow (doar ce m-am uitat in DS).

Incarci registrul cu 64535 (sau pe acolo), activezi intreruperea si el face treaba.

Probabil merge doar o data (sau cu pauze intre "numarari", cat sa reincarci 64535 in TMR0), da' ...

Link spre comentariu

Cred că schepsisul e frecvența scăzută a clock-ului față de frecvența semnalului . Până muncește µC la 2µs/instrucțiune mai trec câteva impulsuri deci LED-ul se aprinde pe la 1000 și ceva . În acest context am cerut și precizarea clară a momentului începerii numărării . 

Link spre comentariu

Nu stiam... nu am folosit pic cu tmr0 decat pe 8biti.

Dar sunt pic'uri care au si intrare T1CK1 pentru tmr1. Am folosit asha ceva.

Sigur e un schepsis... dar nici macar nu a precizat daca impulsurile numarate trebuie sa fie consecutive.

 

Link spre comentariu

Poate mi se pare mie dar pare ca OP doreste monitorizarea unei frecvente si activarea unui LED atunci cand aceasta se stabilizeaza. Altfel activarea repetata a unui LED la fiecare cca 550 microsecunde nu prea are sens.
In acest caz trebuie folosit Input Capture al unui CCP/ECCP pentru masurarea pulsului si dupa 1000 de confirmari se activeaza o iesire digitala. Dar aceasta presupune o frecventa uC ceva mai mare.

Link spre comentariu

       Nu s-ar putea rezolva si cu folosirea unei rutine de intrerupere ioc pe un pin si un timer in intrerupere?

       Cu ajutorul timerului in intrerupere setam o perioada in care stim ca teoretic ar trebui sa existe 1000 de impulsuri ale semnalului

       Initial sau la overflow (al unei variabile contor) numaratoarea e la 0, si in functie de cate fronturi de unda sunt detectate de pin se incrementeaza contorul, iar daca atunci cand se activeaza intreruperea pe timer, contorul a numarat 1000 de intreruperi la pinul ioc atunci avem frecventa care trebuie. Asta daca uc are timp intre 2 intreruperi la pin sa efectueze complet operatia de incrementare. 

Editat de M.Adrian
Link spre comentariu

Daca am inteles bine, topicul e doar "de plictiseala". Adica tizu' se plictiseste si s-a gandit la o problemuta pentru noi, ca poate si noi ne plictisim. Eu da, se pare. :rade:

Cred si eu ca "schepsisul" e apropierea intre frecventa de masurat si cea a ceasului "de lucru". In conditiile in care PIC-urile lucreaza de fapt la un sfert din frecventa de ceas...

De-aia am cautat o solutie cat mai hardware. Din pacate tot mai trebuie incarcat registrul numaratorului cu valoarea de start.

@M.Adrian: TMR0 ala de povestea djvas mai sus face ce zici tu, numai cu mai putine actiuni in rutina de intreruperi. TMR0 poate fi incrementat cu un semnal extern. Fiind pe 16 biti, poate numara singur pana la 1000. Daca-l incarci cu 64535, numara pana la 65535 si da overflow.

Link spre comentariu

       Chiar nu stiam ca se poate incrementa timerul la un impuls pe un pin, defapt probabil se configureaza timerul cu clock extern si se foloseste chiar semnalul masurat, nu ma gandisem la asta, nici nu am folosit, greseala mea :rade:

       Dar in cazul asta de unde stim ca acele 1000 de incrementari ale timerului pana la overflow au loc in intervalul dorit si ca semnalul nu e de 1MHz sa zicem sau alta frecventa diferita de cea a semnalului de interes? De aceea ma gandisem la utilizarea unui timer pentru a verifica ca acele 1000 de incrementari au avut loc in perioada vizata. 

       Ma gandesc atunci tot la 2 timere, unul cu clock extern care e incrementat de semnal, si unul cu clock dat de uc care la intrerupere verifica daca timerul cu semnalul a ajuns la overflow sau nu, asta daca se pot configura timerele ca unul safoloseasca clock extern iar celalalt clock intern, iar majoritatea operatiilor sunt facute hardware de circuitele timerelor aici, singurele linii de cod fiind la verificarea flagului primului timer si la rutina de intrerupere. 

 

Editat de M.Adrian
Link spre comentariu

Pentru-ca s-a spus ca nu e obligatoriu PIC, la AMTEGA se foloseste TIMER1 pus pe OVF cu CLK extern pe T1 (se poate alege sa contorizeze pe front crescator sau descrescator). In TCNT1 se incarca 65535-1000. 
Daca programul se face foarte scurt, ledul se aprinde la impulsul cu numarul 1002 iar daca pagina vectorilor de intreruperi se face conform manualului, ledul se va aprinde la impulsul cu numarul 1005 daca semnalul S are o frecventa aproximativ egala cu CLK uC.
Singura problema e ca TIMER1 incepe sa contorizeze impulsurile din momentul incarcarii lui TCNT1 sau din momentul comutarii CLK_TIMER1 pe intrarea T1 (depinde cum se face programul)

Editat de cimitavita
Link spre comentariu

Nu cred ca se poate fara jitter

Sa luam favoritul meu de pe vremuri, 16F628.
Folosim TIMER1, poate numara asincron de la T1CKI, e pe 16 biti deci putem numara direct la 1000, fara complicatii cu prescalere. Il putem seta la valoarea dorita a.i. sa faca overflow dupa cca 1000 de impulsuri si sa dea intrerupere; pe intrerupere aprindem becul, pardon, ledul. Acum problemele:


1. Pana facem pregatirea dureaza si deci se vor pierde un numar nedeterminat de impulsuri (chiar daca stim precis cat dureaza pregatirea, nu stim precis frecventa semnalului de numarat, nu e sincronizat cu ceasul)
2. Cand timerul este asincron nu se poate preciza cat este lag-ul intre overflow si tratarea intreruperii; documentatia zice 3 sau 4 Tcy, adica +/- 2uS la 2MHz (2Mhz/4 = 500KHz => 1Tcy=2uS); se poate citi valoarea la care a ajuns dupa overflow (presupunem ca ne intereseaza doar low byte) dar este aceeasi problema (considerand ca si semnalul util e aproape 2MHz); cum cele.. hmm!
HMM!

Stai asa.
Dar daca semnalul "de numarat" il folosim ca semnal de ceas pentru uC? Atunci nu mai am problema cu numaratul asincron. Thinking way outside of the box, solicitarea specifica a fost sa se aprinda un bec (led, whatever) dupa 1000 de impulsuri.

Pot sa fiu ticalos si sa zic asa? Bag semnalul la CLKIN. Numar 250 de instructiuni de la pornire. (Delay loop, whatever). BSF PORTB,unde_vrea_Liviu_iesire. Merge?

Link spre comentariu

Tot cu ATMEGA, varianta 2:
TIMER1 setat pe 16 biti cu iesirea OCR1 activata. Intreruperea TIM1_COMPA activata.
TCNT1=0, OCR1A=1000. Se comuta si CLK_TIMER1 pe pinul T1.
In momentul cand TCNT1 = OCR1A, iesirea OC1A trece automat pe 0 si ramane pe 0 atata timp cat TCNT1 >= OCR1A.
Asta inseamna ca la intreruperea TIM1_COMPA trebuie oprit complet CLK_TIMER1 pentru a nu face depasire.
La varianta asta, iesirea OC1A trece in 0 exact la impulsul 1000 pentru-ca totul e facut hardware.

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