Como usar IOC—INTERRUPT-ON-CHANGE ??!!!

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Como usar IOC—INTERRUPT-ON-CHANGE ??!!!

Mensagempor Andre_Cruz » 14 Ago 2009 11:44

Estou estudando o PIC 12F675, e ja vi várias vezes no data sheet esta interupção IOC — INTERRUPT-ON-CHANGE, mas nunca me perguntei como ela funciona, onde pode ser aplicada, e olhando no data sheet, usa-se apenas o registrador IOC para habilitar a interupção, e o flag GPIE do registrador INTCON e quando acontece a interupção o flag GPIF do registrador INTCON é setado.

Algumas das minhas dúvidas:
1) Ela é um interupção de mudança de estado no pino habilitado no registrador IOC ?

2) Se caso ela for uma interupção de mudança de estado, ela acontece a cada transição de 0 para 1 e de 1 para 0? Que não encontrei como configurar a borda que vai gerar a interupção.

Tentei configurar apenas estes registradores que mencionei, e não consegui gerar a interupção.

Agradeço a ajuda de todos
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Re: Como usar IOC—INTERRUPT-ON-CHANGE ??!!!

Mensagempor Djalma Toledo Rodrigues » 14 Ago 2009 12:37

Andre_Cruz escreveu:t2) Se caso ela for uma interupção de mudança de estado, ela acontece a cada transição de 0 para 1 e de 1 para 0? Que não encontrei como configurar a borda que vai gerar a interupção.

Tentei configurar apenas estes registradores que mencionei, e não consegui gerar a interupção.

Agradeço a ajuda de todos

Sim ocorrera a cada mudança de estado

mas, tem também o Flag GPIF, alem do GIE, no Registro INTCON.

E tambem a configuração, lógico, observe que o Comparador e o ADC estão envolvidos na
configuração dos pinos I / O. -----> Registros ANSEL e CMCON

Do Datasheet pág. 21:

make the corresponding GPIO pin an output (i.e., put
the contents of the output latch on the selected pin).
The exception is GP3, which is input only and its
TRISIO bit will always read as ‘1’. Example 3-1 shows
how to initialize GPIO.
Reading the GPIO register reads the status of the pins,
whereas writing to it will write to the port latch. All write
operations are read-modify-write operations. There-fore,
a write to a port implies that the port pins are read,
this value is modified, and then written to the port data
latch. GP3 reads ‘0’ when MCLREN = 1.
The TRISIO register controls the direction of the
GP pins, even when they are being used as analog
inputs. The user must ensure the bits in the TRISIO
register are maintained set when using them as analog
inputs. I/O pins configured as analog inputs always
read ‘0’.
EXAMPLE 3-1: INITIALIZING GPIO
3.2 Additional Pin Functions
(OPTION<7>).
REGISTER 3-1: GPIO — GPIO REGISTER (ADDRESS: 05h)
Note: Additional information on I/O ports may be
found in the PIC ® Mid-Range Reference
Manual, (DS33023).
Note: The ANSEL (9Fh) and CMCON (19h)
registers (9Fh) must be initialized to
configure an analog channel as a digital
input. Pins configured as analog inputs will
read ‘0’. The ANSEL register is defined for
the PIC12F675.

BCF STATUS,RP0 ;Bank 0
CLRF GPIO ;Init GPIO
MOVLW 07h ;Set GP<2:0> to
MOVWF CMCON ;digital IO
BSF STATUS,RP0 ;Bank 1
CLRF ANSEL ;Digital I/O

MOVLW 0Ch ;Set GP<3:2> as inputs
MOVWF TRISIO ;and set GP<5:4,1:0>
;as outputs
bit 7-6: Unimplemented: Read as ’0’
bit 5-0: GPIO<5:0>: General Purpose I/O pin.


Abraço e boa interrupção.
.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor Alesandro F Zagui » 14 Ago 2009 13:29

Exemplificando:

Configuração de uma interrupcao no GPIO0:

ANSEL = B'00000000'
CMCON = B'00000111'
INTCON = B'10001000'
IOC = B'00000001'
WPU = B'00000001' ; configura resistor de PULL-UP no GPIO0

Após gerada a interrupção, você deve limpar o flag GPIF no intcon
Alesandro Freire Zagui
Alesandro F Zagui
Byte
 
Mensagens: 154
Registrado em: 12 Mai 2009 11:03
Localização: Campo Mourao, Pr

Mensagempor Andre_Cruz » 14 Ago 2009 14:08

Valew Djalma e Alessandro,

Estava configurando tudo certinho, estava testando a interupção apenas no GPIO,5 e não sei por qual motivo ele não gera a interupção, o GPIO,0 e GPIO,1 gera eu acabei de testar.

Como que eu faço pra saber se esta na borda de subida ou de descida ? Existe alguma técnica por software para identificar ?

Vou precisar ler as bordas de 2 sinais distintos, como identificar dentro da interupção, qual dos dois sinais causou a interupção ? Testando o nivel lógico dos dois pinos ?

Muito obrigado.
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor Alesandro F Zagui » 14 Ago 2009 14:19

É isso mesmo, na hora que a interrupção acontecer, você faz a leitura do nivel do pino que gerou a interrupção.

Mas caso sejam configurados dois pinos para gerar a interrupção, você terá que salvar o estado logico anterior a enterrupção de cada pino.
E quando a interrupção acontecer, tera que testar qual pino esta com o estado logico diferente. Pois todos os pinos geram a mesma interrupção.

Boa sorte
Alesandro Freire Zagui
Alesandro F Zagui
Byte
 
Mensagens: 154
Registrado em: 12 Mai 2009 11:03
Localização: Campo Mourao, Pr


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x