TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: sokoloko en 23 de Agosto de 2009, 19:55:08
-
Hola amigos,
Soy nuevo en el tema de los PICs y tengo el problema de que tengo un proyecto mecanico preparado para funcionar pero una vez terminado y al hacer las pruebas, la parte electronica me falla. :x
Os resumo, tengo un programa que controla un Motor PAP, tiene 5 entradas y 4 salidas (el programa es para un 16F84A y no es de diseño propio claro esta,jeje):
Entradas:
In 1 => Determina el sentido de giro del motor
In2 => Entrada de impulsos para el avance del motor (un impulso un paso)
In3 e In4 => Controlar que el avance del motor sea de medio paso, completo, o doble.
In5 => Si se pulsa los motores dejan de moverse.
Salidas:
Las cuatro bobinas del PAP unipolar.
Pues el fallo esta en que la entrada "In2" proviene del puerto paralelo de un PC y son señales de 5 microsegundos, y el programa esta preparado para señales de 0,5 sg, y claro no detecta nada.
¿Es posible cambiar el programa para que un 16f84a con solo 5 microsegundos detecte la entrada y mande un paso? :?
Gracias a todos.
-
No, porque seguramente el PIC esta trabajando a 4 MHz, osea cada ciclo de instrucción es de 1us. Seguramente cuando entra en funcionamiento queda en espera de alguna de las cinco entradas y si ingresa un pulso por In2 se dirige a una tabla para cargar el puerto para el control del PAP. Esto lleva muchas instrucciones siendo imposible detectar cada 5us.
Saludos!
-
Hola Suky,
Ante todo gracias por la respuesta.
Efectivamente el PIC trabaja a 4 Mh, no pense eso. Lo maximo de tiempo de impulso que me puede dar el programa es de 15uS, aun asi lo veo muy justito.
Buffffff!!!! creo q voy a tener que cambiar de nuevo toda la electronica....en fin...si alguno se le ocurre una forma de q en con señales de 15us funcione, le estaria muy agradecido.
Saludos.
-
Podes usar un CI preescalador de frecuencia (SDA4212, 74HC390) que por ejemplo cada 64 pulsos te genere 1 para controlar el PIC.
Saludos!
-
Hola...
Menuda peazo idea Suky, muchas gracias.
No conocia ese tipo de integrado ni sus funciones, voy a investigar un poco.
El problema es que es para un sistema CNC, y cada impulso el determinante, pero imagino q podre "trucar" el programa y asi ajustar los impulsos teoricos a los reales.
Muchas gracias por la idea.
Saludos.
-
El 16f84A lo puedes poner a trabajar a 20Mz asi serian 5 instrucciones cada 1us y en 5us 25 instrucciones. El que no te va a andar a esas velocidades es el PAP que a esa velocidad vibrara, hara ruidos raros, e incluso se estropeara, vamos que hara de todo menos andar. El PIC es posible que no se entere de la señal porque esta haciendo otras cosas, una temporizacion por ejemplo, si en esa entrada le pones una interrupcion se deberia de enterar, el motor si que no hay manera de moverlo a esa velocidad.
-
En teoría puede funcionar al trabajar con un cristal de 20MHz, ya que la transición de un paso a otro se controla por cada impulso, en la entrada In2:
In 1 => Determina el sentido de giro del motor
In2 => Entrada de impulsos para el avance del motor (un impulso un paso)
In3 e In4 => Controlar que el avance del motor sea de medio paso, completo, o doble.
In5 => Si se pulsa los motores dejan de moverse.
Suponiendo además que las otras entradas son de nivel, y no de pulsos. De esta forma, en teoría no debiera haber problemas de vibraciones en el PAP con un crstal de 20MHz.
Saludos a quienes nos leen.
-
No todos los 16F84A trabajan hasta 20MHZ, solo los que dicen 16F84A-20 o algo así. Y siendo un PIC discontinuado no creo que sea sencillo conseguirlo.
Saludos!
-
http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en010230
Suki por el data deduzco que el unico a la venta ahora mismo da 20Mz ( 5MIPS ) y esta en produccion, no son capaces de dejar de fabricarlo :lol: es el peor de todos y el mas caro, y seguro que de los mas vendidos. Si es un 16f84a que tenga algun tiempo es posible que no de los 20Mz.
De todos modos un PAP a esa frec no anda ni borracho, y si las entradas son pulsadores quisiera ver yo al artista que los pulsa a esa velocidad :D
tapi8
-
:oops: Bueno, depende de donde vivas, acá voy a la casa de electrónica y lo único que consigo es el 16F84A-4, le pido el de 20 MHZ y quedan :shock: :shock: Les pido un 18F y se me ríen en la cara :?
Saludos!
-
Yo vivo en España pero en una ciudad pequeña ( como Bariloche mas o menos ) y solo hay una tienda de esto, y a veces conseguir algo en el momento tambien es complicado.
tapi8
-
Hola amigos!!!
Os aclaro la duda rapidamente jejejejejee!!!!! Es un 16f84A-04 Es decir.............. :x de los de 4 MHz, asi q nada no me vale el invento. Hombre puedo probar a ver si con un cristal de 20 funciona aunque lo dudo.
Y sino tendre q buscar un preescalador por 10 para las señales, el problema es que tengo 8 salidas a reducir y claro, me gustaria saber si algun integrado "economico" trae mas de un preescalador por integrado.
En relación a la velocidad del PAP, yo tampoco creo q funcionen a tanta frecuencia, pero es la que da el software (y he probado con varios), y no se puede modificar.
Saludos y gracias por la ayuda.
-
sokoloko.... ¿te encuentras capaz de modificar el firmware del PIC?
Te pregunto esto porque es factible funcionar con un cristal de 4MHz.
Lo que yo entiendo del plantemiento inicial, la condición crítica es el ancho del pulso que debe recibir el PIC para que el motor PAP avance un paso, siendo ese pulso de 5useg.
Ahora, si esa entrada del PIC fuera el RB0, utilizando la interrupción por flanco (ya sea de subida o bajada), bastaría con que el pulso recibido sea mayor a un ciclo de instrucción, es decir, con un cristal de 4MHz, el pulso solo debe ser mayor a 1useg. De esta forma, con 5useg se podría trabajar, y si fueran 15useg, mucho mejor.
Para implementar esto, hay que programar el PIC de tal forma que el avance de paso dependa de la rutina de servicio de interrupción.
Espero sirva la idea, y que alguien la apoye o refute.
Saludos a quienes nos leen.
-
Hola a todos de nuevos,
Pues a ver Sansanoloko, te comento, tengo el programa del PIC, los PICS y tengo el programador.
Lo primero que intente es con el archivo .asm tratar de entender el codigo, pero al no tener comentarios de ningun tipo......tras un par de dias me desanime y desisti de modificar el codigo :?. De todas formas no cuento con conocimientos como para realizar lo que tu comentas (al menos de momento), pero me empezare a bajar manuales a ver si me voy iniciando en el mundillo de los PICS.
Saludos y gracias.
PD: Por si alguno se os da bien el tema o os sirve para algo os dejo el codigo por aqui.
; Generated by WinDis84, (c) Nigel Goodwin 1998.
LIST P=16F84, F=INHX8M
include "P16FXX.inc"
ORG 0x0000
GOTO Label_0001
Label_0002 CLRF INDF
INCF FSR , f
ADDLW 0xFF
BTFSS STATUS , Z
GOTO Label_0002
GOTO Label_0003
Label_000F MOVWF EEADR
BSF STATUS , RP0
BSF EECON1 , 00
BCF STATUS , RP0
MOVF EEDATA , W
GOTO Label_0003
Label_001F MOVWF EEDATA
BSF STATUS , RP0
BSF EECON1 , 02
MOVLW 0x55
MOVWF EECON2
MOVLW 0xAA
MOVWF EECON2
BSF EECON1 , 01
Label_0004 BTFSC EECON1 , 01
GOTO Label_0004
BCF EECON1 , 02
GOTO Label_0003
Label_0020 CLRF 0x0F
MOVWF 0x0E
Label_0006 MOVLW 0xFF
ADDWF 0x0E , f
BTFSS STATUS , C
ADDWF 0x0F , f
BTFSS STATUS , C
GOTO Label_0003
MOVLW 0x03
MOVWF 0x0D
MOVLW 0xDF
CALL Label_0005
GOTO Label_0006
Label_001B CLRF 0x0D
Label_0005 ADDLW 0xE8
MOVWF 0x0C
COMF 0x0D , f
MOVLW 0xFC
BTFSS STATUS , C
GOTO Label_0007
Label_0008 ADDWF 0x0C , f
BTFSC STATUS , C
GOTO Label_0008
Label_0007 ADDWF 0x0C , f
CLRWDT
INCFSZ 0x0D , f
GOTO Label_0008
BTFSC 0x0C , 00
GOTO Label_0009
Label_0009 BTFSS 0x0C , 01
GOTO Label_000A
NOP
GOTO Label_000A
Label_000A RETURN
Label_0019 CALL Label_000B
BTFSC STATUS , Z
GOTO Label_000C
MOVF 0x0F , W
MOVWF 0x0D
MOVF 0x0E , W
MOVWF 0x0C
Label_000C MOVF 0x0C , W
RETURN
Label_0010 CLRF 0x0D
CLRF 0x0F
MOVWF 0x0E
MOVLW 0x02
GOTO Label_000D
Label_000B MOVWF 0x0E
MOVLW 0x01
GOTO Label_000D
Label_0017 MOVWF 0x0E
MOVLW 0x06
GOTO Label_000D
Label_000D MOVWF 0x14
MOVF 0x0F , W
SUBWF 0x0D , W
BTFSS STATUS , Z
GOTO Label_000E
MOVF 0x0E , W
SUBWF 0x0C , W
Label_000E MOVLW 0x04
BTFSC STATUS , C
MOVLW 0x01
BTFSC STATUS , Z
MOVLW 0x02
ANDWF 0x14 , W
BTFSS STATUS , Z
MOVLW 0xFF
GOTO Label_0003
Label_0011 IORLW 0x00
BTFSS STATUS , Z
MOVLW 0xFF
ANDWF FSR , W
BTFSS STATUS , Z
MOVLW 0xFF
GOTO Label_0003
Label_0015 IORWF FSR , W
BTFSS STATUS , Z
MOVLW 0xFF
GOTO Label_0003
Label_0003 BCF STATUS , IRP
BCF STATUS , RP1
BCF STATUS , RP0
CLRWDT
RETURN
Label_0001 MOVLW 0x0C
MOVWF FSR
MOVLW 0x44
CALL Label_0002
BSF STATUS , RP0
MOVLW 0xFF
MOVWF TRISA
CLRF TRISB
MOVLW 0x00
BCF STATUS , RP0
CALL Label_000F
ANDLW 0x01
BTFSC STATUS , Z
BCF 0x36 , 02
BTFSS STATUS , Z
BSF 0x36 , 02
BTFSC PORTA , 04
BSF 0x36 , 00
BTFSS PORTA , 04
BCF 0x36 , 00
MOVLW 0x00
BTFSC PORTA , 01
MOVLW 0x01
MOVWF 0x0C
MOVLW 0x00
CALL Label_0010
MOVWF 0x1E
MOVLW 0x00
BTFSC PORTA , 00
MOVLW 0x01
MOVWF 0x0C
MOVLW 0x00
CALL Label_0010
MOVWF 0x20
MOVF 0x1E , W
MOVWF FSR
MOVF 0x20 , W
CALL Label_0011
MOVWF 0x20
MOVWF 0x21
CLRWDT
MOVF 0x20 , W
IORWF 0x21 , W
BTFSC STATUS , Z
GOTO Label_0012
MOVLW 0x20
MOVWF 0x2A
MOVLW 0x08
MOVWF 0x2B
MOVLW 0x10
MOVWF 0x2C
MOVLW 0x04
MOVWF 0x2D
MOVLW 0x20
MOVWF 0x2E
MOVLW 0x08
MOVWF 0x2F
MOVLW 0x10
MOVWF 0x30
MOVLW 0x04
MOVWF 0x31
GOTO Label_0013
Label_0012 MOVLW 0x00
BTFSC PORTA , 01
MOVLW 0x01
MOVWF 0x0C
MOVLW 0x00
CALL Label_0010
MOVWF 0x1E
MOVLW 0x00
BTFSC PORTA , 00
MOVLW 0x01
MOVWF 0x0C
MOVLW 0x01
CALL Label_0010
MOVWF 0x20
MOVF 0x1E , W
MOVWF FSR
MOVF 0x20 , W
CALL Label_0011
MOVWF 0x20
MOVWF 0x21
CLRWDT
MOVF 0x20 , W
IORWF 0x21 , W
BTFSC STATUS , Z
GOTO Label_0014
MOVLW 0x28
MOVWF 0x2A
MOVLW 0x18
MOVWF 0x2B
MOVLW 0x14
MOVWF 0x2C
MOVLW 0x24
MOVWF 0x2D
MOVLW 0x28
MOVWF 0x2E
MOVLW 0x18
MOVWF 0x2F
MOVLW 0x14
MOVWF 0x30
MOVLW 0x24
MOVWF 0x31
GOTO Label_0013
Label_0014 MOVLW 0x20
MOVWF 0x2A
MOVLW 0x28
MOVWF 0x2B
MOVLW 0x08
MOVWF 0x2C
MOVLW 0x18
MOVWF 0x2D
MOVLW 0x10
MOVWF 0x2E
MOVLW 0x14
MOVWF 0x2F
MOVLW 0x04
MOVWF 0x30
MOVLW 0x24
MOVWF 0x31
Label_0013 CLRF 0x32
CLRF 0x33
CLRF 0x37
Label_001C MOVLW 0x00
BTFSC PORTA , 03
MOVLW 0x01
MOVWF 0x0C
MOVLW 0x00
CALL Label_0010
MOVWF 0x1E
MOVLW 0x00
BTFSC PORTA , 04
MOVLW 0x01
MOVWF 0x0C
MOVLW 0x01
CALL Label_0010
MOVWF 0x20
MOVLW 0x00
BTFSC PORTA , 02
MOVLW 0x01
MOVWF 0x0C
MOVLW 0x00
BTFSC 0x36 , 02
MOVLW 0x01
CALL Label_0010
MOVWF 0x22
MOVF 0x20 , W
MOVWF FSR
MOVF 0x22 , W
CALL Label_0011
MOVWF 0x22
MOVWF 0x23
MOVF 0x1E , W
MOVWF FSR
MOVF 0x22 , W
IORWF 0x23 , W
CALL Label_0015
MOVWF 0x22
MOVWF 0x23
CLRWDT
MOVF 0x22 , W
IORWF 0x23 , W
BTFSC STATUS , Z
GOTO Label_0016
CLRWDT
MOVF 0x32 , W
MOVWF 0x0C
MOVF 0x33 , W
MOVWF 0x0D
MOVLW 0x17
MOVWF 0x0F
MOVLW 0x70
CALL Label_0017
BTFSS STATUS , Z
GOTO Label_0018
CLRF 0x32
CLRF 0x33
MOVLW 0x28
ADDWF 0x37 , W
MOVWF 0x1E
CLRF 0x1F
RLF 0x1F , f
MOVLW 0xC8
MOVWF 0x0C
CLRF 0x0D
MOVF 0x1F , W
MOVWF 0x0F
MOVF 0x1E , W
CALL Label_0019
MOVWF 0x37
Label_0018 CLRWDT
MOVLW 0x01
SUBWF 0x37 , W
BTFSS STATUS , C
GOTO Label_001A
CLRF PORTB
MOVF 0x37 , W
CALL Label_001B
Label_001A INCF 0x32 , f
BTFSC STATUS , Z
INCF 0x33 , f
MOVF 0x34 , W
ADDLW 0x2A
MOVWF FSR
MOVF INDF , W
MOVWF PORTB
GOTO Label_001C
Label_0016 BSF 0x36 , 01
CLRWDT
BTFSS PORTA , 04
GOTO Label_001D
CLRWDT
BTFSC 0x36 , 00
GOTO Label_001E
CLRF EEADR
MOVLW 0x00
BTFSC PORTA , 02
MOVLW 0x01
CALL Label_001F
MOVLW 0x0F
CALL Label_0020
Label_001E CLRWDT
CLRW
BTFSC PORTA , 02
ADDLW 0x01
BTFSC 0x36 , 02
SUBLW 0x01
BTFSS STATUS , Z
GOTO Label_001D
BCF 0x36 , 01
Label_001D BTFSC PORTA , 04
BSF 0x36 , 00
BTFSS PORTA , 04
BCF 0x36 , 00
CLRWDT
BTFSS 0x36 , 01
GOTO Label_0021
CLRWDT
BTFSC PORTA , 02
GOTO Label_0022
INCF 0x34 , f
INCF 0x34 , W
MOVWF 0x35
CLRWDT
MOVLW 0x08
SUBWF 0x34 , W
BTFSS STATUS , C
GOTO Label_0023
CLRF 0x34
MOVLW 0x01
MOVWF 0x35
Label_0023 CLRWDT
MOVF 0x34 , W
SUBLW 0x07
BTFSS STATUS , Z
GOTO Label_0024
CLRF 0x35
Label_0024 GOTO Label_0025
Label_0022 CLRWDT
MOVLW 0x01
SUBWF 0x34 , W
BTFSS STATUS , C
GOTO Label_0026
DECF 0x34 , f
GOTO Label_0027
Label_0026 MOVLW 0x07
MOVWF 0x34
Label_0027 CLRWDT
MOVLW 0x01
SUBWF 0x34 , W
BTFSS STATUS , C
GOTO Label_0028
DECF 0x34 , W
MOVWF 0x35
GOTO Label_0025
Label_0028 MOVLW 0x07
MOVWF 0x35
Label_0025 CLRWDT
BTFSC PORTA , 04
GOTO Label_0021
BTFSC PORTA , 02
BSF 0x36 , 02
BTFSS PORTA , 02
BCF 0x36 , 02
Label_0021 CLRWDT
BTFSS PORTA , 03
GOTO Label_0029
CLRWDT
GOTO Label_0021
Label_0029 MOVF 0x34 , W
ADDLW 0x2A
MOVWF FSR
MOVF INDF , W
MOVWF PORTB
MOVLW 0x00
BTFSC PORTA , 01
MOVLW 0x01
MOVWF 0x0C
MOVLW 0x01
CALL Label_0010
MOVWF 0x1E
MOVLW 0x00
BTFSC PORTA , 00
MOVLW 0x01
MOVWF 0x0C
MOVLW 0x01
CALL Label_0010
MOVWF 0x20
MOVF 0x1E , W
MOVWF FSR
MOVF 0x20 , W
CALL Label_0011
MOVWF 0x20
MOVWF 0x21
CLRWDT
MOVF 0x20 , W
IORWF 0x21 , W
BTFSC STATUS , Z
GOTO Label_002A
MOVLW 0x03
MOVWF 0x0D
MOVLW 0x20
CALL Label_0005
MOVF 0x35 , W
MOVWF 0x34
MOVF 0x34 , W
ADDLW 0x2A
MOVWF FSR
MOVF INDF , W
MOVWF PORTB
Label_002A GOTO Label_0013
Label_002B SLEEP
GOTO Label_002B
ORG 0x2000
DATA 0x0F
DATA 0x0F
DATA 0x0F
DATA 0x0F
ORG 0x2007
DATA 0x15
ORG 0x2100
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
DATA 0xFF
END
-
Hola sokoloko
La ausencia de comentarios en tu codigo fuente se debe a que no tienes el archivo .asm original, sino que tienes un código desensamblado desde un archivo .hex
Lo que puedo deducir de este código desensamblado son tres cosas cosas:
- El programador original escribió el código en un ensamblador demasiado básico, pero funcional a sus requerimientos, o
- El mismo programador escribió el programa en un lenguaje de alto nivel para microcontroladores PIC (BASIC, C, etc.), lo que explicaría el código tan extenso, para una función tan trivial en este mundillo, como lo es el control de un motor PAP.
- En este programa no se utilizan interrupciones de ningun tipo.
Para este caso, te recomiendo hacer el programa desde cero, o basado en uno existente (en este mismo foro hay muuucha info al respecto), pero lo mas importante, un programa que tu entiendas de forma muy clara, ya que te permitirá tener un control absoluto sobre el proyecto, y una flexibilidad invaluable en el desarrollo del mismo.
Si deseas optar por ese camino, cuenta con mi apoyo, de todas maneras voy a analizar el código que publicaste, para ver si podemos hacer algo con eso.
Saludos a quienes nos leen.
-
Ese programa para mi es imposible de entender, ahi es muy dificil saber lo que es cada cosa, no hay comentarios, no se definen los reg que podrian dar alguna pista y las etiquetas tampoco. Te voy a poner un programa sencillo hecho por mi, asi que no te fies :lol: , es un programa para mover un PAP en un sentido de giro cada 200ms, 5 pasos por seg. esto lo puedes modificar facilmente a tu gusto, asi como ponerle los pulsadores, este se mueve a medios pasos, pero si quieres tambien se puede mover de paso a paso, haciendo los pares o impares segun quieras mas o menos torque y movimientos mas bruscos o mas suaves.
El prgrama en el MPLAB funciona bien. Espero que te sirva como base para el tuyo.
LIST P=16F84A, ; usar PIC 16F84A
#include <p16f84A.inc>
__CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC
CBLOCK 0x0C
contador ; contador para mover el motor
PDel0 ; reg. para el retardo
PDel1
ENDC
org 0X00
goto INICIO
org 0x04
TABLA
addwf PCL,1 ; tabla de movimientos del motor
retlw 0x08
retlw 0x0C
retlw 0X04
retlw 0X06
retlw 0X02
retlw 0X03
retlw 0X01
retlw 0X09
clrf contador ; cuando desborda va aqui
goto MOVER
INICIO
bsf STATUS,5
movlw 0xF0 ; ponemos rb0 a rb3 salidas para puente H
movwf TRISB
movlw 0x1F ; PORTA todo entradas
movwf PORTA
bcf STATUS,5
clrf PORTB ; contador a 0 para empezar por primer movimiento
clrf contador
MOVER
movfw contador ; mover contador con primer mov. a W para llamar tabla
call TABLA ; llamamos tabla
movwf PORTB ; lo movemos PORTB
incf contador,1 ; incrementamos en 1 contador para siguiente movimiento
call DEMORA ; llamamos demora de 200 ms para mov. de 5HZ
goto MOVER ; empezamos ciclo para siguiente movimiento
DEMORA ; demora de 200ms hecho con el picdel
movlw .156 ; 1 set numero de repeticion (B)
movwf PDel0 ; 1 |
PLoop1 movlw .213 ; 1 set numero de repeticion (A)
movwf PDel1 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
PDelL3 goto PDelL4 ; 2 ciclos delay
PDelL4 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
END
-
Hola,
Lo primero de todo, es alegrarme por el tema del codigo, ya pensaba yo que era un zoquete y que no entendia nada. Ver que para expertos como vosotros ese codigo tmb es complicado.....es un gran consuelo :D.
Como no se Sansanoloko ni quien ni como escribio el codigo, seguire los consejos vuestros y empezare desde cero. Asi q.......armaros de paciencia!!!! jeje.
Voy a investigar un poco y ya os pongo mis "pequeños" progresos. 8)
De momento muchas gracias tapi8 por el codigo, ya toy metido con el como "primer tutorial".
Gracias y saludos.