Autor Tema: No entra la interrupción  (Leído 1564 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
No entra la interrupción
« en: 27 de Julio de 2011, 17:27:45 »
Estoy intentando comunicar dos pics ,el receptor un 12f629,al que va conectado un servo. El emisor manda el ángulo que debe moverse y mediante un botón conectado a gp2, se movería cuando se produce la interrupción.El código es el siguiente
Código: [Seleccionar]
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2011 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 07/07/2011                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Define osc = 4
include "modedefs.bas"

CMCON = 7
vrcon=0

'Trabajando con servos, PIC12F629
Define CONF_WORD = 0x3184
Define CLOCK_FREQUENCY = 4
OPTION_REG = %1011111
INTCON = %10010000
Symbol rojo = GPIO.1
Symbol boton = GPIO.2
Symbol verde = GPIO.4
Symbol rele = GPIO.0
Symbol servo = GPIO.5
TRISIO = %001001

'#########################################################################
'define variables
velocidad var Byte
c var byte
n var Byte
total var byte
codigo var byte
posicion var Byte  '1 centro 2-dch 3-izq posicion servo
pulso var byte
pulso1 var byte
pulso_dch var Byte  'angulo dch servo
pulso_izq var Byte  'angulo izq servo
outon var Byte  'Tiempo de la señal de control del servo a On (duty cycle)
outon1 var Byte
outoff var Word
outoff1 var Word
periodo var Word
off1 var Word
off2 var Word
off3 var Word
off4 var Word
'##########################################################################
Gosub leer
rojo = 0
verde = 0
servo = 0
periodo = 2000
If posicion = $ff or posicion=0 or posicion=1 Then  'el servo se conecta la primera vez
posicion = 01
rojo=1
verde=1
Write 01, posicion
pulso_dch = 155
Write 03, pulso_dch
pulso_izq = 155
Write 04, pulso_izq
velocidad = 1
Write 06, velocidad
Pause 1000
servo = 0
rele = 0
pulso=155
Call servo_inicio
Endif


If posicion = 02 Then
pulso=pulso_dch
Call servo_inicio
servo = 0
rojo = 1
verde = 0
rele = 0
Endif

If posicion = 03 Then
pulso=pulso_izq
Call servo_inicio
servo = 0
rojo = 0
verde = 1
rele = 1
Endif

'######################################################
'inicio programa
main:
Read 01, posicion
Read 03, pulso_dch
Read 04, pulso_izq
Read 06, velocidad
On Interrupt Goto interrup
Intcon=%10010000
Option_reg.6=0


Serin GPIO.3, T300, ["OK"],codigo,#total
'If total = "V" Then codigo = 1
'If total = "D" Then codigo = 2
'If total = "I" Then codigo = 3

for c=0 to 6
SerOut gpio.0, T300, [codigo,#total]
next c

If codigo = "V" Then
Write 06, total
rojo = 1
verde = 1
Endif
pause 1000

If codigo = "D" Then
total = 155 - total
rojo = 1
verde = 0
Write 04, total
Endif
pause 1000

If codigo = "I" Then
total = 155 + total
rojo = 0
verde = 1
Write 03, total
Endif
pause 1000
If total = 155 Then
rojo = 0
verde = 0
Write 04, total
Write 03, total
Endif






Goto main


End                                               

'###################################################
'mueve el servo
interrup:
Disable
Gosub leer

If posicion = 01 Then
pulso=155
Call servo_directo
servo = 0
rojo = 0
verde = 0
pause 200
rojo = 0
verde = 1
rele = 0
Write 01, 02
Return
Endif
If posicion = 02 Then
'el servo està en dch y tiene que pasar a izq
pulso=pulso_dch
pulso1=pulso_izq
Call servo_inverso
servo = 0
rojo = 0
verde = 0
pause 200
rojo = 1
verde = 0
rele = 1
Write 01, 03
Return
Endif
If posicion = 03 Then
pulso=pulso_dch
pulso1=pulso_izq
Call servo_directo
'el servo está en izq y tiene que pasar a dch
servo = 0
rojo = 0
verde = 0
pause 200
rojo = 0
verde = 1
rele = 0
Write 01, 02
Return
Endif
Intcon=%10010000
resume
Enable

Return                                           

leer:
Read 01, posicion
Read 03, pulso_dch
Read 04, pulso_izq
Read 06, velocidad
Return                                           


servo_inicio:
  periodo1 con  2000

outoff1 = (periodo1 - pulso) * 10  'Calculo tiempo de la señal a Off en uSeg.
For n = 1 To 75  'Se repite durante 1500mSeg. para dar tiempo al servo a posicionarse
pulsOut servo, pulso  '1.6mSeg. (señal a On)
pauseUs outoff1  'Tiempo de la señal a Off
Next n
return                                         

servo_directo:
periodo2 Con 2000
outoff2 var Word
outon_2 var Byte
For outon_2 = pulso_izq To pulso_dch  'De un punto a otro
outoff2 = (periodo2 - outon_2) * 10  'Calculo tiempo de la senal a Off en uSeg.
For n = 0 To velocidad  'Control velocidad
pulsout servo, outon_2  'Senal a on
pauseus outoff2  'Tiempo de la senal a Off
Next n
Next outon_2
return                                         


servo_inverso:
periodo3 con 2000
outoff3 var Word
outon_3 var Byte
For outon_3 = pulso_dch To pulso_izq Step -1  'De un punto a otro
outoff3 = (periodo3 - outon_3) * 10  'Calculo tiempo de la senal a Off en uSeg.
For n = 0 To velocidad  'Control velocidad
pulsout servo, outon_3  'Senal a on
pauseus outoff3  'Tiempo de la senal a Off
Next n
Next outon_3
return                                         


Cuando pulso el botón no se activa la salida del servo. ¿está mal definida la interrupción? es la primera vez que uso una y no lo tengo muy claro.
Muchas gracias