TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: dimenzza007 en 23 de Septiembre de 2014, 10:34:23
-
Hola gente de todopic soy de 1 de ingeniería electrónica quería solicitar su ayuda .
El profesor nos pidió hacer un practico de ascensor (PB + 2 pisos) en pic16f628A yo lo hice con un código en ASM el proyecto esta andando pero no lo hice como el quería :shock: yo 'ordenes' simples .
El quería que lo hiciéramos con pulsos , osea que el motor paso a paso se moviera con pulsos (650 pulsos x piso).
Este es mi código andando
list p=16F628A ; list directive to define processor
#include <p16F628A.inc> ; processor specific variable definitions
piso equ 0x20
cabina equ 0x21
intmem equ 0x70
portbmem equ 0x71
__config 3f10 ;Oscilador INTRA I/O
;Watchdog OFF
;Power Up TIM ON
;Master Clear DISABLE
;Brown Out DISABLE
;Data Read DISABLE Protege datos
;Code Protect OFF Protege datos
;***************************************************
;INICIO DEL RPOGARMA
;***************************************************
org 0x05
goto inicio
inicio clrf PORTA ;borra ragistros del por A
;RA4=Sensor de planta baja (0=planta baja,1=no llego)
;RA3 = Puerta de Cabina 1 Abierta 0 Cerrada
;RA2 = Posicion de Cabina 2°
;RA1 = Posicion de Cabina 1°
;RA0=Posicion de Cabina planta baja
movfw PORTB ;mueve el contenido del portb a W
;RB7= posible interrupcion por cambio de pulsadores de cabina(no lo usamos)
;RB6 = Pulsador 2º
;RB5 = Pulsador 1º
;RB4 = Pulsador PB
;RB3 = Motor paso a paso
;RB2 = Direccion de motor (1) baja (0) sube
;RB1 = Prende (0) / Apaga (1) Motor
;RB0 = Interrupcion posc de cabina / Puerta abierta
clrw ;se asegura que w este limpio
movwf PORTB ;mueve el contenido de w a portb
;RB7 (no se usa)
;RB6 = pulsador 2
;RB5 = pulsador 1
;RB4 = pulsador PB
;RB3 = no se usa
clrw piso ;borra la direccion de memoria de piso
clrw cabina ;borra direccion de memoria de cabina
movlw 0x07 ;identifica todas las patitas como e/s mueve el valor 0 al bit 7 de w para segurarse
movwf CMCON ;porta como i/o
bsf STATUS,RP0 ;banco de registro 1
;movwl 0xFF ;carga en w el valor FF
movlw TRISA ;mueve el contnido de w a trisA port de entradas
movlw 0xf1 ; mueve al registro w f1
movlw TRISB ;pone el portb 1,2,3 como salidas
bcf STATUS,RP0 ; vuelve al banco 0
movwf PORTB ; el contenido de portb a w
;*****************************************************
; Se asegur que este en planta baja
;*****************************************************
planta btfsc PORTA,0 ;verifica que el primr bit de portA,0 sea 1 (si la cabina esta en planta baja)
; si el bit es 1 va a SIGUE si es 0 salta a goto
; el bit 0 del portA controla que la cabina este en PB
goto sigue ; si es 1 sigue
; si no es asi
bsf PORTB,2 ; no esta en PB pone el portb,2 en 1
;este controla la direccion del motor
bcf PORTB,1 ; anad el motor
goto planta ;hasta que llegue a Planta Baja
sigue bsf PORTB,1 ; apaga el motor
movfw PORTA ;pone porta en 00000111
andlw 0x07 ;pone en porta 00000111
movwf cabina ;leo porta y cargo la posicion de cabina
nada CALL ptaabierta ;LOGICA PRINCIPAL DEL PROGARMA
CALL pulsadores ;LOGICA PRINCIPAL DEL PROGARMA
goto nada ;LOGICA PRINCIPAL DEL PROGARMA
;************************************************************
;Controla la puerta abierta se deberia parar todo cuando se cierra se reanuda
;************************************************************
ptaabierta btfss PORTA,3 ;la puerta esta abierta ?
return ;no, sale del proceso
call tiempo ;antirrebote de contantos
btfss PORTA,3 ;¿sigue abierta ?
return ;no , falsa alarma
movfw PORTB ;si esta abierta
movwf intmem ;guardo el estado del motor
emergencia bsf PORTB,1 ;paro el motor
btfsc PORTA,3
goto emergencia ;espera a que cierre la puerta
movfw intmem
movwf PORTB ;recuperar el estabo anterior
return ;volver a punto de llamada
;******************************************************************
;RUTINA DE PULSADORES
;******************************************************************
pulsadores btfsc PORTB,4 ;pruebo el pulsador de PB
call tiempo ;espero el tiempo de rebote pulsador
btfsc PORTB,4 ;confirmo el accionamiento del pulsador
call PB ;pulsador PB confirmado , ir al proceso
btfsc PORTB,5 ;
call tiempo ;espero el tiempo de rebote pulsador
btfsc PORTB,5 ;pulsador de piso 1 ir a proceso
call primero ;confirmado ir a proceso 1
btfsc PORTB,6 ;
call tiempo ;espero el tiempo de rebote pulsador
btfsc PORTB,6 ;pulsador de piso 2 ir a proceso
call segundo ;confirmado ir a proceso 2
return ;vuelve al programa
;*****************************************************************
;* PROCESO DE PLANTA BAJA
;*****************************************************************
PB swapf PORTB,w ;paso los bits de puertas a menor peso
andlw 0x07 ;aseguro el valor
movwf piso ;guardo el piso en memoria
call direccion ;poceso que fijara la direccion
otrapuerta call ptaabierta ;pregunta se abrio la puerta
btfss PORTA,0
goto otrapuerta ;pruebo hasta q llegue a PB
bsf PORTB,1 ;paro el motor
movlw 0x01
movwf cabina ;cargo en memoria la posicion de la cabina
clrf piso ;borro para la prox... llamada
return ;vuelve al programa
;*****************************************************************
; PRIMER PISO
;*****************************************************************
primero swapf PORTB,w ;paso a portb
andlw 0x07 ;aseguro el valor
movwf piso ;guarso en memoria el piso
call direccion ;proceso que fija la direccion
otpuerta
call ptaabierta ;pregunta, se abrio la puerta
btfss PORTB,1
goto otpuerta ;pruebo hasta que llegue a PB
bsf PORTB,1 ;llego paro motor
movlw 0x02
movwf cabina ;cargo en memoria la posicion de la cabina
clrf piso ;borro para la prox...llamada
return ;vuelve al programa
;*****************************************************************
; SEGUNDO PISO
;*****************************************************************
segundo
swapf PORTB,w ;paso a portb
andlw 0x07 ;aseguro el valor
movwf piso ;guarso en memoria el piso
call direccion ;proceso que fija la direccion
opuerta
call ptaabierta ;pregunta, se abrio la puerta
btfss PORTA,2
goto opuerta ;pruebo hasta que llegue a PB
bsf PORTB,1 ;llego paro motor
movlw 0x04
movwf cabina ;cargo en memoria la posicion de la cabina
clrf piso ;borro para la prox...llamada
return ;vuelve al programa
;****************************************************************
; PROCESO PARA DETERMINAR DIRECCION
;****************************************************************
direccion
movfw cabina
subwf piso,w ;Se resta la posicio de la cabina - el sensor de piso
btfsc STATUS,Z ;si la resta es 0 la cabina y el pulsador
return ; es el mismo piso
btfss STATUS,C ;se berifica si el bit de carry
goto baja ;si es negativo (Carry=0 hay que subir)
goto sube ;si es positivo (Carry=1 hay que bajar)
sube
bcf PORTB,2 ;direccion
bcf PORTB,1 ;prende motor
return
baja
bsf PORTB,2 ;direccion
bsf PORTB,1 ;prende motor
return ;
;*****************************************************************
;CONTROL DE TIEMPO PARA LOS PULSADORES
;*****************************************************************
tiempo clrf T1CON
movlw 0xb1
movwf TRM1H
movlw 0xde
movwf tmr11 ;el timer1 a 20mseg aproxi...
bsf T1CON,0 ;arranca el temporizador
mas btfss PIR1,0 ;pregunta si termino
goto mas
bcf PIR1,0 ;borra bandera indica fin
bcf T1CON,0 ;para contador
return
END ; directive 'end of program'
Aclaro que el codigo anda bien es simple pero anda , pero cuando entramos en el tema de pulsos :5] estoy en ceros no tengo ni la mas pálida idea .
aver si alguien me puede dar una mano de donde lo tengo que modificar..... la verdad tengo muchas preguntas
como - como genero los pulsos ,que registros se modificar?
cuales son los cálculos a usar , como envió los pulsos al motor? etc...
agradecería su ayuda
Acá el circuito
-
Bienvenido al foro dimenzza007.
Supongo que es un motor paso a paso (PaP), necesitaras 2 pines mas, es decir 4 salidas en vez de 2 como ahora. Tendras que modificar toda la parte de activacion/desactivacion del motor.
Te encontre esto aqui en el foro:
http://www.todopic.com.ar/foros/index.php?topic=34715.0
-
Bienvenido al foro dimenzza007.
Supongo que es un motor paso a paso (PaP), necesitaras 2 pines mas, es decir 4 salidas en vez de 2 como ahora. Tendras que modificar toda la parte de activacion/desactivacion del motor.
Te encontre esto aqui en el foro:
http://www.todopic.com.ar/foros/index.php?topic=34715.0
ok el lenguaje lo entiendo el problema son los calculos
si yo necesito 650 pulsos y cada pulso tiene 7milseg
tengo 4550 mil/seg por piso si o paso a microseg 4550000
intente sacar los calculos para el periodo y frecuencia y me salio cualquier cosa
¿como sigo?
-
¿Por que 7mS por paso? se les llama pasos no pulsos :lol: :lol:
Los PaP pueden tener diferentes pasos, desde 4 pasos 90 grados por paso, hasta 200 pasos 1,8 grados por paso.
Ya te has creado el programa que hace andar el PaP?, has habilitado 4 salidas en vez de las dos que tenias antes?