Sari la conținut
ELFORUM - Forumul electronistilor

RB Port Change Interrupt


Vizitator eve_2035

Postări Recomandate

Vizitator eve_2035

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

Top autori în acest subiect

  • Liviu M

    2

  • kit

    1

Zile populare

Top autori în acest subiect

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

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 veni
TRISB=b'00010000';
bafta
Link spre comentariu

@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

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