Sari la conținut
ELFORUM - Forumul electronistilor

Pic 18F 452 si tastatura


Mar

Postări Recomandate

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

Top autori în acest subiect

  • Mar

    7

  • Liviu M

    6

  • puiu

    2

Top autori în acest subiect

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

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

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

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

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

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

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

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    ggg
Da' 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

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

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

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

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

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