Elige tu idioma

Google-Translate-Spanish to English Google-Translate-Chinese (Simplified) BETA Google-Translate-Spanish to French Google-Translate-Spanish to German Google-Translate-Spanish to Italian Google-Translate-Spanish to Japanese BETA Google-Translate-Spanish to Korean BETA Google-Translate-Spanish to Russian BETA
Usa este widget!

Visitas

Contador Web
Contador Web WAU_classic('65kdjd2sjoxp')

visitantes

Calendario Ideas&Tecnologia

Marzo 2010
L M X J V S D
« Ene    
1234567
891011121314
15161718192021
22232425262728
293031  

Archivos

Meta

CATEGORIAS

Entradas recientes

Nube de Etiquetas

VIDEO

Ultimos comentarios

Enlaces

Count per Day

Directorios

Reloj Ajedrez

Por: Ideas&Tecnologia


110

Descripción

Este proyecto realizado en codigo assembler consiste en el diseño de un circuito de reloj digital cuya funcion es la de controlar el tiempo de una partida de ajedrez. Para realizar este proyecto utilizamos el PIC16F887 y la

técnica de múltiplexación para ahorrar el uso de pines del microcontrolador y a su vez el consumo de energía debido a que se utiliza 8 display cátodo común, un indicador Led para inicio y final del juego,3 button para el control de Jugador1,2 y Start/Finish.

Funcionamiento

Al energizar el circuito este empezara con el reloj seteado en cero, esperando a que el juez presione el button Start/Finish, al presionar este button el indicador led encenderá indicando que se a iniciado el juego, luego de esto se espera a que un jugador presione el button para dar inicio al arranque del reloj una vez iniciado el juego el juez podrá detenerlo en el momento que deseo y a la vez reanudarlo.

Código en ASM

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

LIST P=16F877A

INCLUDE “P16F877A.INC”

ERRORLEVEL -302

__CONFIG (_CP_OFF & _PWRTE_OFF & _HS_OSC & _WDT_OFF & _LVP_OFF & _BODEN_OFF )

;************Equivalencias ******************************************

DISPDIG1 EQU 0X20 ;COD 7 SEG DE DIGITO 1

DISPDIG2 EQU 0X21 ;COD 7 SEG DE DIGITO 2

DISPDIG3 EQU 0X22 ;COD 7 SEG DE DIGITO 3

DISPDIG4 EQU 0X23 ;COD 7 SEG DE DIGITO 4

DISPDIG5 EQU 0X24 ;COD 7 SEG DE DIGITO 5

DISPDIG6 EQU 0X25 ;COD 7 SEG DE DIGITO 6

DISPDIG7 EQU 0X26 ;COD 7 SEG DE DIGITO 7

DISPDIG8 EQU 0X27 ;COD 7 SEG DE DIGITO 8

SELECT EQU 0X29 ;HABILITADOR PARA DISPLAYS

UNIDAD EQU 0X30

DECENA EQU 0X31

N1 EQU 0X32

N2 EQU 0X33

N3 EQU 0X34

CENTENA EQU 0X35

SEGJUGA1 EQU 0X36

SEGJUGA2 EQU 0X37

MINJUGA1 EQU 0X38

MINJUGA2 EQU 0X39

; CARGA_TMR0 SE USA PARA PROGRAMAR EL TMR0

CARGA_TMR0 EQU d’217′ ;217=>2ms

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

ORG 0

GOTO INICIO

ORG 4 ;Int cada 5ms

GOTO INTERRUPTION

;#####################################################################

; PROGRAMA PRINCIPAL

INICIO

BSF STATUS,5 ; Seleccion del banco 1

CLRF TRISD

MOVLW 07H

MOVWF TRISC

CLRF TRISB

CLRF TRISE

MOVLW b’10000111′

MOVWF OPTION_REG ; PRE-ESCALER=256

MOVLW b’10100000′ ; Interrupci¢n por timer0

MOVWF INTCON

bcf STATUS,5 ; Seleccion banco 0

CLRF PORTB

CLRF PORTC

CLRF PORTD

CLRF PORTE

CLRF DISPDIG1

CLRF DISPDIG2

CLRF DISPDIG3

CLRF DISPDIG4

CLRF DISPDIG5

CLRF DISPDIG6

CLRF DISPDIG7

CLRF DISPDIG8

CLRF SELECT

CLRF UNIDAD

CLRF DECENA

CLRF CENTENA

CLRF SEGJUGA1

CLRF SEGJUGA2

CLRF MINJUGA1

CLRF MINJUGA2

CLRF N1

CLRF N2

CLRF N3

CLRWDT

MOVLW 0×01 ;Interrupción por timer0

MOVWF SELECT

MOVLW CARGA_TMR0 ;Valor a cargar en el Timer:

MOVWF TMR0

STARTPRESS

BCF PORTC,3

BTFSC PORTC,2 ;SI BIT=0 EJECUTA SIG INSTRUCCION

GOTO STARTSOLTAR

GOTO STARTPRESS

STARTSOLTAR BTFSC PORTC,2 ;SI BIT=0 EJECUTA SIG INSTRUCCION

GOTO STARTSOLTAR

BSF PORTC,3

PRESS BTFSC PORTC,0 ;SI BIT=0 EJECUTA SIG INSTRUCCION

GOTO SOLTARJUGADOR1

BTFSC PORTC,1

GOTO SOLTARJUGADOR2

GOTO PRESS

SOLTARJUGADOR1 BTFSC PORTC,0

GOTO SOLTARJUGADOR1

GOTO JUGADOR1

SOLTARJUGADOR2 BTFSC PORTC,1

GOTO SOLTARJUGADOR2

GOTO JUGADOR2

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

JUGADOR1

INCF SEGJUGA1,F

MOVF SEGJUGA1,W

SUBLW .60

BTFSC STATUS,2

GOTO MINUTOSJ1

GOTO SEGUNDOSJ1

MINUTOSJ1 CLRF SEGJUGA1

INCF MINJUGA1,F

BCF STATUS,2

CLRW

SEGUNDOSJ1

BTFSC PORTC,1

GOTO JUGADOR2

CALL TIMEJUGADOR1

CALL DELAY

BTFSC PORTC,2

GOTO STOP

GOTO JUGADOR1

;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

JUGADOR2

INCF SEGJUGA2,F

MOVF SEGJUGA2,W

SUBLW .60

BTFSC STATUS,2

GOTO MINUTOSJ2

GOTO SEGUNDOSJ2

MINUTOSJ2 CLRF SEGJUGA2

INCF MINJUGA2,F

BCF STATUS,2

CLRW

SEGUNDOSJ2

BTFSC PORTC,0

GOTO JUGADOR1

CALL TIMEJUGADOR2

CALL DELAY

BTFSC PORTC,2

GOTO STOP

GOTO JUGADOR2

STOP BTFSC PORTC,2

GOTO STOP

GOTO STARTPRESS

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

TIMEJUGADOR1

MOVF SEGJUGA1,W

CALL BINBCD

MOVF UNIDAD,W

MOVWF DISPDIG4

MOVF DECENA,W

MOVWF DISPDIG3

MOVF MINJUGA1,W

CALL BINBCD

MOVF UNIDAD,W

MOVWF DISPDIG2

MOVF DECENA,W

MOVWF DISPDIG1

RETURN

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

TIMEJUGADOR2

MOVF SEGJUGA2,W

CALL BINBCD

MOVF UNIDAD,W

MOVWF DISPDIG8

MOVF DECENA,W

MOVWF DISPDIG7

MOVF MINJUGA2,W

CALL BINBCD

MOVF UNIDAD,W

MOVWF DISPDIG6

MOVF DECENA,W

MOVWF DISPDIG5

RETURN

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

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

; SUBRUTINA INTERRUPT

INTERRUPTION

MOVLW b’10100000′ ;Limpiar bandera de TMR0

MOVWF INTCON

MOVLW CARGA_TMR0 ;Valor a cargar en el Timer:

MOVWF TMR0

CLRWDT

BCF ´ STATUS,C

BTFSC SELECT,0 ;SI BIT CODIGO_G0.0=1 EJECUTA SIG INSTRUCCION

GOTO DIG1

BTFSC SELECT,1 ;SI BIT CODIGO_G0.1=1 EJECUTA SIG INSTRUCCION

GOTO DIG2

BTFSC ´ SELECT,2 ;SI BIT CODIGO_G0.2=1 EJECUTA SIG INSTRUCCION

GOTO DIG3

BTFSC SELECT,3 ;SI BIT CODIGO_G0.3=1 EJECUTA SIG INSTRUCCION

GOTO DIG4

BTFSC SELECT,4 ;SI BIT CODIGO_G0.3=1 EJECUTA SIG INSTRUCCION

GOTO DIG5

BTFSC SELECT,5 ;SI BIT CODIGO_G0.3=1 EJECUTA SIG INSTRUCCION

GOTO DIG6

BTFSC SELECT,6 ;SI BIT CODIGO_G0.3=1 EJECUTA SIG INSTRUCCION

GOTO DIG7

BTFSC SELECT,7 ;SI BIT CODIGO_G0.3=1 EJECUTA SIG INSTRUCCION

GOTO DIG8

DIG1

CLRF PORTD

MOVF DISPDIG1,W

CALL TABLA

MOVWF PORTB ;Dato al display

MOVF SELECT,W

MOVWF PORTD

NOP

MOVLW 0×02

MOVWF SELECT

RETFIE

DIG2

CLRF PORTD

MOVF DISPDIG2,W

CALL TABLA

MOVWF PORTB ;Dato al display

MOVF SELECT,W

MOVWF PORTD

NOP

MOVLW 0×04

MOVWF SELECT

RETFIE

DIG3

CLRF PORTD

MOVF DISPDIG3,W

CALL TABLA

MOVWF PORTB ;Dato al display

MOVF SELECT,W

MOVWF PORTD

NOP

MOVLW 0×08

MOVWF SELECT

RETFIE

DIG4

CLRF PORTD

MOVF DISPDIG4,W

CALL TABLA

MOVWF PORTB ;Dato al display

MOVF SELECT,W

MOVWF PORTD

NOP

MOVLW 0×10

MOVWF SELECT

RETFIE

DIG5

CLRF PORTD

MOVF DISPDIG5,W

CALL TABLA

MOVWF PORTB ;Dato al display

MOVF SELECT,W

MOVWF PORTD

NOP

MOVLW 0×20

MOVWF SELECT

RETFIE

DIG6

CLRF PORTD

MOVF DISPDIG6,W

CALL TABLA

MOVWF PORTB ;Dato al display

MOVF SELECT,W

MOVWF PORTD

NOP

MOVLW 0×40

MOVWF SELECT

RETFIE

DIG7

CLRF PORTD

MOVF DISPDIG7,W

CALL TABLA

MOVWF PORTB ;Dato al display

MOVF SELECT,W

MOVWF PORTD

NOP

MOVLW 0×80

MOVWF SELECT

RETFIE

DIG8

CLRF PORTD

MOVF DISPDIG8,W

CALL TABLA

MOVWF PORTB ;Dato al display

MOVF SELECT,W

MOVWF PORTD

NOP

MOVLW 0×01

MOVWF SELECT

RETFIE

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

;SUBRUTINA DELAY=N1×20.556 MSEG.

;CON N1=25 SE TIENE UN RETARDO DE 0.5 SEG

;CON N1=50 SE TIENE UN RETARDO DE 1 SEG.

;CON N1=100 SE TIENE UN RETARDO DE 2 SEG.

DELAY MOVLW .50

MOVWF N1

LAZO1 MOVLW .67

MOVWF N2

NOP

LAZO2 MOVLW .255

MOVWF N3

LAZO3 NOP

NOP

NOP

DECFSZ N3,F

GOTO LAZO3

DECFSZ N2,F

GOTO LAZO2

DECFSZ N1,F

GOTO LAZO1

RETURN

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

;Tabla de códigos de 7 segmentos para un display de CATODO COMUN. Los leds

;se encienden con un cero

TABLA

addwf PCL,F

retlw 0×3F ;0

retlw 0×06 ;1

retlw 0×5B ;2

retlw 0X4F ;3

retlw 0X66 ;4

retlw 0X6D ;5

retlw 0X7D ;6

retlw 0X07 ;7

retlw 0X7F ;8

retlw 0X6F ;9

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

;SUBRUTINA BINARIO/BCD

BINBCD NOP

MOVWF UNIDAD;NUMERO A CONVERTIR

CLRF DECENA

CLRF CENTENA

RESTA10 MOVLW .10

SUBWF UNIDAD,W

BTFSS STATUS,C;SALTA SI W >=10, C=1

GOTO BINBCDFIN

MOVWF UNIDAD;ACTUALIZA UNIDAD

INCF DECENA,F

MOVLW .10

SUBWF DECENA,W

BTFSS STATUS,C;SALTA SI W>=10, C=1

GOTO RESTA10

CLRF DECENA

INCF CENTENA,F

GOTO RESTA10

BINBCDFIN RETURN

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

END

Diseño de PCB

211

311

411

Contador up/down de 3 dígitos

Por: Ideas&Tecnologia


1


Descripción

Este proyecto consiste en diseñar un circuito contador de 3digitos mediante  el PIC16F887, esto se mostrara en Formato Decimal y Binario. Para aquello se emplea 3 display Cátodo Común y 16 Led, donde el bit LSB es el pin RB0 y el MSB pin RC7, el modo de conteo se controla mediante el button  (up/down)

Para realizar este proyecto utilizamos la técnica de múltiplexación para ahorrar el uso de pines del microcontrolador y a su vez el consumo de energía.


Funcionamiento

Al energizar el circuito este mostrara el numero ‘000’, para iniciar el conteo  se presionara el button ‘up/down’ y de esta manera se iniciara el conteo up, si se desea cambiar el modo de conteo se deberá presionar el button up/down para cambiar al modo opuesto es decir  al modo down.

Este circuito llegara hasta el valor máximo de ‘999’ una vez llegado a este valor se detendrá el conteo y  esperara que el usuario vuelva a presionar  el button ‘up/down’ lo mismo ocurrirá la llegar al valor ‘000’.

Código en MicroBasic

program CodigoMicro

dim DIG1 as WORD

dim DIG2 as  WORD

dim DIG3 as WORD

dim Cont as Byte

dim Cont2 as Byte

dim numero as Word

dim Sentido as Byte

dim Tiempo as Byte

dim numeroLSB as WORD

dim numeroMSB as WORD

dim Tecla as Byte

dim salto as byte

sub procedure  ButtonA()

if PORTA.0=1 then

while(PORTA.0=1) wend

Tecla=1

if Sentido=0 then

Sentido=1

else

Sentido=0

END IF

end if

end sub

sub function CODIG7SEG(dim num as Word) as BYTE

select case num

case 0  result = $3F

case 1  result = $06

case 2  result = $5B

case 3  result = $4F

case 4  result = $66

case 5  result = $6D

case 6  result = $7D

case 7  result = $07

case 8  result = $7F

case 9  result = $6F

end select       ‘case end

end sub

sub procedure interrupt                   ‘ Interrupt service routine

INTCON = $00                            ’ Set T0IE, clear T0IF

Inc(CONT)

Inc(Cont2)

IF Cont=1 THEN

PORTE.2=0

PORTE.1=0

PORTE.0=1

DELAY_US(5)

PORTD=CODIG7SEG(DIG1)

END IF

IF Cont=2 THEN

PORTE.0=0

PORTE.2=0

PORTE.1=1

DELAY_US(5)

PORTD=CODIG7SEG(DIG2)

END IF

IF Cont=3 THEN

PORTE.0=0

PORTE.1=0

PORTE.2=1

DELAY_US(5)

PORTD=CODIG7SEG(DIG3)

Cont=0

END IF

If Cont2=100 then

Tiempo=1

Cont2=0

End If

‘ Increment value of cnt on every interrupt

TMR0   = 245

INTCON = $A0           ‘ Set T0IE, clear T0IF

end sub

main:

OPTION_REG = $07       ‘ Assign prescaler to TMR0

ANSEL  = 0              ‘ Configure AN pins as digital I/O

ANSELH = 0

TRISB = 0               ‘ PORTB is output

TRISA=$01

TRISC = 0

TRISD = 0

TRISE=0

WPUB=$FF

TMR0  = 245              ‘ Timer0 initial value

INTCON = $A0           ‘ Enable TMRO interrupt

Cont=0

Cont2=0

DIG1=0

DIG2=0

DIG3=0

portA=0

PORTB=0

PORTC=0

PORTD=0

PORTE=0

numero=0

numeroLSB=0

numeroMSB=0

Sentido=0

Tiempo=0

Tecla=0

Salto=0

while(1)                    ‘ While there is no interrupt, program runs in endless loop:

INICIO:

ButtonA()

if Tecla=0  THEN

goto INICIO

END IF

REVISAR:

IF Tecla=1 THEN

IF ((Sentido=0 ) AND (Tecla=1) )then

goto  Decrementa

END IF

IF ((Sentido=1 ) AND (Tecla=1) )then

goto Incrementa

end if

else if salto=0 then

goto incrementa

else goto decrementa

end if

end if

Incrementa:

salto=0

Tecla=0

if Tiempo=1 then

if numero <999 then

Inc(numero)

end if

numeroLSB= lo(numero)

portB=numeroLSB

numeroMSB=Hi(numero)

portC=numeroMSB

DIG1= (numero / 100 )

DIG2= (numero / 10) mod 10

DIG3=  numero  mod 10

Tiempo=0

End If

ButtonA()

GOTO REVISAR

Decrementa:

salto=1

Tecla=0

if Tiempo=1 then

if numero>0 then

Dec(numero)

end if

numeroLSB= lo(numero)

portB=numeroLSB

numeroMSB=Hi(numero)

portC=numeroMSB

DIG1= (numero / 100 )

DIG2= (numero / 10) mod 10

DIG3=  numero  mod 10

Tiempo=0

End If

ButtonA()

GOTO REVISAR

wend

end.

Diseño de PCB

210

310

410