Pagina 1 di 1

PIC16F84: usare RB0, con RB1..RB7 usati per un display 7seg.

MessaggioInviato: 5 ago 2013, 8:34
da franx
PIC16F84A

I pin RB1...RB7 li ho impegnati per un display LED sette segmenti.

Il pin RB0/INT lo vorrei usare come pin di interrupt esterno.

Non c'è verso di far funzionare l'interrupt (ho ovviamente configurato INTCON ecc.)

Come ho capito, quando si dà il classico PORTB per accendere i segmenti, ne viene coinvolto pure il pin RB0 e quindi o scaturisce un interrupt (se imposto l'edge a 1) oppure viene ignorato (se imposto l'edge su 0)

C'è una soluzione al problema?

In effetti su google, trovo tutti che collegano il sette-segmenti a RB0-RB6, dando per scontato che RB0 non si possa usare. E' così?

Uso (devo usare :-) mikroBasic

Grazie

Re: PIC16F84: usare RB0, con RB1..RB7 usati per un display 7

MessaggioInviato: 5 ago 2013, 8:48
da c1b8
Il problema credo sia che scrivendo direttamente sulla porta PORTB coinvolgi anche lo stato di RB0, cambiandolo, e quindi scatta l'interrupt.
Ci sono 2 possibili soluzioni, dopo essersi assicurati che RB0 sia impostato come input:
1) Non scrivere direttamente sulla PORTB ma impostare a '0' o '1' i singoli bit da RB1 a RB7
2) Quando vai a scrivere sulla PORTB procedi in questo modo:
- fai una AND tra il valore da scriver in PORTB e il valore 0xFE (in modo da azzerare solo quello che andrebbe scritto in RB0)
- salvi il valore ottenuto
- Leggi la PORTB
- fai un AND con il valore 0x01 (per azzerare tutto tranne RB0)
- fai un OR con il valore salvato precedentemente
- scrivi in PORTB

Re: PIC16F84: usare RB0, con RB1..RB7 usati per un display 7

MessaggioInviato: 9 ago 2013, 9:17
da franx
c1b8 ha scritto:Il problema credo sia che scrivendo direttamente sulla porta PORTB coinvolgi anche lo stato di RB0, cambiandolo, e quindi scatta l'interrupt.


Ti ringrazio. La soluzione di accendere un segmento per volta, secondo me è preferibile rispetto a quella di scrivere sull'intera porta: per esempio il display LED potrebbe essere pilotato per una parte da un PORT e per un'altra parte da un altro PORT, come il caso del 16F688