Sari la conținut
ELFORUM - Forumul electronistilor

Semnal intrare - putin ajutor va rog...


critix

Postări Recomandate

SalutareAm schema atasata. Semnalul de intrare in PIC este in felul urmator: din 2 in 2 secunde am 5V pe intrarea PORTA.0 timp de 2 secunde. Deci 2 sec. e "1", apor 2 sec e "0", iara "1"... etc.Ledul se va aprinde atata timp cat semnalul exista pe intrare. ex. Daca butonul se va apasa, semnalul ajunge la pic, si as dori ca ledul sa se aprinda. Daca butonul nu e apasat, as dori sa se stinga ledul.Ma puteti ajuta cu un mic cod sa verific daca mai am acel semnal sau nu pe intrare, astfel incat sa opresc ledul sau sa ii dau drumul?Va multumesc anticipat.P.S. Din pacate, asambler nu prea stiu, daca puteti un exemplu de cod in orice alt limbaj... Weekend placut.

post-28264-139829616715_thumb.jpg

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

Top autori în acest subiect

  • Mircea

    3

  • critix

    3

  • 10vid

    1

Top autori în acest subiect

Imagini postate

In mikrobasic PRO de la mikroelektronika. Va trebui sa-ti definesti toti registri (de ex. intrari-iesiri, comparatoare off, CCP off) in prealabil.

 

while true '(fa asta continuu)  if Button(PORTA, 0, 0, 1) then '(la tranzitie din 0 in 1 pe RA0)    PORTA.7 = 1 '(Set RA7)  else     PORTA.7 = 0 '(Clear RA7)  end ifwend

Din pacate nu scriu acum de pe calculatorul unde am mikrobasic instalat, deci nu pot sa-ti dau un hex ca sa testezi. Daca nu reusesti, pana maine iti fac un program functional.

Link spre comentariu

Continuam PM pe public, ca asta-i rolul forumului. Eu am inteles (sa ma corectezi daca gresesc): cand apesi butonul vrei ca LED sa fie ON numai daca pe intrarea RA0 ai semnal dreptunghiular, 50% duty cycle, cu perioada de 4 secunde. Odata acest semnal oprit, si LED se stinge indiferent daca butonul e apasat sau nu.Cum l-as face:1. Apas butonul (in mod continuu) in serie cu intrarea RA0.2. Astept sa detectez ca am nivel "1" pe intrare. Daca nimeresc in pauza = nivel "0", astept pana vine un "1" si nu aprind inca LED.3. Am detectat nivel "1", aprind LED, numar ca nivel "1" dureaza approximativ 2 secunde (il masor si e OK daca are intre 1900 si 2100 ms), apoi am nivel "0" pe RA0. LED inca aprins. Masor durata nivelului "0" si daca este mai mica decat 2100 ms, tin LED inca aprins. Daca-i mai lung atunci sting LED odata ce masuratoarea detecteaza semnal in afara domeniului acceptabil (adica nivel "1" nu mai se repeta). Asta chiar daca butonul este inca apasat. 4. Repeta pas 2.Pas 1 nu se repeta pentru ca PIC "stie" cand primeste un nivel "1" numai daca butonul este apasat, permitand intrarii sa primeasc semnal.

Link spre comentariu

Uite cum am nevoie:

Am pe intrare (butonul e apasat) semnal dreptunghiular. 2 sec e pe 1, 2 sec pe 0, 2 sec pe 1... si tot asa. In acest timp, ledul e aprins.

Daca butonul nu o sa mai fie apasat, atunci nu o sa mai am semnalul dreptunghiular pe intrare. Deci ledul o sa fie stins.

O sa incerc sa fac dupa modelul cum l-ai prezentat.

Multumesc

 

 

P.S. Pe PM ti-am spus ceea ce am spus mai sus:

"Salut

Deci, eu pe PORTA.0 am o intrare de genul 1-0-1-0... 2 sec pe 1 2 sec pe 0, si tot asa.

Codul ce l-ai dat e ok, stiam sa il fac, sa zic asa... Chestia ce nu stiu cum sa o fac este cu cele 2 sec in care am 1 pe intrare, sau 0 pe intrare... Cum pot verifica, de ex, daca dupa 4 sec nu imi mai vine 1 pe intrare, de ex... sau 0 pe intrare...? Asta nu stiu cum sa fac...

Mersi mult."

Link spre comentariu

Pai modelul meu de mai sus este un pic diferit, ca logica, de ceea ce vrei. Adica eu presupun ca semnalul se poate intrerupe el singur indiferent daca tii sau nu apasat pe buton. Dar, face ceea ce vrei tu, pentru ca PIC-ul nu stie daca butonul e apasat sau nu, ele vede doar daca semnalul e acolo sau nu. Da-ne de stire cum merge.

Link spre comentariu

Am facut si eu un fel de pseudocod, sper sa se inteleaga:

 

resetare:        RA7=0;asteapta_1:      if (RA0=1) {RA7=1; goto asteapta_0;}                 goto asteapta_1;                 asteapta_0:      if (RA0=0) {goto cronometru};                 goto asteapta_0;cronometru:      i=0;                 while(i<=20) {if (RA0=1) {goto asteapta_0};                               i=+1;                               delay 100ms;}                                 goto resetare;

Un cronometru format dintr-o bucla while e pornit doar in momentul cand RA0 trece in 0. Cronometrul numara pana la 2.1s, dupa care reseteaza pe RA7. Daca intre timp RA0 trece in 1, cronometrul este anulat, si resetarea lui RA7 amanata.

Daca semnalul este foarte precis, se poate mari rezolutia de numarare a cronometrului, de exemplu while(i<=200) si delay 10ms; care va numara pana la 2.01s.

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