Я пытаюсь выяснить, какой алгоритм лучше использовать, чтобы мой клиентский микроконтроллер (8051) автоматически синхронизировал его UART с главным микроконтроллером (также 8051), чтобы обеспечить связь. Узким местом является то, что уартс может содержать только один байт. Микроконтроллеры на самом деле AT89S52, поэтому каждая инструкция выполняется за 1/2-1 микросекунды, так как я использую кристаллы 22.1184 МГц с конденсаторами NPO 33 пФ.
Это код, который у меня пока есть. P3.0 - это вывод приема на микроконтроллере (куда входят биты данных).
Последние четыре строки кода настраивают последовательный порт, чтобы я мог использовать программные прерывания.
Значение для SPEED - это вычисленное число на 8051, которое определяет скорость передачи. Я использую значение 0FDh, потому что скорость UART составляет 38,4 Кбит / с. Калькулятор скорости передачи keil - это то, что я использую для лучшего определения значения SPEED.
redosync:
jb P3.0,$ ;scan line twice to see if line is low (is this enough times?)
jb P3.0,$
;Wait for the time of 8 bytes
mov TH1,#((256 - SPEED) * 8)
w:
mov ACC,#06h
djnz ACC,$
djnz TL1,w
;check end byte twice to see if its a 1
;if in any check its not a 1, then start the sync all over again
jnb P3.0,redosync
jnb P3.0,redosync
;Here the UART is in sync so set it up
mov TL1,#SPEED
mov PCON,#80h
mov SCON,#50h
setb TR1
Я на правильном пути с моей идеей синхронизации? Если так, то я сканирую биты достаточно раз? И все ли улучшилось бы, если бы я изменил данные?
В настоящее время формат данных выглядит следующим образом:
ffh, ffh для начальных байтов 15 байтов необработанных данных, а затем 1 байт, представляющий контрольную сумму из 15 байтов