Está en la página 1de 29

Prueba de conexin serie entre un PIC y una PC Circuito convertidor serie-paralelo para el port serie de la PC por Eduardo J.

Carletti
Presento aqu la prueba de laboratorio de un circuito realizado especficamente para experimentar, de manera bsica, con la comunicacin entre un microcontrolador PIC 16F628A y el puerto serie de una PC (estndar RS-232). El circuito tiene, adems del microcontrolador, un integrado convertidor de niveles RS232 a TTL que es reemplazo del conocido MAX232, pero cuesta ms barato en el mercado argentino. Se trata del HIN232CP de Intersil, que en Buenos Aires se puede comprar en Cika a un valor de u$s 1,1 + 10,5% de IVA.

Comunicacin RS232

Integrado HIN232CP: Los circuitos con letra T son "Transmitters", que trasladan nivel TTL/CMOS en su entrada a nivel RS232 en su salida. Los circuitos con letra R son "Receivers", que trasladan seales RS232 en su entrada (que pueden ser de hasta +30/-30 V) a nivel TTL/CMOS en su salida. Aqu voy a hacer una pequea disgresin sobre por qu utilizo el PIC 16F628A en esta ocasin y en gran parte de los proyectos que encaro y encarar, excepto cuando las prestaciones de este microcontrolador no sean suficientes para la funcin requerida. La razn principal es que es pata a pata compatible con el ms antiguo pero ya clsico PIC 16F84A. Y es compatible en sus programas, con la nica salvedad de que la memoria RAM se encuenta en otra direccin. Transformar un programa hecho para el PIC 16F84A para utilizarlo en este microcontrolador es una cosa de segundos. Y hay miles de ejemplos en Internet y en libros y revistas para el 16F84A, porque hace aos que se disea sobre l, como procesador bsico.

Distribucin de patas (con sus funciones) del PIC 16F628A. El PIC 16F84A puede estar muy bien como eleccin para comenzar, pero la nica razn que va quedando para hacerlo es que la mayora de los ejemplos de programa y de circuito que se encuentran por all estn realizados sobre l. En base a lo dicho en el prrafo anterior, entonces el PIC 16F628A es igual de elegible, ya que es un reemplazo prcticamente directo de nuestro famoso microcontrolador "de batalla". Pero por qu cambiar, si ambos estn disponibles en el mercado? Por una razn muy simple: el PIC 16F628A tiene ms memoria de programa (el doble), ms RAM, ms EEPROM, ms modos de uso, ms timers, y ms prestaciones, incluyendo la que aprovechamos en este diseo, el puerto serie implementado por hardware... y el PIC 16F628A, por lo menos en Argentina, cuesta menos... Por qu no cambiar, entonces? COMPARACIN 16F84A Memoria programa Memoria datos EEPROM Timers PWM Reg. comparacin/captura Comparadores Referencias de voltaje Oscilador interno reloj Patas usables E/S Programacin a bajo voltaje Precio en Buenos Aires (Cika) 1K 68 bytes 64 bytes 1 13 us$ 3,51 (4 MHz) us$ 7,02 (20 MHz)

16F628A 2K 224 bytes 128 bytes 3 1 s 2 1 37 KHz / 4 MHz 16 s


u$s 3 (20 MHz)

Ahora volvamos al circuito de esta prueba

El microcontrolador se comunica utilizando su puerto serie. He programado este puerto a una velocidad de 9600 baudios, un formato de dato de 8 bits, sin paridad, un bit de parada, y sin ningn control de flujo. El programa en el microcontrolador se inicia enviando un mensaje a la PC que dice Hola amigo. Luego la rutina principal de este pequeo programa espera a recibir un caracter, lo devuelve como eco hacia la PC, y luego lo exhibe a travs de sus puertos, donde tenemos conectados LEDs indicadores. Esto nos permite comprobar la recepcin de los caracteres ASCII desde la PC, cuyo cdigo veremos sobre los LEDs. Tambin hace que nuestro circuito cumpla la funcin de transformar la salida serie de la PC en una salida de 8 bits en paralelo. A continuacin se puede observar el circuito que he utilizado: Circuito del interfaz de comunicacin RS232 entre un PIC y una PC

Algn lector observador habr notado que no se utiliza el Puerto A completo (1 byte) para manejar los LEDs que exhiben el caracter que se ha recibido desde la PC. Los bits 4 y 5 del Puerto A no se utilizan, y a cambio los LEDs que corresponden a estos bits se conectan al Puerto B. Por qu complicarse as? No es mejor escribir un byte completo en un puerto, sin tener que manejar dos bits por separado en otro puerto, que para peor tiene dos bits afectados a la comunicacin serie? Paciencia, todo tiene su explicacin: Tal como se ha configurado el microcontrolador, el Puerto A tiene, efectivamente, ocho bits de ancho, pero por caractersticas de circuito no se pueden utilizar los ocho como salida. El bit 5 solamente se puede utilizar como entrada, y el bit 4 tiene un circuito de salida de drenaje abierto, es decir, cuando est en alto no entrega corriente, de manera que no encendera el LED con el circuito que estamos utilizando. Antes que ponerme a hacer algunos

malabarismos con el circuito, prefer solucionar esto por programa y "sacar" los dos bits faltantes a travs del Puerto B, bits 4 y 5. El "costo" de esta solucin son tres o cuatro lneas de programa, nada ms. Montaje del circuito de conexin serie entre un PIC 16F628A y una PC

Detalle de montaje del circuito de conexin serie

Programa

;******************************************************************* ; INTERFAZ SERIE RS232 - ECO Y DISPLAY EN LEDS ; CONVERTIDOR SERIE RS232 - PARALELO 8 BITS ;******************************************************************* LIST P=16F628, R=DEC #include "P16F628A.INC" ; Usar el PIC16F628 y sistema decimal ; Incluye datos de PIC16F628A

CONFIG _CP_OFF & _WDT_OFF & _LVP_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF ;******************************************************************* ; CONFIGURACION ;******************************************************************* ; ; ; ; ; El PIC es configurado para usar todas las entradas y salidas posibles = 16. Por eso no se usa el oscilador con cristal externo, lo que deja libres las patas 15 y 16 para usar como bits de puerto. Se define el clock interno a 4 MHz. No se usa el master reset (pata 4), que queda convertida en el Puerto A, bit 5 (entrada).

;******************************************************************* ; VARIABLES ;******************************************************************* contador dato_serie EQU EQU 0x28 0x29 ; variable ; dato serie desde la PC

;******************************************************************* ORG 0x000 ; El programa empieza en 0x000

;******************************************************************* ; Inhibe comparadores ;******************************************************************* movlw 7 movwf CMCON ; CMCON=7 inhibir los comparadores

;******************************************************************* ; Inicializar Puertos ;******************************************************************* movlw b'00000000' movwf PORTA movlw b'00000000' movwf PORTB bsf STATUS,RP0 movlw b'00000000' ; valor inicial portA ; valor inicial portB ; Pg 1 RAM

movwf TRISA

; ; ; ;

salidas (para mostrar el dato en LEDS) de estas salidas, no usaremos PORTA 4, que tiene salida open drain, y PORTA 5, que slo puede ser entrada RB0 RB1 RB2 RB3 RB2 RB5 RB6 entrada (RX) = entrada (TX) = salida = entrada = salida del bit 4 del dato a LEDS = salida del bit 5 del dato a LEDS y RB7 = entradas

movlw b'11001011' ; ; ; ; ; ; ; movwf TRISB

;******************************************************************* ; BAUD RATE para la comunicacin RS232 ; y otras definiciones para USART ;******************************************************************* ; Baud Rate = 9600, Sin Paridad, 1 Bit parada ; movlw 0x19 ; 0x19=9600 bps (0x0C=19200 bps) movwf SPBRG movlw b'00100100' ; movwf TXSTA ; habilita la transmisin Async bcf STATUS,RP0 movlw b'10010000' movwf RCSTA ; RAM PAGE 0 ; habilita de recepcin Async

;******************************************************************* ; TIEMPO DE ESTABILIZACION ;******************************************************************* clrf contador estab decfsz contador,F goto estab movf RCREG,W movf RCREG,W movf RCREG,W call Bienvenida

; vaca el buffer de recepcin ; enva mensaje de bienvenida

;******************************************************************* ; LAZO PRINCIPAL ;******************************************************************* loop clrw btfss PIR1,RCIF goto loop call recibeRS232 movwf dato_serie call enviaRS232 ; (5) se fija si hay dato RS232 ; no, no lleg ; s, hay ; guarda dato (para uso de cualquier rutina) ; enva el eco a la PC

call muestra goto loop

; muestra el caracter recibido en LEDS

;******************************************************************* ; RECIBE CARACTER SERIE - RS232 - DESDE LA PC ;******************************************************************* recibeRS232 movf RCREG,W return ; guarda dato recibido en acumulador

;******************************************************************* ; ENVIA CARACTER SERIE - RS232 - A LA PC Y ESPERA A QUE HAYA SALIDO ;******************************************************************* enviaRS232 movwf TXREG ; envo el dato en acunulador w bsf STATUS,RP0 ; Pg 1 RAM Espere btfss TXSTA,TRMT ; transmision completa si es alto goto Espere bcf STATUS,RP0 ; Pg 0 RAM return ;******************************************************************* ; MUESTRA DATO ;******************************************************************* muestra movf dato_serie,w movwf PORTA btfss dato_serie,4 bcf PORTB,4 btfsc dato_serie,4 bsf PORTB,4 btfss dato_serie,5 bcf PORTB,5 btfsc dato_serie,5 bsf PORTB,5 return ; ; ; ; ; ; ; ; ; ; recupera el dato guardado exhibe el dato en LEDS en PORTA pero, como el PORTA tiene el bit 4 que es open drain, nos conviene poner el bit 4 del dato en otra salida; lo hacemos en el bit 4 del PORTB. y , como el PORTA tiene el bit 5 que es slo usable como entrada, tenemos que poner el bit 5 del dato en alguna salida; lo hacemos en el bit 5 del PORTB.

;******************************************************************* ; MENSAJES ;******************************************************************* Bienvenida ; los primeros caracteres 0x00 son ; para estabilizacin del circuito movlw 0x00 call enviaRS232 movlw 0x00 call enviaRS232 movlw 0x00 call enviaRS232 movlw 0x00 call enviaRS232

movlw call call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call msgCR movlw call movlw goto END

0x00 enviaRS232 msgCR 'H' enviaRS232 'o' enviaRS232 'l' enviaRS232 'a' enviaRS232 ' ' enviaRS232 'a' enviaRS232 'm' enviaRS232 'i' enviaRS232 'g' enviaRS232 'o' enviaRS232 0x0D enviaRS232 0x0A enviaRS232

Bajar el programa en formato ASM (puede usar el botn derecho de su mouse) Bajar el programa en formato HEX (puede usar el botn derecho de su mouse) Por las dudas, el archivo incluido P16f628a.inc (puede usar el botn derecho de su mouse)

Uso del programa "HyperTerminal" para la comunicacin desde la PC Para establecer la comunicacin serie desde la PC, se debe utilizar el programa HyperTerminal que viene con el sistema operativo Windows, o cualquier otra aplicacin de terminal bsica que usted desee. Aqu se puede ver una explicacin de Microsoft sobre cmo utilizar el programa HyperTerminal. En la configuracin de la conexin, usted debe indicar que se va a conectar "Directo a COM", indicando cul es el puerto COM de la PC que va a utilizar en esta comunicacin (generalmente es el COM1... pero cada PC es un mundo aparte). Esto se define en la seccin "Configurar". Bits por segundo = 9600 Bits de datos = 8 Paridad = Ninguna

Bits de parada = 1 Control de flujo = Ninguno

Ver las imgenes. (A la izquierda, las propiedades de la conexin nombrada por m como "robots", a la derecha, la pantallita "Configurar" del puerto elegido en esta conexin, el COM1).

Algunas cosas que observ El uso de los bits de puerto adicionales del PIC 16F628A luego de convertir por configuracin las lneas para el cristal del oscilador de reloj y la de Master Clear en bits del Puerto A me caus, al principio, algunos problemas. En concreto, el de los bits 4 y 5 del Puerto A, tema ya explicado arriba. Esto demuestra que se debe leer bien la hoja de datos y nunca dar nada por sobreentendido. La conclusin es que si se utiliza el puerto serie interno del PIC 16F628A (que ocupa dos bits en el Puerto B) no hay disponible, lamentablemente, un puerto completo para manejar un byte entero de salida. No s si es muy importante, pero en la programacin se hace un poco ms engorroso "sacar" un byte entero. Por lo dicho en el punto anterior, si se desea utilizar de algn modo un byte de salida en paralelo que no sea para exhibirlo en LEDs, se debe implementar un pulso de aviso (strobe) que anuncie que el dato es vlido, ya que este byte de salida se actualiza por partes. El programa es bsico y no tiene ninguna comprobacin de confirmaciones en el protocolo de comunicacin, as que si se envan datos a mucha velocidad desde la PC se pueden perder datos e incluso puede quedar "colgado" el PIC, situacin que a m no se me ha presentado... pero puede pasar. Segn todas las teoras, usando esta configuracin en la que se genera internamente un pulso de reloj de 4 MHZ sin cristal, podra haber algn problema de corrimiento de la frecuencia del reloj y, por ende, de la velocidad de transferencia del puerto serie del PIC (baudios). Sin embargo, no he notado dificultades de comunicacin. No es difcil implementar esta comunicacin por interrupcin, tarea que encarar en una prxima prueba. No quise hacerlo aqu para no complicar un ejemplo que, a mi entender, debe ser bsico.

COMUNICACIN SERIAL PC - PIC USANDO MATLAB Y PIC BASIC PRO


RESUMEN: La comunicacin serial entre un dispositivo 16F628A de Microchip con Matlab es sencilla. En este artculo se ensayar el cdigo necesario para la tx de datos desde Matlab para encender un led con el microcontrolador 16F628A. Para esta simulacin, se configuran dos puertos virtuales usando el demo del programa Virtual Serial Port Driver v.6.

MATLAB
El cdigo necesario para la inicializar el puerto serial es:
SerPIC = serial('COM2'); set(SerPIC,'BaudRate',2400); set(SerPIC,'DataBits',8); set(SerPIC,'Parity','none'); set(SerPIC,'StopBits',1); set(SerPIC,'FlowControl','none');

La funcin serial crea un objeto que contiene todos los parmetros correspondientes al puerto serial como baudios, bits de datos, bit de parada, etc. Estos parmetros se los modifica con la funcin set. Una vez establecidos los parmetros de la comunicacin, se procede a abrir el puerto con la funcin fopen:
fopen(SerPIC);

La funcin para escribir el puerto serial es fprintf:


fprintf(SerPIC,'%s','A')

En la lnea precedente se escribe en el puerto la letra A en formato string. (Tambin es posible escribir caracteres, reemplazando %s por %c y enviando los datos con la funcin char.) Una vez terminada la comunicacin, se procede a cerrar el puerto con el siguiente cdigo:
fclose(SerPIC); delete(SerPIC) clear SerPIC

MICROCONTROLADOR
En el microcontrolador tenemos el siguiente programa:

include "modedefs.bas"

valor var byte

trisb =%00000001 portb =%00000000

inicio: serin portb.0,T2400,valor if valor == "E" then high portb.1 'E>Encendido if valor == "A" then low portb.1 goto inicio 'A->Apagado

Como se trata de una transmisin serial, siempre va la librera modedefs.bas. No olvidar que la velocidad de envo debe ser la misma que la velocidad de recepcin (2400 en este caso). En este programa si el dato recibido es E, enciende el pin 1 del puerto B. Si recibe A pone a 0 ese mismo pin.

SIMULACIN
Para efectos de simplificar, se us el demo del programa Virtual Serial Port Driver 6 que crea pares de puertos seriales virtuales en un mismo PC.

DESCARGAR

El esquema en Proteus se muestra en la siguiente figura:

La configuracin del componente COMPIM es como muestra la siguiente figura:

La configuracin del VIRTUAL TERMINAL se muestra en la siguiente figura:

Comunicacion inalmbrica entre 2 PICs


INTRODUCCION:

Que es modulacin GFSK? Qu diferencia tiene con los otros mtodos de modulacin? (FSK, GMSK, etc) Qu son los mdulos transceptores de RF? Teora y Prctica sobre RADIOENLACES y alcances.

Modelos de transceptores ofrecidos por la firma CTM Electronica.

DESARROLLO DEL PROYECTO:

Mdulo utilizado para el presente proyecto.

INICIACION y CONFIGURACION DE MODULOS APPCON. Puesta en prctica de los mdulos.

Al margen:

Ejemplo de comunicacin UART entre dos PICs 16F876, cdigo CCS y simulacin PROTEUS (fuente: Ejemplos Compilador CCS y Simulador Proteus para Microcontroladores PIC).

DESCARGAR LIBRO COMPLETO DESCARGA TODO EL CD DE EJEMPLOS con INDICE DE EJEMPLOS. MANUAL DEL CCS.

Me llegaron los mdulos!!! Costo a la fecha: 30USD cada mdulo Transceptor.

Primera prueba de transmisin - recepcin, todo un xito!

Siguiendo los pasos de los PDFs que se indican al principio del desarrollo de este proyecto, y con los siguientes cdigos, se pudo probar la transmisin punto a punto.... El PIC Transimisor enva los nmeros del 1 al 10 consecutivamente con un delay de 1 segundo entre nmero y nmero. El PIC receptor recibe los nmeros. Cuando recibe el 5 prende un led por el pin RB7, y cuando recibe el 7 lo apaga. Pregunta para el inteligente, cunto tardar entre encendido y encendido? Contame en los comentarios. Codigo del PIC Transmisor: #include <16F876A.h>; #FUSES XT,NOWDT #use delay(clock=4000000) #use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7) void main() { int valor; while(1){ for (valor=0;valor<=10;valor++) { PUTC(valor); delay_ms(1000); } } }

Codigo del PIC Receptor: #include <16F876A.h> #FUSES XT,NOWDT #use delay(clock=4000000) #use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8) #use standard_io(B)

#BYTE TRISA=0X85 #BYTE PORTA=0X05 int valor; #int_RDA RDA_isr() { valor=GETC(); } void main() { bit_clear(TRISA,0); enable_interrupts(INT_RDA); enable_interrupts(GLOBAL); for (;;) {

if(valor==5) output_high(PIN_B7); if(valor==7) output_low(PIN_B7); } }

Probamos la comunicacin Inalmbirca PC-PIC, bidireccional: El siguiente cdigo permite que el PIC nos regrese el valor numrico que le hemos enviado por la UART, precedido siempre por la cadena: "Recibido el: ". #include <16F873A.h> #FUSES XT,NOWDT #use delay(clock=4000000) #use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8) #BYTE TRISA=0X85 #BYTE PORTA=0X05 #org 0x0F00,0x0FFF {} //16F873A bootloader resides here int valor; #int_RDA RDA_isr() { valor=GETC();

printf("Recibido el: %1D", valor); } void main() { bit_clear(TRISA,0); enable_interrupts(INT_RDA); enable_interrupts(GLOBAL); for (;;) { } }

Asi conectamos la PC al Transceptor APC230:

Y el PIC al otro Transceptor:

Cdigo en CCS del Tp Final. #include "PCronos.h" int contador = 0; long time[6]; long int cuenta = 0; #int_TIMER0 void TIMER0_isr() { set_timer0(136); cuenta++; /* printf("T"); */ } #int_EXT void EXT_isr() { if (contador<= 6) { time[contador] = cuenta; } contador++; printf("E"); }

void main() {

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_8); set_timer0(136); enable_interrupts(INT_EXT); enable_interrupts(INT_TIMER0); set_tris_a(0x10); set_tris_b(0x01); printf("Cronometro para PC \n\r"); contador = 0; while (1){ if (contador == 0) { printf("Presione S para comenzar a realizar la medicion \n\r" ); while(getch() != 'S'); enable_interrupts(GLOBAL); printf("\n\rOK\n\r"); contador++; } else if (contador > 5){ disable_interrupts(GLOBAL); printf("\n\r"); for(contador = 1; contador < 6; contador++){ printf("%Lu\n\r", time[contador]); } printf("\n\r"); printf("%Lu\n\r", time[2] - time[1]); printf("%Lu\n\r", time[3] - time[2]); printf("%Lu\n\r", time[4] - time[3]); printf("%Lu\n\r", time[5] - time[4]); contador = 0; cuenta = 0; printf("Preparado para una nueva medicion \n\r"); } } }

#include <16f84a.h> #FUSES NOWDT //No Watch Dog Timer #FUSES XT //Crystal osc <= 4mhz #FUSES PUT //Power Up Timer

#FUSES NOPROTECT //Code not protected from reading #use delay(clock=4000000) #use rs232(baud=9600,parity=N,xmit=PIN_A3,rcv=PIN_A4,bits=8) La consiga de este TP es crear un programa capaz de activar una salida con una frecuencia de 500Hz, la misma se comandar desde una entrada. Codigo Assembler ;******************************************************************** ; Nombre del archivo: TestStarter.asm ;******************************************************************** ; Descripcin: ; -----------; Este software sirve para verificar el funcionamientos de la ; placa Starter. ; Enciende y apaga los leds conectados al PORTB en una secuencia ; determinada por el programa, siempre y ; cuando se active mediante un "1" la llave conectada en RA0. ; ;******************************************************************** ; Hardware: ; --------; Placa Starter ; XTAL: 4MHz ;******************************************************************** ; Autores: VMMB Fecha: 18/11/09 Versin:1.0 ;******************************************************************** LIST p=PIC16F84A INCLUDE __CONFIG _WDT_OFF & _PWRTE_ON & _CP_OFF & _XT_OSC ERRORLEVEL -302 ;******************************************************************** ; Definiciones y Equivalencias ;******************************************************************** #DEFINE BANK0 bcf STATUS,RP0 ; Cambio al banco 0 #DEFINE BANK1 bsf STATUS,RP0 ; Cambio al banco 1 RAM EQU 0x0C FLASHROM EQU 0x000 SW_0 EQU 0 SW_1 EQU 1 ;******************************************************************** ; Variables ;******************************************************************** CBLOCK RAM var_1 var_2

var_3 w_temp status_temp ENDC ;******************************************************************** ; MACROS (Sustituyen una o ms lineas de cdigo por un nombre) ;******************************************************************** ; Macros usadas para este programa LEDS_OFF MACRO clrf PORTB ENDM LEDS_ON MACRO movlw b'11111111' movwf PORTB call delay_200ms LEDS_OFF call delay_200ms ENDM LED_1 MACRO movlw b'00000001' movwf PORTB ENDM LED_2 MACRO movlw b'00000010' movwf PORTB ENDM LED_3 MACRO movlw b'00000100' movwf PORTB ENDM LED_4 MACRO movlw b'00001000' movwf PORTB ENDM LED_5 MACRO movlw b'00010000' movwf PORTB ENDM LED_6 MACRO movlw b'00100000' movwf PORTB ENDM LED_7 MACRO

movlw b'01000000' movwf PORTB ENDM LED_8 MACRO movlw b'10000000' movwf PORTB ENDM LED_1y3 MACRO movlw b'00000101' movwf PORTB ENDM LED_2y4 MACRO movlw b'00001010' movwf PORTB ENDM LED_3y5 MACRO movlw b'00010100' movwf PORTB ENDM LED_4y6 MACRO movlw b'00101000' movwf PORTB ENDM LED_5y7 MACRO movlw b'01010000' movwf PORTB ENDM LED_6y8 MACRO movlw b'10100000' movwf PORTB ENDM LED_7y1 MACRO movlw b'01000001' movwf PORTB ENDM LED_8y2 MACRO movlw b'10000010' movwf PORTB ENDM LED_1y2 MACRO movlw b'00000011' movwf PORTB

ENDM LED_3y4 MACRO movlw b'00001100' movwf PORTB ENDM LED_5y6 MACRO movlw b'00110000' movwf PORTB ENDM LED_7y8 MACRO movlw b'11000000' movwf PORTB ENDM

; Macros usadas para guardar los registros W y STATUS al momento ; de llegar una interrupcin PUSH MACRO movwf w_temp swapf STATUS,W movwf status_temp ENDM

POP MACRO swapf status_temp,W movwf STATUS swapf w_temp,F swapf w_temp,W ENDM ;******************************************************************** ; Vectores ;******************************************************************** ORG FLASHROM clrw goto Inicio ; de Reset ORG 0x004 goto Isr ; de Interrupcin ;******************************************************************** Inicio ;******************************************************************** ; Configuro los puertos I/O BANK1

movlw b'11111' movwf TRISA clrf TRISB BANK0 ;******************************************************************** ; Programa principal ;******************************************************************** Loop_1 ;LEDS_OFF LEDS_ON goto Loop Loop btfss PORTA,SW_0 goto Variacion_1 goto Variacion_2 Variacion_1 btfss PORTA,SW_1 goto Loop_1 goto SECUENCIA_1 Variacion_2 btfss PORTA,SW_1 goto SECUENCIA_2 goto SECUENCIA_3 SECUENCIA_1 LED_1 call delay_200ms LED_2 call delay_200ms LED_3 call delay_200ms LED_4 call delay_200ms LED_5 call delay_200ms LED_6 call delay_200ms LED_7 call delay_200ms LED_8 call delay_200ms goto Loop

SECUENCIA_2 LED_1y3 call delay_200ms LED_2y4 call delay_200ms

LED_3y5 call delay_200ms LED_4y6 call delay_200ms LED_5y7 call delay_200ms LED_6y8 call delay_200ms LED_7y1 call delay_200ms LED_8y2 call delay_200ms goto Loop

SECUENCIA_3 LED_1y2 call delay_200ms LED_3y4 call delay_200ms LED_5y6 call delay_200ms LED_7y8 call delay_200ms goto Loop

;******************************************************************** ; Subrutinas ;******************************************************************** ; Delays ; delay_200ms ;499994 cycles movlw 0x03 movwf var_1 movlw 0x18 movwf var_2 movlw 0x02 movwf var_3 delay_200ms_0 decfsz var_1, f goto $+2 decfsz var_2, f goto $+2 decfsz var_3, f goto delay_200ms_0 ;2 cycles goto $+1 ;4 cycles (including call)

return ;******************************************************************** ; Servicio de Interrupcin ;******************************************************************** Isr PUSH ; Aca se escribe el Servicio de Interrupcin POP retfie ;******************************************************************** END ;Directiva que indica la finalizacin del pgm