В принципе, эта схема симулируется нормально - если посмотреть на график VSM Oscilloscope и покрутить частоту в генераторе "датчика холла", то можно увидеть изменения на графике - фронты импульсов сдвигаются относительно друг друга, меняется скважность.
Я, конечно, подробно то не копался в исходнике - многа букав. Но. В твоей схеме ошибка - порт RC7/RX контроллера не подключен к контакту RDX COM-порта, а ведь RC7 настроен на вход - регистр TRISC='10000000'. Поэтому нет приема информации с COM-порта. Это ж приемник USART.
В окне PIC CPU EEPROM Memory первые 5 и посление 2 регистра изменены (по умолчанию содержится FF), это и есть настройки. Чето только мало их.
В тексте дизассемблированного исходника нигде не встречается обращение к регистрам EEDATA и EEADR - именно через эти регистры идет чтение-запись EEPROM. Есть только в комментах предупреждение дизассемблера о проблемах при выборе банков. И в строчке постоянно указываются регистры PIR1 и PIE1 - регистры флагов и разрешений прерываний от перефирийных модулей. А они находятся в одинаковом месте, только в соседних банках. Вот это именно та фишка, что разрядность адреса памяти данных равна 7 бит, а два старших бита адреса - это биты выборы банка, задаваемые через специальныйй регистр STATUS.
ХА! Ошибка дизассемблера при декодировании гекс-файла! При переходах по строкам программы дизассемблер не учел биты RP0 и RP1.
В режиме пошаговой анимации можно уловить момент первого изменения содержимого регистров EEADR и EEDATA (адресa 10Dh и 10Ch). В строчке программы 11E0 (это адрес регистра памяти программ) - инициализуется первое чтение EEPROM!!! - инструкция "bsf EECON1, RD" в окне PIC CPU Registers, а в исходном коде значится операция с регистром PIR1. на скрение 1.jpg как раз указано.
С адреса 0х08 EEPROM (число в регистре EEADR) читается значение FF, затем оно передается в регистр 0х134 (строчка программы 11E5) - скрин 2.jpg.
Далее (11E7) - инкремент на 1 регистра EEADR (incf EEADR,F), читается следующий регистр EEPROM с адресом 0х09 и содержимое (опять FF) передается в регистр данных 0x135. Через некоторое время опять происходит чтение EEPROM.
movf EEDATA, W - это чтение в аккумулятор из регистра EEDATA. В дизассемблированном тексте стоит регистр PIR1.
Но читаются, в основном, "пустые" данные - значение FF - это по умолчанию.
Скорее всего, данные в EEPROM просто были некорректно записаны. (я уже писал про неподключенный порт RC7 приемо-передатчика).
Вобщем, это нужно "построчно" разгребать всю эту фигню, ибо дизассемблер много ерунды понаписал. Перепроверить все предупреждения о выборе банков - от этого меняется суть регистров. Я не смотрел дальше, куда там переправляются прочитанные данные из EEPROM-а и как они вообще в него попадают.
Логично, что порт RC7 работает как приемник USART (универсальный последовательный синхронный/асинхронный приемник-передатчик)

Причем, асинхронный, поскольку по регистр TXSTA ( 0х98 ) содержит число 24h, то есть бит SYNC = 0.
Скорость порта 9600 бит/с - значение регистра скорости SPRG (0x99) = 103 при установленном бите BRGH - high speed.
Прием разрешен, переполнения буфера нет - регистр RCSTA ( 0x18 ) = 90h, биты разрешения установлены.
Поэтому в протеусе скорость COM порта тоже выставляем в 9600 бит/с - иначе менеджер не подключается.
И если какие-то проблемы с записью EEPROM-а, вначале проверяем блок USART-а, правильно ли он работает.
Хотя, прочитать данные из контроллера получается! Но график УОЗ совершенно не похож на то, что должно быть. Смотрим картинку 3.jpg
Идем дальше. Пробуем записать теперь график.
О чудо - пишется! Данные в EEPROM изменяются аж до адреса 0x23 и последних два адреса тоже. Так что, все пучком. И он-лайн графики вычерчиваются. Смотри скрин 4.jpg
Вот теперь, учитывая твою первоначальную схему, можно точно сказать, что
проблема с записью была именно в отсутствии связи приемника USART с COM-портом.
Правда, я не знаю, чего там за ошибки в самом менеджере - это для спецов по двигателям. Возможно, просто изначально неправильные параметры в менеджере.
При считывании параметров PIC-а из менеджера правильно считываются записанные в него параметры, а вот при считывании записанного графика УОЗ - ерунда получается.
Я еще без понятия, что такое ДАД (? датчик детонации? или че?) и какой там должен быть сигнал.
|
Цитата:
|
|
по предворительным подсчетам объема EEPROM должно хватить. Почему такая реализация непонятно мне, возможно я ошибся в расчетах объема EEPROM.
|
Данный контроллер
PIC16F876A имеет 256 байт EEPROM - а это максимально возможный объем в контроллерах данной серии. Связано это с разрядностью адресации EEPROM - только 8 бит, поскольку адресация идет косвенная, через регистры данных.
Вообще, если уж и интересоваться работой EEPROM, то реализация этого в контроллера такая:
регистры EEPROM не имеют отображения в адресное пространство данных. По-простому говоря, у них нет собственных адресов. Поэтому запись и чтение EEPROM выполняется через регистры специального назначения, реализованные физически в памяти данных. Это регистры EEADR и EEDATA. Адреса в памяти данных - 10Dh и 10Ch соответственно. (буква h говорит о том, что число записано в 16-ричной системе, если ты еще не в курсе. Так же может встретиться запись 0x10D - это одно и то же)
Через регистр EEADR (адрес 10Dh) выбирается адрес регистра EEPROM, с которым будем производить операции чтения или записи. То есть, например, двоичное число 00000011 в регистре EEDATA будет указывать на внутренний адрес 03h в блоке регистров EEPROM. В окне PIC CPU EEPROM Memory можно увидеть содержимое всех регистров EEPROM.
Регистр EEDATA (адрес 10Ch) будет содержать данные, подлежащие записи в регистр EEPROM, либо прочитанные из регистра EEPROM. Сами операции чтения или записи будут совершаться посредством специальной команды инициализации. Попросту говоря, есть еще один управляющий регистр специального назначения EECON1 (адрес 18Ch). Установка "1" в битах RD и RW будет запускать операцию чтения или записи соответственно.
То есть, операция чтения EEPROM будет состоять из нескольких шагов - записываем в EEADR число, соответствующее нужному нам адресу регистра EEPROM, затем устанавливаем в "1" бит RD в регистре EECON1 и после читаем регистр EEDATA. При обращении к регистру EECON1 не забываем, что он находится в четвертом банке, а EEADR и EEDATA - в третьем, следовательно, необходимо своевременно устанавливать и сбрасывать биты RP0 и RP1 в регистре STATUS.
Запись в EEPROM выполняется почти так же - в EEADR заносится адрес регистра EEPROM, в EEDATA - то, что нужно записать. А вот дальше есть ряд обязательных команд - сначала разрешить вообще запись в EEPROM (если она ранее не была разрешена) установкой бита WREN в регистре EECON1, затем проделать последовательно операции записи чисел 55h и AAh в регистр EECON2 - это не физический регистр (не имеет адреса), но используется для программной защиты от случайной перезаписи EEPROM. Типа как "вы точно уверены, что хотите удалить папку Windows?" - "Да!" - "А почему?" - "Покачану!"

Так же, желательно глобально запрещать прерывания (если они используются в проге) перед началом операци записи.
Вооот, все это должно присутствовать в программе, если ведется работа с EEPROM.
И как видно, размера EEPROM этого контроллера хватает с лихвой.