Миландр

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

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




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: 1886ВЕ5У eeprom
СообщениеДобавлено: 2010-ноя-24 14:31 
Не в сети

Зарегистрирован: 2010-ноя-24 12:15
Сообщения: 1
Добрый день.
Имеется отладочная плата с мк 1886ВЕ5У. Возникают проблемы с чтением и записью в eeprom.

Вот кусок кода, отвечающий за включение самого блока и считывание:
Код:
void
EEPROM_On()
{
   EE_MODE = 0x80;
   EE_CON   = 0x02;
   
   while(EE_BUSY) {};   
}

uint8_t
eepromReadByte(uint8_t ADR)
{
   EE_ADR = ADR;
   EE_MODE = 0x81;
   
   while(EE_BUSY) {};

   EE_MODE = 0x80;

   return EE_DATA;   
}


Проблема в том, что байт считывается со второго раза. Что я делаю неправильно?

Заранее спасибо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ5У eeprom
СообщениеДобавлено: 2010-ноя-25 11:44 
Не в сети

Зарегистрирован: 2009-май-25 16:41
Сообщения: 206
Откуда: АО "ПКК Миландр"
d.koryagin писал(а):
Добрый день.
Имеется отладочная плата с мк 1886ВЕ5У. Возникают проблемы с чтением и записью в eeprom.

Вот кусок кода, отвечающий за включение самого блока и считывание:
Код:
void
EEPROM_On()
{
   EE_MODE = 0x80;
   EE_CON   = 0x02;
   
   while(EE_BUSY) {};   
}

uint8_t
eepromReadByte(uint8_t ADR)
{
   EE_ADR = ADR;
   EE_MODE = 0x81;
   
   while(EE_BUSY) {};

   EE_MODE = 0x80;

   return EE_DATA;   
}


Проблема в том, что байт считывается со второго раза. Что я делаю неправильно?

Заранее спасибо.


Общие рекомендации:
1. EE_CON устанавливается до EE_MODE = 0x80
2. Перед проверкой EE_BUSY необходимо вставить один холостой цикл микроконтроллера, т.к. из-за пересинхронизации сигнал BUSY может задержаться на один цикл.
3. При считывании, EE_DATA нужно считать до EE_MODE = 0x80.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ5У eeprom
СообщениеДобавлено: 2015-июн-15 17:45 
Не в сети

Зарегистрирован: 2015-июн-15 16:48
Сообщения: 2
Добрый день! Имеется отладочная плата на данный контроллер и сейчас разбираюсь с EEPROM. Эксперимент проверки EEPROM в следующем: по нажатию на кнопку(SW3 на отладочной плате) инкрементируется счетчик, значение счетчика отображается при помощи 4-х светодиодов порта Е. Значение счетчика записываю в EEPROM. Так это EEPROM, то значение счетчика после выключения платы не должно сброситься и после включения должно продолжать изменяться с того значения на котором остановился до выключения платы. Но происходит следующее:
1. При записи в void main (void), до while(1), операции по выставлению значения счетчика до выключения на порт (PORTE=i, где i-это счетчи), происходит коротковременное, чуть видно загорания светодиодов, которые горели до выключения(то есть это правильно),но очень редко бывает что загораются чуть-чуть не те светодиоды. Самое интересное что если строку PORTE=i закомментировать, то горение светодиодов становится постоянным и ярким, как при нормальной работе и так же загорается значение до выключения, но очень редко бывает что загораются чуть-чуть не те светодиоды. Далее в любом случае следует пункт 2.
2.После этого счетчик начинает считать не с того значения на котором остановился до выключения, а начинает считать опять с 0.




Программа
Код:
#include <1886VE5.h>
#include "int17xxx.h"
#pragma origin 0x8
int i;    //cчетчик
long y,y1;//для антидребезга кнопки
interrupt iServer(void)
{
    multi_interrupt_entry_and_save

PERIPHERAL_service:
TMR0_service:
    // save on demand: PRODL,PRODH,TBLPTRH,TBLPTRL,FSR0,FSR1
    /* process Timer 0 interrupt */
    // T0IF is automatically cleared when the CPU vectors to 0x10
    // restore on demand: PRODL,PRODH,TBLPTRH,TBLPTRL,FSR0,FSR1
T0CKI_service:
INT_service:
    interrupt_exit_and_restore
}
/******************/

void write(int adress, int data)
{
     
     EE_EN=1;              //Включаем EEPROM
     #asm
             nop;          //пустая команда, так как из-за пересихнронизации сигнал BUSY может задержаться на один цикл
     #endasm
     while(BUSY==1)        //Ждем пока спадет флаг занятости
     {}
     EE_DATA=data;         //В регистр EE_DATA записываем данные, которые хотим сохранить
     EE_ADR=adress;        //Адрес куда хотим сохранить данные
     MODE1=1;              //Запись слова в EEPROM
     #asm
             nop;          //пустая команда, так как из-за пересихнронизации сигнал BUSY может задержаться на один цикл
     #endasm
     while(BUSY==1)        //Ждем пока спадет флаг занятости
     {}
     MODE1=0;              //Режим работы переводим в "нет работы"
     EE_EN=0;              //Выключаем EEPROM
     }

void read(int adress)
{   
     EE_EN=1;               //Включаем EEPROM
     #asm
             nop;           //пустая команда, так как из-за пересихнронизации сигнал BUSY может задержаться на один цикл
     #endasm
     while(BUSY==1)         //Ждем пока спадет флаг занятости
     {}           
     EE_ADR=adress;         //Адрес из которого будут взяты данные
     MODE0=1;
     #asm
             nop;           //пустая команда, так как из-за пересинхронизации сигнал BUSY может задержаться на один цикл
     #endasm
     while(BUSY==1)         //Ждем пока спадет флаг занятости
     {}
     i=EE_DATA;             //Записываем считанные данные в переменную i(счетчик)
     MODE0=0;               //Режим работы переводим в "нет работы"
     EE_EN=0;               //Выключаем EEPROM
     }

void erase()
{
     EE_EN=1;               //Включаем EEPROM
     #asm
        nop;                //пустая команда, так как из-за пересихнронизации сигнал BUSY может задержаться на один цикл
     #endasm
     while(BUSY==1)         //Ждем пока спадет флаг занятости
     {}
     MODE2=1;               //Очистка всей EEPROM
     #asm
        nop;                //пустая команда, так как из-за пересихнронизации сигнал BUSY может задержаться на один цикл
     #endasm
     while(BUSY==1)         //Ждем пока спадет флаг занятости
     {}
     MODE2=1;               //Режим "Нет работы"
     EE_EN=0;               //Выключение EEPROM
}

void main(void)
{
     DDRE=0;                //Порт Е на выход
     DDRD3=1;               //3 бит Порта D на вход (SW3 к ней подключен)
     EE_CONT=0x02;          //частота Fc=10-20MГц
     read(0xA5);            //считываем значение счетчика до выключения из ячейки А5
     i=EE_DATA;
     PORTE=i;               //Выставляем на порт значение счетчика, считанного с EEPROM, при этом будет кратковременное зажигание светодиодов
                            //Если закомментировать, то светодиоды будут нормально гореть
   
     while(1)
     {
            if(PORTD3==0)                       //Если на кнопку нажали, то инкрементируем счетчик
            {
                         i++;                   //инкрементируем счетчик
                         while(y1<0xfff)
                            {y++;
                               if(y==10)
                                {               //Антидребезг кнопки
                                   y1++;
                                   y=0;
                                }
                            }
                         y1=0;
                         if(i==16)
                         {i=0;}                 //Если значение счетчика стало равным 16, то обнуляем его
                         PORTE=i;               //Выставляем на порт Е текущее значение счетчика
                         erase();               //Стирание всей памяти, так как  Запись возможна только “1” поверх “0”. 
                         write(0xA5,i);         //Запись значения счетчика в ячейку, располагающуюся по адресу А5
            }     
     }
             
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1886ВЕ5У eeprom
СообщениеДобавлено: 2015-июн-17 15:02 
Не в сети

Зарегистрирован: 2015-июн-15 16:48
Сообщения: 2
Добрый день! Кто-нибудь из сотрудников Миладра читает эту ветку? И как долго ждать ответа?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

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


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

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


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

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