Vizitator dj_leno_2006 Postat Octombrie 29, 2011 Partajează Postat Octombrie 29, 2011 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
Liviu M Postat Octombrie 29, 2011 Partajează Postat Octombrie 29, 2011 Ce compilator?Ce oscilator? Cum e setat in cod?Ce face functia button()?Cum e legat butonul? Pune eventual schema (ca poza/pdf, s-o poata deschide oricine). Link spre comentariu
Vizitator dj_leno_2006 Postat Octombrie 29, 2011 Partajează Postat Octombrie 29, 2011 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
Liviu M Postat Octombrie 29, 2011 Partajează Postat Octombrie 29, 2011 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 Postat Octombrie 29, 2011 Partajează Postat Octombrie 29, 2011 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 Postat Octombrie 29, 2011 Partajează Postat Octombrie 29, 2011 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
Liviu M Postat Octombrie 30, 2011 Partajează Postat Octombrie 30, 2011 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 Postat Octombrie 30, 2011 Partajează Postat Octombrie 30, 2011 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 Link spre comentariu
Vizitator dj_leno_2006 Postat Octombrie 30, 2011 Partajează Postat Octombrie 30, 2011 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 Link spre comentariu
Liviu M Postat Octombrie 30, 2011 Partajează Postat Octombrie 30, 2011 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
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum