oferta

sábado, 20 de marzo de 2010

Primer programa: encender un led


PIC16F84A.- Es un circuito integrado programable, el cual esta compuesto basicamente de memorias RAM y EEPROM ,buses de comunicacion, unidad logica aritmetica(ALU) y puertos que sirven como entrada y salida, las flechas indican si los pines son de entrada, salida o bidireccionales(ingresan y salen datos) 


Instrucciones del PIC16F84
ADDWF f,d ........................Suma W con f
ANDWF f,d ........................Lógica AND W con f
CLRF f ...............................Borra f (pone todos los bits a 0)
CLRW ................................Borra W
COMF f,d ...........................Complementa f (Invierte)
DECF f,d ............................Decrementa f
INCF f,d .............................Incrementa f
Iorwf f,d .............................Lógica OR entre W y f
MOWF f .............................Mueve W a f
MOVF f ..............................Mueve f
NOP ....................................No opera (no hace nada )
RLF f,D ...............................Rota f a la izquierda a través del acarreo
RRF f,D ...............................Rota f a la derecha a través del acarreo
SUBWF f,d .........................Resta W a f
SWAPF f,d .........................Intercambia nibbles
XORWF f,d ........................Lógica WOR entre W y f
BCF f,d ...............................Borra el bit b (pone a 0) de f
BSF f,d ...............................Activa (pone a 1) el bit b de f
BTFSC f,d ..........................Explora un bit de f y brinca si vale 0
BTFSS f,d ..........................Explora un bit de f y brinca si vale 1
DECFSZ f,d .......................Decrementa f y si vale 0 brinca
INCFSZ f,d ........................Incrementa f y si vale 1 brinca
ADDLW k ..........................Suma inmediata de K con W
ANDLW k ..........................AND inmediata de K con W
IORLW k ...........................OR inmediata de K con W
MOVLW k .........................Mueve a W el valor inmediato de K
SUBLW k ...........................Resta W del valor inmediato K
XORLW k ..........................XOR exclusiva de W con el valor K
CALL k ...............................Llamadas a subrutina
CLRWDT ...........................Refresca el perro guardián
GOTO k .............................Salto incondicional
RETFIE .............................Retorno de interrupción (GIE=1)
RETLW k ..........................Retorno de subrutina y carga W=k
RETURN ...........................Retorno de subrutina
SLEEP ...............................Pasa al modo reposo

NOTA:
w: registro trabajo auxiliar     f: registro fuente         d: destino

Memoria RAM.- Es mapa de registros, cada registro especial tiene su funcion de momento sólo nos preocupa saber cómo están distribuidos y qué posición (hexadecimal) ocupan, por ejemplo un registro que usaremos bastante es STATUS y si nos fijamos en memoria de datos su direccion hexadecimal es 03h = 0x03, igual PORTA es 05h = 0x05 y asi sucesivamente.


NUESTRO PRIMER PROGRAMA: ENCENDER UN DIODO LED EN EL PUERTO B (PIN 6= RBO)
Haremos el primer programa que considero el mas simple, esto es encender un diodo led del puerto B (pin Nª 6) del PIC. Para esto solo necesitamos saber 5 instrucciones , conocer la distribución memoria RAM(memoria de datos) y por supuesto conocer los pines del PIC16f84a para armar el siguiente circuito.
Ademas la estructura de un programa assembler para un pic se divide en 3 partes: etiquetas, instrucciones y los comentarios que van despues del punto y coma ( ; ) el pic no tomara en cuenta estos comentarios al ejecutar las instrucciones.


LIST P=16F84A                      ;indicamos el PIC que utlizaremos

; DECLARACION REGISTROS A USAR
STATUS EQU 0x03               ; Registros de la memoria RAM
PORTB   EQU 0x06               ; con su direccion hexadecimal
TRISB    EQU 0x86

; CONFIGURAMOS PUERTOS DE ENTRADA O SALIDA
ORG 0x00                              ;Iniciamos el programa en el origen
BSF STATUS,5                     ;vamos al banco1
CLRF TRISB                         ;puerto b es salida(colocamos '00000000')
BCF STATUS,5                     ;regresamos banco0

; PROGRAMA PRINCIPAL
BSF PORTB,0                       ;pone un “1” ( enciende) en rbo =pin6
END                                       ;fin de programa

Comentarios sobre el programa:

STATUS, es un registro de 8 bits , desde B0 hasta B1 cada bit tiene su funcion lo cual veremos mas adelante, por ahora solo nos interesa el bit 5 (RP0) este bit indica la posicion de la memoria RAM (que esta dividida en 2 bancos)
si  RP0=0 nos estamos ubicando en el banco0,
si  RP0=1 nos ubicamos en el banco1.
Asi podemos acceder a los diferentes registros ubicados en cada banco, su direccion hexadecimal es 03h = 0x03










PORTB, registro de 8 bits cuya direccion es 06h (6 en hexadecimal, que tambien se puede escribir 0x06) y corresponde a cada pin del PIC16f84a
o RB0 ==> PORTB,0 (pin 6 del pic)
o RB1 ==> PORTB,1 (pin 7 del pic)
o RB2 ==> PORTB,2 (pin 8 del pic)
o RB3 ==> PORTB,3 (pin 9 del pic)
o RB4 ==> PORTB,4 (pin 10 del pic)
o RB5 ==> PORTB,5 (pin 11 del pic)
o RB6 ==> PORTB,6 (pin 12 del pic)
o RB7 ==> PORTB,7 (pin 13 del pic)

TRISB, es otro registro de 8 bits, su funcion es decir si los bits del puerto B van a trabajar como entrada(lectura) o de salida (escritura). Si colocamos ceros (b'00000000') en este registro quiere decir que el puerto B trabajara como salida de datos. Si colocamos Unos (b'11111111')entonces el puerto B trabajara como entrada. Fijate en el mapa de memoria y veras que su direccion hexadecimal es 86h.
Podemos combinar si queremos que trabaje como entrada y salida de datos el puerto B.

Sobre las instrucciones

ORG 0,  la memoria de un pic consta de varias celdas o bits, es logico que cada celda tengauna direccion para que el pic pueda ubicarlas y trabajar con ellas, con ORG 0 estamos indicando que trabajaremos en el inicio o posicion 1 de la memoria del PIC
BSF STATUS,5  colocamos un "1" en el registro status en la posicion 5 (que se llama RP0) para ir al banco1 de la memoria( por defecto esta en el banco0) y luego trabajar con el registro TRISB
CLRF TRISB,  "Limpiamos" o colocamos '00000000' en el registro trisb para que podamos enviar datos por el puerto B. (recordar que el trisb decide si el puerto B recibe o envia datos)
BCF STATUS,5  colocamos un '0' en el registro status en la posicion 5 (llamado RP0) para volver al banco0
BSF PORTB,0  aqui encendemos el led (Rb0=pin6) del puerto
END  siempre se coloca para indicar el fin del programa

Bien espero hayan entendido este pequeño programa, he tratado de hacerlo lo mas simple, si tuvieran dudas gustoso les absolvere.

5 comentarios:

  1. Gracias a los cibernautas que nos agradecen, tratare de seguir mejorando esta pagina.

    ResponderEliminar
  2. mi hermano por fabor no podrias colocar ejemplos en c, assembler se me dificulta, gracias a tu web cada dia aprendo mas

    ResponderEliminar
  3. ok wilmer tratare de poner ejemplos en c,aunque seria una mezcla, claro que con c la programacion es mas poderosa, los programas serian mas cortos.

    ResponderEliminar