Vizitator eve_2035 Postat Iunie 21, 2010 Partajează Postat Iunie 21, 2010 Salut. Incerc de ceva timp sa fac o intrerupere pe portul RB4 al uc PIC16F877A. Pe RB0 am reusit, dar pe RB4-RB7 nu. La RB4 este conectata iesirea de la un optocuplor si la a 3-lea semnal generat de acesta, vreau sa aprind un led (RD1). Cred ca ar fi important de precizat ca microcontrollerul il alimentez de la PICKit2, iar la RB6 si RB7 sunt conectate firele PGD si PGC. Am incercat sa le scot din montaj dupa ce programez uc, dar tot nu are loc intreruperea. Softul meu:#includeint t=0;unsigned int j,k;void init(void){ TRISD=0; PORTD=0x00; TRISB=0x0b11110000; PORTB=0x00; PEIE=1; GIE=1; RBPU=0; RBIE=1; RBIF=0; INTE=0;}void interrupt isr(void) { GIE=0; if((RB4==0)&&(RBIF)) { RBIF=0; t++; } GIE=1;}void main(void){ init(); while(1) { RD0=1; for(j=0;j<15000;j++); if(t>3) { RD1=1; for(k=0;k<20000;k++); t=0; } }}Aveti vreo idee unde e greseala? Multumesc. Link spre comentariu
Liviu M Postat Iunie 21, 2010 Partajează Postat Iunie 21, 2010 N-am folosit pana acum niciodata interrupt on change-ul asta, da' din ce scrie in DS The input pins (of RB7:RB4) are compared with the old value latched on the last read of PORTB.ma gandesc ca poate e nevoie sa citesti portul asta o data la inceput, ca sa se "incarce" latchul cu valoarea aia veche. Presupun ca initializarea TRISB=0x0b11110000; e o greseala de tastare. A, si ca sa pastrezi codul formatat si usor de citit, foloseste tagurile code ([ code ][ /code ]). LE Presupun ca restul hardware-ului functioneaza corect. Chiar, o schema poti pune? Macar bucata cu conectarea intre optocuplor si PIC. Daca da, incearca s-o pui ca poza/pdf, ca nu pot sa deschid prea multe formate exotice. Link spre comentariu
kit Postat Iunie 21, 2010 Partajează Postat Iunie 21, 2010 n-am folosit niciodata 16f877a iar C-ul scris nu este in C18 cu care sunt familiarizat, daraici void interrupt isr(void) {GIE=0;if((RB4==0)&&(RBIF)){RBIF=0;t++;}GIE=1;}pare ca nu e bun. rbif va fi resetat doar daca rb4 este 0, insa daca rb4==1 nu. IOC apare la schimbarea valorii de pe pin, adica de la 1->0 sau de la 0->1.poate ar fi mai bine:void interrupt isr(void) {GIE=0;if((RBIF==1)&&(RBIE==1)){RBIF=0;if(RB4==0){t++;}}GIE=1;}apoi, desigur, pe RB0 era o intrerupere de tip INT si nu IOC. poate ar fi bine de adaugat o "siguranta" in cod in sensul citirii dupa un mic delay() din nou a pinului. daca dupa delay() e neschimbat atunci nu a fost un semnal parazit si faci t++.o alta chestie ar putea rezulta din:A mismatch condition will continue to set flag bit RBIF.Reading PORTB will end the mismatch condition andallow flag bit RBIF to be cleared.(pag 44 din DS)eventual ar putea fi adaugata o instructiune de citire a PORTB.inca o chestie: ai incercat sa nu te bazezi pe pull-up-ul intern si sa-l rezolvi extern? sa nu intre in conflict cu partea de hard pe care o ai pe placa...iar daca citesti doar pe RB4 atunci ar cam veniTRISB=b'00010000';bafta Link spre comentariu
Liviu M Postat Iunie 21, 2010 Partajează Postat Iunie 21, 2010 @kit: cred ca ai dreptate, probabil asta e problema, numa ca ai rezolvat-o doar pe jumatate (ma rog, trei sferturi). Inainte sa faca RBIF = 0 trebuie sa citeasca portul RB, altfel nu dispare "conditia de mismas" si flagul e setat din nou. Ma rog, ai scris si de asta, da' cred ca chiar trebuie in isr. 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