Mar Postat Noiembrie 3, 2010 Partajează Postat Noiembrie 3, 2010 Vreau sa conectez o tastatura de 3 coloane si 4 liniia la portb dar merge aiurea.Folosesc intrerupere si am setat RB0-RB2 ca iesiri si RB4-RB7 ca intrari. Coloanele se ciclez pe RB0, RB1,RB2 si la liniile pe RB4-RB7.Eu vreau sa citesc tot portul B si sa compar cu un numar binar. Daca numarul binar corespunde cu portul B atunci imi afiseaza ceva pe LCD. Am simulat programul si problema e ca atunci cind compar , intrarile nu pot sa le citesc. Se pot citi numai iesirile. Deci nu pot sa stiu care dintre pinii RB4-RB7 a generat intreruperea.Va rog sa-mi spuneti cum pot sa stiu care dintre intrari a generat intreruperea.Multumesc Link spre comentariu
Liviu M Postat Noiembrie 3, 2010 Partajează Postat Noiembrie 3, 2010 Cum adica nu poti citi intrarile? Pai tocmai, ca intrarile sunt cele care se pot citi, iar iesirile sunt cele pe care picul le "impune".Eu banui ca in simulare nu poti citi intrarile pentru ca n-au o valoare "cunoscuta", depind de circuitul extern. Activeaza weak-pull-up si ar trebui sa citesti permanent 1.Sau posteaza o schema, sa vedem si noi desprece vorbim, ca poate ai deja rezistente externe. Link spre comentariu
Mar Postat Noiembrie 4, 2010 Autor Partajează Postat Noiembrie 4, 2010 Secventa de program este urmatoarea; ORG 00004 Goto main ORG 0008 Bra int main movlw 0x0Fh movwf ADCON1 ; setez pe digital movlw 0xF0 movwf 0xF93 ; TRISB ( RB0 – RB3 sunt iesiri, RB4 – RB7 sunt intrari) bsf 0xFF2,7 ; activez intreruperea globala GIEH din INTCON bsf 0xFD0,7 ; setez IPEN din RCON bsf 0xFF1, 0 ; setez RBIP din INTCON2 pentru high priority bsf 0xFF1, 7 ; setez RBPU din INTCON2 bsf 0xFF2, 3 ; setez RBIE din INTCON bcf 0xFF2, 0 ; sterg flagul RBIF din INTCON ggg bsf 0xF81,0 ;in aceasta secventa ciclez RB0-RB2 pentru coloane call delay bcf 0xF81,0 call delay bsf 0xF81,1 call delay bcf 0xF81,1 call delay bsf 0xF81,2 call delay bcf 0xF81,2 goto ggg int btfsc 0xF81,4 ;RB4 call unu btfsc 0xF81,5 ;RB5 call patru bcf 0xFF2,0 ; sterg flagul RBIF retfie In programul de intrerupere eu citesc intrarile RB4 si RB5.Intreruperea o face cind apas tastele dar imi afiseaza pe lcd ambele cifre cea ce arata ca pinii nu au fost trecuti pe 0 logic.Am incercat sa citesc iesirile modificind RB4 cu RB0 si RB5 cu RB1 in secventa de intrerupere si pe asta o citeste Cum afisez si o imagine a tastaturii conectata la PIC? Link spre comentariu
Mar Postat Noiembrie 4, 2010 Autor Partajează Postat Noiembrie 4, 2010 Hai ca am reusit Link spre comentariu
Liviu M Postat Noiembrie 4, 2010 Partajează Postat Noiembrie 4, 2010 Si problemele le ai cu schema fizica sau in simulare?Daca in simulare, cu ce/cum simulezi? Link spre comentariu
Mar Postat Noiembrie 4, 2010 Autor Partajează Postat Noiembrie 4, 2010 Problemele le am si in simulare si cu schema fizica.Eu simulez cu MPLAB SIM.In secventa se ciclare introduc o secventa care seteaza RBIF. La simulare programul sare in intrerupere dar nu poate reseta RB4-RB7, deci nu pot sa sterg din portul RB4-RB7.Daca inlocuiesc pinii cu RB0-RB3 pot sa-i trec pe 0 sau 1 logic in secventa de intrerupere dar sint setati din TRISB pe iesire. Link spre comentariu
Liviu M Postat Noiembrie 4, 2010 Partajează Postat Noiembrie 4, 2010 N-am idee de ce nu merge schema fizica, da' la simulator mi se pare normal ce face.N-ai cum sa setezi din PORTB<7:4> valorile pinilor. Fiind ei intrari, sunt numai cititi; "setarea" lor se face extern.Din cate stiu eu, in mpsim trebuie sa-ti definesti scenarii de generare a stimulilor externi. In scenariile astea poti sa "simulezi" apasarea tastelor. Link spre comentariu
puiu Postat Noiembrie 4, 2010 Partajează Postat Noiembrie 4, 2010 Din cate stiu eu, in mpsim trebuie sa-ti definesti scenarii de generare a stimulilor externi. In scenariile astea poti sa "simulezi" apasarea tastelor.1. Da, este adevarat. In MPSIM se initiliaza porturile si acest lucru se face in sectiunea debungger, se alege optiunea stimuli. Link spre comentariu
Mar Postat Noiembrie 4, 2010 Autor Partajează Postat Noiembrie 4, 2010 Voi incerca miine varianta cu debuger. Totusi ce ar putea sa nu functioneze in programul meu?Eu nu pot sa stiu care dintre pinii RB4-RB7 a generat intreruperea. Exista alta obtiune de a afla ce a generat intreruperea? Link spre comentariu
puiu Postat Noiembrie 4, 2010 Partajează Postat Noiembrie 4, 2010 1. Daca schimbi radurile cu coloanele, deci faci pe rand 0V la RB4-RB7, poti seta intreruperile INT0,INT1 si INT2 adica RB0, RB1 si RB3 a caror valoare o poti citi in registri INCON, pentru INT0 si INCON3 pentru INT1 si INT2 Link spre comentariu
Liviu M Postat Noiembrie 4, 2010 Partajează Postat Noiembrie 4, 2010 Eu n-am scris pana acum nici un program in assembler, asa ca sunt sanse mari sa spun prostii, da' eu cred ca ai probleme cu "logica" de la coloane. La cum ai desenat schema, ar trebui sa tii coloanele in 1 si sa le "tragi" pe rand la masa, a.i. in cazul in care apesi o tasta sa ai un singur 0 la un moment dat si sa poti decodifica tasta apasata. Daca inteleg eu bine in codul tau, dupa fiecare bcf ai inca o coloana care ramane conectata la masa. Adica, dupa parerea mea, ai logica putin pe invers. Daca as stii sa scriu cod in assembler as scrie ceva de genul: movlw 0xF0h movwf 0xF81 ; RB4..RB7 = 1 ggg bcf 0xF81,0 ;in aceasta secventa ciclez RB0-RB2 pentru coloane call delay bsf 0xF81,0 call delay bcf 0xF81,1 call delay bsf 0xF81,1 call delay bcf 0xF81,2 call delay bsf 0xF81,2 goto gggDa' nu prea ma pricep la assembler, asa ca probabil ce am scris mai sus nu va functiona. Sper, in schimb, sa-ti dea o idee la ce ma refer. LE Vezi ca n-ai nevoie de rezistentele de pe coloane. Link spre comentariu
Mar Postat Noiembrie 5, 2010 Autor Partajează Postat Noiembrie 5, 2010 DA asa este cum ai zis. Tin toate coloanele la 1 si le trag pe rind la masa asta deoarece din cite am citit probabilitatea ca o intrerupere a portului B sa se auto declanseze este mai mica. Dar voi incerca sa fac invers cum ai spus tu (pe logica pozitiva). Voi pune coloanela la masa si le voi cicla cu 1 logic. Link spre comentariu
Liviu M Postat Noiembrie 5, 2010 Partajează Postat Noiembrie 5, 2010 Nu, eu cred ca tu vrei sa tii coloanele in 1 si sa le faci 0 pe rand, da' din cate stiu eu bcf inseamna bit clear. Asta inseamna ca la sfarsitul buclei aleaia infinite (ggg), dupa cei trei bcf, toate coloanele sunt 0, nu 1. Sansa sa decizi care coloana e "vinovata" de o detectie pe una din linii e, in cazul asta, zic eu, minima. Daca te uiti in bucatica de cod pe care am scris-o eu, o sa vezi ca am incercat sa am toti pinii in 1 (bsf) si sa pun la masa un singur pin o data, pentru delay time (practic in codul tau am inversat bcf si bsf intre ele a.i. la sfarsitul buclei toti pinii sa fie in 1). Link spre comentariu
Mar Postat Noiembrie 5, 2010 Autor Partajează Postat Noiembrie 5, 2010 Draga Liviu M in final am reusit. Tin coloanele 0 logic si le ciclez cu 1 logic. Asa functioneaza perfect. Dar rezistentele de pe linii le pun la masa. Oricum nu stiu daca rezistentele de pe linii isi mai au rostul acolo Link spre comentariu
Liviu M Postat Noiembrie 5, 2010 Partajează Postat Noiembrie 5, 2010 Rezistentele pe linii sunt necesare intotdeauna, ca altfel raman intrarile in aer si nu stiu ce sa faca.De renuntat poti renunta la cele de pe coloane, care impreuna cu cele de pe linii fac un divizor rezistiv de toata frumusetea si-ti pot strica nivelele pe intrari.A, si felicitari! 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