Como encender un led con un PIC.

Hola a todos, bueno es esa la pregunta ¿Como encender un led con un pic?

En la universidad estamos iniciando a ver los micro controladores y como primer tarea debemos encender un LED con uno de estos, y me decidi por usar un pic para esta tarea, pero bien no se cual de todos usar eh leido que el 16F627 es facil de usar porque solo tiene 18 pines, ahora lo que me da duda es como hacer el programa, lo quiero hacer en assembler para asi saber como trabaja internamente el PIC y me gustaria saber bien el circuito que deberia tener el PIC o la forma de conectarlo para encender el LED. Mas adelante, la siguiente tarea sera encenderlo mediante bluetooth pero eso aun no es lo que necesito.

Asi que acepto cualquier sugerencia como: que pic usar, en donde programarlo, como conectarlo, que I/O usar etc.

Gracias por la ayuda desde ya.
 
Hola Amigo, puedes utilizar cualquier PIC para ese cometido. En cuanto a como conectar el Led dependera del micro a utilizar, pues si bien este permite drenar a su salida la corriente suficiente como para encender el Led, pues solo le añades una Resis limitadora.
las I/O son configurables tanto como INPUT o OUTPUT, algunas vienen predefinidas como, para poder tambien usarlas como entradas analog, o bien como salidas pero en colector/drenador abierto, etc.
Debes leer la hoja de datos del PIC a utilizar.
Respecto al lenguaje de programacion puedes usar cualquiera, siempre y cuando tenga soporte sobre el micro a utilizar.
 
Última edición:
Hola:

Si es con ASM puedes ver un ejemplo con simulador mediantes retardos.

Ver aquí.

Antes que nada te descarga este archivo del Proteus para simularlo.
Fig0102_%20EntrenadorBasico.gif

Archivo
Contraseña = D.P.E.

Este no enciende y apaga LEd pero es para manejar puertos digitales.
Código:
;************************************** Ensam_03.asm ************************************
;
; Por el Puerto B se obtiene el dato de las cinco líneas del Puerto A al que está conectado
; un array de interruptores. Por ejemplo, si por el Puerto A se introduce "---11001", por
; el Puerto B aparecerá "xxx11001" (el valor de las tres líneas superiores no importa).
;
; ZONA DE DATOS **********************************************************************

    __CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC    ; Configuración para el
                                                            ; grabador.
    LIST    P=16F84A            ; Procesador.
    INCLUDE <P16F84A.INC>        ; Definición de los operandos utilizados.

; ZONA DE CÓDIGOS ********************************************************************

    ORG     0                    ; El programa comienza en la dirección 0 de memoria de
Inicio                            ; programa.
    bsf        STATUS,RP0            ; Pone a 1 el bit 5 del STATUS. Acceso al Banco 1.
    clrf    TRISB                ; Las líneas del Puerto B se configuran como salidas.
    movlw    b'11111111'
    movwf    TRISA                ; Las líneas del Puerto A se configuran como entradas.
    bcf        STATUS,RP0            ; Pone a 0 el bit 5 de STATUS. Acceso al Banco 0.
Principal
    movf     PORTA,W                ; Lee el Puerto A.
    movwf    PORTB                ; El contenido de W se visualiza por el Puerto B.
    goto     Principal            ; Crea un bucle cerrado.

    END                            ; Fin del programa.

Un saludo.

PD: Haré un pequeño documento de como encender un Led con un pulsador y un microinterruptor con el PIC16F84A y 16F88.
 
Última edición:
Muchas gracias a todos, en especial a ti META voy a probar el ejemplo que me dejaste y en base a el podre encender mi led mediante un pulsador o algo asi.

Les cuanto cuando ya avance mejor y me eh decidido por el 16F88

Muchas gracias a todos.
 
Hola:

Por si acaso dejo un tutorial sobre MPLAB si lo usas y el sustituto del PIC16F84A.

Ver manual.

Espero ver tus avances, por lo tanto, mira este vídeo.

 
Última edición:
Muchas gracias Meta, ese tutorial me a servido mucho para comprender mas sobre los PICs, en seguida me descargare el Proteus y me concentrare en hacer todas esas pruebas.

Tengo una duda, veo que los PICs usan un oscilador o cristal externo que sirve para manejar la frecuancia a la que trabajaran, la duda es: algun pic ya tiene un oscilador interno es decir, que lo pueda utilizar mediante programacion y asi no tener que conectar uno a sus pines, y de ser asi como lo utilizo.

Muchas gracias.
 
Hola:

La mayoría de los PIC nuevos, ya incorporan oscilador interno. El externo es aconsejable usarlo si usas temporizadores, transferencia de datos, ya que tienen más precisión que los internos, a parte de ello, funcionan a más frecuencia.

Saludo.
 
Bien luego de comprar el Programador de pics, el pic necesario y los demas componentes al fin termine mi circuito, utilice el MPLAB v8.84 porque al MPLAB X no le entendi mucho asi que con el 8.84 logre hacer todo, luego de terminar mi programacion queme mi pic y lo coloque en mi circuito pero para sorpresa no funciona. aca les dejo el circuito que use y el codigo que hice.

Código:
;------------Encabezado-------------

	LIST p=16f84
	radix hex

;-----------Mapa de Memoria---------

estatus equ 0x03 ; asigna el nombre estatus a la posicion 0x03
TRISB equ 0x06   ; asigna el la etiqueta TRISB a la posicion 0x06
puertoB equ 0x06 ; asigna la etiqueta puertoB a 0x06

reg1 equ 0x0C    ; utilizados para hacer el retardo.
reg2 equ 0x0D
reg3 equ 0X0E

;---------Configuracion de Puertos------

reset org 0x00   ; Origen del programa.

	goto inicio ; Salta a "inicio"
inicio bsf estatus,5 ; pone rp0 a 1 y pasamos al banco 1
	movlw b'00000000' ;carga W con 0´s
	movwf TRISB       ;carga TRISB con W
	bcf estatus,5      ; pone 0 a estado y regresamos al banco 0	

;--------Programa-------------------

ciclo bsf puertoB,0   ; pone un 1 en RB0
	call retardo  ; llama al temporizador

	bcf puertoB,0 ; pone un 0 en RB0
	call retardo  ; llamada al temporizador
	goto ciclo    ; se repite el ciclo

;-------Temporizador----------------

retardo movlw 10 ; Aqui se cargan los registros con sus valores.
	movwf reg1

tres	movlw 20
	movwf reg2

dos	movlw 30
	movwf reg3

uno 	decfsz reg3,1 ; decremnto en 1
    	goto uno      ; hasta que reg3 llegue a 0

	decfsz reg2,1 ;decremento en 1
	goto dos      ; hasta reg2 llegue a 0

	decfsz reg1,1 ;decremento en 1
	goto tres     ; hasta que reg1 llegue a 0
	retlw 00      ; regresa a donde se le llamo

;----------------------
 	end
;----------------------

Lo simule en el MPLAB y si corre bien sin ningun error, tambien pase el codigo a mi pic y todo bien asi que no creo que sea el codigo.

Tambien adjunto el circuito, lo hice igual en un protoboard y nada, cambie los leds para ver si estaban malos y nada.

Lo unico diferente que hice fue que los cap en vez de ser de 22pf use de 10pf. Alguien tiene alguna idea de que pude ser?

Gracias.
 

Adjuntos

  • pic.gif
    pic.gif
    3 KB · Visitas: 25
Un cordial saludo.
Necesito ayuda para implementar un circuito de encender y apagar un LED con el PIC16F628A.
Pruebo un programa en proteus y funciona correctamente pero conecto el circuito en la protoboard y no funciona.
No sé que hago mal en la protoboard.
* Alimento el pin 14 con 5 voltios
* Ground o tierra al pin 5
* Y conecto en el pin 6 el LED

Anexo el código que utilizo:
Código:
#include <16f628a.h>
#fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT,NOMCLR
#use delay(clock=4000000)
#byte TRISB=0x86
#byte PORTB=0x06

void main(void){
TRISB=0x00;
PORTB=0x00;
do{
output_high(PIN_B0);
delay_ms(2000);
output_low(PIN_B0);
delay_ms(2000);
}while(TRUE); 
}
 
No mencionas si le pusiste resistencia al LED, y si no fue así, es probable que tu PIC pueda estar quemado.

Tampoco mencionas si pusiste resistencia pull-up en el pin 4 (MCLR)

O sea, en los fuses pones: MCLR y NOMCLR ¿Por cuál te decides?
En teoría debería dejar el NOMCLR, pero nunca he probado confundir al PIC.
 
Cordial saludo.

Estoy realizando un proyecto que se trata de encender y apagar un LED conectado a un
PIC16F628A, enviando un dato por el puerto serial desde el hyperterminal.
Este circuito funciona correctamente en proteus pero no sé que error estoy cometiendo a la hora de montarlo en la protoboard.

Les agradezco de antemano la ayuda que me puedan prestar.

ESPECIFICACIONES:
* Desde el hyperterminal de windows envío el dato.

* Utilizo un "Conversor Usb A Serial TTL" Los pines que utilizo de este son:
- El pin Rx está conectado al pin Tx del PIC (Pin_B2)
- El pin Tx está conectado al pin Rx del PIC (Pin_B1)
- El Gnd está conectado a tierra.

* En el PIC utilizo:
- Pin 14 para alimentarlo con 5 voltios.
- Pin 5 Gnd
- B1 es Rx
- B2 es Tx
- B0 está conectado un LED.

Código:
#include <16f628a.h>
#use delay (clock = 4M)
#use RS232 (baud = 9600, bits = 8, parity = N, xmit = pin_b2, rcv = pin_b1)//rcv-rx-recibir, xmit-tx-transmitir

char dato;

void main()
{

puts ("hola\r");
delay_ms(1000);
puts ("presiona la letra a para encender y b para apagar el led \r");

while(true)
inicio: 
{ 
dato = getc();

if(dato == 'a') // Compara
output_high(PIN_B0); 

if(dato == 'b') // Compara
output_low(PIN_B0);

goto inicio;
}
}

- No me muestra los mensajes de "hola" y "presiona la letra a para encender y b para apagar el led"
- Tampoco se enciende el LED al presionar la tecla "a"
- Les recuerdo que la simulación en proteus se realiza correctamente.
 
Última edición por un moderador:
No estás incluyendo la palabra de configuración (fuses) y si no los incluyes el PIC quedará configurado para usar un oscilador externo (RC)
Quita la etiqueta inicio y el goto, pues ya estás creando un bucle infinito con while (true)

Prueba de esta forma con las correcciones que te menciono:
Código:
#include <16f628a.h>
#fuses   NOMCLR   // Para desactivar el pin de reset.
#use     delay (internal = 4MHz)   // Usar el oscilador interno
#use     RS232 (UART1)  // Configuración por defecto para el módulo USART: (9600, 8, N, 1)


void main()
{
char dato;

   puts ("hola\r");
   delay_ms(1000);
   puts ("presiona la letra a para encender y b para apagar el led \r");

   while(true)
   { 
      dato = getc();

      if(dato == 'a') // Compara
         output_high(PIN_B0); 

      if(dato == 'b') // Compara
         output_low(PIN_B0);
   }
}
Al usar: #use delay(internal = 4MHz) el compilador configura los fuses para utilizar el oscilador interno.
Y al declarar #use RS232 (UART1) sin más parámetros, se asume utilizar el módulo USART a 9600 Bps, 8 Bits, N = Sin control de flujo y 1 Bit de parada. (9600, 8, N, 1)
Esa es la configuración por defecto si no se especifican otros parámetros.
Y obviamente se utilizarán los pines Rx y Tx por defecto del módulo USART (RB1 = Rx y RB2 = Tx)

Al usar el módulo USART en vez de hacerlo por software como lo estás realizando, te conviene más utilizar la interrupción por recepción (#INT_RDA)
 
Atrás
Arriba