Como Hacer Un Robot Casero
Enviado por ibuky • 21 de Enero de 2013 • 3.358 Palabras (14 Páginas) • 860 Visitas
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,
...