moro Postat Aprilie 18, 2011 Partajează Postat Aprilie 18, 2011 Salutare, de curand m-am pus sa ma joc cu niste pic-uri ce le am printr-o lada si vreau sa fac o automatizare cu niste butoane si becuriAm sa arat codul dupa care voi spune si ce s-a intamplat void main() { TRISA = 0xFF; TRISB = 0xFF; TRISC = 0x00; CMCON=0; ADCON1=0xFF; TRISA.RA1=1; // RA1 inputdo { if (PORTB.RB0==0&&PORTA.RA1==0) { // usa dreapta PORTC.RC0 = 1; delay_ms(1000); PORTC.RC0 = 0; } else { PORTC.RC0= 0; } } while(1);}Pe portul RB0 am conectat un buton care atunci cand este actionat da starea 0 logic pe RB0 si va trimite 1 logic pe iesirea RC0, eu vreau sa conditionez operatia aceasta de inchiderea unui contact pe RA1 care atunci cand este inchis va pune starea 0 logic pe RA1.Problema este ca nici in ruptul capului nu are vreun efect in ce stare este RA1, daca apas butonul din RB0 indiferent ca RA1 este 1 sau 0 level mie tot imi actioneaza RC0. A intalnit cineva problema asta sa ma ajute si pe mine putin... nu am foarte multa experienta cu picuri.... Link spre comentariu
cirip Postat Aprilie 18, 2011 Partajează Postat Aprilie 18, 2011 Salut,Esti sigur ca RA1 ajunge 1? Ai pullup pe el? Ca sa fii sigur ca ajunge 1, fa un program care nu face decat sa citeasca RA1 si sa-l scoata afara pe alt port, la un led sau chiar masurat cu voltmetrul, ca sa vezi ce "vede" cu adevarat procesorul cand citeste RA1. Link spre comentariu
moro Postat Aprilie 18, 2011 Autor Partajează Postat Aprilie 18, 2011 Da are pullup pe RA1, si pe RA0 face la fel, am incercat sa vad daca scoate pe alte porturi si tot la fel face...Ba chiar cu un program ceva mai simplu:if (PORTA.RA1==0) { PORTC.RC4 = 1;} else { portc.rc4 = 0; } si la fel face... am incercat chiar sa inversez conditia, sa il fac pentru 1 logic si nu pentru 0. Ba chiar am facut si o simulare pe calculator in proteus vdm/isis si acelasi lucru... incep sa cred ca nu sunt configurati niste registrii corecti, dar pe portul RA1 am decat IO sau Analog, am incercat cu ADCON 0 sau 1 sau 0xFF si nimic Link spre comentariu
francezu Postat Aprilie 18, 2011 Partajează Postat Aprilie 18, 2011 Ai activat comparatoarele , care au intrarile la pinii RA0-RA3. Pentru dezactivare trebuie : CMCON=7sau nu modifici deloc registrul, pt ca la reset, comparatoarele sunt dezactivate. Link spre comentariu
cirip Postat Aprilie 19, 2011 Partajează Postat Aprilie 19, 2011 Corect, corect ce zice francezu. CMCON tre sa fie 7 ca sa folosesti intrarile digitale si atentie cand il scrii, ca e in bank1. Link spre comentariu
pegas Postat Aprilie 19, 2011 Partajează Postat Aprilie 19, 2011 nu.trebuie pus in ADCON1 0x06. altfel, la reset sunt porturi analogice.CMCON nu are treaba. Link spre comentariu
cirip Postat Aprilie 19, 2011 Partajează Postat Aprilie 19, 2011 Eu imi amintesc (n-am mai programat de mult PIC) ca trebuie lucrat cu ambele registre, ADCON1 si CMCON.In plus, in documentatie la pag 43 scrie cu referire la portul A: The operation of each pin isselected by clearing/setting the appropriate control bitsin the ADCON1 and/or CMCON registers. Link spre comentariu
pegas Postat Aprilie 19, 2011 Partajează Postat Aprilie 19, 2011 ... si al doilea rand, dedesubt scrie la nota: On a Power-on Reset, these pins are configured as analog inputs and read as ‘0’. The comparators are in the off (digital) state. oricum, incarcase 7 in CMCON, suplimentar, deci CM2-0 erau dezactivati. Link spre comentariu
francezu Postat Aprilie 19, 2011 Partajează Postat Aprilie 19, 2011 oricum, incarcase 7 in CMCON, suplimentartocmai , ca nu incarcase 7 ( asta i-am sugerat mai sus) ci 0. In cazul asta chiar si cu ADCON1=0x06, intrarile( corespunzatoare comparatoarelor) or sa fie setate tot in analogic, si la citire o sa dea mereu 0. Link spre comentariu
pegas Postat Aprilie 19, 2011 Partajează Postat Aprilie 19, 2011 merge si cu CMCON si fara. simulare MPLAB + real.implicit ele vin cu 7. Link spre comentariu
francezu Postat Aprilie 19, 2011 Partajează Postat Aprilie 19, 2011 Da, dar ce incerc eu sa spun este ca nu merge cu CMCON=0 ( am testat practic), asa cum a scris in cod colegul @moro la inceputul topicului; asta era motivul pt care lui nu i-a mers. Link spre comentariu
moro Postat Aprilie 20, 2011 Autor Partajează Postat Aprilie 20, 2011 Multumesc colegilor forumisti mai experimentati ca mine cu microcontrolerele astea... Intradevar 0x06 pe ADCON1 mi-a rezolvat problema, functioneaza brici dar am ajuns intr-un mic impas cu o chestie if(PORTA.RA2==0||PORTB.RB4==0||PORTB.RB5==0||PORTB.RB6==0||PORTB.RB7==0&&PORTA.RA1==0) { do { Sound_Init(&PORTC, 4); Sound_Play(1000, 100); } while(1);} else { PORTC.RC4=0; } Vreau sa implementez si o alarma in cazul care unul din bitii portului B (RB4,RB5,RB6,RB7) si de pe portul A RA2 sunt deschise ( o usa se deschide) toate astea fiind conditionate de armarea montajului prin pinul RA1 tras la masa (0 logic) Vreau ca atunci una din usi cand se deschide sa sune alarma, dar sa ramana blocata pana cand sistemul este dezarmat, adica nivelul lui RA1 va fi 1 (RA1==1) Pana acum merge alarma in sensul ca atunci cand una din usi (RA2,RB4,RB5,RB6,RB7) sunt deschise, se automentine alarma, dar vreau ca atunci cand o dezarmez sa se opreasca, practic un fel de reset. Am vazut ca daca resetez pinul 1 MCLR se reseteaza si alarma intradevar, dar nu vreau sa folosesc MCLR-ul acela... Are vreo idee cineva? Link spre comentariu
francezu Postat Aprilie 20, 2011 Partajează Postat Aprilie 20, 2011 Trebuie sa verifici nivelul pinului de armare/dezarmare (RA1) in bucla do.. while: Sound_Init(&PORTC, 4);do Sound_Play(1000, 100);while(RA1_bit==0); Link spre comentariu
moro Postat Aprilie 20, 2011 Autor Partajează Postat Aprilie 20, 2011 saru`mana merge !! Link spre comentariu
moro Postat Aprilie 27, 2011 Autor Partajează Postat Aprilie 27, 2011 Am revenit... Ca sa nu mai deschid alt subiect cu acest microcontroler, fiind incepator am incercat sa fac diverse experimente cu pic`ul asta. Am vazut ca stie sa faca ceva pwm-uri, am stat toata dimineata sa vad cum naiba generez pwm dar simt ca ma lasa rabdarea, o sa dau paste la cod prima oara void main() { T2CON=0x05; // PR2=0x0A; CCPR1L= 0x16; TRISC=0; CCP1CON=0x4C; // }Clock-ul este de 4 mhz, si cand pun osciloscopul pe pinul RC2 corespunzator lui CCP1 nimic, mort. Tot rumeg datasheetul lui PIC16F876 Ce am reusit eu sa deduc din datasheet este ca pentru a seta modul pwm trebuie sa selectez bitii 5 si 4 (CCPxX si CCPxY), 3 si 2 ( CCPxM3 si CCPxM2 ) am setat si prescale la 2, am setat si portul C si tot nu merge, deja am ramas fara idei.... 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