TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: efe87 en 22 de Mayo de 2006, 21:08:00
-
Hola! soy un amigo de Granada(España) y necesito vuestra ayuda...he buscado información en el foro, pero tras unas cuantas horas bastante largas, no he encontrado nada que me sirviera o que por lo menos yo supiera aplicar. Estudio 1º de Desarrollo de Productos Electrónicos y en la asignatura de Lógica nos han mandado mediante el pic16f84, controlar la velocidad de un motor que se incremente en un 10% por cada pulsación de un sólo interruptor y que al llegar al 100% de la velocidad la siguiente pulsación volviera a cero (volver al principio). Por favor es urgente, soy principiante en esto pero en realidad no os pido ayuda porque ya este sea mi último recurso, sino porque me encanta la programación y es una de mis metas en un futuro y en realidad me gustaria hacerme de amigos que también les guste, por eso les dejo mi correo por si quieren contactar conmigo por el msn...soy principiante y me encantaría aprender mucho más.
Saludos..!!
Atentamente: Emilio
efe87@hotmail.com :P
-
Hola efe87 ¿en que lenguaje sabes programar?
-
Hola juanacho, se (si se puede decir k se) programar en MPLAB...Si puedes ayudarme porfavor dimelo o indicame de alguien que sepa programar en MPLAB, porque este proyecto me está volviendo loco con lo sencillo que seguro que es.
-
Hola creo que deberias de intentar de cambiar de proyecto ye que ese es demaciado complicado para un pricipiante con poco manejo del .asm, trata de cambiarlo y si no es posible yo te podria pasar una codigo que elguna ves realice para el control de un motor, pero no es tal como tu lo pindes.
Un saludo.
Atte. CARLOS.
-
Je je je, pues sí efe87 la verdad es que todo es fácil cuando se sabe.
Sólo quería comentarte un par de cosas:
- Piensa que la mayoría de expertos de este foro seguramente son capazes de resolver tu problema en menos de
unos minutos, pero creo que es más importante que tu aprendas a resolverlo.
- Debes plantearte el problema de forma más minuciosa:
- ¿Qué tipo de motor es?
- Potencias, intensidades, etc.
- Debes diseñar tu circuito hardware.
- Debes elegir un cristal a tu micro,etc...
- A la hora de programar lo podrás hacer en ensamblador o lenguaje C .
- Seguramente controlaras tu motor mediante una salida PWM que tendrás que programar tu mismo mediante soft.
- Debes leerte todos los manuales y datasheets que el fabricante orqueste en su web (Microchip)
- Mira problemas resueltos en este foro, te darán ideas de programación.
- Pero si buscas una solución directa, entonces necesitas una persona que trabaje por tí, y eso amigo mio vale dinero.
- Expon tus avances, dudas, progresos..., creo que así, captarás más la sensibilidad que todos los genios tienen. :lol:
-
Hola don Emilio, para manejar el motor ( dc supongo) podes usar un transistor conectado a una red r2r al portb, el portb lo tenes que "clrf" antes de incrementarlo +25 a cada pulsacion de algun pin de entrada, acordate testear el pin del pulsador con retardos... es una idea nada mas
-
La forma mas facil de controlar el motor es mediante PWM. Pero te recuerdo que los trabajos que se envian a los alumnos son para que adquieran destrezas que solo se adquieren con la practica, por lo que nosotros te podemos ayudar en las dudas pero tu tienes que realizar el trabajo. Por cierto si sabes "C", que en ese ciclo se da, el programa se hace en dos patadas.
Saludos.
-
Bueno chicos gracias a todos, por mostrarme vuestra ayuda. Al final despues de tanto tiempo intentándolo he conseguido algo pero no es exactamente lo que yo quería aun así soy feliz, porque se que lo he hecho yo mediante mi esfuerzo, mis medios y mis ganas de aprender programación, porque os diré que nadie de la clase lo ha hecho porque dicen que eso es imposible y NI SI QUIERA LO HAN INTENTADO!! bueno os voy a pasar el código en .asm para que lo miren y también adjunto una imagen del circuito en proteus por si les sirve para alguna vez... Como ya les digo no me funciona a la perfección pero bueno, algo es algo.
UN ENORME SALUDO A TODOS ..y bueno aunque ya no me sirva para aprobar la asignatura pero me gustaria que si lo consiguen realizar me avisen, lo mismo haré yo si lo consigo solucionar. Si no pues ahí se queda, como un reto para la humanidad jejejej :P
Atentamente: efe87 ;)
;******************************************************
;Control de velocidad de motor
;Selección de la velocidad, mediante un pulsador de tal manera que
;cada vez que se pulse, se incremente su velocidad en un 10%
;Autor: Emilio Molina/Curso:1ºDPA/Centro: IES VIRGEN DE LAS NIEVES
;******************************************************
list p=16f84 ;Tipo de procesador
include "P16f84.INC" ;Definiciones de registros internos
TABLA_SALTO equ 0x0a
org 0x00 ;Vector de Reset
goto Inicio
org 0x04
goto Rutina_interrupción
;Temporizaciones
retardo_100us
bcf INTCON,T0IF
movlw .253
movwf TMR0
Volver1
btfss INTCON,T0IF
goto Volver1
return
retardo_200us
bcf INTCON,T0IF
movlw .250
movwf TMR0
Volver2
btfss INTCON,T0IF
goto Volver2
return
retardo_300us
bcf INTCON,T0IF
movlw .246
movwf TMR0
Volver3
btfss INTCON,T0IF
goto Volver3
return
retardo_400us
bcf INTCON,T0IF
movlw .243
movwf TMR0
Volver4
btfss INTCON,T0IF
goto Volver4
return
retardo_500us
bcf INTCON,T0IF
movlw .240
movwf TMR0
Volver5
btfss INTCON,T0IF
goto Volver5
return
retardo_600us
bcf INTCON,T0IF
movlw .237
movwf TMR0
Volver6
btfss INTCON,T0IF
goto Volver6
return
retardo_700us
bcf INTCON,T0IF
movlw .234
movwf TMR0
Volver7
btfss INTCON,T0IF
goto Volver7
return
retardo_800us
bcf INTCON,T0IF
movlw .231
movwf TMR0
Volver8
btfss INTCON,T0IF
goto Volver8
return
retardo_900us
bcf INTCON,T0IF
movlw .228
movwf TMR0
Volver9
btfss INTCON,T0IF
goto Volver9
return
retardo_1ms
bcf INTCON,T0IF
movlw .225
movwf TMR0
Volver10
btfss INTCON,T0IF
goto Volver10
return
Inicio
bsf STATUS,RP0
clrf TRISA
movlw b'0000001'
movwf TRISB
movlw b'00000100'
movwf OPTION_REG
bcf STATUS,RP0
clrf PORTB
movlw b'00000001'
movwf PORTB
clrf INTCON
bsf INTCON,3
bsf INTCON,INTE
bsf INTCON,GIE
Dato_TABLA_SALTO
bsf TABLA_SALTO,1
Espera
clrwdt
goto Espera
Rutina_interrupción;INTERRUPCIÓN
bcf INTCON,INTF
goto Incrementar_TABLA
Incrementar_TABLA;INCREMENTA
incf TABLA_SALTO,1
movf TABLA_SALTO,W
goto Tabla
Tabla
addwf PCL,F
call Velocidad_0
call Velocidad_1
call Velocidad_2
call Velocidad_3
call Velocidad_4
call Velocidad_5
call Velocidad_6
call Velocidad_7
call Velocidad_8
call Velocidad_9
call Velocidad_10
;Velocidades
Velocidad_0;CT_0%
movwf TABLA_SALTO
bcf PORTB,7
bsf INTCON,GIE
goto Velocidad_0
Velocidad_1;CT_10%
movwf TABLA_SALTO
bsf PORTB,7
call retardo_100us
bcf PORTB,7
call retardo_900us
bsf INTCON,GIE
goto Velocidad_1
Velocidad_2;CT_20%
movwf TABLA_SALTO
bsf PORTB,7
call retardo_200us
bcf PORTB,7
call retardo_800us
bsf INTCON,GIE
goto Velocidad_2
Velocidad_3;CT_30%
movwf TABLA_SALTO
bsf PORTB,7
call retardo_300us
bcf PORTB,7
call retardo_700us
bSf INTCON,GIE
goto Velocidad_3
Velocidad_4;CT_40%
bsf PORTB,7
call retardo_400us
bcf PORTB,7
call retardo_600us
movwf TABLA_SALTO
bSf INTCON,GIE
goto Velocidad_4
Velocidad_5;CT_50%
bsf PORTB,7
call retardo_500us
bcf PORTB,7
call retardo_500us
movwf TABLA_SALTO
bsf INTCON,GIE
goto Velocidad_5
Velocidad_6;CT_60%
bsf PORTB,7
call retardo_600us
bcf PORTB,7
call retardo_400us
movwf TABLA_SALTO
bsf INTCON,GIE
goto Velocidad_6
Velocidad_7;CT_70%
bsf PORTB,7
call retardo_700us
bcf PORTB,7
call retardo_300us
movwf TABLA_SALTO
bsf INTCON,GIE
goto Velocidad_7
Velocidad_8;CT_80%
bsf PORTB,7
call retardo_800us
bcf PORTB,7
call retardo_200us
movwf TABLA_SALTO
bsf INTCON,GIE
goto Velocidad_8
Velocidad_9;CT_90%
bsf PORTB,7
call retardo_900us
bcf PORTB,7
call retardo_100us
movwf TABLA_SALTO
bsf INTCON,GIE
goto Velocidad_9
Velocidad_10;CT_100%
bsf PORTB,7
clrf TABLA_SALTO
bsf INTCON,GIE
goto Velocidad_10
end
-
que bueno efe que lo ayas podido resolver(al menos en parte)
bueno solo decir que como te dicen mas arriba si lo realizas en C es mucho mas cencilo.
un saludo y mejor suerte para la proxima
-
Hola Emilio fijate que los CALL no tienen retorno, te esta faltando RETFIE y RETURN la secuencia pwm hacela afuera de la rutina de interrupcion.
-
Hola MSK, he probado a poner los return, pero si vuelven, seguiria aumentando la velocidad solo, y no tendria sentido y si pongo retfie no llega a aumentar la velocidad, simplemente atiende a la primera pulsacion pero nada mas. en cuanto PWM nose exactamente lo que es he escuchado hablar mucho sobre eso pero si puedieras especificarme un poco mas en cuanto a como se programa y que utilización tiene, te lo agradeceria mucho ;)
-
El PWM significa modulacion por ancho de impuso y lo que hace el micro es generar una onda cuadrada de semiperiodo variable, como la energia entregada al motor es proporcional al area de la curva si el semiperiodo de la curva la ocupa toda la energia será máxima y si no ocupa nada la energia sera cero, luego podremos regular la velocidad del motor. Si el semiperiodo de la señal cuadrada es positivo y negativo, podremos ademas de controlar la velocidad parar el motor y hacer un cambio de sentido de giro.
Un saludo.
-
Hola te modifique algo el programa ahora tiene dos tablas una en la int. y otra afuera en el loop del pwm, trata de simularlo para saber si funciona y me contas
(SIEMPRE SALVA EL W Y EL STATUS)
Rutina_interrupción ;INTERRUPCIÓN
bcf INTCON,INTF
movf TABLA_SALTO,W
call Tabla
movwf velocidad
incf TABLA_SALTO,F
movlw .11
subwf TABLA_SALTO,F ; FIJATE SI ES 11 CERO CONT.
BTFSC STATUS,Z
clrf TABLA_SALTO
retfie
Tabla
addwf PCL,F
retlw .0
retlw .1
retlw .2
retlw .3
"
"
"
( esto es un loop despues de "espera" )
velocidad
movf velocidad,W
addwf PCL,F
goto Velocidad_0
goto Velocidad_1
goto Velocidad_2
"
"
"
;Velocidades
Velocidad_0 ;CT_0%
bcf PORTB,7
goto Velocidad
Velocidad_1 ;CT_10% ESTO ES PWM
bsf PORTB,7
call retardo_100us
bcf PORTB,7
call retardo_900us
goto Velocidad
"
"
"