Programa para 16f84
Hola a todos, estaba haciendo un programa para un 16f84 y no acaba de funcionarme del ttodo bien.Lo estaba haciendo con microbasic y me he quedao un poco atascao, no es muy dificil pero todavia no lo domino muy bien.Explico lo que deberia hacer el micro.
Tenemos un dipswitch de 3 lineas de 2 posiciones cada una conectados a RA0, RA1 y RA2 y un pulsador en el RA4.Solo uno de los 3 puede estar a masa en el momento de alimentar, puede ser cualquiera de los 3 pero solo uno y el micro actua diferente sea cual sea el dip.· modos de funcionamiento. - Si es el dip de RA0 el que esta a masa al pulsar el pulsador de RA4 se activara la salida de RB0 durante 1 segundo y despues volvera a nivel bajo a la espera de otra pulsacion. - Si es el dip de RA1 el que esta a masa al pulsar el pulsador de RA4 se activara la salida de Rb0 durante 30 segundos y despues volvera a nivel bajo a la espera de otra pulsacion. -si es el dip de RA2 el que esta a masa cuando se pulse el pulsador de RA4 la salida de RB0 pasara a nivel alto hasta que se vuelva a pulsar RA4 que volveria a llevarla a nivel bajo y asi sucesivamente todas las veces. Digamos q son 3 modos de funcionamiento y estos modos lo marcan las posiciones de los dip. Os dejo el programa en microbasic y si podeis echarle un vistazo para arreglarlo, agradecido.Si alguno lo apaña en ensamblador porque lo domina mejor pues igual me da, le saco el hex y lo cargo. Muchas gracias a todos. Aqui esta: program tresmodos main: TRISA = 1 TRISB = 0 PORTB = %00000000 IF PORTA.0 = 0 THEN IF PORTA.4 = 0 THEN PORTB.0 = 1 delay_ms(1000) PORTB.0 = 0 END IF end if IF PORTA.1 = 0 THEN IF PORTA.4 = 0 THEN PORTB.0 = 1 delay_ms(30000) PORTB.0 = 0 END IF end if IF PORTA.2 = 0 THEN IF PORTA.4 = 0 THEN IF PORTB.0 = 1 THEN PORTB.0 = 0 ELSE PORTB.0 = 1 END IF END IF end if goto main end. |
Hola ecraun
Yo estoy empezando con esto de los pic, utilizo el pic simulador ide para escribir y simular el codigo.Es muy parecido al microbasic.Tendras que poner los tiempos para las esperas puesto que los puse para poder simular.Espero te sirva Un saludo AllDigital TRISA = %11111111 TRISB = %00000000 inicio: PORTB.0 = 0 If PORTA = 0x11 Then Goto segundo WaitUs 50 If PORTA = 0x12 Then Goto treinta WaitUs 50 If PORTA = 0x14 Then Goto siempre WaitUs 50 Goto inicio siempre: PORTB.0 = 1 WaitUs 150 If PORTA = 0x14 Then Goto inicio Goto siempre segundo: PORTB.0 = 1 WaitUs 500 Goto inicio treinta: PORTB.0 = 1 WaitUs 2000 Goto inicio End |
Gracias jabato por interesarte, la cuestion es que no acaba de funcionar del todo bien he probado con el programa que me dices y no se activa la salida como deberia, hay algo que nos estamos pasando por alto.He probado con alguna modificacion del programa y tampoco funciona bien.en estos momentos el programa lo tengo asi:
Gracias a los 2 por contestar.La verdad es que el programa ha mejorado mucho pero sigue sin funcionar.A veces se enciende 1 segundo a veces 30 funciona aleatoriamente sin sintedo alguno, y lo que no he conseguido que haga es encender y apagar con el mismo pulsador, osea el modo 3 (RA2) Os dejo el programa tal y como lo tengo en estos momentos a ver si veis algo. De nuevo gracias por interesaros. program tresmodos main: TRISA = 255 TRISB = 0 PORTB = 0 while true if TestBit(PORTA, 0) = 0 then if Button(PORTA, 4, 100, 0) then SetBit(PORTB, 0) Delay_ms(1000) ClearBit(PORTB, 0) end if end if if TestBit(PORTA, 1) = 0 then if Button(PORTA, 4, 100, 0) then SetBit(PORTB, 0) Delay_ms(30000) ClearBit(PORTB, 0) end if end if if TestBit(PORTA, 2) = 0 then if Button(PORTA, 4, 100, 0) then if TestBit(PORTB, 0) then ClearBit(PORTB, 0) else SetBit(PORTB, 0) end if end if end if wend end. A ver si alguien puede ver el error. Un saludo y gracias de nuevo jabato |
Hola ecraun
Creo que deberiamos ralentizar el programa para evitar los rebotes del pulsador.Si lo tienes montado en un circuito asegurate de que ninguna entrada esta flotante.El programa que puse funciona con los dipswitch y el pulsador en estado alto y hay que modificar los tiempos puesto que los puse en microsegundos para poder simularlo. Un saludo y encantado de aprender contigo |
Dime la velocidad y tipo de reloj con la que vas a trabajar y preparo la versión ensamblador.
Un saludo. |
Dime también que ha de hacer el programa si estando la salida RB0 activada (en cualquiera de los 3 modos) se vuelve a activar RB4. Osea, si esta temporizando y cambia de estado el puerto A. Y que se debe hacer si se mantiene una tecla pulsada.... lo que se te ocurra.
|
Hola estator , estos dias he estado probando cosas y parece que funciona mejor el circuito al reves de lo que proponia en un principio, osea, funciona mejor si en lugar de poner resistencias de pull-up a + 5V y cortocircuitar con los dips y el pulsador a masa las entradas, pues al reves, colocar las resistencias a masa y cortocircuitar con los dips y el pulsador a +5V, con lo que nos cambiaria el programa en lo que a niveles altos y bajos se refiere en las entradas.Lo que un nivel bajo nos activaba antes Ra4 ahora es un nivel alto.Sigo haciendo pruebas con diferentes programas, diferentes esquemas y aumentando tiempos de espera para anular los rebotes como dice jabato.
El programa parece que quiere ir pero no es definitivo, porque a veces por lo que sea, se activa la salida con 30 segundos cuando deberia ser solo 1 y al reves y no pillo por que, es aleatorio y no le encuentro explicacion, yo creo que es de soft porque el hard no tiene mayor misterio, las resistencias de pull-up en la entrada, estoy funcionando con un cristal de 4 Mhz con sus correspondientes condensadores de 22 picos y una resistencia limitadora de corriente en la salida para no freir el led, no hay mas. A ver si me apañas algo por ahi, te dejo lo que me pides arriba. Oscilador cristal de cuarzo a 4 Mhz Si se activa de nuevo Ra4 mientras esta temporizada la salida que no haga nada en los casos RA0 y RA1 (1 segundo y 30) simplemente que se termine la temporizacion y ya esta, no hace falta que comience la temporizacion de nuevo.En el caso de RA2 (estable) si se activa RA4 se debera cambiar el estado de la salida sucesivamente. Un saludo y muchas gracias, estamos en contacto |
Prueba este .asm (al final esta el .hex). Hablamos.
Código:
;Tenemos un dipswitch de 3 lineas de 2 posiciones cada una conectados a RA0, RA1 y RA2 y un pulsador Código:
:020000040000FA |
Veo que el copypaste no sale muy bien en los textos que usan tabulaciones. Si necesitas los ficheros originales dimelo.
|
Hola estator, me da error al cargarlos y seguro que es por las tabulaciones de las lineas.Si no te importa mandame los ficheros directamente para poder cargarlos sin problemas a la dire q te dejo en el privi..
Muchas gracias por tu ayuda,un saludo. |
Hola ecraun.
¿Como llevas este tema?. ¿Te sirvió lo que te envié?. Curiosidad solamente...:) Un saludo. |
[QUOTE=Estator;3346779]Hola ecraun.
¿Como llevas este tema?. ¿Te sirvió lo que te envié?. Curiosidad solamente...:) Un saludo.[/QUOTE] Hola Estator, lo tengo parado de momento, he estado liao con temas de trabajo y muy a mi pesar no he podido hacer nada aun, espero poder hacer algo este finde que va a ser un poco mas largo de lo normal. Te agradezco el interes, tengo el circuito montado en la proto y me falta grabar el pic con tu programa y probarlo, en cuanto lo tenga te comento. Un saludo y gracias. |
Necesitas filtrar la entrada del pulsador, siempre se producen rebotes, yo le suelo poner un tiempo de 50 mS antes de segurar la posicion cerrado o abierto. Hace tiempo que no programo pero si lo necesitas intentaré buscarte alguna rutina que funcione bien.
Saludos desde la Costa del Sol |
necesito alguna idea para frenar un motor continuo que hace girar dos ruedas... es un motor de baja tension y no se cual puede ser la mejor manera de frenarlo... todavia soy principiante en electronica..si se les ocurre algo se los agradeceria! saludos!
|
La franja horaria es GMT +2. Ahora son las 18:10. |
Powered por vBulletin™ Version 3.8.10
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.
Traducido por vBsoporte - vBulletin en español
ZackYFileS - Foros de Debate