Tengo varios adaptadores de radio HM-TRP (que consisten en el chip HM-TRP con un encabezado hembra conectado) de la misma versión. Lo probé en un mini circuito donde la PC hace E / S directa con el adaptador HM-TRP. Ese circuito funciona porque cuando la PC comprueba los caracteres, tan pronto como enciendo el circuito, obtengo "HM-TRP-V02". en mi pantalla como se esperaba.
Ahora estoy tratando de lograr lo mismo con un microcontrolador (AT89S52) pero el primer byte no se detecta correctamente.
En ambas pruebas, todas las velocidades establecidas para el adaptador son 56Kbps
Este es mi fragmento de código relevante:
org 0h
ljmp init
org 03h ;put string near beginning so we can increment DPL instead of DPTR
;String we expect to see returned serially
hmtrpstrval:
db 'M-TRP-V02',00h ;Not sure if I should add the "H"
;returnable statuses
RADIOOK equ 0h ;Radio is OK
NORADIO equ 1h ;No radio or timeout
MFRADIO equ 2h ;Bad character: radio malfunction
checkradinit:
;setup pointer and make A=0 and R1=0
mov DPTR,#hmtrpstrval
clr A
mov R1,A
gnb:
mov R3,A ;Here, R3=0 and A=0. R3 is the delay counter
movc A,@A+DPTR ;Get data from address DPTR
jz exhmt ;If byte in = 0 then exit. we're ok.
wgb:
;Here we could stall for at least 65281 clocks
;(about 32mS) since crystal used is 22.1184Mhz
;but if ANY character is received, we process it
jbc RI,exsc
djnz R4,wgb
djnz R3,wgb
;here, more than 32mS passed which is way too long
;so assume we haven't received the character and
;exit
mov R5,#NORADIO
ret
exsc:
;See if incoming data matches byte
xrl A,SBUF
jnz hmerr
;The byte matches
inc DPL ;so we move to next character we expect to receive
mov R1,A ;and reset the chance counter explained below
sjmp gnb
hmerr:
;It doesn't but we give the radio up to 65534 more chances
;because it could have processed one byte without us knowing
clr A ;so make A=0 and read same code byte again
djnz R2,gnb
djnz R1,gnb
;Here, too many chances were given and at least the wrong set of characters
;were received so we return a radio fault
mov R5,#MFRADIO
ret
exhmt:
;here the valid string is received so we return OK.
mov R5,#RADIOOK
ret
init:
mov PCON,#80h ;set PCON.7 for speed trick. maybe turn off?
mov SCON,#50h ;enable serial port in mode 1
mov TMOD,#021h ;set timer 1 in mode 2 (auto reload)
mov TH1,#0FEh ;set reload values to 0FEh
mov TL1,#0FEh
setb TR1 ;start timer
lcall checkradinit
El condensador que alimenta directamente el módulo de radio HM-TRP tiene una clasificación electrolítica de 100uF a 16V.
Estoy publicando esta pregunta aquí porque estoy tratando de explicar el peor de los casos en la detección exitosa del adaptador. Actualmente está cableado en modo de datos (no en modo de configuración) y la única otra manera que puedo probarlo es tener un sistema remoto con el mismo adaptador para enviar datos, pero quiero evitar hacerlo en este momento.
¿Hay algo mejor que pueda hacer con mi código para que la prueba sea más confiable? Me preocupan más los tiempos de los personajes.
También verifiqué que el adaptador HM-TRP funciona porque lo volví a colocar en mi mini circuito y lo probé allí.
¿Mi lógica está bien con mi código? ¿O debería ser más indulgente y detectar solo la parte final de la cadena? o debo detectar la cadena completa? ¿Debe cambiarse TH1 o TL1 para una mejor alineación? ¿El 100uF es un valor de condensador incorrecto?
La configuración básica del oscilador para el micro es 22.1184Mhz de cristal con capacitores cerámicos de 33pF entre cada cable de cristal y tierra.
Por favor, hágamelo saber a dónde me voy mal.