Sari la conținut
ELFORUM - Forumul electronistilor

Problema cu citirea RA1 la un PIC16F876A


moro

Postări Recomandate

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
  • Răspunsuri 40
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • moro

    14

  • francezu

    10

  • pegas

    6

  • cirip

    3

Top autori în acest subiect

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

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

Ai activat comparatoarele , care au intrarile la pinii RA0-RA3. Pentru dezactivare trebuie :

CMCON=7
sau nu modifici deloc registrul, pt ca la reset, comparatoarele sunt dezactivate.
Link spre comentariu

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

... 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

oricum, incarcase 7 in CMCON, suplimentar

tocmai , 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

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

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

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

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