Autor Tema: No encuentro el fallo  (Leído 2576 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
No encuentro el fallo
« en: 19 de Julio de 2011, 17:03:34 »
Estoy intentando hacer un programador para la posición de servos.Con  un teclado y un pequeño menú en un lcd mando la posición  derecha e izquierda al servo a un 12f629, según el fichero de proteus.El programa que va en el 12f629 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.3
Symbol rele = GPIO.4
Symbol servo = GPIO.5
TRISIO = %000101
'#########################################################################
'define variables
velocidad var Byte

c var byte
n var Byte
total var Word
p1 var Byte
p2 var Byte
p3 var Byte
p4 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 = 1
verde = 1
servo = 0
periodo = 2000
If posicion = $ff or posicion=0 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
servo = 0
rele = 0
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
'Enable
'######################################################
'inicio programa
main:
Read 01, posicion
Read 03, pulso_dch
Read 04, pulso_izq
Read 06, velocidad
for c=0 to 6
SerOut gpio.4, T300, [6,6,"OK",3]
next c
Serin GPIO.0, T300, ["OK"],#total

If total > 1000 And total < 2000 Then
velocidad = total - 1000
Write 06, velocidad
Endif

If total > 7000 And total < 8000 Then  'pulso izq
pulso_izq = total - 7000
Write 04, pulso_izq
Endif


If total > 4000 And total < 5000 Then
pulso_dch = total - 4000
Write 03, pulso_dch
Endif

for c=1 to 8
SerOut gpio.4, T1200, [6,6,"OK",#total]
pause 200
next c

If boton = 1 Then Gosub mover_servo


Goto main


End                                               

'###################################################
'mueve el servo
mover_servo:
'On Interrupt
Gosub leer
'Select Case posicion
'Case 0
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
'Case 03
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
'Case Else
'EndSelect

'INTCON.1 = 0
'Resume
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                                         


Al inicio del programa digo que se enciendan dos leds, pero no hace nada y no sé a que se debe. ¿encontrais algún fallo? ¿tengo algo mal configurado?
Muchas gracias

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Re: No encuentro el fallo
« Respuesta #1 en: 21 de Julio de 2011, 16:53:07 »
 :( :( :(
Código: [Seleccionar]
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2011 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 21/07/2011                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Define osc = 4
'Trabajando con servos, PIC12F629
Define CONF_WORD = 0x3184
Define CLOCK_FREQUENCY = 4
Symbol rojo = GPIO.1
Symbol boton = GPIO.2
Symbol verde = GPIO.3
Symbol rele = GPIO.4
Symbol servo = GPIO.5
TRISIO = %00000000

gpio.3=1
end

pues no sé por qué no funciona este código en la simulación.Lo que hace es encender un led. Se compila bien pero cuando lo paso al somulador no hace nada.El mismo programa en pic simulator ide funciona. ¿será algún problema del picbasic pro?

Desconectado PacoP

  • PIC10
  • *
  • Mensajes: 21
Re: No encuentro el fallo
« Respuesta #2 en: 21 de Julio de 2011, 17:44:50 »
Prueba a meter algúna pausa de 10 ms por ejemplo entre lectura y lectura de Eeprom, estas lecturas consecutivas suelen dar problemas porque se solapan.

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Re: No encuentro el fallo
« Respuesta #3 en: 22 de Julio de 2011, 14:45:33 »
Pues no es eso,no sé sigo pensando que es problema de la versión que tengo de pbp

Desconectado PacoP

  • PIC10
  • *
  • Mensajes: 21
Re: No encuentro el fallo
« Respuesta #4 en: 22 de Julio de 2011, 18:09:35 »
Pues no es eso,no sé sigo pensando que es problema de la versión que tengo de pbp

Te lo he compilado con la version pbp 2.6 prueba o a ver

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Re: No encuentro el fallo
« Respuesta #5 en: 24 de Julio de 2011, 05:55:22 »
Pues no funciona.Tengo la versión 4 de microcode y el pbp en compile pone 2.6.
Este ejemplo
Código: [Seleccionar]
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2011 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 21/07/2011                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
@device  pic12F629, INTRC_OSC, wdt_off, pwrt_on, mclr_off, bod_off, protect_off
    'dispositivo 12f629, ocilador interno,wath dog off, master clear off,
    OPTION_REG=%00000000 ' RESISTENCIAS PULL UP ABILITADAS
    WPU.2=1   'RESISTENCIA PARA GPIO2 ACTIVA
    CMCON = 7 ' Set GP<2:0> to Digital, Disable comparator




'
'Define CONF_WORD = 0x3184

Define CLOCK_FREQUENCY = 4
CMCON = %00000111
Symbol rojo = GPIO.1
Symbol boton = GPIO.3
Symbol verde = GPIO.4
Symbol rele = GPIO.2
Symbol servo = GPIO.5
TRISIO = %001001
rojo=0
verde=0
boton=0
servo=0
main:

rojo=1
verde=1
pause 3000

goto main
end
debería encender los leds.Los enciende y mantiene encendidos si mantengo pulsado el botón de la siguiente simulación.
No sé que puede ser. ¿os funciona a vosotros?

Desconectado PacoP

  • PIC10
  • *
  • Mensajes: 21
Re: No encuentro el fallo
« Respuesta #6 en: 24 de Julio de 2011, 06:16:53 »
Pues que el Reset lo tienes puesto al revez, tiene que estar a +5 para que funcione,
a tierra para que no funcione.
 :D
Eso pasa en las mejores familias.

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Re: No encuentro el fallo
« Respuesta #7 en: 24 de Julio de 2011, 15:19:52 »
Pues no sé.El reset quiero que sea como digital.En principio con este código está desactivado ¿no?
Código: [Seleccionar]
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2011 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 21/07/2011                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

__INTRC_OSC_NOCLKOUT 'Reloj interno solo
__WDT_OFF ' Watchdog Timer desconectado
__PWRT_ON ' Power-On Timer conectado
__BOD_ON ' Brown-Out Detect conectado
__MCLR_OFF ' Master Clear Externo desconectado
__LVP_OFF ' Low-Voltage Programming desconectado
__CPD_OFF ' Data Memory Code Protect desconectado

CMCON = 7 ' Set GP<2:0> to Digital, Disable comparator
Define CLOCK_FREQUENCY = 4
Symbol rojo = GPIO.1
Symbol boton = GPIO.3
Symbol verde = GPIO.4
Symbol rele = GPIO.2
Symbol servo = GPIO.5
TRISIO = %001001
rojo=0
verde=0
boton=0
servo=0

main:
rojo=1
verde=1
pause 3000
goto main
end
Es algo de la configuración, pero no acabo de verlo.

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Re: No encuentro el fallo
« Respuesta #8 en: 25 de Julio de 2011, 16:07:37 »
parece que ya está.En una entrada antigua del foro se comentaba algo sobre lo mismo que me pasaba.He editado el archivo 12f629.inc y he cambiado los fuses
Código: [Seleccionar]
;****************************************************************
;*  12F629.INC                                                  *
;*                                                              *
;*  By        : Leonard Zerman, Jeff Schmoyer                   *
;*  Notice    : Copyright (c) 2005 microEngineering Labs, Inc.  *
;*              All Rights Reserved                             *
;*  Date      : 08/31/05                                        *
;*  Version   : 2.46a                                           *
;*  Notes     :                                                 *
;****************************************************************
        NOLIST
    ifdef PM_USED
        LIST
        include 'M12F629.INC' ; PM header
        device  pic12F629, intrc_osc_noclkout, wdt_off, mclr_off, protect_off,LVP_OFF,CPD_OFF
        XALL
        NOLIST
    else
        LIST
        LIST p = 12F629, r = dec, w = -302
        INCLUDE "P12F629.INC" ; MPASM  Header
        __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _CP_OFF
        NOLIST
    endif
        LIST

Parece que aunque en el editor configures los fuses, cuando se compila, al pbp le da igual, coje la configuración del archivo include,lo que no sé es si pasa sólo con este micro o es con todas. ¿tenéis noticias de algo más?
Por cierto en el archivo si se pone on u off en minúsculas no sirve,tiene que ser mayúsculas,