Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2018-ноя-15 06:55

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 32 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: 2011-июл-27 14:38 
Не в сети

Зарегистрирован: 2010-дек-13 13:49
Сообщения: 15
Lew писал(а):
for(RAM[iij]=0x41;RAM[iij]<=0x4f;RAM[iij]++)
-это сильно. Возможно, компилятор тут что-то не понял.
Используйте локальную переменную.

Это строка
Код:
for(RAM[iij]=0x41;RAM[iij]<=0x4f;RAM[iij]++)
только для того, чтобы проверить(выявить) как работает контроллер с массивами при прерывании. Ещё нужно отметить, что тот же эффект, наблюдается когда в обработчике вот эта функция
Код:
void uart1_RX(void) //короче, операции со структурой
{
  com1.in_buf[com1.rx_lseek_wr] = RCREG1;
  com1.rx_lseek_wr++;     
  if(com1.rx_lseek_wr >= sizeof(com1.in_buf))
  com1.rx_lseek_wr = 0;           
}
. Когда её нет(закомент.), то всё нормально. В итоге вопрос, что их объединяет, заглянул в main.asm ___
Код:
;     PORTC=RAM[iij];//iij;
m362    MOVLW 46
        ADDWF iij,W
        MOVWF FSR0
        MOVFP INDF0,WREG
        MOVLB 1
        MOVWF PORTC

короче, операции со структурой
и вот ещё
Код:
    ;void uart1_RX(void)
                        ;{
uart1_RX
                        ;  com1.in_buf[com1.rx_lseek_wr] = RCREG1;
        MOVLW 59
        ADDWF com1+108,W
        MOVWF FSR0
        MOVFP RCREG1,INDF0
                        ;   com1.rx_lseek_wr++;     
        INCF  com1+108,1
                        ;   if(com1.rx_lseek_wr >= sizeof(com1.in_buf))
        MOVLW 40
        CPFSLT com1+108
                        ;            com1.rx_lseek_wr = 0;           
        CLRF  com1+108,1
                        ;}
        RETURN


1. Почему работа с регистрами косвенной адресации (FSR0,INDF0) как-то влияет на данные в ОЗУ(при прерываниии)?
2. Может компиоятор тут и не понял что-то в коде, но как его правильно настроить?
3. Как правильно временно запрещать и разрешать прерывания по UARTу в коде?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 2011-июл-27 17:50 
Не в сети

Зарегистрирован: 2009-май-25 15:07
Сообщения: 158
Откуда: АО "ПКК Миландр"
insert103 писал(а):
1. Почему работа с регистрами косвенной адресации (FSR0,INDF0) как-то влияет на данные в ОЗУ(при прерываниии)?
2. Может компиоятор тут и не понял что-то в коде, но как его правильно настроить?
3. Как правильно временно запрещать и разрешать прерывания по UARTу в коде?

1. Так делать нельзя: #asm MOVFP TBLPTRH, sTBLPTRH
Надо писать sTBLPTRH = TBLPTRH;
Компилятор сам определит MOVPF или MOVFP.
2. Сохранять PRODL и PRODH бессмысленно, так как они только для чтения.
3. Запретить прерывания можно многими способами: битами GLINTD, PEIE..
Конкретно для UART: TX1IE = 0; RC1IE = 0;
4. СС7А это подмножество языка С и еще в стадии тестирования, поэтому старайтесь не злоупотреблять сложными структурами данных и труднопонимаемыми выражениями.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2011-сен-30 14:05 
Не в сети

Зарегистрирован: 2011-май-26 07:22
Сообщения: 16
Доброго времени суток! Прошу помочь понять в чем заключается ошибка. Запись слова в память программ производится функцией Write_FLASH. Запись производится, но иногда с ошибкой - записывается другое значение (не то, которое передавалось в качестве аргумента в функцию). Завершение "длинной записи" производится как в примере Eval8_WRFlash - по таймеру TMR3, период переполнения которого составляет 500мкс (как по документации). WDT во время записи не переполняется. Если функция написана правильно, то в чем может быть дело :?: Спасибо.



/*******************************************************
* Функция: void Write_FLASH(int16 Address, int16 Data)
* Производит запись во внутреннюю память программ.
* Аргументы: Адрес записи, записываемые данные.
* Возвращаемое значение: нет.
* Примечание: Используется напряжение программирования на MCLR.
*******************************************************/
void Write_FLASH(int16 Address, int16 Data)
{
GLINTD = 1; //Запрет всех прерываний.
PIE1 = 0;
PIE2 = 0;
//Подача напряжения программирования Upp/MCLR = +12В на вывод RA3.
PORTA_Temp = PORTA;
PORTA_Temp.3 = UPP_ON;
PORTA = PORTA_Temp;
TMR3L = 0;
TMR3H = 0;
//Пауза для завершения переходного процесса установки напряжения Upp/MCLR - 12В.
nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();
nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();
clrwdt(); //СБРОС WDT.
WRDIV = (5*20); //Коэффициент деления частоты генератора. Определяет длительность импульсов
// записи во Flash. Здесь 20 - частота кварцевого генератора.

//Предустанавливаем регистр периода таймера TMR3 в значение 500мкс.
PR3H = 0x07; // 0,0005/(20МГц/4) = 0x07D0.
PR3L = 0xD0;

TBLPTRL = Address.low8; //Установка младшего байта адреса.
TBLPTRH = Address.high8; //Установка старшего байта адреса.

PEIE = 1;
TMR3IF = 0;
TMR3IE = 1;
TMR3ON = 1;
//Запись старшего, а затем младшего байта.

writeH(Data.high8); //Загрузка старшего байта данных в защелку. (tlwt 1, ucDataH)
writeLU(Data.low8); //Загрузка младшего байта данных в табличную защелку. (tablwt 0, 0,ucDataL)

clrwdt(); //СБРОС WDT.
TMR3ON = 0;
TMR3IE = 0;
TMR3IF = 0;
//PEIE нельзя сбрасывать, т.к. остальные прерывания не должны быть запрещены.
//Снятие напряжения программирования.
PORTA_Temp = PORTA;
PORTA_Temp.3 = UPP_OFF;
PORTA = PORTA_Temp;
//Пауза для завершения спада напряжения +12В.
nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();
nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();
nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();
//Восстановление регистров PIE1, PIE2.
PIE1 = 0b00110000; //Разрешены прерывания по достижению 16-битного таймера TMR1 значений в регистрах PR1 и PR2.
PIE2 = 0;
clrwdt(); //СБРОС WDT.
GLINTD = 0; //Разрешение всех немаскированных прерываний.
}

_________________
#include <brain.h>


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2011-сен-30 15:18 
Не в сети

Зарегистрирован: 2009-май-25 15:07
Сообщения: 158
Откуда: АО "ПКК Миландр"
Igor писал(а):
Доброго времени суток! Прошу помочь понять в чем заключается ошибка. Запись слова в память программ производится функцией Write_FLASH. Запись производится, но иногда с ошибкой - записывается другое значение (не то, которое передавалось в качестве аргумента в функцию). Завершение "длинной записи" производится как в примере Eval8_WRFlash - по таймеру TMR3, период переполнения которого составляет 500мкс (как по документации). WDT во время записи не переполняется. Если функция написана правильно, то в чем может быть дело :?: Спасибо.
Работая с нашим программатором Вы могли заметить, что процедуры записи/стирания весьма замысловаты. Это связано с технологией изготовления Flash и EEPROM памяти. Сначала производится запись всего массива данных, и, если хоть один бит во всем массиве не прописался, процесс повторяется. И так до 6 раз. После этого еще раз повторяется контрольная запись всего массива.
Поэтому Вам потребуется добавить в процедуру записи верификацию данных и дополнительные записи в случае ошибки.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2011-окт-01 11:39 
Не в сети

Зарегистрирован: 2011-май-26 07:22
Сообщения: 16
Продолжаю думать о том, чтО же я мог сделать не так. Стоит ли стирать данные по нужному адресу перед записью? Записывать слово вначале нулями пробовал, но проблема не решается.
Записывать в цикле один и тот же адрес с последующей верификацией - не решение, т.к. данные могут так и не записаться корректно (опробовано, проблема не исчезла). В чем же дело? Неужели полагаться на вероятность?... Проблема появляется в двух образцах устройства. Может дело в предельно допустимых режимах работы? Вывод nMCLR/Upp функционирует как MCLR (это проверялось). Может ли функция программирования быть нарушена, например, из-за того, что на вывод nMCLR/Upp при программировании кратковременно подавалось напряжение +14В (по документации необходимо +12В)? Так ли это критично? Спасибо.

_________________
#include <brain.h>


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2011-окт-03 08:54 
Не в сети

Зарегистрирован: 2009-май-25 15:07
Сообщения: 158
Откуда: АО "ПКК Миландр"
Igor писал(а):
Продолжаю думать о том, чтО же я мог сделать не так. Стоит ли стирать данные по нужному адресу перед записью? Записывать слово вначале нулями пробовал, но проблема не решается.
Запись - это установка в 1. Стирание в 0 может быть выполнено только целиком для всего сектора.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2011-окт-03 09:10 
Не в сети

Зарегистрирован: 2011-май-26 07:22
Сообщения: 16
Спасибо за ответ! Но... т.е. перед записью 1го слова необходимо стирать весь сектор? Насколько я понял, команд для стирания сектора в перечне opcode микроконтроллера не предусмотрено. Тогда необходимо слово за словом стирать весь сектор? Примечание: то, что можно циклически записывать информацию в первую доступную ячейку стертой Flash без необходимости каждый раз стирать весь сектор я знаю, но такой вариант не приемлем.
А насчет 14 Вольт?... может они повредили что? Позже попробую перепаять микроконтроллер, отпишусь о результатах.
Спасибо

_________________
#include <brain.h>


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2011-окт-04 09:42 
Не в сети

Зарегистрирован: 2011-май-26 07:22
Сообщения: 16
Перепайка микроконтроллера результатов не принесла! Память программ записывается некорректно даже при строгих +12В.

_________________
#include <brain.h>


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2011-окт-04 10:39 
Не в сети

Зарегистрирован: 2009-май-25 15:07
Сообщения: 158
Откуда: АО "ПКК Миландр"
Igor писал(а):
Перепайка микроконтроллера результатов не принесла! Память программ записывается некорректно даже при строгих +12В.
Что означает некорректно? Что вместо чего пишется? Повторяю: Вы можете производить запись в память программ переводя биты из нулевого в единичное состояние. Стирать память программ можно только программатором.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2011-окт-04 15:26 
Не в сети

Зарегистрирован: 2011-май-26 07:22
Сообщения: 16
Если нули замещаются единицами, а не наоборот, тогда понятно. Однако ж, в документации на 1886ВЕ2У не указана необходимость стирания Flash ячейки перед записью (хотя это характерно для технологии использования Flash как типа памяти) - подразумевается, что процесс происходит автоматически. Пусть перевод английского datasheet'a это в чем-то хорошо, но все-таки специфическое целевое назначение данных микроконтроллеров требует четкости, ясности и отсутствия недокументированных "особенностей". В целом спасибо за внимание к моему вопросу. Если кому нужна помощь - обращайтесь, буду рад помочь.

_________________
#include <brain.h>


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2011-окт-05 14:41 
Не в сети

Зарегистрирован: 2010-дек-13 13:49
Сообщения: 15
Здравствуйте,Lew. Вы написали по теме "Проблема с АЦП на МК 1886ВЕ2" юзеру Lakec "Задержка командой NOP в цикле при наличии прерываний будет непредсказуемой. Используйте таймеры. ".
1. Это имеется в виду использование NOPа в теле цикла или в общем использования NOPов в коде?
2. Что означает "непредсказуемой"?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2011-окт-05 15:29 
Не в сети

Зарегистрирован: 2009-май-25 15:07
Сообщения: 158
Откуда: АО "ПКК Миландр"
insert103 писал(а):
Здравствуйте,Lew. Вы написали по теме "Проблема с АЦП на МК 1886ВЕ2" юзеру Lakec "Задержка командой NOP в цикле при наличии прерываний будет непредсказуемой. Используйте таймеры. ".
1. Это имеется в виду использование NOPа в теле цикла или в общем использования NOPов в коде?
2. Что означает "непредсказуемой"?
Вот, например, в этой ветке встречается такой неэффективный код:
Код:
nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();
nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();
Если во время его исполнения произойдет прерывание, то общая задержка вырастет на длительность выполнения процедуры обработки прерывания. В случае использования таймеров (анализа в цикле флага TMRxIF) при возникновении прерывания задержка будет ближе к задуманной. Однако, для некритичных ко времени задач, задержка с помощью nop или с помощью пустых циклов оправдана и широко применяется.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2011-окт-05 15:39 
Не в сети

Зарегистрирован: 2010-дек-13 13:49
Сообщения: 15
А можно где-нибудь посмотреть примеры работ(Exmpl) с периферией для ВЕ2 на CC7A ?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2011-окт-05 15:48 
Не в сети

Зарегистрирован: 2009-май-25 15:07
Сообщения: 158
Откуда: АО "ПКК Миландр"
insert103 писал(а):
А можно где-нибудь посмотреть примеры работ(Exmpl) с периферией для ВЕ2 на CC7A ?
Много примеров есть в составе IDE1886 на нашем сайте. Работа с периферией для ВЕ2 не отличается от такой для других контроллеров серии 1886.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2012-дек-12 20:05 
Не в сети

Зарегистрирован: 2010-май-10 20:57
Сообщения: 8
Есть необходимость изменять настройки для разных объектов. Имеется описание как произвести запись в память программ, как считать, но в описании нет информации, что FLASH перед записью надо стирать, не описывается процедура стирания секторов (хотя она используется в ISP загрузчике, как команда с кодом 0000 1111 - из спецификации по программированию внутренней памяти 1886ВЕ1-ВЕ4). В связи с этим просьба, дать информацию по стиранию секторов.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 32 ]  На страницу Пред.  1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB