TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Sat3llite5 en 14 de Septiembre de 2011, 14:56:36
-
Que tal, estoy comenzando con esto de los pic, y me eh comprado este 12C508A, necesito hacer algo parecido a lo que haria un ne 555 solo que con el pic, la problematica seria:
al recibir un pulso en un pin hacer que otro pin lo sostenga por 4 min.
no se donde comenzar y esto es lo que llevo viendo otros codigos y que creo es lo que me funcionaria, agradeceria que me asesoraran con este proyecto.
list p=12c508a ;pic
#include <p12c508a.inc>
CONFIG _XT_OSC & _MCLRE_ON & _CP_OFF & _WDT_OFF & _LVP_OFF & _PWRTE_ON
;----------------------
cblock 0x0c ;memoria
endc
;----------------------
org 0
goto inicio
;----------------------
;definimos las IO
TRISIO.0=1 ;GP0 COMO ENTRADA
TRISIO.1=1 ;GP1 COMO ENTRADA
TRISIO.2=0 ;GP2 COMO SALIDA
TRISIO.3=0 ;GP3 COMO SALIDA
TRISIO.4=1 ;GP4 COMO SALIDA SOLO SE PUEDE CONFIGURAR COMO SALIDA?
TRISIO.5=0 ;GP5 COMO SALIDA
Saludos y desde ya Gracias!!!
-
yo adquiri el 12f508 ya que puedes grabarlo muchas veces.si no me equivoco el 12c508a solo se puede gravar una vez.
respecto a los 4 minutos de temporizacion.deben de ser exactos o da igual.ya que se podria usar el oscilador interno.o un cristal externo.lo cual tendrias que privarte de 2 pin.
-
no, me gustaria poder mandar un retardo de 3 minutos o 3 minutos 30 seg ya eh modificado lo anterior y tengo todo solo me falta ese retardo... dale un vistaso: aaaa y un retardo de 2 o 3 segundos mira:
;cencere
list p=12c508a ;micro
#include <p12c508a> ;libreria
CONFIG _XT_OSC & _MCLRE_ON & _CP_OFF & _WDT_OFF & _LVP_OFF & _PWRTE_ON
w equ 0
f equ 1
OUT1 equ 0 ;gp0
OUT2 equ 1 ;gp1
OUT3 equ 2 ;gp2
IN1 equ 3 ;gp3
OUT4 equ 4 ;gp4
IN2 equ 5 ;gp5
AUX1 equ 0 ;variable auxiliar
AUX2 equ 1 ;variable auxiliar
movlw p'00000101'
tris GPIO
start
bsf GPIO,OUT1 ;enciende led1
call time_1 ;toma 3 seg
bcf GPIO,OUT1 ;apaga led1
call time_1 ;toma 3 seg
bsf GPIO,OUT2 ;enciende led2
call time_1 ;toma 3 seg
bcf GPIO,OUT2 ;apaga led2
call time_1 ;toma 3 seg
btfss GPIO,IN1 ;revisa esta entrada si es1 salta una instruccion
goto start
rel_on
call time_2 ;toma 3 o 4 minutos
bsf GPIO,OUT3 ;activa relay
play
bsf GPIO,OUT4 ;enciende led3
call time_1 ;toma 3 seg
bcf GPIO,OUT4 ;apaga led3
call time_1 ;toma 3 seg
btfss GPIO,IN2 ;revisa esta entrada si es1 salta una instruccion
goto play
rel_off
bcf GPIO,OUT3 ;desactiva relay
goto start
time_1 ;rutina de retardo 3 seg
????????????????????????
time_2 ;rutina de retardo 3 a 4 minutos
????????????????????????
end
desde ya muchas gracias hermano
-
hola Sat3llite5.he estado desarroyando tu programa.he tenido que cambiarte algunos pin.para aprobechar mejor el microcontrolador.
pero poco se puede hacer con este pic.ya que tiene muy pocas opciones.
lo mas que he podido es aprobechar GP0 para ahorrar una resistencia.y tener opcion a despertarlo.aunque el modo sleep no te sirve con el programa que has hecho.
no se exactamente lo que quieres hacer.pero te recomiendo que busques otro pic que use interrupciones.almenos si quieres usar el juego de luces de los led.
ya que tu programa no funciona con pulsadores.para activar el rele tienes que estar presionando los pulsadores durante 3 o 6 segundos.depende de que linea se este ejecutando en el momento que presionas el pulsador.en todo caso si prescindes de los led.podrias accionar el temporizador del rele mediante GP0.
estando el pic en modo sleep.pero tendrias que prescindir del juego de luces.para que tu programa temporizara con solo presionar el pulsador.
otra cosa. hay programas que te generan automaticamente el codigo para los retardos. yo uso el PDEL Ver SP1. solo que no usa el TMR0 para hacer el reardo.
; PROGRAMA : temporizador
; Funcion :
;
;
; Revision : 1.1 17/09/2011 Programa para : PIC12C508A
; CPU Clock : 4 MHz Reloj instruccion :
; WDT : Deshabilitado Tipo de reloj : IntRC
; Code Prot : OFF
;*****************************************************www.ingeniopic.com***************************************************
;FUNCIONAMIENTO DEL CIRCUITO:
;Para encender o apagar la luz se realizara una pulsacion breve sobre el pulsador.
;Si queremos entrar en el modo de regulacion,realizaremos una pulsacion larga (siempre que la luz este encendida)
LIST P=12C508A ;Se indica el modo de procesador
RADIX HEX ;Sistema de numeracion hexadecimal
INCLUDE "P12C508A.inc"
;registros internos
__CONFIG _IntRC_OSC & _CP_OFF & _WDT_OFF & _MCLRE_OFF
CBLOCK 0x08 ;comienza el bloque de ram en la direccion 0x08
PDel0
PDel1
PDel2
PDel3
PDel4
PDel5
PDel6
PDel7
PDel8
ENDC ;fin del bloque de ram
#define OUT1 1 ;gp1
#define OUT2 2 ;gp2
#define OUT3 4 ;gp4
#define IN1 0 ;gp0
#define OUT4 5 ;gp5
#define IN2 3 ;gp3
;<<<<<<---------------------- VECTOR DE RESET ------------------------>>>>>>>
ORG 0x00 ;Inicio en el Vector de Reset
goto INICIO ;ir a la primera instruccion del programa
;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>>
INICIO movlw b'10000111' ;configura el divisor de TMR0 division , pull up enable,wake up disable.
option
movlw b'00001001'
tris GPIO ;configura le puerto
clrf GPIO ;borra todas las salidas
;<<<<<<<------------------------------------------------PROGRAMA PRINCIPAL---------------------------------------->>>>>>>>>>>>>>
PRINCIPAL goto start
;AUX1 equ 0 ;variable auxiliar
;AUX2 equ 1 ;variable auxiliar
start
bsf GPIO,OUT1 ;enciende led1
call time_1 ;toma 3 seg
bcf GPIO,OUT1 ;apaga led1
call time_1 ;toma 3 seg
bsf GPIO,OUT2 ;enciende led2
call time_1 ;toma 3 seg
bcf GPIO,OUT2 ;apaga led2
call time_1 ;toma 3 seg
btfsc GPIO,IN1 ;revisa esta entrada si es1 salta una instruccion
goto start
rel_on
call time_2 ;toma 3 o 4 minutos
bsf GPIO,OUT3 ;activa relay
play
bsf GPIO,OUT4 ;enciende led3
call time_1 ;toma 3 seg
bcf GPIO,OUT4 ;apaga led3
call time_1 ;toma 3 seg
btfsc GPIO,IN2 ;revisa esta entrada si es1 salta una instruccion
goto play
rel_off
bcf GPIO,OUT3 ;desactiva relay
goto start
;-------------------------------------------------------------
; Generado con PDEL ver SP r 1.0 el 18/09/2011 Hs 16:39:02
; Descripcion: Delay 3000000 ciclos
;-------------------------------------------------------------
time_1 ;rutina de retardo 3 seg
movlw .67 ; 1 set numero de repeticion (C)
movwf PDel0 ; 1 |
PLoop10 movlw .91 ; 1 set numero de repeticion (B)
movwf PDel1 ; 1 |
PLoop11 movlw .122 ; 1 set numero de repeticion (A)
movwf PDel2 ; 1 |
PLoop12 clrwdt ; 1 clear watchdog
decfsz PDel2, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop12 ; 2 no, loop
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop11 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (C)
goto PLoop10 ; 2 no, loop
PDelL11 goto PDelL12 ; 2 ciclos delay
PDelL12 clrwdt ; 1 ciclo delay
retlw 0 ; 2+2 Fin.
;-------------------------------------------------------------
time_2 ;rutina de retardo 3 a 4 minutos
;-------------------------------------------------------------
; Generado con PDEL ver SP r 1.0 el 18/09/2011 Hs 18:05:29
; Descripcion: Delay 240000000 ciclos
;-------------------------------------------------------------
time_2 ;rutina de retardo 3 a 4 minutos
movlw .231 ; 1 set numero de repeticion (C)
movwf PDel0 ; 1 |
PLoop0 movlw .223 ; 1 set numero de repeticion (B)
movwf PDel1 ; 1 |
PLoop1 movlw .245 ; 1 set numero de repeticion (A)
movwf PDel2 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 goto PDelL3 ; 2 ciclos delay
PDelL3 goto PDelL4 ; 2 ciclos delay
PDelL4 goto PDelL5 ; 2 ciclos delay
PDelL5 goto PDelL6 ; 2 ciclos delay
PDelL6 goto PDelL7 ; 2 ciclos delay
PDelL7 goto PDelL8 ; 2 ciclos delay
PDelL8 clrwdt ; 1 ciclo delay
decfsz PDel2, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (C)
goto PLoop0 ; 2 no, loop
PDelL9 goto PDelL110 ; 2 ciclos delay
PDelL110 goto PDelL11 ; 2 ciclos delay
PDelL111
retlw 0 ; 2+2 Fin.
end
(http://img101.imageshack.us/img101/3945/temporizador.jpg) (http://imageshack.us/photo/my-images/101/temporizador.jpg/)
Uploaded with ImageShack.us (http://imageshack.us)
-
hola groundman muchas gracias por rersponder no sabia de los generadores de retardos, basicamente este programa lo que hace es al recibir un pulso constante en in1 (ignicion de un vehiculo) espera 3 minutos para activar el relay que desactivara el sistema de combustible, es solo un complemento para una alarma, y al detectar otro pulso constante desactivarlo.
este pic lo compre por barato para hacer pruebas, hasta despues me entere de que no era regrabable, aun asi pienso que despues de varias pruebas y tener afinado el programa, deveria funcionar bien con este pic, estoy abierto a sugerencias, tambien considerando que no debo gastar mucho en esto.
De antemano te agradesco la ayuda que me proporcionas, asi como la informacion de los generadores de retardos, voy a investigar cuales funcionan en debian ya que lo estoy haciendo desde el piklab.
Gracias y Saludos!!!
-
Hola, aqui tienes el programita para generar demoras (http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=5968.0;attach=378) en ensamblador... :mrgreen:
-
Hola todopic.
Muchas gracias por el programita, terminando el codigo lo pongo aqui para que me ayuden a validar que ...en cierta manera funcione, ya estoy buscando el 12c508 que es regrabable para las pruebas.
Saludos y Gracias!
-
bueno aqui esta ya terminado, aun no lo simulo ni nada ya que estoy batallando con el gpsim, aparte que no soporta este pic, espero sus comentarios para encontrar algun problema en el, Muchas Gracias....
; -----------------------------------------------------------------------
; Plantilla generada por Piklab
#include <p12c508a.inc>
; -----------------------------------------------------------------------
; Bits de configuración: adapte los parámetros a su necesidad
__CONFIG _IntRC_OSC & _WDT_OFF & _CP_OFF & _MCLRE_ON
; -----------------------------------------------------------------------
CBLOCK 0x08 ;bloque de ram en la direccion 0x08 para los retardos
PDel0
PDel1
PDel2
PDel3
PDel4
PDel5
PDel6
PDel7
PDel8
ENDC ;termina bloque de la ram
#define OUT0 0;gp0
#define OUT1 1;gp1
#define OUT2 2;gp2
#define IN0 3;gp3
#define OUT3 4;gp4
#define IN1 5;gp5
ORG 0
MOVLW b'00101'
TRIS GPIO
start
BSF GPIO,OUT0 ;enciende led
CALL TIME0 ;espera 3 seg
BCF GPIO,OUT0 ;apaga led
CALL TIME0 ;espera 3 seg
BTFSS GPIO,IN0 ;revisa entrada0 si es 1 salta una intruccion
GOTO start ;comienza de nuevo
relon
CALL TIME1 ;espera 3 minutos
BSF GPIO,OUT1 ;activa relay
playy
BSF GPIO,OUT0 ;enciende led
CALL TIME0 ;espera 3 seg
BCF GPIO,OUT0 ;apaga led
CALL TIME0 ;espera 3 seg
BTFSS GPIO,IN1 ;revisa entrada1 si es 1 salta una instruccion
GOTO playy ;comienza en esta etiqueta
BCF GPIO,OUT1 ;apaga relay
GOTO start ;comienza de nuevo
TIME0 ;retardo 3 seg
movlw .67 ; 1 set numero de repeticion (C)
movwf PDel0 ; 1 |
PLoop10 movlw .91 ; 1 set numero de repeticion (B)
movwf PDel1 ; 1 |
PLoop11 movlw .122 ; 1 set numero de repeticion (A)
movwf PDel2 ; 1 |
PLoop12 clrwdt ; 1 clear watchdog
decfsz PDel2, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop12 ; 2 no, loop
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop11 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (C)
goto PLoop10 ; 2 no, loop
PDelL11 goto PDelL12 ; 2 ciclos delay
PDelL12 clrwdt ; 1 ciclo delay
retlw 0 ; 2+2 Fin.
TIME1 ;retardo 3 a 4 minutos
movlw .231 ; 1 set numero de repeticion (C)
movwf PDel0 ; 1 |
PLoop0 movlw .223 ; 1 set numero de repeticion (B)
movwf PDel1 ; 1 |
PLoop1 movlw .245 ; 1 set numero de repeticion (A)
movwf PDel2 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 goto PDelL3 ; 2 ciclos delay
PDelL3 goto PDelL4 ; 2 ciclos delay
PDelL4 goto PDelL5 ; 2 ciclos delay
PDelL5 goto PDelL6 ; 2 ciclos delay
PDelL6 goto PDelL7 ; 2 ciclos delay
PDelL7 goto PDelL8 ; 2 ciclos delay
PDelL8 clrwdt ; 1 ciclo delay
decfsz PDel2, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (C)
goto PLoop0 ; 2 no, loop
PDelL9 goto PDelL110 ; 2 ciclos delay
PDelL110 goto PDelL11 ; 2 ciclos delay
PDelL111
retlw 0 ; 2+2 Fin.
END
esta genial el PDel.
Saludos!