Está en la página 1de 20

PALTA_2 PARA PROGRAMAR MICROCONTROLADORES

P.G.F.

Ing. Paul Glvez 2010

Manejo de Puertos Digitales Registros para el manejo de puertos digitales El PIC16F877 contiene 5 puertos que pueden ser configurados como entrada o salida digitales (A, B, C, D, E). El puerto A contiene 6 bits (RA0-5). El puerto B (RB0-7) El puerto C (RC0-7) y el puerto D (RD0-7) tiene cada uno 8 lneas. El puerto E solo cuenta con 3 lneas (RE0-2) La operacin de configuracin de los puertos en general implica la siguiente secuencia: Ingresar al banco 1 Configurar los puertos (registros TRISA, TRISB, TRISC, TRISD y TRISE) Regresar al banco 0 Escribir o leer datos desde los puertos. (registros PORTA, PORTB, PORTC, PORTD y PORTE )
P.G.F.

Indicaciones Previas

Hemos indicado que la memoria de datos del PIC16F877 se divide en cuatro bancos: 0, 1, 2 y 3. En las posiciones inferiores de ambos bancos se encuentran los registros especiales de funcin (SFR). En la posicin 0x05, 0x06, 0x07, 0x08 y 0x09 respectivamente se encuentran los registros PORTA, PORTB, PORTC, PORTD y PORTE que se usan para leer o escribir datos, en tanto que en las posiciones 0x85, 0x86, 087, 0x88 y 0x89 se encuentran los registros TRISA, TRISB, TRISC, TRISD y TRISE respectivamente, es all donde se configuran los puertos. Cabe sealar que el PORTB tambin aparece en el banco 2 en la posicin de memoria 0x106 y el TRISB en la posicin de memoria 0x186.

P.G.F.

Cada una de las lneas de los puertos puede ser configurado como entrada o como salida. En los registros TRIS determinamos la configuracin de los puertos. Los registros son una suerte de mascara. Por ejemplo Si escribimos un 0 en el bit 0 del TRISA la lnea RA0 se comportar como una lnea de salida. Si colocamos a 1 el bit 0 del TRISA a la lnea RA0 se comportar como entrada. A travs de los valores que escribamos en los registros TRIS determinamos el comportamiento de los puertos. La escritura y lectura de valores desde los puertos se hace a travs de los registros PORT que se encuentran en el Banco 0 (y banco 2 para el puerto B). Desde luego si configuramos un puerto como entrada (lectura) los valores que escribamos en el no tendrn efecto porque fue configurado como entrada y no como salida. A travs de las instrucciones MOV podemos leer o escribir valores. P.G.F.

POSMEM

BANCO 0 ..

BANCO 1 .. TRSA TRISB TRISC TRISD TRISE .. ADCON

POSMEM

0X05 0X06 0X07 0X08 0X09

PORTA PORTB PORTC PORTD PORTE ..

0X85 0X86 0X87 0X88 0X89

0X1F

NOTA.El puerto A es un puerto multifuncin que se puede configurar como digital o como analgico este modo de funcionamiento depender del registro ADCON1 (banco 1 posicin 0x1F).
Observaciones Las instrucciones de escritura en puertos siempre son precedidas de una operacin de lectura. Es decir ponemos el valor del registro PORTA o PORTB en el registro de trabajo W. All modificamos su valor (podemos variar uno o ms bits) y luego llevamos el valor de W al registro del puerto. Esto se hace por ejemplo en la ejecucin de las instrucciones BCF y BSF. Por tanto debemos tener cuidado con aquellos puertos cuyas lneas son configuradas como entrada y salida a la vez. Por ejemplo: Una instruccin bsf PORTB,5 hace que W =PORTB luego el bit 5 de W se pone a 1 y finalmente W es llevado a PORTB. Si otro bit del PORTB es definido al inicio del programa como entrada y en el desarrollo del programa es reconfigurado como salida, la lnea no necesariamente coincidir con el valor que haba antes, por tanto se pierde.
P.G.F.

Retomando la estructura de programacin:

Al contrario de los lenguajes de alto nivel, el ASM es un programa no estructurado, por lo cual la declaracin de las subrutinas (o subprogramas) puede ser en cualquier parte del cdigo, donde reside el programa principal. Por lo general, es recomendable, realizarlas al final del programa principal, para facilitar la programacin y el seguimiento del cdigo. Aunque en esencia el ASM no tiene una estructura definida, hay que seguir ciertas normativas o pasos al realizar un cdigo en ASM. Para ejemplificar la estructura se tomar como ejemplo la programacin en un PIC16F8XX

P.G.F.

;************************************************************ ;Programa ejemplo para el parpadeo de un led por 1 segundo ;************************************************************ list p=16f877 include <p16f877.inc> __config (_WDT_OFF & _XT_OSC & _BODEN_OFF) errorlevel -302 ;ignorar errores al almacenar en banco 1 PDel0 equ h'25' programa PICdel PDel1 equ h'26' PDel2 equ h'20' ORG 0 GOTO INICIO INICIO org 0x5 clrf INTCON bsf STATUS,RP0 bcf STATUS,RP1 ;******************************** ; Configuracin de Puertos ;******************************** clrf TRISE clrf TRISD bcf STATUS,RP0 ;******************************** ; Programa Principal ;******************************** clrf PORTD ppal bsf PORTD,0 call DEMORA bcf PORTD,0 call DEMORA goto ppal forma infinita. ;------------------------------------------------------------; Subrutina de temporizacin de 1 segundo ;------------------------------------------------------------DEMORA movlw .14 movwf PDel0 ;1| PLoop0 movlw .72 movwf PDel1 ;1| PLoop1 movlw .247 movwf PDel2 ;1| PLoop2 clrwdt decfsz PDel2, 1 goto PLoop2 decfsz PDel1, 1 goto PLoop1 decfsz PDel0, 1 goto PLoop0 PDelL1 goto PDelL2 PDelL2 clrwdt return ;------------------------------------------------------------end

;Definicin de variables generadas con el

;Vector de Reset ;Salto del vector de interrupciones ; Paso al Banco 1

La primera lnea define el microcontrolador a ocupar, en nuestro caso el PIC16F877.

;Habilitacin del Puerto D ;Puerto D como salida ;Banco 0

;Inicializa el Puerto de salida ;Enciende el led ;Mantiene el estado por 1 segundo ;Apaga el led ;Mantiene el estado por 1 segundo ;Vuelve al inicio para repetir la secuencia en

Se analizara lnea a lnea

; 1 set numero de repeticin (C) ; 1 set numero de repeticin (B) ; 1 set numero de repeticin (A) ; 1 clear watchdog ; 1 + (1) es el tiempo 0 ? (A) ; 2 no, loop ; 1 + (1) es el tiempo 0 ? (B) ; 2 no, loop ; 1 + (1) es el tiempo 0 ? (C) ; 2 no, loop ; 2 ciclos delay ; 1 ciclo delay ; 2+2 Fin. ; Fin del programa

P.G.F.

;************************************************************ ;Programa ejemplo para el parpadeo de un led por 1 segundo ;************************************************************ list p=16f877 include <p16f877.inc> __config (_WDT_OFF & _XT_OSC & _BODEN_OFF) errorlevel -302 ;ignorar errores al almacenar en banco 1 PDel0 equ h'25' programa PICdel PDel1 equ h'26' PDel2 equ h'20' ORG 0 GOTO INICIO INICIO org 0x5 clrf INTCON bsf STATUS,RP0 bcf STATUS,RP1 ;******************************** ; Configuracin de Puertos ;******************************** clrf TRISE clrf TRISD bcf STATUS,RP0 ;******************************** ; Programa Principal ;******************************** clrf PORTD ppal bsf PORTD,0 call DEMORA bcf PORTD,0 call DEMORA goto ppal forma infinita. ;------------------------------------------------------------; Subrutina de temporizacin de 1 segundo ;------------------------------------------------------------DEMORA movlw .14 movwf PDel0 ;1| PLoop0 movlw .72 movwf PDel1 ;1| PLoop1 movlw .247 movwf PDel2 ;1| PLoop2 clrwdt decfsz PDel2, 1 goto PLoop2 decfsz PDel1, 1 goto PLoop1 decfsz PDel0, 1 goto PLoop0 PDelL1 goto PDelL2 PDelL2 clrwdt return ;------------------------------------------------------------end

;Definicin de variables generadas con el

;Vector de Reset ;Salto del vector de interrupciones ; Paso al Banco 1

La segunda lnea de cdigo incluye la identificacin de los registros del microcontrolador

;Habilitacin del Puerto D ;Puerto D como salida ;Banco 0

;Inicializa el Puerto de salida ;Enciende el led ;Mantiene el estado por 1 segundo ;Apaga el led ;Mantiene el estado por 1 segundo ;Vuelve al inicio para repetir la secuencia en

; 1 set numero de repeticin (C) ; 1 set numero de repeticin (B) ; 1 set numero de repeticin (A) ; 1 clear watchdog ; 1 + (1) es el tiempo 0 ? (A) ; 2 no, loop ; 1 + (1) es el tiempo 0 ? (B) ; 2 no, loop ; 1 + (1) es el tiempo 0 ? (C) ; 2 no, loop ; 2 ciclos delay ; 1 ciclo delay ; 2+2 Fin. ; Fin del programa

P.G.F.

;************************************************************ ;Programa ejemplo para el parpadeo de un led por 1 segundo ;************************************************************ list p=16f877 include <p16f877.inc> __config (_WDT_OFF & _XT_OSC & _BODEN_OFF) errorlevel -302 ;ignorar errores al almacenar en banco 1 PDel0 equ h'25' programa PICdel PDel1 equ h'26' PDel2 equ h'20' ORG 0 GOTO INICIO INICIO org 0x5 clrf INTCON bsf STATUS,RP0 bcf STATUS,RP1 ;******************************** ; Configuracin de Puertos ;******************************** clrf TRISE clrf TRISD bcf STATUS,RP0 ;******************************** ; Programa Principal ;******************************** clrf PORTD ppal bsf PORTD,0 call DEMORA bcf PORTD,0 call DEMORA goto ppal forma infinita. ;------------------------------------------------------------; Subrutina de temporizacin de 1 segundo ;------------------------------------------------------------DEMORA movlw .14 movwf PDel0 ;1| PLoop0 movlw .72 movwf PDel1 ;1| PLoop1 movlw .247 movwf PDel2 ;1| PLoop2 clrwdt decfsz PDel2, 1 goto PLoop2 decfsz PDel1, 1 goto PLoop1 decfsz PDel0, 1 goto PLoop0 PDelL1 goto PDelL2 PDelL2 clrwdt return ;------------------------------------------------------------end

;Definicin de variables generadas con el

;Vector de Reset ;Salto del vector de interrupciones ; Paso al Banco 1

;Habilitacin del Puerto D ;Puerto D como salida ;Banco 0

;Inicializa el Puerto de salida ;Enciende el led ;Mantiene el estado por 1 segundo ;Apaga el led ;Mantiene el estado por 1 segundo ;Vuelve al inicio para repetir la secuencia en

La tercera lnea define los fusibles o palabra de configuracin los cuales se pueden programas para seleccionar varias configuraciones del dispositivo: tipo de oscilador, proteccin de cdigo, habilitacin del circuito de vigilancia (Watch Dog o perro guardin) y el temporizador al encendido.

; 1 set numero de repeticin (C) ; 1 set numero de repeticin (B) ; 1 set numero de repeticin (A) ; 1 clear watchdog ; 1 + (1) es el tiempo 0 ? (A) ; 2 no, loop ; 1 + (1) es el tiempo 0 ? (B) ; 2 no, loop ; 1 + (1) es el tiempo 0 ? (C) ; 2 no, loop ; 2 ciclos delay ; 1 ciclo delay ; 2+2 Fin. ; Fin del programa

P.G.F.

;************************************************************ ;Programa ejemplo para el parpadeo de un led por 1 segundo ;************************************************************ list p=16f877 include <p16f877.inc> __config (_WDT_OFF & _XT_OSC & _BODEN_OFF) errorlevel -302 ;ignorar errores al almacenar en banco 1 PDel0 equ h'25' programa PICdel PDel1 equ h'26' PDel2 equ h'20' ORG 0 GOTO INICIO INICIO org 0x5 clrf INTCON bsf STATUS,RP0 bcf STATUS,RP1 ;******************************** ; Configuracin de Puertos ;******************************** clrf TRISE clrf TRISD bcf STATUS,RP0 ;******************************** ; Programa Principal ;******************************** clrf PORTD ppal bsf PORTD,0 call DEMORA bcf PORTD,0 call DEMORA goto ppal forma infinita. ;------------------------------------------------------------; Subrutina de temporizacin de 1 segundo ;------------------------------------------------------------DEMORA movlw .14 movwf PDel0 ;1| PLoop0 movlw .72 movwf PDel1 ;1| PLoop1 movlw .247 movwf PDel2 ;1| PLoop2 clrwdt decfsz PDel2, 1 goto PLoop2 decfsz PDel1, 1 goto PLoop1 decfsz PDel0, 1 goto PLoop0 PDelL1 goto PDelL2 PDelL2 clrwdt return ;------------------------------------------------------------end

;Definicin de variables generadas con el

;Vector de Reset ;Salto del vector de interrupciones ; Paso al Banco 1

;Habilitacin del Puerto D ;Puerto D como salida ;Banco 0

La cuarta lnea se emplea para eliminar los mensajes de error cuando se almacenan valores en el banco 1.

;Inicializa el Puerto de salida ;Enciende el led ;Mantiene el estado por 1 segundo ;Apaga el led ;Mantiene el estado por 1 segundo ;Vuelve al inicio para repetir la secuencia en

; 1 set numero de repeticin (C) ; 1 set numero de repeticin (B) ; 1 set numero de repeticin (A) ; 1 clear watchdog ; 1 + (1) es el tiempo 0 ? (A) ; 2 no, loop ; 1 + (1) es el tiempo 0 ? (B) ; 2 no, loop ; 1 + (1) es el tiempo 0 ? (C) ; 2 no, loop ; 2 ciclos delay ; 1 ciclo delay ; 2+2 Fin. ; Fin del programa

P.G.F.

;************************************************************ ;Programa ejemplo para el parpadeo de un led por 1 segundo ;************************************************************ list p=16f877 include <p16f877.inc> __config (_WDT_OFF & _XT_OSC & _BODEN_OFF) errorlevel -302 ;ignorar errores al almacenar en banco 1 PDel0 equ h'25' programa PICdel PDel1 equ h'26' PDel2 equ h'20' ORG 0 GOTO INICIO INICIO org 0x5 clrf INTCON bsf STATUS,RP0 bcf STATUS,RP1 ;******************************** ; Configuracin de Puertos ;******************************** clrf TRISE clrf TRISD bcf STATUS,RP0 ;******************************** ; Programa Principal ;******************************** clrf PORTD ppal bsf PORTD,0 call DEMORA bcf PORTD,0 call DEMORA goto ppal forma infinita. ;------------------------------------------------------------; Subrutina de temporizacin de 1 segundo ;------------------------------------------------------------DEMORA movlw .14 movwf PDel0 ;1| PLoop0 movlw .72 movwf PDel1 ;1| PLoop1 movlw .247 movwf PDel2 ;1| PLoop2 clrwdt decfsz PDel2, 1 goto PLoop2 decfsz PDel1, 1 goto PLoop1 decfsz PDel0, 1 goto PLoop0 PDelL1 goto PDelL2 PDelL2 clrwdt return ;------------------------------------------------------------end

;Definicin de variables generadas con el

;Vector de Reset ;Salto del vector de interrupciones ; Paso al Banco 1

;Habilitacin del Puerto D ;Puerto D como salida ;Banco 0

Luego se definen las variables, similar a la inicializacin de variables que poseen los lenguajes de alto nivel.

;Inicializa el Puerto de salida ;Enciende el led ;Mantiene el estado por 1 segundo ;Apaga el led ;Mantiene el estado por 1 segundo ;Vuelve al inicio para repetir la secuencia en

; 1 set numero de repeticin (C) ; 1 set numero de repeticin (B) ; 1 set numero de repeticin (A) ; 1 clear watchdog ; 1 + (1) es el tiempo 0 ? (A) ; 2 no, loop ; 1 + (1) es el tiempo 0 ? (B) ; 2 no, loop ; 1 + (1) es el tiempo 0 ? (C) ; 2 no, loop ; 2 ciclos delay ; 1 ciclo delay ; 2+2 Fin. ; Fin del programa

P.G.F.

;************************************************************ ;Programa ejemplo para el parpadeo de un led por 1 segundo ;************************************************************ list p=16f877 include <p16f877.inc> __config (_WDT_OFF & _XT_OSC & _BODEN_OFF) errorlevel -302 ;ignorar errores al almacenar en banco 1 PDel0 equ h'25' programa PICdel PDel1 equ h'26' PDel2 equ h'20' ORG 0 GOTO INICIO INICIO org 0x5 clrf INTCON bsf STATUS,RP0 bcf STATUS,RP1 ;******************************** ; Configuracin de Puertos ;******************************** clrf TRISE clrf TRISD bcf STATUS,RP0 ;******************************** ; Programa Principal ;******************************** clrf PORTD ppal bsf PORTD,0 call DEMORA bcf PORTD,0 call DEMORA goto ppal forma infinita. ;------------------------------------------------------------; Subrutina de temporizacin de 1 segundo ;------------------------------------------------------------DEMORA movlw .14 movwf PDel0 ;1| PLoop0 movlw .72 movwf PDel1 ;1| PLoop1 movlw .247 movwf PDel2 ;1| PLoop2 clrwdt decfsz PDel2, 1 goto PLoop2 decfsz PDel1, 1 goto PLoop1 decfsz PDel0, 1 goto PLoop0 PDelL1 goto PDelL2 PDelL2 clrwdt return ;------------------------------------------------------------end

;Definicin de variables generadas con el

;Vector de Reset ;Salto del vector de interrupciones ; Paso al Banco 1

;Habilitacin del Puerto D ;Puerto D como salida ;Banco 0

;Inicializa el Puerto de salida ;Enciende el led ;Mantiene el estado por 1 segundo ;Apaga el led ;Mantiene el estado por 1 segundo ;Vuelve al inicio para repetir la secuencia en

; 1 set numero de repeticin (C) ; 1 set numero de repeticin (B) ; 1 set numero de repeticin (A) ; 1 clear watchdog ; 1 + (1) es el tiempo 0 ? (A) ; 2 no, loop ; 1 + (1) es el tiempo 0 ? (B) ; 2 no, loop ; 1 + (1) es el tiempo 0 ? (C) ; 2 no, loop ; 2 ciclos delay ; 1 ciclo delay ; 2+2 Fin. ; Fin del programa

Luego de realizada las configuraciones globales y la definicin de variables, debemos posicionar el cdigo de programa en la posicin de memoria cero (vector de Reset), para cuando se produzca una reinicializacin del sistema el programa no se salte alguna configuracin importante del PIC que provoque un mal funcionamientos de la aplicacin que estamos realizando.

P.G.F.

;************************************************************ ;Programa ejemplo para el parpadeo de un led por 1 segundo ;************************************************************ list p=16f877 include <p16f877.inc> __config (_WDT_OFF & _XT_OSC & _BODEN_OFF) errorlevel -302 ;ignorar errores al almacenar en banco 1 PDel0 equ h'25' programa PICdel PDel1 equ h'26' PDel2 equ h'20' ORG 0 GOTO INICIO INICIO org 0x5 clrf INTCON bsf STATUS,RP0 bcf STATUS,RP1 ;******************************** ; Configuracin de Puertos ;******************************** clrf TRISE clrf TRISD bcf STATUS,RP0 ;******************************** ; Programa Principal ;******************************** clrf PORTD ppal bsf PORTD,0 call DEMORA bcf PORTD,0 call DEMORA goto ppal forma infinita. ;------------------------------------------------------------; Subrutina de temporizacin de 1 segundo ;------------------------------------------------------------DEMORA movlw .14 movwf PDel0 ;1| PLoop0 movlw .72 movwf PDel1 ;1| PLoop1 movlw .247 movwf PDel2 ;1| PLoop2 clrwdt decfsz PDel2, 1 goto PLoop2 decfsz PDel1, 1 goto PLoop1 decfsz PDel0, 1 goto PLoop0 PDelL1 goto PDelL2 PDelL2 clrwdt return ;------------------------------------------------------------end

;Definicin de variables generadas con el

;Vector de Reset ;Salto del vector de interrupciones ;Paso al Banco 1

;Habilitacin del Puerto D ;Puerto D como salida ;Banco 0

Luego debo saltar a una posicin de memoria media, donde no ocupe espacio de vectores reservados (como el vector 04h que es para interrupciones), generalmente se salta a la posicin de memoria 5h (en ASM tambin se ocupa la nomenclatura 0x5).

;Inicializa el Puerto de salida ;Enciende el led ;Mantiene el estado por 1 segundo ;Apaga el led ;Mantiene el estado por 1 segundo ;Vuelve al inicio para repetir la secuencia en

; 1 set numero de repeticin (C) ; 1 set numero de repeticin (B) ; 1 set numero de repeticin (A) ; 1 clear watchdog ; 1 + (1) es el tiempo 0 ? (A) ; 2 no, loop ; 1 + (1) es el tiempo 0 ? (B) ; 2 no, loop ; 1 + (1) es el tiempo 0 ? (C) ; 2 no, loop ; 2 ciclos delay ; 1 ciclo delay ; 2+2 Fin. ; Fin del programa

P.G.F.

;************************************************************ ;Programa ejemplo para el parpadeo de un led por 1 segundo ;************************************************************ list p=16f877 include <p16f877.inc> __config (_WDT_OFF & _XT_OSC & _BODEN_OFF) errorlevel -302 ;ignorar errores al almacenar en banco 1 PDel0 equ h'25' programa PICdel PDel1 equ h'26' PDel2 equ h'20' ORG 0 GOTO INICIO INICIO org 0x5 clrf INTCON bsf STATUS,RP0 bcf STATUS,RP1 ;******************************** ; Configuracin de Puertos ;******************************** clrf TRISE clrf TRISD bcf STATUS,RP0 ;******************************** ; Programa Principal ;******************************** clrf PORTD ppal bsf PORTD,0 call DEMORA bcf PORTD,0 call DEMORA goto ppal forma infinita. ;------------------------------------------------------------; Subrutina de temporizacin de 1 segundo ;------------------------------------------------------------DEMORA movlw .14 movwf PDel0 ;1| PLoop0 movlw .72 movwf PDel1 ;1| PLoop1 movlw .247 movwf PDel2 ;1| PLoop2 clrwdt decfsz PDel2, 1 goto PLoop2 decfsz PDel1, 1 goto PLoop1 decfsz PDel0, 1 goto PLoop0 PDelL1 goto PDelL2 PDelL2 clrwdt return ;------------------------------------------------------------end

Definicin de variables generadas con el

;Vector de Reset ;Salto del vector de interrupciones ;Paso al Banco 1

;Habilitacin del Puerto D ;Puerto D como salida ;Banco 0

;Inicializa el Puerto de salida ;Enciende el led ;Mantiene el estado por 1 segundo ;Apaga el led ;Mantiene el estado por 1 segundo ;Vuelve al inicio para repetir la secuencia en

; 1 set numero de repeticin (C) ; 1 set numero de repeticin (B) ; 1 set numero de repeticin (A) ; 1 clear watchdog ; 1 + (1) es el tiempo 0 ? (A) ; 2 no, loop ; 1 + (1) es el tiempo 0 ? (B) ; 2 no, loop ; 1 + (1) es el tiempo 0 ? (C) ; 2 no, loop ; 2 ciclos delay ; 1 ciclo delay ; 2+2 Fin. ; Fin del programa

En este momento estamos en condiciones de configurar los registros reservados del PIC para nuestra aplicacin, por ejemplo, habilitar o deshabilitar interrupciones generales y/o de perifricos especficos (como el conversor A/D), configurar puertos como salidas o entradas, habilitar o deshabilitar funciones especiales como comunicacin serie, puerta paralela esclava (SPP), etc. IMPORTANTE: Debemos notar que algunos registros de configuracin se encuentran en bancos distintos, por lo tanto debemos configurar primero en un banco y luego en los dems, funcin por funcin. (Esto se realiza con los bits RP0 y RP1 del registro STATUS).

P.G.F.

;************************************************************ ;Programa ejemplo para el parpadeo de un led por 1 segundo ;************************************************************ list p=16f877 include <p16f877.inc> __config (_WDT_OFF & _XT_OSC & _BODEN_OFF) errorlevel -302 ;ignorar errores al almacenar en banco 1 PDel0 equ h'25' programa PICdel PDel1 equ h'26' PDel2 equ h'20' ORG 0 GOTO INICIO INICIO org 0x5 clrf INTCON bsf STATUS,RP0 bcf STATUS,RP1 ;******************************** ; Configuracin de Puertos ;******************************** clrf TRISE clrf TRISD bcf STATUS,RP0 ;******************************** ; Programa Principal ;******************************** clrf PORTD ppal bsf PORTD,0 call DEMORA bcf PORTD,0 call DEMORA goto ppal forma infinita. ;------------------------------------------------------------; Subrutina de temporizacin de 1 segundo ;------------------------------------------------------------DEMORA movlw .14 movwf PDel0 ;1| PLoop0 movlw .72 movwf PDel1 ;1| PLoop1 movlw .247 movwf PDel2 ;1| PLoop2 clrwdt decfsz PDel2, 1 goto PLoop2 decfsz PDel1, 1 goto PLoop1 decfsz PDel0, 1 goto PLoop0 PDelL1 goto PDelL2 PDelL2 clrwdt return ;------------------------------------------------------------end

;Definicin de variables generadas con el

;Vector de Reset ;Salto del vector de interrupciones ;Paso al Banco 1

;Habilitacin del Puerto D ;Puerto D como salida ;Banco 0

;Inicializa el Puerto de salida ;Enciende el led ;Mantiene el estado por 1 segundo ;Apaga el led ;Mantiene el estado por 1 segundo ;Vuelve al inicio para repetir la secuencia en

; 1 set numero de repeticin (C) ; 1 set numero de repeticin (B) ; 1 set numero de repeticin (A) ; 1 clear watchdog ; 1 + (1) es el tiempo 0 ? (A) ; 2 no, loop ; 1 + (1) es el tiempo 0 ? (B) ; 2 no, loop ; 1 + (1) es el tiempo 0 ? (C) ; 2 no, loop ; 2 ciclos delay ; 1 ciclo delay ; 2+2 Fin. ; Fin del programa

Terminadas las configuraciones se vuelve al banco de trabajo (BANK 0) y se comienza el programa principal.

P.G.F.

;************************************************************ ;Programa ejemplo para el parpadeo de un led por 1 segundo ;************************************************************ list p=16f877 include <p16f877.inc> __config (_WDT_OFF & _XT_OSC & _BODEN_OFF) errorlevel -302 ;ignorar errores al almacenar en banco 1 PDel0 equ h'25' programa PICdel PDel1 equ h'26' PDel2 equ h'20' ORG 0 GOTO INICIO INICIO org 0x5 clrf INTCON bsf STATUS,RP0 bcf STATUS,RP1 ;******************************** ; Configuracin de Puertos ;******************************** clrf TRISE clrf TRISD bcf STATUS,RP0 ;******************************** ; Programa Principal ;******************************** clrf PORTD ppal bsf PORTD,0 call DEMORA bcf PORTD,0 call DEMORA goto ppal forma infinita. ;------------------------------------------------------------; Subrutina de temporizacin de 1 segundo ;------------------------------------------------------------DEMORA movlw .14 movwf PDel0 ;1| PLoop0 movlw .72 movwf PDel1 ;1| PLoop1 movlw .247 movwf PDel2 ;1| PLoop2 clrwdt decfsz PDel2, 1 goto PLoop2 decfsz PDel1, 1 goto PLoop1 decfsz PDel0, 1 goto PLoop0 PDelL1 goto PDelL2 PDelL2 clrwdt return ;------------------------------------------------------------end

;Definicin de variables generadas con el

;Vector de Reset ;Salto del vector de interrupciones ;Paso al Banco 1

;Habilitacin del Puerto D ;Puerto D como salida ;Banco 0

;Inicializa el Puerto de salida ;Enciende el led ;Mantiene el estado por 1 segundo ;Apaga el led ;Mantiene el estado por 1 segundo ;Vuelve al inicio para repetir la secuencia en

Luego se realizan las subrutinas que son llamadas por el programa principal por la instruccin (o nemnico) CALL. Cuando se realiza una llamada el programa principal salta a la subrutina invocada y para devolver el control al programa principal se ocupa la instruccin RETURN.

; 1 set numero de repeticin (C) ; 1 set numero de repeticin (B) ; 1 set numero de repeticin (A) ; 1 clear watchdog ; 1 + (1) es el tiempo 0 ? (A) ; 2 no, loop ; 1 + (1) es el tiempo 0 ? (B) ; 2 no, loop ; 1 + (1) es el tiempo 0 ? (C) ; 2 no, loop ; 2 ciclos delay ; 1 ciclo delay ; 2+2 Fin. ; Fin del programa

P.G.F.

;************************************************************ ;Programa ejemplo para el parpadeo de un led por 1 segundo ;************************************************************ list p=16f877 include <p16f877.inc> __config (_WDT_OFF & _XT_OSC & _BODEN_OFF) errorlevel -302 ;ignorar errores al almacenar en banco 1 PDel0 equ h'25' programa PICdel PDel1 equ h'26' PDel2 equ h'20' ORG 0 GOTO INICIO INICIO org 0x5 clrf INTCON bsf STATUS,RP0 bcf STATUS,RP1 ;******************************** ; Configuracin de Puertos ;******************************** clrf TRISE clrf TRISD bcf STATUS,RP0 ;******************************** ; Programa Principal ;******************************** clrf PORTD ppal bsf PORTD,0 call DEMORA bcf PORTD,0 call DEMORA goto ppal forma infinita. ;------------------------------------------------------------; Subrutina de temporizacin de 1 segundo ;------------------------------------------------------------DEMORA movlw .14 movwf PDel0 ;1| PLoop0 movlw .72 movwf PDel1 ;1| PLoop1 movlw .247 movwf PDel2 ;1| PLoop2 clrwdt decfsz PDel2, 1 goto PLoop2 decfsz PDel1, 1 goto PLoop1 decfsz PDel0, 1 goto PLoop0 PDelL1 goto PDelL2 PDelL2 clrwdt return ;------------------------------------------------------------end

;Definicin de variables generadas con el

;Vector de Reset ;Salto del vector de interrupciones ;Paso al Banco 1

;Habilitacin del Puerto D ;Puerto D como salida ;Banco 0

;Inicializa el Puerto de salida ;Enciende el led ;Mantiene el estado por 1 segundo ;Apaga el led ;Mantiene el estado por 1 segundo ;Vuelve al inicio para repetir la secuencia en

; 1 set numero de repeticin (C) ; 1 set numero de repeticin (B) ; 1 set numero de repeticin (A) ; 1 clear watchdog ; 1 + (1) es el tiempo 0 ? (A) ; 2 no, loop ; 1 + (1) es el tiempo 0 ? (B) ; 2 no, loop ; 1 + (1) es el tiempo 0 ? (C) ; 2 no, loop ; 2 ciclos delay ; 1 ciclo delay ; 2+2 Fin. ; Fin del programa

Se debe destacar que en los programas se pueden realizar comentarios en cualquier parte del cdigo (se considera comentario todo lo que est despus del carcter ;), los cuales no sern tomados en cuenta por el compilador, por lo tanto se usan como referencias para el programador (es decir para poder seguir el programa). Lo ideal es ir comentando cada lnea de cdigo que realizo, para poder corregir o actualizar el programa de forma fcil.

P.G.F.

;Programa ejemplo para el parpadeo de un led por 1 segundo ;************************************************************ list p=16f877 include <p16f877.inc> __config (_WDT_OFF & _XT_OSC & _BODEN_OFF) errorlevel -302 ;ignorar errores al almacenar en banco 1 PDel0 equ h'25' programa PICdel PDel1 equ h'26' PDel2 equ h'20' ORG 0 GOTO INICIO INICIO org clrf bsf bcf 0x5 INTCON STATUS,RP0 STATUS,RP1

;Definicin de variables generadas con el

;Vector de Reset ;Salto del vector de interrupciones

Se debe agregar, adems, que las instrucciones de salto (goto y call) llevan una etiqueta con el nombre asignado de la subrutina o posicin de memoria que estimemos conveniente. Es decir si llamo a la rutina Demora (rutina que realizar un retardo, por ejemplo) debo ocupar la siguiente sentencia CALL Demora, por lo tanto en ese momento el PC (contador de programa o puntero de programa) apunta a la direccin de memoria donde se encuentra la subrutina, es decir va a la parte del programa que contenga la etiqueta Demora. Para la instruccin de salto GOTO (Ir a ) funciona de la misma manera.

;Paso al Banco 1

;******************************** ; Configuracin de Puertos ;******************************** clrf clrf bcf ;******************************** ; Programa Principal ;******************************** ppal call clrf bsf DEMORA bcf call goto forma infinita. ;------------------------------------------------------------; Subrutina de temporizacin de 1 segundo ;------------------------------------------------------------DEMORA movlw movwf PDel0 PLoop0 movlw .72 movwf PDel1 PLoop1 movlw .247 movwf PDel2 PLoop2 clrwdt decfsz goto decfsz goto decfsz goto PDelL1 goto PDelL2 clrwdt return ;------------------------------------------------------------end PORTD PORTD,0 PORTD,0 DEMORA ppal ;Inicializa el Puerto de salida ;Enciende el led ;Mantiene el estado por 1 segundo TRISE TRISD STATUS,RP0 ;Habilitacin del Puerto D ;Puerto D como salida ;Banco 0

;Apaga el led ;Mantiene el estado por 1 segundo ;Vuelve al inicio para repetir la secuencia en

.14 ;1| ;1|

; 1 set numero de repeticin (C) ; 1 set numero de repeticin (B) ; 1 set numero de repeticin (A)

;1| PDel2, 1 PLoop2 PDel1, 1 PLoop1 PDel0, 1 PLoop0 PDelL2 ; 1 clear watchdog ; 1 + (1) es el tiempo 0 ? (A) ; 2 no, loop ; 1 + (1) es el tiempo 0 ? (B) ; 2 no, loop ; 1 + (1) es el tiempo 0 ? (C) ; 2 no, loop ; 2 ciclos delay ; 1 ciclo delay ; 2+2 Fin. ; Fin del programa

P.G.F.

;Programa ejemplo para el parpadeo de un led por 1 segundo ;************************************************************ list p=16f877 include <p16f877.inc> __config (_WDT_OFF & _XT_OSC & _BODEN_OFF) errorlevel -302 ;ignorar errores al almacenar en banco 1 PDel0 equ h'25' programa PICdel PDel1 equ h'26' PDel2 equ h'20' ORG 0 GOTO INICIO INICIO org clrf bsf bcf 0x5 INTCON STATUS,RP0 STATUS,RP1

;Definicin de variables generadas con el

;Vector de Reset ;Salto del vector de interrupciones

;Paso al Banco 1

;******************************** ; Configuracin de Puertos ;******************************** clrf clrf bcf ;******************************** ; Programa Principal ;******************************** ppal call clrf bsf DEMORA bcf call goto forma infinita. ;------------------------------------------------------------; Subrutina de temporizacin de 1 segundo ;------------------------------------------------------------DEMORA movlw movwf PDel0 PLoop0 movlw .72 movwf PDel1 PLoop1 movlw .247 movwf PDel2 PLoop2 clrwdt decfsz goto decfsz goto decfsz goto PDelL1 goto PDelL2 clrwdt return ;------------------------------------------------------------end PORTD PORTD,0 PORTD,0 DEMORA ppal ;Inicializa el Puerto de salida ;Enciende el led ;Mantiene el estado por 1 segundo TRISE TRISD STATUS,RP0 ;Habilitacin del Puerto D ;Puerto D como salida ;Banco 0

A modo de ejemplo se presento la programacin de un microcontrolador que realiza el parpadeo de un led. Se debe notar que se mostraron recursos de programacin que an no se han revisado y que se vern ms adelante, dentro del desarrollo de la asignatura, por lo tanto este ejemplo slo pretende mostrar la estructura de programacin descrita anteriormente.

;Apaga el led ;Mantiene el estado por 1 segundo ;Vuelve al inicio para repetir la secuencia en

.14 ;1| ;1|

; 1 set numero de repeticin (C) ; 1 set numero de repeticin (B) ; 1 set numero de repeticin (A)

;1| PDel2, 1 PLoop2 PDel1, 1 PLoop1 PDel0, 1 PLoop0 PDelL2 ; 1 clear watchdog ; 1 + (1) es el tiempo 0 ? (A) ; 2 no, loop ; 1 + (1) es el tiempo 0 ? (B) ; 2 no, loop ; 1 + (1) es el tiempo 0 ? (C) ; 2 no, loop ; 2 ciclos delay ; 1 ciclo delay ; 2+2 Fin. ; Fin del programa

P.G.F.

ERRORRES A DEPURAR
Clean: Deleting intermediary and output files. Clean: Done. Executing: "C:\Archivos de programa\Microchip\MPASM Suite\MPASMWIN.EXE" /q /p16F877 "Primero.asm" /l"Primero.lst" /e"Primero.err" Warning[205] C:\PRIMERO\PRIMERO.ASM 1 : Found directive in column 1. (list) Warning[207] C:\PRIMERO\PRIMERO.ASM 4 : Found label after column 1. (CONF_ADCON1) Message[302] C:\PRIMERO\PRIMERO.ASM 14 : Register in operand not in bank 0. Ensure that bank bits are correct. Message[302] C:\PRIMERO\PRIMERO.ASM 17 : Register in operand not in bank 0. Ensure that bank bits are correct. Message[302] C:\PRIMERO\PRIMERO.ASM 18 : Register in operand not in bank 0. Ensure that bank bits are correct. Loaded C:\Primero\Primero.COD BUILD SUCCEEDED: Mon Aug 25 22:53:21 2008 Clean: Deleting intermediary and output files. Clean: Done. Executing: "C:\Archivos de programa\Microchip\MPASM Suite\MPASMWIN.EXE" /q /p16F877 "Primero.asm" /l"Primero.lst" /e"Primero.err" Warning[205] C:\PRIMERO\PRIMERO.ASM 1 : Found directive in column 1. (list) Warning[207] C:\PRIMERO\PRIMERO.ASM 9 : Found label after column 1. (CONF_ADCON1) Loaded C:\Primero\Primero.COD BUILD SUCCEEDED: Tue Aug 26 00:31:53 2008

Clean: Deleting intermediary and output files. Clean: Done. Executing: "C:\Archivos de programa\Microchip\MPASM Suite\MPASMWIN.EXE" /q /p16F877 "Primero.asm" /l"Primero.lst" /e"Primero.err" Warning[205] C:\PRIMERO\PRIMERO.ASM 1 : Found directive in column 1. (list) Warning[207] C:\PRIMERO\PRIMERO.ASM 12 : Found label after column 1. (CONF_ADCON1) Loaded C:\Primero\Primero.COD BUILD SUCCEEDED: Tue Aug 26 00:37:25 2008

Clean: Deleting intermediary and output files. Clean: Done. Executing: "C:\Archivos de programa\Microchip\MPASM Suite\MPASMWIN.EXE" /q /p16F877 "Primero.asm" /l"Primero.lst" /e"Primero.err" Loaded C:\Primero\Primero.COD BUILD SUCCEEDED: Tue Aug 26 00:58:29 2008

P.G.F.