oferta

sábado, 18 de junio de 2011

PIC con LCD 4bit

Para tener mas  pines libres de salida de un pic es preferible usar la interfaz al LCD con 4 bits, en este ejemplo usamos el puerto B con los 4 bits mas altos(RB4-RB7) conectados a los pines mas altos (D4-D7)del  LCD, de igual forma pongo todo el programa completo sin uso librerias.
;*******************************************

; 4 BIT LCD CON PIC16F84A
; RB7-RB4 = DB7-DB4 ; E=RB3 ; RW= RB2 ; RS=RB1
;*******************************************
list p=PIC16F84A
include "p16f84a.inc"
BIT_E          EQU 3
BIT_RW      EQU 2
BIT_RS       EQU 1
TEMP          EQU 0x020
reg1             EQU 0x021
reg2             EQU 0x022

org 0h
goto START

INITPIC                                  ;Configuracion de puertos
            bsf STATUS,RP0        ; vamos bank 1
           movlw b'00000000'
           movwf TRISB              ;puerto b salida
           bcf STATUS,RP0        ; vamos bank 0
          clrf PORTB
          return

INITLCD                                 ;inicializar LCD
              MOVLW 0xFE
              CALL retardo1
              MOVLW B'00111000'
              MOVWF PORTB
              BCF PORTB,BIT_E
              MOVLW 0x0A               ;retardo 5ms
              CALL retardo1
              MOVLW B'00111000'
              MOVWF PORTB
              BCF PORTB,BIT_E
              MOVLW 0x02
              CALL retardo1
              MOVLW B'00111000'
              MOVWF PORTB
              BCF PORTB,BIT_E
             CALL LCDBUSY
              MOVLW B'00101000'
              MOVWF PORTB
              BCF PORTB,BIT_E
             CALL LCDBUSY
             MOVLW B'00101000'
              MOVWF PORTB
              BCF PORTB,BIT_E
              MOVLW B'10001000'
              MOVWF PORTB
              BCF PORTB,BIT_E
              CALL LCDBUSY
              MOVLW B'00001000'
              MOVWF PORTB
              BCF PORTB,BIT_E
              MOVLW B'11111000'
              MOVWF PORTB
             BCF PORTB,BIT_E
              CALL LCDBUSY
              MOVLW B'00001000'
              MOVWF PORTB
              BCF PORTB,BIT_E
              MOVLW B'00011000'
              MOVWF PORTB
             BCF PORTB,BIT_E
             CALL LCDBUSY
             MOVLW B'00001000'
             MOVWF PORTB
             BCF PORTB,BIT_E
             MOVLW B'01101000'
             MOVWF PORTB
             BCF PORTB,BIT_E
             RETURN
LCDBUSY
             BSF STATUS,RP0
             MOVLW B'11110000'
             MOVWF TRISB
             BCF STATUS,RP0
             BSF PORTB,BIT_RW
             BCF PORTB,BIT_RS
             BSF PORTB,BIT_E
             MOVF PORTB,W
            BCF PORTB,BIT_E
            BSF PORTB,BIT_RW
            BCF PORTB,BIT_RS
            BSF PORTB,BIT_E
            NOP
            BCF PORTB,BIT_E
            ANDLW 0x80
            BTFSS STATUS,Z
           GOTO LCDBUSY
            BCF PORTB,BIT_RW
            BSF STATUS,RP0
            MOVLW 0x000
            MOVWF TRISB
            BCF STATUS,RP0
             RETURN

LINE2       
          MOVLW B'11001000'
          MOVWF PORTB
          BCF PORTB,BIT_E
          MOVLW B'00001000'
          MOVWF PORTB
          BCF PORTB,BIT_E
          RETURN

LCDWRITE
           MOVWF TEMP
           CALL LCDBUSY
           MOVF TEMP,W
            ANDLW B'11110000'
            IORLW B'00001010'
            MOVWF PORTB
            BCF PORTB,BIT_E
            SWAPF TEMP,W
           ANDLW B'11110000'
            IORLW B'00001010'
            MOVWF PORTB
           BCF PORTB,BIT_E
           RETURN
DEMORA                    ;retardo 500uS con xt 4MHz

            MOVLW D'165'
            MOVWF reg1
DEMORA1
            DECFSZ reg1, F
            GOTO DEMORA1
            RETURN
retardo1
            MOVLW D'255'
            MOVWF reg2
DEMORA2
            CALL DEMORA
            DECFSZ reg2, F
            GOTO DEMORA2
            RETURN

START
CALL INITPIC               ;inicializar PIC
CALL INITLCD              ;inicializar LCD
inicio
               call retardo1
               MOVLW D'80'              ;P
               CALL LCDWRITE
               MOVLW D'82'              ;R
               CALL LCDWRITE
               MOVLW D'79'              ;O
               CALL LCDWRITE
               MOVLW D'89'              ;Y
               CALL LCDWRITE
               MOVLW D'69'              ;E
              CALL LCDWRITE
              MOVLW D'67'               ;C
              CALL LCDWRITE
              MOVLW D'84'               ;T
              CALL LCDWRITE
              MOVLW D'79'               ;O
              CALL LCDWRITE
              MOVLW D'83'              ;S
             CALL LCDWRITE
              MOVLW D'32'              ;espacio en blanco
              CALL LCDWRITE
               MOVLW D'50'             ;2
               CALL LCDWRITE
               MOVLW D'48'             ;0
               CALL LCDWRITE
               MOVLW D'49'             ;1
               CALL LCDWRITE
              MOVLW D'49'              ;1
              CALL LCDWRITE
              MOVLW D'32'              ;espacio en blanco
              CALL LCDWRITE
              SLEEP
               END

El archivo HeX. probado y comprobado lo pueden bajar de este enlace:
http://www.4shared.com/file/SBnq3pu0/lcd4bit.html


miércoles, 1 de junio de 2011

LCD con pic16f84a

Haremos el programa para controlar  un LCD con un pic16f84a con 8 lineas de datos, pondremos el programa completo para no confundir al lector  con las librerias que tendria que convertirlas en archivo de tipo .INC


list p=16f84                                       ;Procesador PIC16f84
#include "pic16f84"

DATO_A equ 0xc                               ;Registro del dato A
DATO_B equ 0xd                               ;Registro del dato B
RESUL equ 0xe                                   ;Registro de resultados
TEMPO1 equ 0xf                                 ;Registro temporal 1
TEMPO2 equ 0x10                              ;Registro temporal 2
OFFSET equ 0x11                               ;Variable de desplazamientos de mensajes
Digito EQU 1Fh                                   ;Cursor para leer la tabla de datos.

ORG 00h                                             ;Direccion del Vector de RESET
GOTO INICIO                                   ;Comienza el programa
ORG 05h                                             ;detras del Vector Interrupcion

;-------CONFIGURACION LCD-----------
LCD_E          BSF PORTA,2          ;Activa señal E
                     NOP                          ;Espera 1uS
                     BCF PORTA,2          ;Desactiva señal E
                     RETURN
LCD_BUSY  BSF PORTA,1          ;Pone el LCD en modo lectura
                      BSF STATUS,5        ;Selecciona el Banco 1
                      MOVLW 0xFF
                      MOVWF TRISB       ;Puerta B actua de entrada
                      BCF STATUS,5        ;Selecciona el Banco 0
                      BSF PORTA,2          ;Activa el LCD (Señal E)
                      NOP
L_BUSY       BTFSC PORTB,7     ;Chequea el bit BUSY
                     GOTO L_BUSY       ;Est a "1" (Ocupado)
                     BCF PORTA,2         ;Desactiva el LCD (Se¤al E)
                     BSF STATUS,5        ;Selecciona el Banco 1
                     CLRF TRISB            ;Puerta B actua como salida
                     BCF STATUS,5        ;Selecciona el Banco 0
                     BCF PORTA,1          ;Pone el LCD en modo escritura
                     RETURN

LCD_REG  BCF PORTA,0          ;Desactiva RS (Modo instruccion)
                   MOVWF PORTB      ;Saca el codigo de instruccion
                   CALL LCD_BUSY    ;Espera a que se libere el LCD
                   GOTO LCD_E           ;Genera pulso en señal E
LCD_DATOS BCF PORTA,0     ;Desactiva RS (Modo instrucci¢n)
                   MOVWF PORTB      ;Valor ASCII a sacar por RB
                   CALL LCD_BUSY    ;Espera a que se libere el LCD
                   BSF PORTA,0            ;Activa RS (Modo dato)
                   GOTO LCD_E           ;Genera pulso en señal E
LCD_INI   MOVLW b'00111000'
                  CALL LCD_REG       ;Codigo de instruccion
                  CALL DELAY_5MS  ;Temporiza 5 mS.
                  MOVLW b'00111000'
                  CALL LCD_REG        ;Codigo de instruccion
                  CALL DELAY_5MS   ;Temporiza 5 mS.
                  MOVLW b'00111000'
                  CALL LCD_REG        ;Codigo de instruccion
                  CALL DELAY_5MS   ;Temporiza 5 mS.
                  RETURN
LCD_PORT   BSF STATUS,5              ;Selecciona el banco 1 de datos
                      CLRF TRISB                   ;RB se programa como salida
                       MOVLW b'00011000'   ;RA4, RA3 son entradas
                       MOVWF TRISA            ;el resto como salidas
                       BCF STATUS,5             ;Selecciona el banco 0 de datos
                       BCF PORTA,0               ;Desactiva RS del modulo LCD
                       BCF PORTA,2               ;Desactiva E del modulo LCD
DELAY_5MS  movlw 0x1a                   ;retardo de 5ms
                        movwf DATO_B
                        clrf DATO_A
                        DELAY_1 decfsz DATO_A,1
                        goto DELAY_1
                        decfsz DATO_B,1
                        goto DELAY_1
                        return

;----PROGRAMA PRINCIPAL------

INICIO CLRF Digito                        ;Pone a 0 la variable digito
             CALL LCD_PORT              Puertos en modo LCD
             BCF PORTA,0                    ;Desactiva RS del modulo LCD
             BCF PORTA,2                    ;Desactiva E del modulo LCD
START CALL LCD_INI                  ;Inicia LCD (CFG puertos...)
START_1 MOVLW b'00000001'    ;Borrar LCD y Home
             CALL LCD_REG
             MOVLW b'00000110' ;
             CALL LCD_REG
             MOVLW b'00001100'         ;LCD On, cursor Off,Parpadeo Off
             CALL LCD_REG
             MOVLW 0x80                     ;Direccion caracter
             CALL LCD_REG
REPETIR MOVF Digito,w                ;W=Digito
             CALL DATO_1                  ;Coge el caracter
             IORLW 0                            ;Compara
             BTFSC STATUS,2              ;Es el ultimo?
             GOTO acabar                      ;Si
             CALL LCD_DATOS          ;Visualiza caracter
             INCF Digito,f                      ;Incrementa numero de Digito
            GOTO REPETIR                 ;Vuelve a escribir
            acabar nop
            goto acabar                           ;Buclee infinito

DATO_1 ADDWF PCL,1
RETLW 'p'
RETLW 'r'
RETLW 'o'
RETLW 'y'
RETLW 'e'
RETLW 'c'
RETLW 't'
RETLW 'o'
RETLW 's'
RETLW ' '
RETLW '2'
RETLW '0'
RETLW '1'
RETLW '1'
RETLW 0x00
END
Aqui esta el archivo HEX. probado , lo bajan del siguiente link:
http://www.4shared.com/file/37iqavfh/lcd.html


 

sábado, 7 de mayo de 2011

CONTADOR CON PULSADOR

Bien esta vez haremos un contador de 0 a 9 mediante un pulsador en Ra0 que cada vez que es pulsado incrementara la cuenta en el contador en forma binaria y mostrado  por el puerto B, usando un decodificador 7447 convertiremos este conteo de binario a decimal, si la cuenta llega a 9 se reiniciara el conteo.
Esto mismo se puede hacer sin usar el 7447 usando las famosas tablas del pic, pero queria hacerlo de esta forma para entender el algoritmo de programacion, en una proxima publicacion haremos el contador sin 7447.




;EL PROGRAMA

list p=16f84

status    equ 0x03
trisb      equ 0x86
portb    equ 0x06
trisa      equ 0x85
porta    equ 0x05
reg1     equ 0x0C ; Estos 3 registros los utilizaré
reg2     equ 0x0D ; para hacer el retardo
reg3     equ 0x0E

org 0x00                                 ;inicio del programa
bsf status,5                              ;vamos al banco1
clrf trisb                                   ;portb es salida
movlw b'00000001'                ;Ra0 es entrada
movwf trisa
bcf status,5                             ;regresamos al banco0
inicio clrf portb
        repite btfss porta,0          ;presiono pulsador Rao?
       goto $-1                         ;si no regresa atras
       call rebote                       ;llama antirebote
       incf portb,1                     ;incrementa el conteo mas 1
;comparacion del conteo=9
   MOVF portb,0
   XORLW B'1010'               ;pregunta si conteo=9
   BTFSC status,2                 ;aqui ve la respuesta
   goto inicio                          ;si es asi vuelve a inicio
   btfsc porta,0                      ;solto el pulsador?
   goto $-1                            ;si no regresa atras
   goto repite

rebote  movlw 10              ; Aquí se cargan los registros
            movwf reg1           ; reg1, reg2 y reg3
            tres movlw 10        ; respectivamente
            movwf reg2
  dos    movlw 10
           movwf reg3
  uno   decfsz reg3,1            ; Aquí se comienza a decrementar
          goto uno                    ; Cuando reg3 llegue a 0
          decfsz reg2,1             ; le quitare 1 a reg2
          goto dos                    ; cuando reg2 llegue a 0
          reg1,1                       ; le quitare 1 a reg1
          goto tres                    ; cuando reg1 llegue a 0
          return                         ; regresare al lugar
          end
Aqui tienen el archivo HEX. comprobado y lo pueden bajar del siguiente link:
http://www.4shared.com/file/nCXiviU8/contador.html

sábado, 26 de marzo de 2011

BRAZO ROBOTICO A CONTROL REMOTO

Usando un control remoto para Television marca SONY y aprovechando un software hecho de control remoto sony para pic16f84a , haremos el control de un brazo robotico de 6 o mas grados de libertad.
Primero la construccion del brazo robotico, esto mas que todo es ingenio de uno , puede hacerse usando material reciclado de computadoras, impresoras, poleas , engranajes, servomotores, etc.

Sugiero la construccion de este brazo, debemos tener en cuenta que la armazon no pese tanto para no forzar a los servomotores que iran en cada articulacion, por ejemplo la mica puede ser un buen material liviano y resistente, los servomotores si no los consiguen en reciclaje se los pueden comprar de la marca FUTABA y seran 6:

Este segundo brazo para su construccion se necesita un poco mas de ingenio pero al final dara mas satifaccion al que lo construya o copien en algo la idea de su hechura
servomotor1: para cerrar y abrir la pinza
servomotor2: para rotacion de la muñeca
servomotor3: para rotacion del codo
servomotor4: para rotacion de el antebrazo
servomotor5 : para rotacion de el hombro
servomotor6 : para rotacion de la base
Aqui hay un detalle de la pinza hecho con engranajes reciclados de impresoras y un servo que los acciona, repito esto de hacer la construccion del brazo es ingenio de cada uno mas que todo


EL PROGRAMA PARA CONTROL REMOTO Y SU CIRCUITO
En el circuito mostrado tenemos 12 salidas del pic16f84 desde Rb0 hasta Rb7 y Ra0 hasta Ra3, estas salidas corresponden a un numero o canal del control remoto SONY de un televisor, tomamos un par de salidas por ejemplo Rb0 y Rb1 para el  servomotor1 , Rb2y Rb3 para el servomotor2 y asi sucesivamente, con el control remoto con cada numero o canal podemos activar cada salida del pic16f84a, esto es con el mismo numero o canal del control remoto apagamos o activamos su salida correspondiente.

Esto lo aprovechamos para controlar un servo, logicamente que antes de conectarlo al servo lo tenemos que conectar a un puente H a base transistores o  a base relays. Como son 12 salidas tomamos 2 salidas para cada servomotor.
El fotoreceptor de 3 terminales es un demodulador y amplificador es el TS0P21, TS0P23 lo pueden comprar  o utilizar uno usado de los que tienen los televisores a colores.

Bien como dije este programa no es mio , sus creditos a quien lo hizo, lo probe y funciona perfectamente lo pueden bajar  el HEX y fuente en ASM del siguiente link:

http://www.4shared.com/file/Ta1tCvfp/Sony.html
http://www.4shared.com/file/qF6QYgRK/Sony.html

jueves, 27 de enero de 2011

ELEVADOR DE 3 NIVELES

Esta aplicacion mas seria un elevador de 3 pisos que empieza en un sotano y subira de piso en piso en forma ascendente del 1 al 2 y del 2 al 3 y en la misma forma en descender(3-2-1), los botones de llamada son: Rb0=piso1
Rb1=piso2
Rb2=piso3
y los stop finales de carrera  ubicados en su piso correspondiente:
Rb5=piso1
Rb6=piso2
Rb7=piso3
todos los botones pulsadores de llamada y finales de carrera (o sensor magnetico) normalmente conectados a tierra, el motor usado es de corriente continua y  se usa el  Ra2 y Ra1 como salidas para el motor DC, sin mas que decir vamos al programa principal.

;ELEVADOR DE 3 NIVELES

INCLUDE "P16F84A.INC"
ORG 0X00
BSF STATUS,5
CLRF PORTA                ;puerto A es de salida
MOVLW B'11111111'
MOVWF TRISB            ;puerto B es  entrada de sensores
BCF STATUS,5
CLRF PORTB

;programa principal

INICIO
SUBEPISO1  BTFSS PORTB,0
                      GOTO SUBEPISO1
                      CALL SUBE
STOP1           BTFSS PORTB,5
                      GOTO STOP1
                      CALL STOP
SUBEPISO2  BTFSS PORTB,1
                      GOTO SUBEPISO2
                      CALL SUBE
STOP2          BTFSS PORTB,6
                      GOTO STOP2
                      CALL STOP
SUBEPISO3  BTFSS PORTB,2
                      GOTO SUBEPISO3
                     CALL SUBE
STOP3         BTFSS PORTB,7
                    GOTO STOP3
                    CALL STOP

BAJAPISO2   BTFSS PORTB,1
                      GOTO BAJAPISO2
                      CALL BAJA
PARADA2    BTFSS PORTB,6
                     GOTO PARADA2
                     CALL STOP
BAJAPISO1  BTFSS PORTB,0
                      GOTO BAJAPISO1
                      CALL BAJA
PARADA1    BTFSS PORTB,5
                     GOTO PARADA1
                     CALL STOP
                     GOTO INICIO

;Subrutinas de stop, bajada y subida de motor

STOP            MOVLW B'00000000'
                      MOVWF PORTA
                      RETURN
SUBE            MOVLW B'00000010'
                      MOVWF PORTA
                      RETURN
BAJA             MOVLW B'00000100'
                       MOVWF PORTA
                       RETURN
                       END

A pedido de muchos lectores aqui les dejo el link para descargar el archivo HEX, probado y comprobado
http://www.4shared.com/file/yZXHAim-/elevador3.html
Aqui una maqueta sugerida de un elevador de 3 niveles, con pulsadores de llamada tanto de la cabina como del panel frontal para poder llamarlo desde las 2 posiciones, para esto solo colocamos en paralelo otro pulsador en paralelo para cada piso desde Rb0 a Rb2.


ETAPA DE POTENCIA PARA MOTOR dC
Para el motor DC hacemos un puente H con  transistores 2n3904 para motores pequeños  y los cambian por tip41 si usan  motores DC mas grandes. Conectar la salida  Ra1 y Ra2 del PIC a la entrada del puente H (izquierda y derecha), los diodos d1-d4 son de proteccion contra chispazos que produce el motor DC.
Si es posible prueben el puente H solo para ver si sus entradas son excitadas con 0 y 5 voltios, generalmente los TIP41 necesitan mas corriente que la que genera un pic, lo mejor es usar darlingtongs y solucionamos el problema.


Para un ascensor de 4 pisos (que sube y baja a cualquier piso) el programa  en asembler seria muy extenso y engorroso, por eso hice el programa en  PICBASICPRO y lo pueden ver en mi pagina
http://www.proyectoselectronicoos.blogspot.com/  ascensor de 4 pisos con picbasic.

sábado, 15 de enero de 2011

CONTROL PUERTA DE GARAGE CON PAP

El control se hara con un motor PAP  unipolar por ser de la velocidad adecuada para abrir y cerrar el porton , al cual le colocaremos finales de carrera para detener la abrida o cerrada de la puerta.

El programa sera para el circuito siguiente donde en vez de relays  empleamos el ULN2803 como driver para el PAP conectando  Rb1, Rb2, Rb3 y Rb4  a las entradas del uln2803, y las salidas del uln2803 al motor pap unipolar. Rb5 colocar un led que indicara solo la subida (se enciende) y la bajada (apagado)






INCLUDE "P16F84A.INC"

REG1 EQU 0X0C                          ; Registro para hacer  un retardo
REG2 EQU 0X0D                         ; Registro para hacer  un retardo

; ***Configuracion de puertos******
ORG    0X00
BSF STATUS,5
CLRF PORTB                              ; Puerto B es de salida
MOVLW B'11111111'          
MOVWF TRISA                         ; Puerto A es de entrada de sensores
BCF STATUS,5

; *****Programa principal**********

INICIO         BTFSS PORTA,3               ;espero llamada RA3 para abrir la puerta
                     GOTO INICIO
ABRIENDO  CALL ABRIR                       ; subrutina abrir
                     BTFSS PORTA,1                ;chequea swicht de stop de abrir
                     GOTO ABRIENDO 
                     CALL STOP
ESPERA1    BTFSS PORTA,0              ; espero llamada RA2 para cerrar puerta
                     GOTO ESPERA1
CERRANDO  CALL CERRAR              ;subrutina de cerrar
                     BTFSS PORTA,2              ;chequea swicht de stop de cerrar
                    GOTO CERRANDO
                    CALL STOP
                    GOTO INICIO

; ******Parada del motor PAP********

STOP    MOVLW B'00000000'
              MOVWF PORTB
              RETURN

; *****Secuencia pasos de subida de motor PAP****


ABRIR    MOVLW B'00110000'     
               MOVWF PORTB
               CALL     RETARDO                          
                MOVLW B'00101000'
                MOVWF PORTB
                CALL RETARDO
               MOVLW B'00100100'
               MOVWF PORTB
               CALL RETARDO
               MOVLW B'001000010'
               MOVWF PORTB
               CALL RETARDO
               RETURN

; *****Secuencia pasos de subida de motor PAP****

CERRAR  MOVLW B'00000010' 
                 MOVWF PORTB
                 CALL RETARDO 

                 MOVLW B'00000100'
                 MOVWF PORTB
                 CALL RETARDO
                 MOVLW B'00001000'
                 MOVWF PORTB
                 CALL RETARDO
                 MOVLW B'00010000'
                 MOVWF PORTB
                 CALL RETARDO
                 RETURN

; *****Secuencia de retardo*********
RETARDO  MOVLW 60                 
                     MOVWF REG1               
         DOS   MOVLW 60
                    MOVWF REG2
          UNO  DECFSZ REG2,1
                     GOTO UNO
                     DECFSZ REG1,1
                    GOTO DOS
                     RETURN
                     END                              ; fin


Aqui tienen el archivo HEX. del proyecto probado, lo  pueden bajare del siguiente link:
http://www.4shared.com/file/dBXkgKG4/puertagaraje.html