TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: dragon33 en 15 de Octubre de 2003, 12:03:00
-
necesito leer un codigo de 4 bits por puerta A, que mientras sea 0 no haga nada, y si entra por ejemplo el nº23 salte a un bucle A este se repita 23 veces para luego retornar y esperar otro dato, si entra otro dato por ejemplo 25, reste 25 de 23 el resultado 2 se mete al bucle A para que se repita 2 veces y salga, si entra otra vez el 23 este se resta de la suma de los otros dos datos metidos al bucle A es decir 23+2=25 es decir 23-25=-2 este -2 se mete esta vez al bucle B y se repite 2 veces....
y asi siempre gracias.
-
Creo que debieras hacerlo tú, comentando las líneas debidamente. Una vez terminado lo pones aquí si lo deseas y te damos nuestra opinión.
Por lo menos empezar, hacer algo ...
Un saludo
-
dragon33 con 4 bits no lo conseguiras ya que el valor maximo que obtendras es el 15 en decimal .
roll.
-
Porque mejor nos explicas realmente cual es el objetivo de este codigo, no como se desarrolla sino el fin que quieres obtener con el.
Recuerda que hay muchos caminos para llegar a Roma, pero en realidad lo que interesa es llegar (en este caso ese es el objetivo).

-
Lo que pretendo es controlar un motor bipolar PaP. Para ello he desarrollado un programa en C que envia datos previamente programados por el puerto paralelo a un interface puente entre el PC y el pic16f84, los datos que se envian son cualquier numero entre 0 y 15(fue un lapsus
Sispic perdonad).Estos datos de 0 a 15 posicionan el eje del motor en cualquier posicion entre 0º y 180º en pasos de 12º (15x12=180).
Os desarrollo un ejemplo de como funcionaria: imaginemos que entra el dato 13, el pc temporiza 0.5sg y lo hace desaparecer, tiempo suficiente para que el pic se de cuenta que en su puerta A tiene el 13, entonces ha de posicionar el eje del motor en la posicion de 13x12=156º, pasado un tiempo le llega a las puertas del pic el dato 10, el pic ha de posicionar en 10x12=120º para lo cual ha de girar al lado contrario, ahora le llega el dato 0 0x12=0º, el motor debe volver a situacion de reposo.....Creo que ahora esta mas claro, el codigo que hace girar para un lado u otro lo tengo ya hecho y probado pero el programa
principal no se como cogerlo...porfa en ensamblador GRACIAS A TODOS.
-
Este programa lo he hecho sobre papel, seguro que tiene errores, hay que probarlo:
.
.
.
Inicio movfw PORTA
subwf Temporal,0 ;f-W
movwf Contador
movfw PORTA
movwf Temporal
btfsc STATUS,Z
goto Inicio
btfss STATUS,C ;Si C=0 hay acarreo
goto Giroantihorario
goto Girohorario
Horario call Giro12horario
decfsz Contador
goto Horario
goto Inicio
Antihorario call Giro12antihorario
decfsz Contador
goto Antihorario
goto Inicio
.
.
.
En estos puntos suspensivos pondrías las dos rutinas para el giro de 12 pasos. Una para el giro horario y otra para el antihorario
Espero que se entienda. Un saludo
-
Por que no simplificas el codigo del PIC, enviandole directamente el numero de pasos y el sentido de giro, efectuando los calculos en el programa del PC??
-
Efectivamente tal como me imaginaba, a la primera nunca sale y el programa que envié, tiene fallos. Voy a ver si tengo un rato, no sé cuando y lo acabo por completo... me ha picado.
Un saludo
-
Estimado pocher al ingresar un numero por puerta A lo he probado y el motor siempre gira y no para, espero tus resultados......y los de otras personas del foro y respecto a MGLSOFT tienes razon pero ya me costo un huevo elaborar el programa en C para que sacase una secuencia
numerica previamente programada y almacenada en un archivo, no estoy muy suelto todavia gracias.
-
Hey, Dragon33!!
Se dice testiculo...je...je...


-
Uf ... lo conseguí.
Este es el programa, esta hecho para un motor pap unipolar que es el que trae el PROTEUS.
De todas formas el asunto de los grados en el motor pap de PROTEUS creo que no va bien.
Tuve que depurarlo en MPLAB paso a paso y funciona de perlas.
Si te pediría dragón33 que lo probases físicamente y me dijeses si funciona.
Ahí va:
; PaPunip4.asm
;
List p=16F876 ;Tipo de procesador
include "P16F876.INC" ;Definiciones de registros internos
TEMP1 EQU 0x20 ;TEMP1 y TEMP2 --> temporización de 50ms aprox.
TEMP2 EQU 0x21
TEMP3 EQU 0x22 ;Temporal para almacenar el valor anterior PORTA
CONTADOR EQU 0x23 ;CONTADOR3=PORTAanterior-PORTApresente
org 0x00 ;Vector de Reset
goto INICIO
org 0x05
INICIO bsf STATUS,RP0 ;Seleccionamos el banco 1
movlw 0x06
movwf ADCON1
movlw 0xFF
movwf TRISA ;PORTA entradas
clrf TRISB ;PORTB salidas
clrf CONTADOR
clrf TEMP3
bcf STATUS,RP0 ;Seleccionamos el banco 0
clrf PORTB
clrf INTCON
BUCLE1 movfw TEMP3
subwf PORTA,0 ;PORTApresente-TEMP3(PORTAanterior) --> W
btfsc STATUS,Z
goto BUCLE1 ;Paro
movwf CONTADOR ;Número de pasos hacia delante o atrás
movfw PORTA ;Almacena PORTApresente en TEMP3
movwf TEMP3
btfss STATUS,C ;Si C=0 hay acarreo
goto ANTIHORARIO ;Como C=0 la resta es (-) --> antihorario
goto HORARIO ;Como C=1 la resta es (+) --> horario
;*************************************************************************
HORARIO
PASO1H movlw b"00001100"
movwf PORTB
call DELAY
decfsz CONTADOR,1
goto PASO2H
goto BUCLE1
PASO2H movlw b"00000110"
movwf PORTB
call DELAY
decfsz CONTADOR,1
goto PASO3H
goto BUCLE1
PASO3H movlw b"00000011"
movwf PORTB
call DELAY
decfsz CONTADOR,1
goto PASO4H
goto BUCLE1
PASO4H movlw b"00001001"
movwf PORTB
call DELAY
decfsz CONTADOR,1
goto PASO1H
goto BUCLE1
;*************************************************************************
ANTIHORARIO
comf CONTADOR,1 ;Complemento a 1
incf CONTADOR,1 ;más 1 y tenemos el número positivo
PASO1A movlw b"00001001"
movwf PORTB
call DELAY
decfsz CONTADOR,1
goto PASO2A
goto BUCLE1
PASO2A movlw b"00000011"
movwf PORTB
call DELAY
decfsz CONTADOR,1
goto PASO3A
goto BUCLE1
PASO3A movlw b"00000110"
movwf PORTB
call DELAY
decfsz CONTADOR,1
goto PASO4A
goto BUCLE1
PASO4A movlw b"00001100"
movwf PORTB
call DELAY
decfsz CONTADOR,1
goto PASO1A
goto BUCLE1
;*************************************************************************
DELAY movlw 0x50 ;Temporización entre pasos de aprox.50ms
movwf TEMP1
clrf TEMP2
DELAY_1 decfsz TEMP2,F
goto DELAY_1
decfsz TEMP1,F
goto DELAY_1
RETURN
END
-
Por lo que veo, Pocher, este código tiene una pinta estupenda... no se si te habrá costado un huevo o un testículo, o quizás ambos!
pero me quito el sobrero..
A ver si fisicamente también rula... ya nos contará el dragón.
Besotes
Elena
-
pocher, el codigo sigue sin funcionar el motor gira sin control, por cierto la instruccion movfw no esta en el
juego de instrucciones del pic 16f84 y segun he leido
aunque el mplab lo admite, al compilarlo el compilador
lo deja como etiqueta y no realiza ninguna funcion, como
si no estuviera vaya.......seguimos intentandolo gracias
-
No te preocupes por el movfw que el compilador sí que lo admite. Se trata de una instrucción especial (equivale al movf)
Has tenido en cuenta que mi diseño está hecho para un unipolar (PROTEUS). Tienes que hacer los cambios en HORARIO y ANTIHORARIO para adaptarlo al tuyo que es bipolar.
Un saludo
-
Hola Pocher, muy bueno tu desarrollo, pero no entiendo lo del complemento...

Ahora me surge una duda, y creo que perderia pasos si cambia el sentido de giro, al enviarle siempre por el principio de cada bloque de giro... 
es decir, si avanzo una cantidad de pasos, y luego al retroceder, no iria a la salida correspondiente..... es decir, da bien matematicamente la cantidad de pasos, pero creo que no la asignacion de las bobinas .. ¿es correcto o me olvido de algo?
creo que se deberia emplear una unica tabla, y leerla ascendente o descendente... voy a tratar de escribir algo..
Un abrazo 
Norberto
--------------- ya esta!, entendi lo del complemento... estaba interpretando mal , no vi que venia de la resta...
gracias
-
Yo también creo que perdería 1 paso. Las posibles combinaciones en los cambios de sentido serían:
Cambio HORARIO --> ANTIHORARIO:
1100 --> 1001 (esta es la única que estaría bien)
0110 --> 1001
0011 --> 1001
1001 --> 1001
Cambio ANTIHORARIO --> HORARIO:
1001 --> 1100 (esta es la única que estaría bien)
0011 --> 1100
0110 --> 1100
1100 --> 1100
Salvo en la primera de cada cambio se perdería 1 paso.
Esta claro, para que no ocurra esto, como bien dices Norberto, hay que utilizar una única tabla y recorrerla ascendente o descendentemente.
... a calentarse la cabeza.
Un saludo
-
Enhorabuena el codigo empieza a funcionar, si entro el 15, el motor recorre 360º, si meto el 7 recorre 180º aprox.....pero todavia tenemos un problema y es, que el motor una vez llega a la posicion deseada, no se queda alli esperando una nueva orden ,sino que regresa inmediatamente a la posicion de origen o reposo......a ver si lo solucionamos....el codigo usado es este de abajo de todopic...gracias....pero reformado a un motor bipolar.
-
je je je... bueno, se me calento la cabeza....
aqui esta, parte del codigo de Pocher, y parte mio
a ver que les parece...
; PaPunip4.asm
; AVANCE ES CUANTO GIRA, ES DECIR DE 0 A 15 , SON 16 VALORES POSIBLES
; PASOS, SON LA CANTIDAD DE PASOS A DAR EN CADA AVANCE, EJEMPLO 25, VER SEGUN MOTOR
; EJEMPLO 360/200=1,8 GRADOS POR PASO -> EMPLEANDO TABLA DE 1/2 PASO, NOS QUEDARIA
; UN 360/400=0.9 GRADOS POR PASO
; 400/16=25--->> SON LOS PASOS EN CADA AVANCE
; 25 PASOS * 16 AVANCES = 400 !!! OK?
;
; List p=16F876 ;Tipo de procesador
; include "P16F876.INC" ;Definiciones de registros internos
List p=16F84a
include "P16F84a.INC"
TEMP1 EQU 0x20 ;TEMP1 y TEMP2 --> temporizaci¢n de 50ms aprox.
TEMP2 EQU 0x21
TEMP3 EQU 0x22 ;Temporal para almacenar el valor anterior PORTA
CONTADOR EQU 0x23 ;CONTADOR3=PORTAanterior-PORTApresente
PASOS EQU 0X24 ;CANTIDAD DE PASOS POR AVANCE (15)
CONTADOR_TABLA EQU 25H ;POSICION EN LA TABLA DE SALIDA
AVANCE EQU 26H
org 00H ;Vector de Reset
goto INICIO
org 05H
;------------------------------------------------------------------------------------
INICIO bsf STATUS,RP0 ;Seleccionamos el banco 1
movlw 0x06
; movwf ADCON1
movlw B"000001111"
movwf TRISA ;PORTA entradas
clrf TRISB ;PORTB salidas
clrf CONTADOR
clrf TEMP3
movlw .1
movwf CONTADOR_TABLA ;FORZAR UN VALOR DE INICIO
bcf STATUS,RP0 ;Seleccionamos el banco 0
clrf PORTB
clrf INTCON
BUCLE1 movfw TEMP3
subwf PORTA,0 ;PORTApresente-TEMP3(PORTAanterior) --> W
btfsc STATUS,Z
goto BUCLE1 ;Paro
movwf CONTADOR ;N£mero de pasos hacia delante o atr s
movf PORTA,W ;Almacena PORTApresente en TEMP3
movwf TEMP3
btfss STATUS,C ;Si C=0 hay acarreo
goto ANTIHORARIO ;Como C=0 la resta es (-) --> antihorario
goto HORARIO ;Como C=1 la resta es (+) --> horario
;*************************************************************************
HORARIO
PASO1H
MOVLW .25
MOVWF AVANCE
OTRO1H
INCF CONTADOR_TABLA,F ;LECTURA DE LA TABLA DE ARRIBA HACIA ABAJO
MOVF CONTADOR_TABLA,W
CALL TABLA
movwf PORTB
call DELAY
DECFSZ AVANCE,F ;DAR 25 PASOS POR CADA INGRESO DE CONTADOR
GOTO OTRO1H
decfsz CONTADOR,F ;CANTIDAD DE AVANCES
goto PASO1H
goto BUCLE1
;*************************************************************************
ANTIHORARIO
comf CONTADOR,1 ;Complemento a 1
incf CONTADOR,1 ;m s 1 y tenemos el n£mero positivo
PASO1A
MOVLW .25
MOVWF AVANCE
OTRO1A
DECF CONTADOR_TABLA,F ;LECTURA DE TABLA DE ABAJO HACIA ARRIBA
MOVF CONTADOR_TABLA,W
CALL TABLA
movwf PORTB
call DELAY
DECFSZ AVANCE,F
GOTO OTRO1A
decfsz CONTADOR,F ;CANTIDAD DE AVANCES
goto PASO1A
goto BUCLE1
;*************************************************************************
DELAY movlw 0x50 ;Temporizaci¢n entre pasos de aprox.50ms
movwf TEMP1
clrf TEMP2
DELAY_1 ;RETURN solo para verificar en MPLAB
decfsz TEMP2,F
goto DELAY_1
decfsz TEMP1,F
goto DELAY_1
RETURN
;------------------------------- TABLA DE CONTROL BOBINAS MOTOR -------------
TABLA ;TABLA DE MEDIO PASO (400 POR VUELTA )
ADDWF PCL,F
GOTO MAXIMO ;0 SALTA A VALOR 8
PRIMERO RETLW b"00000001" ;1
RETLW b"00000011" ;2
RETLW b"00000010" ;3
RETLW b"00000110" ;4
RETLW b"00000100" ;5
RETLW b"00001100" ;6
RETLW b"00001000" ;7
ULTIMO RETLW b"00001001" ;8
; GOTO MINIMO ;9 SALTA A VALOR 1
MINIMO
MOVLW .1
MOVWF CONTADOR_TABLA ;COLOCO CONTADOR DE TABLA EN 1
GOTO PRIMERO
MAXIMO MOVLW .8
MOVWF CONTADOR_TABLA
GOTO ULTIMO ;DE ESTA MANERA, LA PROPIA TABLA
;ACTUALIZA LOS LIMITES MAXIMO Y MINIMO
;------------------------------------------------------------------------------
END
un gran abrazo 
Norberto
-
que feo que queda sin los espacios y tab"s...
descargarlo de aqui !!!!
o mirar si este funciona ... AQUI!
Norberto
-
Vaya ya no deja adjuntar archivos.
Todos los ficheros estan en: http://miarroba.com/foros/ver.php?foroid=132135&temaid=1132954
Un saludo
-
Hola Pocher, creo que esta interesante para un control de cambio del disco de colores o gobos para los equipos de iluminacion... o la seleccion de herramientas de la fresadora de Marcelo..., por eso lo del giro completo (360)
Ahora, yo le cambiaria el ingreso de datos por RS232... o mejor aun por DMX (pero no dispongo de los protocolos)
Un gran abrazo! 
Norberto
-
pocher y todopic os agradezco enormemente el interes que estais demostrando, todavia tengo un problema con los nuevos codigos que habeis puesto en el foro, el problema es que si yo ingreso el nº15 el motor efectivamente gira 360º pero no se queda en esa posicion esperando una nueva orden, sino que inmediatamente cambia el sentido de giro y se vuelve a la posicion de reposo.........y lo que se pretende es que si entra el 15 vaya a 360ºy se quede, si entra el 13 compare el dato presente y el anterior y retroceda los grados necesarios y asi etc etc etc.......gracias.
por cierto da igual que sean 360º que 180º la transformacion para uno u otro se hacerla.
-
Hola dragon33, manda tu código retocado para bipolar y le pegaremos un vistazo.
Lo que dices acerca de .........y lo que se pretende es que si entra el 15 vaya a 360ºy se quede, si entra el 13 compare el dato presente y el anterior y retroceda los grados necesarios y asi etc etc etc....... esta hecho en el último fichero .rar que envié donde está simulado y comprobado con PROTEUS el correcto funcionamiento de un motor unipolar (el bipolar no lo tiene el PROTEUS) según lo que tú pedías.
Un saludo
-
Oye pocher, que pasa si en proteus conectas ese motor unipolar como si fuese bipolar, dejando los comunes al aire??
Se puede probar no?
Un saludo!
-
Yo lo que hice en su día fué cortocircuitar la toma intermedia con la parte inferior o superior y así funcionaba.
Un saludo
-
He puesto el codigo en el almacen de codigos del foro, este codigo si me funciona, observar los retoques realizados al codigo y compararlo con los añadidos ultimamente por vosotros.........por cierto en el encabezamiento aclaratorio donde pone AVANCE debe poner RESULTADO,
os agradezco vuestra colaboracion sispic y pocher.
-
Ya sé que ha sido un "lapsus", pero una aclaración: colaboradores TODOPIC y Pocher por favor, solo Norberto y yo, sabemos el tiempo que hemos invertido en esto.
Un saludo
-
Hola, el programa efectivamente hace lo que pides... ahora si retorna a CERO, es justamente porque no mantienes la señal de entrada, y al leer un cero, se dirije a el..

yo lo simule con los stimulus, y los pines en la posicion toggle del mplab y anda fantastico...

Suerte!
Norberto
-
Norberto he estado este sábado estudiando más detenidamente el programa que enviaste y creo que tiene un defecto. Quizá me equivoque, mira a ver que te parece:
Para PORTA=1 ---> 25 · 1 · 0,9º = 22,5º
.
.
.
Para PORTA=15 ---> 25 · 15 · 0,9º = 337,5º
Para 360º faltan 25 pasos de 0,9º, es decir 22,5º
El defecto creo que está en que cuentas 16 avances y como máximo hace 15 (PORTA=1111)
Lo he comprobado con PROTEUS y efectivamente, salen estos números.
Un saludo
-
Hola Pocher, pero yo considero al numero cero como una posicion, con lo cual 0000 es una posicion, y 1111 es la ultima, o sea 16 posiciones posibles ok?
por eso que en el post anterior le manifestaba que hay que mantener la señal de entrada, pues si se realiza pasando por cero, logicamente se dirige a la posicion cero... se entiende? y el calculo es para medios pasos...
un abrazo
Norberto
pd.. alguien tiene el protocolo DMX512 ? para implementar en este proyecto?
-
pocher sispic a ver si podeis sacar el codigo necesario para controlar un servo de la misma forma que se hacia con el motor PaP bipolar, es decir metiendo numeros del 0 al 15 determinamos todo el movimiento del servo hacia adelante o hacia atras....animo
-
Hola, para eso , simplemente al ingresar el numero, realizas un PWM, es decir, la relacion del pwm es segun el numero ingresado, y aqui no es necesario calcular si es horario o antihorario... el servo se encargara de ello...
Norberto
-
Hola... en el apartado de robótica vas a encontrar el funcionamiento del servo:
http://miarroba.com/foros/ver.php?temaid=904471&foroid=58732
... su posición varía de manera angular , entre 0 y 180º (generalmente, hay de otros ángulos 90º, 360º, etc)... y su posición variará con el PWM... cuando el ancho del pulso es cercano a 0ms...el ángulo es 0º , y cuando el ancho de pulso es cercano a 2ms... el ángulo es de 180º, se entiende?... con todos sus intermedios.
Si miras el link que te pasé, verás que hay una animación muy didáctica.
Un abrazo...
marmatar