Problema con entradas digitales PIC16F88

Hola, estoy haciendo un circuito muy simple para practicar con pic y no consigo que funcione.
El circuito tiene que encender y mantener encendio un led hasta que se pulse un pulsador y volver a encender el led cuando se vuelva a pulsar. El programa lo he simulado en proteus y funciona sin problemas pero al probar el circuito fisicamente el led o no se enciende o no se apaga o parpadea muy rapido y no responde al pulsador, aqui os dejo el programa en asm (aunque los comentarios estan en catalan):


Código:
;-------------------------------------------------------------------
;Controlar un led amb un pulsador
;-------------------------------------------------------------------

	list	p=16F88
	include	"P16F88.INC"


	__CONFIG _CONFIG1, _CP_OFF & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC
	__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF

;----------------------------------------------------------------------------------
;                 -----------------Configuració---------------------
;----------------------------------------------------------------------------------

;Declaració dels registres
status	equ	0x0003

porta	equ	0x0005
portb	equ	0x0006
trisa	equ	0x0085
trisb	equ	0x0086

ansel	equ	0x009B


comptador	equ	0x0020



;Inici del codi del programa

reset	org	0x0000
	goto	inici

;-----------------------------------------------------------------------------
;                ------------------Subrutines---------------------
;-----------------------------------------------------------------------------
banc1	;Per canviar al banc1
	bcf	status,6
	bsf	status,5
	return

banc0	;Per canviar al banc0
	bcf	status,6
	bcf	status,5
	return

;-----------------------------------------------------------------------------
;              ------------------Fi Subrutines---------------------
;-----------------------------------------------------------------------------


inici
	call	banc1		;Canvi al banc 1
	movlw	b'00001000'	
	movwf	portb		;RB3 entrada
	clrf	ansel		;Entrades/Sortides Digitals
	clrf	trisa		;Tot sortides

	call 	banc0		;Tornem al banc 0
	clrf	porta		;Es neteja el porta
	clrf	portb		;i el portb

	clrf	comptador	;Es neteja el comptador (el led comença apagat)

polsador
	btfsc	portb,3
	call	led		;Es mira l'estat del led (si esta engegat o apagat)
	goto	polsador	;Si no, es torna a comprovar el polsador

led
	btfss	comptador,0	;Si el comptador esta a 0 (el led esta apagat)
	goto	on_led		;Es va a on_led (per engegar el led)
	bcf	porta,0		;Si no s'apaga el led
	bcf	comptador,0	;Es posa el comptador a 0
	goto	lliure		;I s'espera a que es deixi el polsador

on_led	
	bsf	porta,0		;S'encen el led
	bsf	comptador,0	;Es posa el comptador a 1
lliure
	btfsc	portb,3
	goto	lliure		;em quedo a esperar
	return			;Si es deixa es torna a fer el test


	end

Adjunto un esquema del circuito, el archivo asm y el archivo de proteus.
En el circuito utilizo un zener para mantener el voltaje a 5,1 V (porque no tenia zener de 5V),
 

Adjuntos

  • pulsador_led.jpg
    pulsador_led.jpg
    60.2 KB · Visitas: 51
  • pulsador_led.zip
    7.8 KB · Visitas: 23
Última edición:
Hola que tal

Si en el simulador hace lo que tu quieres entonces esta bien el programa (no hay que molestarse en revisarlo) sino que el problema debe ser de hardware.

1.-Le falta resistencia de pull up o de pull down a tu pulsador asi no sabe en que estado esta y puede tomar valores indeseables

2.-Es el efecto de rebote de los pulsadores una solucion es uar antes una compuerta por ejemplo una nand o una not que use schmit triger que convierte satisfactoriamente a ttl es decir solo 0 ò 1 y no como el efecto de rebote que hace varios ceros y unos en un tiempo de aprox 20 miliseg u otros dicen que con condensador eso no lo he probado pero io cre que funciona es poniendo un capacitor entre el pin que esta conectado a la resistencia y tierra.

3.-otra solucion es por software tendrias que implementar una rutina que espere como 20 ms despues del cambio de estado del pulsador pero como es un programa simple y alomejor vas comenzando la primera es la solucion.

https://www.forosdeelectronica.com/f24/eliminar-rebotes-interruptores-6316/
 
Última edición:
Hola que tal

Si en el simulador hace lo que tu quieres entonces esta bien el programa (no hay que molestarse en revisarlo) sino que el problema debe ser de hardware.

1.-Le falta resistencia de pull up o de pull down a tu pulsador asi no sabe en que estado esta y puede tomar valores indeseables

2.-Es el efecto de rebote de los pulsadores una solucion es uar antes una compuerta por ejemplo una nand o una not que use schmit triger que convierte satisfactoriamente a ttl es decir solo 0 ò 1 y no como el efecto de rebote que hace varios ceros y unos en un tiempo de aprox 20 miliseg u otros dicen que con condensador eso no lo he probado pero io cre que funciona es poniendo un capacitor entre el pin que esta conectado a la resistencia y tierra.

3.-otra solucion es por software tendrias que implementar una rutina que espere como 20 ms despues del cambio de estado del pulsador pero como es un programa simple y alomejor vas comenzando la primera es la solucion.

https://www.forosdeelectronica.com/f24/eliminar-rebotes-interruptores-6316/

Muchas gracias, he añadido una resistencia pull down y ahora funciona perfectamente.
 
Hola a todos,

Tengo un problemilla con un circuito muy simple que he montado y no le encuentro explicacion. Se trata de las salidas tanto del puerto A como del B de un PIC16F88, cuando estab activas solo me da 3,8V, y eso sin conectarle ninguna carga. No lo entiendo. ¿Pueden tener algo que ver las Pull-ups del puerto B?

Gracias de antemano y un saludo
 
las salidas tanto del puerto A como del B de un PIC16F88, cuando están activas solo me da 3,8V, y eso sin conectarle ninguna carga. No lo entiendo. ¿Pueden tener algo que ver las Pull-ups del puerto B?
No adjuntas código ni esquema, y tampoco dices en que lenguaje programas.
Pero... ¿Ya configuraste el registro ANSEL para hacer al puerto A y al puerto B, Digital I/O?

Saludos.
 
Hola D@rkbytes,

Tienes razón, a continuación el código en c:

Código:
#include "C:\Documents and Settings\mgutierrez\Escritorio\Proyectos PIC\Switch y LEd\main.h"
#include <stdio.h>
#BYTE    PA = 0x05
#BYTE    PB = 0x06
#BIT   luz0 = PA.1
#BIT  pulsador1 = PB.0


void main ()
{

   port_b_pullups(TRUE);
   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   setup_oscillator(OSC_8MHZ|OSC_INTRC);

 
   luz0=1;

   
   While (1)
   {
      if (!pulsador1)
      {
         luz0=1;
      }
      else
      {
         luz0=0;
      }
   }
}

Lo curioso es que en realidad el led se ilumina, y deja de iluminarse al poner el pin B0 a masa mediante un switch. Pero se ilumina poco debido ala baja tensión. No se si así se entiende mejor mi duda.

Saludos
 
Última edición por un moderador:
Lo curioso es que en realidad el led se ilumina, y deja de iluminarse al poner el pin B0 a masa mediante un switch. Pero se ilumina poco debido ala baja tensión. ¿No se si así se entiende mejor mi duda?
Saludos.
Prueba ahora con esta configuración y haz la prueba. ;)
Código:
#include "16f88.h"
#fuses   INTRC_IO,NOMCLR,NOWDT,NOBROWNOUT,NOLVP,NOFCMEN,NOIESO,CCPB3
#BYTE    PA = 0x05
#BYTE    PB = 0x06
#BIT     luz0 = PA.1
#BIT     pulsador1 = PB.0
#use delay(clock = 8M)

void main ()
{
   port_b_pullups(TRUE);
   setup_adc_ports(NO_ANALOGS);
   setup_oscillator(OSC_8MHZ|OSC_INTRC);
   set_tris_a(0xFD);
   set_tris_b(0xFF);
   
   While (true)
   {
      if (!pulsador1)
      {
         luz0=1;
      delay_ms(1000);      // Opcional, para probar oscilador interno
         luz0=0;
      delay_ms(1000);      // "" "" ""
      }
      else
      {
         luz0=0;
      }
   }
}

Suerte.
 
Hola de nuevo,

Gracias por el codigo.

El tema de la baja tension ha quedado solucionado. Pero el circuito hace cosas extrañas. Primero de todo los delays parecen no tenere ningun efecto.
Ademas en ocasiones el led se queda "anclado", quiero decir encendido todo el rato aunque en el Pin B0 haya 0v. Despues quito alimentacion, y al realimentar el circuito todo vuelve a funcionar hasta que se vuelve a quedar anclado. No se, estoy un poco perdido, porque no siempre sucede.

Alguna idea?
 
Hola,

He quitado los delays, y ya no se me queda anclada la salida. ¿Alguien tiene alguna idea de por que sucede esto? Me imagino que es por algo del oscilador interno, pero no se.
Código:
#include "16f88.h"
#fuses   INTRC_IO,NOMCLR,NOWDT,NOBROWNOUT,NOLVP,NOFCMEN,NOIESO,CCPB3
#BYTE    PA = 0x05
#BYTE    PB = 0x06
#BIT     luz0 = PA.1
#BIT     pulsador1 = PB.0
#use delay(clock = 8M)

void main ()
{
   port_b_pullups(TRUE);
   setup_adc_ports(NO_ANALOGS);
   setup_oscillator(OSC_8MHZ|OSC_INTRC);
   set_tris_a(0xFD);
   set_tris_b(0xFF);
   luz0=0;
   
   While (true)
   {
      if (!pulsador1)
      {
         luz0=1;
         
      }
      else
      {
         luz0=0;
      }
   }
}
 
Última edición por un moderador:
Hola,

He quitado los delays, y ya no se me queda anclada la salida. ¿Alguien tiene alguna idea de por que sucede esto? Me imagino que es por algo del oscilador interno, pero no se.
Saludos.
Por mi parte no tengo idea de que te esté sucediendo.
Compile el código que subí, lo simule y arme el circuito físicamente, y no tuve ningún problema.
El programa funciona muy bien con la configuración de oscilador interno a 8MHz.

Sería bueno que revisaras tu fuente de alimentación por posible ruido, y tus conexiones.
Incluso hasta el mismo PIC puede estar fallando.

Adjunto el proyecto por si acaso.

Suerte.
 

Adjuntos

  • 16F88_JPEG_001.jpg
    16F88_JPEG_001.jpg
    15.1 KB · Visitas: 12
  • 16F88_SCH.jpg
    16F88_SCH.jpg
    35.7 KB · Visitas: 12
  • Programa funcionando.rar
    22.4 KB · Visitas: 13
Última edición:
Hola Darkbytes,

Tenias razon, se trataba de la fuente de alimentacion. Estoy utilizando una bateria de 12v y un regulador de tension a 5v, LT8S05CV. Alimentando el pic directamente, no funcionaban bien los delays, funcionaba anarquicamente, vamos que hacia lo que le daba la gana. He puesto un condensador en la entrada de alimentacion de 47uF y ahora funciona perfectamente.

Muchas gracias por tu ayuda.
 
Atrás
Arriba