Sari la conținut
ELFORUM - Forumul electronistilor

Problema input PIC16F876A


Vizitator dj_leno_2006

Postări Recomandate

Vizitator dj_leno_2006

Salut, sunt un incepator in lumea Pic-urilor si am o problema cu PIC16F876A, am setat RA0 ca input, si PORTB ca output, ceea ce vreau sa fac e cand RA0 e high voltage PORTB e 1, problema e urmatoarea:daca RA0 e la + sau la - (cu button(PORTA, 0, 1, 1) ), PORTB e 0, daca RA0 e la + sau la - (cu button(PORTA, 0, 1, 0) ), PORTB e 1, nu imi citeste inputul si nu imi dau seama dc, am incercat fel si fel de chestii dar nimicvoid main(){ CMCON = 0x07; TRISA0_bit = 1; TRISB = 0x00; // Configure PORTB as output PORTB = 0x00; // Initial PORTB value while(1) { if(button(PORTA, 0, 1, 1)) { PORTB = 0xff; // Set PORTB on Delay_ms(200); PORTB = 0; // Set PORTB off Delay_ms(200); } }} ms, Alex

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

Top autori în acest subiect

  • Liviu M

    4

Top autori în acest subiect

Imagini postate

Vizitator dj_leno_2006

Ala e tot codul, compilator mikroc, oscilator extern de 8mhz, functia button este din library, daca ai mai folosit vreodata mikroc atunci stii cum functioneaza, ms d raspuns

Link spre comentariu

Sa-nteleg ca frecventa ceasului/tipu7l de ceal le-ai setat folosind IDE-ul?

Nu, nu stiu cum e cu mikroC (daca stiam nu intrebam ce e cu el). Asta nu m-a impiedicat sa ma uit in help ce e cu functia aia button() si am gasit un exemplu care face cam ce vrei tu folosind alti pini (butonul e conectat la RB0).

Example reads RB0, to which the button is connected; on transition from 1 to 0 (release of button), PORTD is inverted:

 

do {   if (Button(&PORTB, 0, 1, 1))         oldstate = 1;   if (oldstate && Button(&PORTB, 0, 1, 0)) {      PORTD = ~PORTD;      oldstate = 0;   }} while(1);
Dupa cum observi, parametrul e transmis prin referinta (sper c-am adaptat bine) - ampersandul (&) din fata lui PORTB (if(button(&PORTB...)).

Dupa cum observi inca o data, starea lui RB0 e testata de 2 ori, ceea ce permite detectia unei tranzitii (in cazul din fata din 1 in 0). Cu primul if asteapta ca RB0 sa fie 1, in al doilea detecteaza trecerea in 0 a acelui pin.

 

C p!

Link spre comentariu
Vizitator dj_leno_2006

Problema este ca nu stiu cum este setat, input analogic sau digital, am incercat cu ANCON1 = 0x00001110 seteaza toate port AN ca digital aparte RA0 care este AN0 ca input analogic. Buttonul merge doar cand firul de la pin RA0 este atins cu degetul, in schimb daca este la + sau la gnd, nu se intampla nimic, mi se pare destul de ciudat, daca RA0 este setat ca digital port atunci nu merge absolut nimic

Link spre comentariu
Vizitator dj_leno_2006

Am incercat fel si fel de metode inclusiv exemplul dat de tine mai sus, nu merge nimc, nu inteleg partea cu atinsul degetului pe canal analogic, si cealalta parte cu canal digital care nu merge

Link spre comentariu

Inca n-ai pus schema, asa ca e greu de ghicit cam ce ar putea sa-ti faca probleme.

Pinul ar trebui setat pe digital (ADCON1 = 0x06).

Inca nu m-am prins de ce-ti trebuie o functie intreaga sa citesti un buton.

 

do {   if (RA0 == 1)        oldstate = 1;   if (oldstate &&  (RA0==0)    {       PORTB = 0xff; // Set PORTB on       Delay_ms(200);       PORTB = 0; // Set PORTB off       Delay_ms(200);   }} while(1);
Link spre comentariu
Vizitator dj_leno_2006

Nu stiu la ce te referi prin schema dar daca te referi la schema circuit nu o am pt ca acum doar invat PIC, am pus poza cu codul C, am incercat si metoda ta if (RA0 == 1) si o reincerc acum, dar nu mi-a mers if if (RA0 == 0) merge dar invers nu.Ms

post-17840-139829330339_thumb.png

Link spre comentariu
Vizitator dj_leno_2006

Problema rezolvata, problema era ADCON = 0x06; 2 zile am pierdut si 10 ore de draci :)) Imi poti explica mai bine ADCON? Mersi mult Liviu. PS. stii cum pot masura timpul in care RA0 este high level? de ex tin apasat 3sec pe button, si in pic sa am o variabila unde va fi setata in functie de timpul care a fost apasat buttonulCodul corect

post-17840-139829330473_thumb.png

Link spre comentariu

Daca vrei ca PORTA sa fie si digital, ADCON1 trebuie setat intotdeauna, altfel dupa reset porneste implicit cu PORTA setat pe analog. Ieri am sarit peste "amanuntul" asta; cand ai pomenit de ADCON1 am crezut ca ai testat singur si ADCON1 corect.

Referitor la schema, e totusi importanta ca sa ne prindem si noi cum generezi o si cum 1.

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