0 / 0 / 0
Регистрация: 04.05.2023
Сообщений: 8
|
||||||
1 | ||||||
[МК51] Как в программу добавить проверку контрольной суммы (ассемблер)28.11.2023, 15:27. Показов 642. Ответов 7
Метки нет (Все метки)
Как в программу добывить проверку контрольной суммы.
7 6 5 4 3 2 1 0 SM0 SM1 SM2 REN TB8 RB8 TI RI
0
|
28.11.2023, 15:27 | |
Ответы с готовыми решениями:
7
Ассемблер на мк51 Загрузка и хранение файлов: имеет ли смысл добавить столбец контрольной суммы файла? Создать программу на проверку логической микросхемы в ассемблер 8086 Ассемблер и МК51! Завал с курсовым проектом!!!! [МК51] программа генерации синусоидального сигнала переменной частоты (ассемблер) |
Модератор
1188 / 627 / 283
Регистрация: 10.11.2019
Сообщений: 1,322
|
||||||||||||||||||||||||||||||||||||
28.11.2023, 16:03 | 2 | |||||||||||||||||||||||||||||||||||
Вывод байта через последовательный порт, или проклятые 3 команды.
Как ПРАВИЛЬНО работать с последовательным портом и как НЕ надо с ним работать. 1) Неработающий вариант:
На самом деле, флаг TI означает не "буфер передачи пустой", а "закончена передача байта из буфера" и соответственно надо сначала записать в SBUF байт, а уж потом дожидаться установки TI. Обходной вариант устранения ошибки: установить TI принудительно (setb TI) "где-то в начале программы" в подпрограмме инициализации порта, чтобы добиться передачи первого байта. А дальше "всё пойдет нормально". Весьма неудачный подход, в результате которого в работающей программе порт "самым загадочным образом" отключается намертво. Эта ошибка как оказалось, была допущена в ранних руководствах самой Intel (причем логика работы последовательного порта была описана правильно). Потом Intel спохватились и "исправили" (?) ошибку, но было уже поздно - ошибку растиражировали перепечатками и переводами. Я думаю, что это реально главная проблема начинающих программистов на 51 контроллере, которые берут "описание" с таким советом. (кстати, без единого намёка, что это перевод с документации Intel и без единой собственной мысли). 2) Вариант 2, "усовершенствован Intel", но работает не всегда. Код работает правильно, только если прерывание UART запрещено, либо прерывание UART разрешено, но имеет самый низкий приоритет из разрешенных (как в 8051 по умолчанию):
Предположим, мы используем _ввод_ байт через последовательный порт по прерываниям, причем программа обработки выглядит как:
Предположим теперь, что у нас есть прерывание с более _низким_ приоритетом, чем прерывание последовательного порта, причем оно разрешено. Например, в 8052 процессорах прерывание Таймера 2 имеет более низкий приоритет. Или приоритет последовательного порта принудительно установлен в высокий. Возникает такая ситуация. Мы обращаемся к C_OUT2, в результате чего контроллер довольно долго стоит в цикле ожидания
В это время "совершенно случайно" приходит прерывание от таймера 2:
Поскольку прерывание UART разрешено, то оно тут же выполняется. Но т к оно не сбрасывает TI, то происходит такая вещь. Как только идет reti из подпрограммы прерывания UART в подпрограмму timer2_int, то выполняется ровно 1 команда из подпрограммы timer2_int, после чего опять возникает serial_int и т д. Т е в результате процесс выполнения timer2_int затягивается в десятки раз, потому что каждая команда timer2_int (начиная со случайного адреса) будет сопровождаться вызовом и возвратом serial_int До того, как проклятый код наконец не достигнет
но если прерывание Таймера 2 управляет аппаратурой, то "что-то начинает дёргаться". Причем и последовательный порт вполне естественно "сбоит". 3) Вариант 3, неплохой (?) Работает правильно, только если прерывание UART разрешено:
флаг. Мораль: оказывается, работа UART по прерываниям и без - это принципиально разные режимы. Программа обработки прерываний должна _всегда_ явно сбрасывать биты RI и TI, если они установлены. Т е если Вы вдруг задумали перевести чтение байт из UART "с опроса бита состояния на работу по прерываниям", или наоборот, то нужно соответственно поменять и программу записи байт в порт. Это кажется настолько очевидным ... настолько, что об этом никто не знает ?
0
|
0 / 0 / 0
Регистрация: 04.05.2023
Сообщений: 8
|
|
28.11.2023, 16:49 [ТС] | 3 |
А если сделать так: сумируем передаваемые числа, их инвертируем, а затем сумируем с суммой полученных данных и получаем ноль. Это значит что данные переданы верно.
Вопрос? А как записать это в эту программу. Просто непонятно.
0
|
Модератор
1188 / 627 / 283
Регистрация: 10.11.2019
Сообщений: 1,322
|
||||||
28.11.2023, 17:19 | 4 | |||||
Ваша первая задача - исправить приём и передачу символов и программу обработки прерывания.
Сейчас программа в целом - не рабочая. Допустим, мы вычислили контрольную сумму строки и поместили ее в байт с адресом 30h Тогда нам после выдачи строки в порт надо добавить две цифры контрольной суммы - примерно так:
Напишите также, на чём Вы пишите программу и как отлаживаете.
0
|
0 / 0 / 0
Регистрация: 04.05.2023
Сообщений: 8
|
|
28.11.2023, 21:15 [ТС] | 5 |
Пишу программу на ассемблере для микроконтроллера мк51 (8051). ОТЛАЖИВАЮ В KeiluVision
0
|
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,048
|
|
29.11.2023, 09:56 | 6 |
Непонятно каков механизм того, что порт отключается намертво в этом случае (предполагается, что прерывания запрещены).
0
|
Модератор
1188 / 627 / 283
Регистрация: 10.11.2019
Сообщений: 1,322
|
|
29.11.2023, 15:26 | 7 |
На самом деле, как раз желательно сделать чтение по прерываниям.
Т к при этом меньше возможности потерять байты при приёме. Я занимался разработкой чековых принтеров, и там вполне естественно требовалось обеспечить приём данных по прерываниям в то время, пока принтер печатает строку. Но при этом и возникали те проблемы, о которых я писал выше.
0
|
Модератор
1188 / 627 / 283
Регистрация: 10.11.2019
Сообщений: 1,322
|
||||||
29.11.2023, 19:00 | 8 | |||||
Вот пример программы, которая работает с com портом
и вычисляет контрольную сумму введённой строки (см аттач с проектом) csum.uv2 - запускаемый проект Keil (Keil 7.03) В Keil: Компилировать программу Запустить отладчик (Start-Stop Debug Session) Открыть окно View/Serial Window #1 Запустить программу (F5) При этом программа отладчика работает как терминал, т е можно вводить с клавиатуры строку и наблюдать результат. Точно так же программа должна работать на реальной схеме МК, подключённой к компьютеру через программу - терминал. (Но не забудьте, что программа использует память xdata)
0
|
29.11.2023, 19:00 | |
29.11.2023, 19:00 | |
Помогаю со студенческими работами здесь
8
[МК51] Сложение двух 4-байтных чисел в BCD-коде (ассемблер) МК51 (аналог intel 8051): как добавить бит четности? Добавить проверку в программу на простые числа, чтобы программа работала как прежде без ошибок МК51 Программа формирования ШИМ сигнала с пилообразным изменением коэффициента заполнения (Ассемблер) Написать программу, которая должна проверять правильность контрольной суммы и выводить отчёт Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |