TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: farroyogarcia en 25 de Noviembre de 2007, 06:08:30
-
Hola colegas electrónicos, soy estudiante adulto de electrónica y os planteo mi cuestión, ya que me he hartado de buscar en el foro y en la web y no he encontrado nada.
Mi profe de electrónica y yo nos estamos introduciendo en el mundo de los pic, hemos desarrollados ejemplos muy simples por nuestros propios medios e incluso le hemos hechos pequeñas modificaciones y nos ha ido bien.
Actualmente queremos realizar un programa que realice las funciones de interruptor a través de las interrupciones detectadas a través de la interrupción externa que dispone el 16f84a, es decir, que cada vez que se presione el pulsador pase de encendido a apagado y viceversa, supongo que no será difícil, pero nosotros que somos totalmente profanos en esto es difícil y precisamos de ver el ejemplo para "abrir" nuestra comprensión a esta forma de funcionar (la del pic).
He utilizado el niple y e seguido un ejemplo algo parecido que ofrecen, pero .... joder que malo soy je je je.
gracias de antemano por vuestra ayuda
recibid un cordial saludo desde Morón de la frontera, Sevilla-España
Fco. Jesús Arroyo García
-
hola, as ies el camino de los autodidactas, pero no estas solo, como decia Lennon: but i'm not the only one...
bueno, programas en niple? m... no domino mucho ese entorno, te puedo ayudar pero si programaras en ASSEMBLER o en C, si te interesa pues escribes nomas, además hay mucha gente en el foro que usa el niple seguro que te ayudaran con tus dudas. saludos! :-/
-
Hola amigo:
Desde hace un poquitin de tiempo programo con Niple y tambien en ensamblador y gustosamente me ofrezco para ayudarte en lo que pueda.
Tambien como decis, soy bastante autodicata y me gusta meterme en las produndidades del porque de las cosas.
Puedes decirme en donde estas atascao y/o dudas que tengas.
De entrada el interruptor que dectectaria los cambios como es, tener en cuenta que para eliminar los dichosos rebotes que producen al accionarse son la causa de multiples problemas con las detecciones de cambio de estado. lo normal es poner algun retraso software o realizar algun sistema antirebote por Hardware. ¿ esto lo habeis tenido en cuenta?
Fermin
-
Gracias por vuestro apoyo, pues si que es algo complicado esto de los pic´s... pero decimos mi maestro y yo... es cuestión de partirse "los cuernos" y de esa manera empezar a funcionar mejor.
He estado toda la tarde dándole caña al niple siguiendo un ejemplo que ofrecen y creo que he podido conseguir algo, aquí os acompaño las imágenes de los flujos, archivo .Hex y el .Asm generado con el niple,, dios si tuviera que tener conocimiento para escribir todo lo que ese programa ha generado a través de los flujos........ :shock: :shock: :shock: :shock: :shock:
Hasta mañana por la tarde que no llegue al instituto no sabré si funciona.
recibid un saludo
p.d. pues no me deja subir las imagenes de los flujos, es una extensión no válida
-
saludos farroyogarcia, bienvenido al foro.
Mira talvez te sirva comenzar por el ensamblador, si es que no conoces mucho de micros, siempre es bueno comenzar por la estructura de un dispositivo y ver como funciona internamente, ello lo lograras con el ensamblador y el mplab, despues puedes pasarte a otro lenguaje que sea de alto nivel, como el C de ccs, el basic o proton, lo que veas mas facil
para comenzar tb te servira mucho la hoja de datos del pic, esa la consigues de la pagina de microchip no tiene costo las descargas, en ello puedes tb darle una mirada a las intrucciones, registros, seguramente que tienes principios de electronica digital ya que ahi habla de registros, memoria, direcciones, etc.
mira el programa que hice para encender un led por interrupcion externa, te lo comento todo, para que puedas entenderlo:
bueno aca el programa explicado:
LIST P=16F84A ;define que micro es el que vas a usar
#INCLUDE <P16F84A.INC> ;incluye las definiciones usadas para el micro, por ejemplo, PORTB=0x06,INTCON,INTE, etc
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF ;esta el la palabra de configuracion, son algunas caracteristicas con las que funcionara el micro
; dice qeu usaremos un oscilador XT (<4MHz)
; WDT_OFF deshabilita el perro guardian, que es un timer que resetea al micro cuando desborda, se lo usa cuando sea necesario, aca no
; PWRTE_ON es el power up timer, si no me equivco es para que el micro espere un tiempo hasta que la tension sea la adecuada para comenzar a ejecutar el programa
; CP_OFF es proteccion del codigo, en off esta desprotegido, este lo habilitas para que no te copien el programa desde el micro
ERRORLEVEL -302 ; solo quita algunos warning que te da el mplab
CBLOCK 0x0C ; una definicion de variables que van desde la posiscion 0x0c de la ram
PDel0,PDel1 ; los nombres de las variables
ENDC ; fin del bloque de variables
ORG 0X00 ; origen del programa en la direccion 0
GOTO INICIO ; nos vamos a la etiqueta de inicio
ORG 0X04 ; declaracion de ll vector de interrupcion
GOTO INTERRUPT
;-----------------------------------------
;**************RUTINA RETARDO************* esta rutina fue elaborada con el programa PICDEL (PDEL)
;-----------------------------------------
DELAY movlw .55 ; 1 set numero de repeticion (B)
movwf PDel0 ; 1 |
PLoop1 movlw .181 ; 1 set numero de repeticion (A)
movwf PDel1 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
clrwdt ; 1 ciclo delay
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
RETURN ; 2+2 Fin.
;---------------------------------------------------------
;***********RUTINA QUE ATIENDE LA INTERRUPCION************
;---------------------------------------------------------
INTERRUPT ; esta rutina se ejecuta cada vez que ocurra una interrupcion
CALL DELAY ; llamamos a la rutina DELAY para generar un retardo de 50ms antirrebotes
MOVLW B'00000010' ; cargamos el acumulador W con el valor binario 10
XORWF PORTB,F ; realizamos un OR-Exclusivo entre el PUERTOB y el valor binaio cargado anteriormente
BCF INTCON,INTF ; ponemos a cero la bandera de interrupcion externa, para poder detectar otra interrupcion posteriormente
RETFIE ; retornamos de la interrupcion al programa principal, de donde fue interrumpido
;-----------------------------------------
;***********PROGRAMA PRINCIPAL************
;-----------------------------------------
INICIO
CLRF PORTA ; inicializamos puerto A
CLRF PORTB ; y puerto B
BSF STATUS,RP0 ; nos vamos al banco 1, para configurar los puertos a entradas y salidas
MOVLW B'11111101' ; cargamos el acumulador W con el valor binario
MOVWF TRISB ; movemos el valor binario anterior al registro TRISB que contiene la configuracion de I/O del puerto B
; los '1' definen el pin como entrada; los '0' como salida 1=IN 0=OUT
; el puerto B entonces tiene todos los pines como entradas, excepto el pin RB1, que sera la salida
; es mejor si no se usara un pin configurarlo como entrada, apra evitar corto circuitos que lo puedan dañar
MOVLW B'11111111' ; cargamos el acumulador W con el valor binario
MOVWF TRISA ; movemos el valor binario anterior al registro TRISA que contiene la configuracion de I/O del puerto A
BSF OPTION_REG,INTEDG ; definimos que la interrupcion se dara en el flanco de subida, ya que ponemos a '1' el bit INTEDG del registro OPTION_REG
BCF STATUS,RP0 ; nos vamos al banco 0 para la manipulacion del siguiete registro y el puerto B que estan en el banco 0
BCF INTCON,INTF ; ponemos a '0' la abndera de interrupcion externa
BSF INTCON,INTE ; ponemos a '1' el bit de interrupcion externa, para habilitar la interrupcion
BSF INTCON,GIE ; ponemos a '1' el bit de interrupcion global, para habilitar el uso de las interrupciones
CICLO ; bucle infinito
GOTO CICLO ; donde se trabajara hasta que haya interrupcion, en este caso no hay nada ya que la interrupcion hace lo necesario
END ; fin del programa
creo que esta mas corto y claro que el codigo generado por el niple, si simulas con proteus lo podras ver, o armando lo veras tb, jeje, talvez ajustar un poco el retardo si es que no funciona mbien para los rebotes
pulsador en RB0 y led en RB1
vcc-----pulsador------10k-----tierra
|
v
al micro
RB0
te colgue el codigo, el .hex y la simulacion en proteus aca (http://www.4shared.com/file/30385809/2980a5d7/Interrupcion_Externa_84a.html)
-
Hola amigo ferroygarcia:
Como ya tienes tu primer programa ¿has probado ya si te funciona?
Fermin
-
Solucionado... perdonen la tardanza de mi respuesta ya que echo la semana de trabajo fuera de casa y no dispongo de Internet fuera.
Tenia un problema con el hardware, una soldadura en el mismo pin de la regleta que me pillaba el Rb0, de ese modo no realizaba la interrupción.
gracias por vuestra atencion.
Actualmente mi maestro y yo estamos abarcando un poquito mas (pasito a pasito) y queremos hacer que a través de un pulsador y dependiendo del tiempo que este esté pulsado, encienda una salida u otra en el puerto. He pensado que se podría realizar introduciendo justo después de la interrupción una temporización de un segundo mas o menos, para realizar después una comparación con un registro definido, si este vale 0 (por ejemplo) el pulsador sigue pulsado dando una salida definida para este caso. Si el valor del pulsador es diferente al del registro al realizar la comparación, generará la otra salida que hayamos definido, creo que no voy muy equivocado, haber que me nos sale.
Una pregunta, ¿existe algún programa para PC que realice las funciones de un "entrenador"? esto seria muy interesante ya que podría prescindir de tener que fabricar una placa para el entrenamiento con los pic´s
-
que bueno es saber que te ha funcionado el programa que hiciste :mrgreen:
en cuanto al entrenador, no conozco ninguno, pero puedes probar con el proteus, es un software que te permite simular microcontroladores varios 12f 16f 18f 24f, hay seguramente una version de prueba por su pagina oficial http://www.labcenter.co.uk
en cuanto a lo que planteas para tu siguiente proyecto va muy bien como mencionas, tb puedes usar la interrupcion del TMR0 que te contaria el tiempo que lleva pulsado un pulsador, nose, intenta lo que planteaste y nos comentas si ha fallado algo, con gusto te ayudamos, un saludo :mrgreen:
-
Amigo Fco. Jesús, te ruego que edites el primer post de tu hilo y le cambies la palabra "pulasor" por "pulsador" así si algún amigo usa el buscador preguntando por esa palabra podrá encontrar tu hilo. :mrgreen:
Muchas gracias.