[/code];**************************************************************************************************************************
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<----- Proyecto: LECTOR RFID 125Khz.64bits ----->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;**************************************************************************************************************************
;**************************************************************************************************************************
;incluir archivo con asociacion entre etiqueta/nombre y las direcciones de los registros asociados al microcontrolador.
;**************************************************************************************************************************
$Include 'JL8REG.INC' ;
;**************************************************************************************************************************
; definicion de origenes de las memorias a utilizar
;**************************************************************************************************************************
RAMstart EQU $0060
FLASHROMstart EQU $DC00
VECTORstart EQU $FFDE
EN equ 0
RS equ 1
;**************************************************************************************************************************
; especificacion de inicio de la RAM
;**************************************************************************************************************************
ORG RAMstart
;**************************************************************************************************************************
;especificacion del inicio del programa, que se almacena en la ROM, a partir de las direcciones indicadamo
;**************************************************************************************************************************
ORG FLASHROMstart
;**************************************************************************************************************************
;subrutinas:
;**************************************************************************************************************************
;----------------------------------------------------------------<< retardo gral >>-------------------------------------------
retardo: mov #$ff,$00d3 ;01 en posicion 0082.
lazo2: mov #$ff,$00d4 ;0f en posicion 0083.
lazo: dec $00d4 ;decremento 0083.
bne lazo ;unto distinto de 0.
dec $00d3 ;decremento 0082.
bne lazo2 ;pregunto distinto de 0.
rts ;sale.
;---------------------------------------------------------------<<retardo del LCD >>------------------------------------------
retardo_lcd: lda #$0a ;
sta $00b7 ;
lazo4: lda #$0f ;
sta $00b8 ;
lazo3: dec $00b8 ;
bne lazo3 ;
dec $00b7 ;
bne lazo4 ;
rts ;
;------------------------------------------------------------<< rutina de enable (LCD) >>------------------------------------------
enable: bset EN,PORTA ;
jsr retardo_lcd ;
bclr EN,PORTA ;
jsr retardo_lcd ;
rts ;
;-------------------------------------------------------------<< inicializacion del LCD >>----------------------------------------
Inicializacion:
jsr retardo_lcd ;
bclr RS,PORTA ;rs=0 (control)
mov #$38,PORTB ;38
jsr enable ;
mov #$38,PORTB ;38
jsr enable ;
mov #$0c,PORTB ;06
jsr enable ;
mov #$06,PORTB ;0E
jsr enable ;
rts ;
;-----------------------------------------------------------<< 1º frase "esperando tarjeta" >>------------------------------
primera_frase: bclr EN,PORTA ;por si el enable esta activado.
bclr RS,PORTA ;rs=0(comando).
mov #$01,PORTB ;limpia display.
jsr enable ;enable
bset RS,PORTA ;rs=1 (datos).
jsr retardo_lcd
jsr retardo_lcd
mov #'E',PORTB ;e
jsr enable ;
mov #'s',PORTB ;s
jsr enable ;
mov #'p',PORTB ;p
jsr enable ;
mov #'e',PORTB ;E
jsr enable ;
mov #'r',PORTB ;r
jsr enable ;
mov #'a',PORTB ;a
jsr enable ;
mov #'n',PORTB ;n
jsr enable ;
mov #'d',PORTB ;d
jsr enable ;
mov #'o',PORTB ;o
jsr enable ;
bclr RS,PORTA ;rs=0(comando).
mov #$A8,PORTB ;2º linea.
jsr enable ;
bset RS,PORTA ;rs=1(dato).
mov #'t',PORTB ;t
jsr enable ;
mov #'a',PORTB ;a
jsr enable ;
mov #'r',PORTB ;r
jsr enable ;
mov #'j',PORTB ;j
jsr enable ;
mov #'e',PORTB ;e
jsr enable ;
mov #'t',PORTB ;t
jsr enable ;
mov #'a',PORTB ;a
jsr enable ;
mov #'.',PORTB ;.
jsr enable ;
mov #'.',PORTB ;.
jsr enable ;
mov #'.',PORTB ;.
jsr enable ;
rts
;**************************************************************************************************************************
;configuracion de registros,CONFIG1-COP-
;**************************************************************************************************************************
init: mov #$01,config1 ;desahabilito el watchdog.
init2: bset 1,intscr ;desabilito irq por pin.
mov #$ff,DDRA ;define al puertob como salidas.
mov #$ff,DDRB ;define al puertob como entradas.
mov #$fc,DDRD ;uso para el timmer.
clrx ;limpio x.
clra ;limpio a.
clr porta ;
clr portb ;
cli ;hactivo irqs.
jsr inicializacion ;
jsr primera_frase ;
;-----------------------------------------------------<< registros gral. >>------------------------------------------------
mov #$01,$0060 ;15 pulsos(ideal son 16).
clr $0061 ;10 o 01 posibles valores.
clr $0062 ;2 muestras x bit.
clr $0063 ;bandera de bit leido.
clr $0064 ;badera de primer 1 de sincronizacion.
clr $0065 ;contador de los nueve "1" seguidos-sincronizado.
clr $0066 ;dato=1 o dato=0.
clr $0067 ;bandera de sincronismo completo(=1).
clr $0068 ;flag de, primer dato valido q se guarda.
mov #$37,$0069 ;64-9=55 bit de datos validos.
clr $006a ;"1" o "0" a transmitir.
clr $006b ;
ldx #$71 ;
mov #$0b,$00b2 ;
mov #$05,$00b3 ;
bclr 1,intscr ;
;-----------------------------------------------------<< config Timmer >>--------------------------------------------------
clr T1SC ;prendo el contador y el prescaler.
mov #$4c,T1sc0 ;activo interrupciones y digo q lo uso como input capture por flanco ascendente.
mov #$ff,tmodh ;si o si tengo q cargar los 2 reg porq sino no activa la bandera TOF.
mov #$ff,tmodl ;si o si tengo q cargar los 2 reg porq sino no activa la bandera TOF.
clr TICH0H ; limpio el registro del timer 0 alto.
clr T1CH0l ; limpio el registro del timer 0 bajo.
;-----------------------------------------------------<< config SCI >>-----------------------------------------------------
mov #$40,SCC1 ;habilito el SCI-transmision serial.
clr scc2 ;habilito solo la transmision de datos.
mov #$02,SCBR ;seleccione el prescaler y el div de baud para 9600 baudios
;**************************************************************************************************************************
;Programa principal
;**************************************************************************************************************************
;-----------------------------------------------------<< bucle principal >>------------------------------------------------
main: brset 0,$0063,bit_leido ;obtencion del bit.
jmp main;
;-----------------------------------------------------<< averiguo si el dato es "1" "0" o invalido >>----------------------
bit_leido: clr $0063 ;
lda $0061 ;condicion de uno.
cbeqa #$01,bit_uno ;
cbeqa #$02,bit_cero ;
clr $0065 ;cant de "1" seguidos.
clr $0064 ;pox uno sra el primer dato a guardar.
jmp main ;
bit_uno: bset 0,$0066 ;dato=1.
jmp proceso ;
bit_cero: clr $0066 ;dato=0.
;-------------------------------------------------<< comprobando los 9 "1" de sincronizacion >>-----------------------------
proceso: brset 0,$0067,mem_dato ;pregunto x la sincronizacion.
brset 0,$0066,sigue ;si es un cero reseteo contadores y vuelvo al main.
clr $0065 ;cant de "1" seguidos.
clr $0064 ;pox uno sra el primer dato a guardar.
mov $1b,$0060 ;
ldx #$71 ;
jmp main ;
sigue: mov $0066,x+ ;ya habia mas de un 1 guardado.
inc $0065 ;contador de secuencia de 9-"1".
lda $0065 ;
cbeqa #$09,sincronizado
jmp main ;
sincronizado: bset 0,$0067 ;bandera de sincronismo completo.
mov #$1a,$0060
ldx #$7A
jmp main ;
;-----------------------------------------------------------<< almaceno datos >>-----------------------------------------------
mem_dato: mov $0066,x+ ;cargo el dato al siguiente espacio de memoria.
dbnz $0069,main ;
jmp par ;ya se leyeron todos los bits y los transmito.
;-----------------------------------------------------------<< comprabacion de pariedad >>------------------------------------------
par: bset 1,intscr ;desabilito irq por pin.
mov #$0c,T1sc0 ;
ldx #$79
pariedad: incx
clra
dbnz $00b2,preg1 ;contador de 10 filas
jmp pariedad2
preg1: dbnz $00b3,preg12 ;contador de 4bits de datos
mov #$05,$00b3 ;4bits a sumar
sta $00b4 ;numero a preg su pariedad
brset 0,$00b4,inpar
clr $00b5
jmp comparo
inpar: bset 0,$00b5;
comparo: lda $00b5
cmp ,x
beq pariedad
jmp init2
preg12: add ,x
incx
jmp preg1
pariedad2: mov #$05,$00b2
mov #$0b,$00b3
mov #$79,$00b6
columna: inc $00b6
ldx $00b6
clra
dbnz $00b2,preg2 ;contador de 4 columnas
jmp corro
preg2: dbnz $00b3,preg22 ;contador de 10bits de datos
mov #$0b,$00b3 ;4bits a sumar
sta $00b4 ;numero a preg su pariedad
brset 0,$00b4,inpar2
clr $00b5
jmp comparo2
inpar2: bset 0,$00b5;
comparo2: lda $00b5
cmp ,x
beq columna
jmp init2
preg22: add ,x
incx
incx
incx
incx
incx
jmp preg2
;--------------------------------------------------------<< datos en grupos de 4 bits >>--------------------------------
corro: bclr RS,PORTA ;rs=0(comando).
mov #$01,PORTB ;clear.
jsr enable ;
bset RS,PORTA ;rs=1(dato).
mov #$c8,$00c1 ;apartir de c8 guardo los datos fianles
mov #$7a,$00c3 ;c4 variabla para guerdar x
mov #$04,$00c0
mov #$0C,$00c2 ;10 grupos a leer
clra
ldx $00c3
add ,x
incx
stx $00c3
corro2: dbnz $00c2,corro_loop
jmp serie
corro_loop: dbnz $00c0,desplazo ;loop de 4 bits x grupo
ldx $00c1 ;
sta ,x
incx ;
stx $00c1 ;4bits ya movidos
mov #$04,$00c0 ;
inc $00c3 ;
clra
ldx $00c3
add ,x
inc $00c3
jmp corro2
desplazo: ldx $00c3
asla
add ,x
incx
stx $00c3
jmp corro_loop
;---------------------------------------------------------<< transmision serial >>------------------------------------------------
serie:
mov #$d7,$00d5
bset 3,SCC2 ;
mov #$c8,$00d6
mov #$0A,$0069 ;cargo la cantidad de datos a transmitir(55bits).
sci: brset 7,SCs1,loop ;pregunto si ya se puede transmitir otro dato.
jmp sci ;vuelve al bucle.
loop: ldx $00d6
mov x+,$006a ;muevo a otro espacio de mem el dato a transmitir.
stx $00d6
lda $006a ;condicion de uno.
cbeqa #$00,cero ;
cbeqa #$01,uno ;pregunto si es un "0" o "1".
cbeqa #$02,dos ;
cbeqa #$03,tres ;
cbeqa #$04,cuatro ;
cbeqa #$05,cinco ;
cbeqa #$06,seis ;
cbeqa #$07,siete ;
cbeqa #$08,ocho ;
cbeqa #$09,nueve ;
cbeqa #$0a,a ;
cbeqa #$0b,b ;
cbeqa #$0c,c ;
cbeqa #$0d,d ;
cbeqa #$0e,e ;
cbeqa #$0f,f ;
siete: jmp siete1
ocho: jmp ocho1
nueve: jmp nueve1
a: jmp a1 ;
b: jmp b1
c: jmp c1
d: jmp d1
e: jmp e1
f: jmp f1
cero: mov #'0',$006a ;cargo el dato "0" en ascci en la memoria.
ldx $00d5
mov $006a,x+
stx $00d5
jmp loop2 ;
uno: mov #'1',$006a ;cargo el dato "1" en ascci en la memoria.
ldx $00d5
mov $006a,x+
stx $00d5
jmp loop2
dos: mov #'2',$006a ;cargo el dato "2" en ascci en la memoria.
ldx $00d5
mov $006a,x+
stx $00d5
jmp loop2
tres: mov #'3',$006a ;cargo el dato "3" en ascci en la memoria.
ldx $00d5
mov $006a,x+
stx $00d5
jmp loop2
cuatro: mov #'4',$006a ;cargo el dato "4" en ascci en la memoria.
ldx $00d5
mov $006a,x+
stx $00d5
jmp loop2
cinco: mov #'5',$006a ;cargo el dato "5" en ascci en la memoria.
ldx $00d5
mov $006a,x+
stx $00d5
jmp loop2
seis: mov #'6',$006a ;cargo el dato "6" en ascci en la memoria.
ldx $00d5
mov $006a,x+
stx $00d5
jmp loop2
siete1: mov #'7',$006a ;cargo el dato "7" en ascci en la memoria.
ldx $00d5
mov $006a,x+
stx $00d5
jmp loop2
ocho1: mov #'8',$006a ;cargo el dato "8" en ascci en la memoria.
ldx $00d5
mov $006a,x+
stx $00d5
jmp loop2
nueve1: mov #'9',$006a ;cargo el dato "9" en ascci en la memoria.
ldx $00d5
mov $006a,x+
stx $00d5
jmp loop2
a1: mov #'A',$006a ;cargo el dato "a" en ascci en la memoria.
ldx $00d5
mov $006a,x+
stx $00d5
jmp loop2
b1: mov #'B',$006a ;cargo el dato "b" en ascci en la memoria.
ldx $00d5
mov $006a,x+
stx $00d5
jmp loop2
c1: mov #'C',$006a ;cargo el dato "c" en ascci en la memoria.
ldx $00d5
mov $006a,x+
stx $00d5
jmp loop2
d1: mov #'D',$006a ;cargo el dato "d" en ascci en la memoria.
ldx $00d5
mov $006a,x+
stx $00d5
jmp loop2
e1: mov #'E',$006a ;cargo el dato "e" en ascci en la memoria.
jmp loop2
f1: mov #'F',$006a ;cargo el dato "f" en ascci en la memoria.
ldx $00d5
mov $006a,x+
stx $00d5
loop2: mov $006a,scdr ;muevo al dato a transmitir al registro de datos del modulo sci.
dec $0069 ;decremento la cantidad de datos a transmitir.
beq LCD ;si se transmitieron todos los datos termina el prog.
jmp sci ;sino vuelve al bucle.
;----------------------------------------------------------------<< LCD >>--------------------------------------------------
LCD: bclr RS,PORTA ;rs=0(comando).
mov #$01,PORTB ;clear.
jsr enable ;
bset RS,PORTA ;rs=1(dato).
jsr enable
ldx #$d7
mov #$0a,$00e3
loop_lcd: mov x+,portb
jsr enable
dbnz $00e3,loop_lcd
jmp fin
;----------------------------------------------------------<< fin del programa >>--------------------------------------------
fin: jsr retardo ;espero un tiempo antes de volver a leer la tarjeta.
jsr retardo
jsr retardo
jsr retardo
loop_fin: brclr 0,portd,*
jmp init2 ;comienza todo el proceso nuevamente
;***************************************************************************************************************************
;INTERRUPCIONES:
;***************************************************************************************************************************
;---------------------------------------------<< IRQ por pin (la mas importante) >>-----------------------------------------
PIN_IRQ: dbnz $0060,vuelvo ;
jmp preg_bit ;
vuelvo: rti ;
preg_bit: inc $0062 ;
lda $0062 ;2 muestras.
cbeqa #$02,seg_muestra ;
brset 1,portd,primer_uno ;pregunto el estado de la pata.
clr $0061 ;registro de datos.
mov #$22,$0060 ;16 pulsos.
rti ;
primer_uno: bset 0,$0061 ;registro de datos.
mov #$22,$0060 ;16 pulsos.
rti ;
seg_muestra: brset 1,portd,seg_uno ;
bclr 1,$0061 ;registro de datos.
mov #$22,$0060 ;16 pulsos.
clr $0062 ;1º o 2º muestra lo uso.
bset 0,$0063 ;bandera de bit leido.
rti ;
seg_uno: bset 1,$0061 ;registro de datos.
mov #$22,$0060 ;16 pulsos.
clr $0062 ;1º o 2º muestra lo uso.
bset 0,$0063 ;bandera de bit leido.
rti
;-----------------------------------------------------------<< IRQ de timmer >>----------------------------------------------
timmer_irq: bclr 7,T1sc0 ;deshabilito las irq por flanco.
mov #$01,$0060;
rti ;
;-----------------------------------------------------------<< IRQ de indeseadas >>-----------------------------------------------------
error_irq: ;IRQ por si se produce un irq no deseada.
rti; ;termina la irq.
;*****************************************************************************************************************************
;asignacion de saltos para cada vector
;****************************************************************************************************************************
org VectorStart
dw error_irq ; ADC Conversion Complete Vector
dw error_irq ; Keyboard Vector
dw error_irq ; (No Vector Assigned $FFE2-$FFE3)
dw error_irq ; (No Vector Assigned $FFE4-$FFE5)
dw error_irq ; (No Vector Assigned $FFE6-$FFE7)
dw error_irq ; (No Vector Assigned $FFE8-$FFE9)
dw error_irq ; (No Vector Assigned $FFEA-$FFEB)
dw error_irq ; (No Vector Assigned $FFEC-$FFED)
dw error_irq ; (No Vector Assigned $FFEE-$FFEF)
dw error_irq ; (No Vector Assigned $FFF0-$FFF1)
dw error_irq ; TIM1 Overflow Vector
dw error_irq ; TIM1 Channel 1 Vector
dw Timmer_irq ; TIM1 Channel 0 Vector
dw error_irq ; (No Vector Assigned $FFF8-$FFF9)
dw PIN_IRQ ; ~IRQ1
dw error_irq ; SWI Vector
dw init ; Reset Vector[code=plain]