ClubEnsayos.com - Ensayos de Calidad, Tareas y Monografias
Buscar

Como Hacer Un Robot Casero

ibuky21 de Enero de 2013

3.358 Palabras (14 Páginas)892 Visitas

Página 1 de 14

2

[pic]

Fig1. Diagrama esquemático de la práctica 2.

8. Implementación del experimento o sistema

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC & _LVP_OFF

include

List P=16f877a ;Tipo de procesador

cont equ 0x20 ;contador rutina retardo

index equ 0x21 ;índice de la tabla de codigos de 7 segmentos

nido equ 0x22 ;indice para el contador anidado

org 0 ;vector de reset

bsf STATUS,RP0 ;Banco 1

movlw 0x03

movwf TRISB ;RB1, RB0 entradas

movlw 0x00

movwf PORTD ;Puerto d salida

bcf STATUS,RP0 ;Banco 0

clrf index ;inicializamos registro en cero

rulo movf index,W

call tabla ;llama subrutina tabla

movwf PORTD ;envía código de 7 segmentos por el ;Puerto D

call retardo2s ;retardo de tiempo de 2 segundos

;algoritmo antirrebotes********************************************

btfss PORTB, 1

call ascendente

movlw 0x05

movwf cont

pollito nop

decfsz cont,1

goto pollito

btfss PORTB, 1

call ascendente

call descendente

;subrutinas*********************************************************

ascendente incf index,F ;incrementa conteo

movf index,W

xorlw 0x0A ;conteo =10?

btfsc STATUS,Z

clrf index ;si conteo es 10, reinicia la cuenta

goto rulo

descendente movf index,W

xorlw 0x00

movlw 0x0A

btfsc STATUS,Z

movwf index

decf index,F ;decrementa conteo

goto rulo

;******************************************************************

tabla

addwf PCL,F

retlw h'c0' ;código 0

retlw h'f9' ;código 1

retlw h'a4' ;código 2

retlw h'b0' ;código 3

retlw h'99' ;código 4

retlw h'92' ;código 5

retlw h'82' ;código 6

retlw h'f8' ;código 7

retlw h'00' ;código 8

retlw h'18' ;código 9

;******************************************************************

retardo2s movlw 0x02

movwf nido

retardo movlw 0xFF

movwf cont

nada nop

decfsz cont,1

goto nada

decfsz nido

goto retardo

return

End

-Encabezado-------------

LIST P=16F84

#include <P16F84luis.INC>

;-------Configuración de puertos-------

ORG 0x00

GOTO inicio

ORG 0x04

GOTO ISR

ORG 0X05

inicio BSF STATUS,RP0 ; configurando puertos

MOVLW 0x10

MOVWF TRISA ; RA0-RA3 = SALIDA

MOVLW 0xFF ; PORTB = ENTRADA

MOVWF TRISB

BCF STATUS,RP0

;-------Habilitación de interrupciones-------

BSF INTCON,GIE ; habilitamos todas las interrupciones

BSF INTCON,INTE ; que sean interrupciones externas

;-------Programa Principal-------

CLRF PORTA

espera SLEEP

GOTO espera ; El micro pasa a bajo consumo

ISR MOVF PORTA,W ; pasamos lo que hay en PORTA a W

XORLW B'1001' ; compara para saber si terminó la cuenta

BTFSC STATUS,Z ; si no terminó salta una linea

GOTO reini ; y si terminó irá a reiniciarla

INCF PORTA,F ; incrementa en 1 PORTA y lo retiene

BCF INTCON,INTF ; borro bandera de interrupción

RETFIE ; regresa al modo SLEEP

reini CLRF PORTA

BCF INTCON,INTF ; borro bandera de interrupción

RETFIE

;------------------------------------------

END

;------------------------------------------

Descripción

Y como siempre, sólo aquello que está en rojo, ya que lo demás lo conocemos desde sus inicios.

#include <P16F84luis.INC>

Respecto a esto no diré nada, ya lo mencioné al comenzar esta sección, vamos por lo otro.

Al configurar TRISA con 0x10 hemos dejado RA4 como entrada, de tal modo que enviemos lo que enviemos al registro PORTA, RA4 no será alterado.

De TRISB, bueno, si bien utilizaré sólo uno de sus pines, configuré todo el puerto B como entrada.

Luego viene la habilitación de interrupciones, la general (GIE), y la que corresponde al pin RB0 (INTE)

Lo siguiente, es limpiar el PORTA, para empezar la cuenta en cero, asi que...

CLRF PORTA

y el Display muestra cero "0".

Luego ponemos al micro en espera de la interrupción, con la instrucción SLEEP

Ahora biene el gran secreto, La ISR o Rutina de Servicio de Interrupciones...

Les recuerdo que nuestro decodificador cuenta sólo hasta 9, es decir que si envían 10 por el puerto A el Display no mostrará nada, por lo tanto, habrá que reiniciar la cuenta, si el puerto A llega a 9 (B'1001') el próximo pulso deberá enviar cero al display para reiniciar la cuenta.

ISR MOVF PORTA,W ; pasamos lo que hay en PORTA a W

XORLW B'1001' ; compara para saber si terminó la cuenta

BTFSC STATUS,Z ; si no terminó salta una linea

GOTO reini ; y si terminó irá a reiniciarla

INCF PORTA,F ; incrementa en 1 PORTA y lo retiene

BCF INTCON,INTF ; borro bandera de interrupción

RETFIE ; regresa al modo SLEEP

Cuando se presione el pulsador, se generará una interrupción, eso significa que saldrá del modo SLEEP para pasar a este trozo de código.

Teniendo en cuenta lo dicho anteriormente, lo que haremos será pasar lo que hay en PORTA al registro w, y luego compararlo con 1001 (9 en el display). Si aún no llegó a 9 saltamos una línea, incrementamos PORTA (INCF PORTA,F) y lo guardamos en el mismo registro, aquí utilicé F (recuerda que antes lo indicábamos con 0 o con 1, y como estamos utilizando nuestro P16F84luis.INC, pues la cosa se pone más clara), luego borramos la bandera de interrupción y regresamos al modo sleep.

ok. Supongamos ahora, que la cuenta ya terminó...

En este caso, nuestro Display muestra 9, y PORTA está en 00001001, si es así, cuando hagamos xorlw con 00001001, por ser el mismo valor, la bandera de cero Z del registro STATUS, se pondrá en 1, pues bien, eso significa que la cuenta terminó, por lo tanto habrá que reiniciarla, asi que hacemos un GOTO a la etiqueta reini

reini CLRF PORTA

BCF INTCON,INTF ;

...

Descargar como (para miembros actualizados) txt (13 Kb)
Leer 13 páginas más »
Disponible sólo en Clubensayos.com