Pues creo que de la manera que lo hago no puedo.
Con un 12f629 intento leer la onda.Configuro timer1 para medir el tiempo e interrupción por flanco ascendente de gp2
'****************************************************************
'* Name : TABLERO_DE_CONTROL.BAS *
'* Author : [JUAN MARTÍNEZ] *
'* Date : 02/02/2012 *
'* Version : 1.0 *
'* Notes : PIC12F629 *
'* PANEL DE CONTROL Y LEER ONDA CUADRADA: *
'****************************************************************
'lee una onda de frecuencia en alto de 58us periodo total 116us
'Trabajando con servos, PIC12F629
Define CONF_WORD = 0x3184
Define CLOCK_FREQUENCY = 4
Define SIMULATION_WAITMS_VALUE = 1
AllDigital
Symbol verde = GPIO.0
Symbol rele1 = GPIO.1
Symbol boton = GPIO.2
Symbol mas = GPIO.3
Symbol rele = GPIO.5
Symbol servo = GPIO.4
TRISIO = %001100
'WaitMs 3000
'#########################################################################
'define timers
OPTION_REG.T0CS = 0 'selecciona reloj interno
OPTION_REG.PSA = 0 'asigna el prescales al timer0
OPTION_REG.PS0 = 1 'bits de la seleccion del factor de division,prescaler 256
OPTION_REG.PS1 = 1 'bits de la seleccion del factor de division,prescaler 256
OPTION_REG.PS2 = 1 'bits de la seleccion del factor de division,prescaler 256
INTCON.T0IF = 0 'borra el flag de desbordamiento del timer0
TMR0 = 178 'cargo el registro del tmr0 para que desborde cada 1mS
INTCON.T0IE = 1 'habilita las interrupciones del timer0
'valor a cargar en tmr0 para 20ms 178
T1CON.TMR1CS = 0 'asigna el reloj interno al timer1, se incrementa cada ciclo de instruccion
T1CON.T1CKPS0 = 0 'factor del preescales del timer1, 0 prescaler 1/1
T1CON.T1CKPS1 = 0 'factor del preescales del timer1, 0
INTCON.PEIE = 1 'bit de habilitacion de interrupciones de perifericos
TMR1H = 0x00 'carga el registro del contador desde cero byte alto
TMR1L = 0x00 'carga el registro del contador desde cero byte bajo
T1CON.TMR1ON = 1 'habilitacion del TMR1, comienza a increm
'interrupcion int flanco ascendente
OPTION.INTEDG = 1
INTCON.INTE = 1
INTCON.GIE = 1
Enable
'#########################################################################
'define variables
Dim n As Byte
Dim flag1 As Byte
Dim posicion As Byte '1 centro 2-dch 3-izq posicion servo
Dim pulso_dch As Byte 'angulo dch servo
Dim pulso_izq As Byte 'angulo izq servo
Dim outon As Byte 'Tiempo de la señal de control del servo a On (duty cycle)
Dim outoff As Word
Dim periodo As Word
Dim t1_alto As Byte 'bit alto timer1
Dim t1_bajo As Byte 'bit alto timer1
Dim t2_alto As Byte 'bit bajo timer1
Dim t2_bajo As Byte 'bit bajo timer1
Dim flag_flanco As Byte
'Dim off1 As Word
'Dim off2 As Word
'##########################################################################
'a = 1
flag1 = 1
Gosub leer
'rojo = 0
'verde = 0
servo = 0
periodo = 2000
flag_flanco = 0
'######################################################
'inicio programa
main:
Goto main
End
'###################################################
'mueve el servo
On Interrupt
If INTCON.INTF = 1 Then 'si interrupción int
If flag_flanco = 0 Then 'recibido flanco subida
t1_alto = TMR1H 'leo valor timer1 en pulso alto
t1_bajo = TMR1L
OPTION.INTEDG = 0 'configuro int flanco bajada
flag_flanco = 1 'indico siguiente flanco de bajada
Else
t2_alto = TMR1H 'leo valor timer1 en pulso bajo
t2_bajo = TMR1L
OPTION.INTEDG = 1 'configuro int flanco subida
flag_flanco = 0 'siguiente flanco subida
TMR1H = 0x00 'carga el registro del contador desde cero byte alto
TMR1L = 0x00 'carga el registro del contador desde cero byte bajo
Endif
Endif
INTCON.T0IF = 1
INTCON.INTF = 0
Resume
leer:
Read 01, posicion
Read 03, pulso_dch
Read 04, pulso_izq
'Read 05, flag1
Return
A la primera pregunta del signal generator le digo 118 ,la segunda 50. Sólo cuando pulso en el botón salta la interrupciòn.