Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > PIC18F4620 пишет в EEPROM или нет


Автор: iPlay 20.2.2011, 09:58
Есть схемка не большая которая с каждым тактом генерирует 8192 раза нолик или единичку, эта схемка подключена к микроконтроллеру PIC18F4620, задача на МК запомнить эти 8192 бита(ну и потом передать по сети, эту задачу еще не решал, может скорее всего перейду потом на PIC18 c Ethernet). Вообщем пишу программку под МК чтобы запомнить биты, которые приходят на ножку RA0.
Код

#include <htc.h>
#include "delay.c"
#define SIZE 8192

void main(void)
{
    int pMap[SIZE];
    //bdata int pMap[SIZE];
    TRISA = 0xff;
    TRISB = 0x00;
    
    for(int i=1;i<=SIZE;i++)
    {
        DelayMs(250);
        eeprom_write(i,RA0);
    }
    while(1)
    {
    }
}

Открываю в отладчике MPLAB чтобы посмотреть EEPROM, а там http://habreffect.ru/files/002/e632283be/sshshshhh.png

Подумал что в EEPROM не произошла запись, написал код по проще:
Код

void main(void)
{
    TRISA = 0xff;
    TRISB = 0x00;

    eeprom_write(0x0A,3);

    if (eeprom_read (0x0A) == 3)
    { 
        RB0=0;
    }
    
    while(1)
    {
    }
}

Моделирую в Proteus, работает, на ножке RB0 появляется нолик, если указать нужный адрес и число. То есть в память пишет. Открываю отладчик EEPROM опять ничего  smile  smile 

Как быть? Я теперь просто не знаю пишет ли мой цикл, в коде выше, данные в eeprom или нет, думал вывести на LCD посмотреть, я еще пока с LCD не умею работать.

Автор: iPlay 20.2.2011, 11:42
Может я не правильно EEPROM просматриваю в MPLAB???

Автор: iPlay 20.2.2011, 14:20
Проблема оказывается в том что я не могу считать значение с ножки RA0. http://habreffect.ru/files/d59/7d5d3fa3a/Снимasdfhsdfhsdок.png Прошлый пример проверил в память, в EEDATA регистр и EEADR пишется отлично, почему ничего нету в окне EEPROM не понятно, может не правильно схему собрал. Но всё таки я что не правильно считываю с RA0???

Автор: iPlay 20.2.2011, 16:24
И так всё по правил до вот такого вида
Код

#include <htc.h>
#include "delay.c"
#define SIZE 10

void init(void);

void main(void)
{
    init();

    for(int i=0;i<=9;i++)
    {
        DelayMs(200);
        eeprom_write(i,RB0);    
    }

    while(1)
    {
    }
}

void init(void)
{
    GIE=1; 
    IPEN=0;

    T1CON=0x81;        /* Timer 1 needs to be activated */
    TMR1IE=0;        /* No interrupts are associated with timer 1 */

    ADCON1=0x0F;    /* Set relevant port pins to digital mode, rather than analog */
    
    TRISA=0;        /* initially ports will be in output mode to display test pattern */
    TRISB=0xFF;        /* PORTB must be set as input so that the interrupts are possible */
}


В результате работы, все отлично заносится  в регистры EEDATA и EEADR, только во окно EEPROM в MPLAB до сих пор показывает что в eeprom ничего нет, может я чёто не так делаю?

Автор: UniBomb 21.2.2011, 09:19
iPlay, по заданному вопросу я ответить увы не смогу, т.к. с пиками никогда не работал и этот ваш MPLAB в глаза не видел. Но пару замечаний есть:

1. EEPROM очень капризная штука, поэтому записывать в эту память надо как можно реже. А вот читать можно сколько угодно раз. Поэтому перед записью делайте проверку - если в нужной ячейке хранится тоже самое значение, что вы хотите записать, то можно не записывать.


Код

for(int i=0;i<=9;++i)
{
    DelayMs(200);
    if(eeprom_read (i) != RB0)
        eeprom_write(i,RB0);    
}


К тому же это позволит сэкономить чуток времени, т.к. операция записи в EEPROM длится довольно долго.

2. Если данные приходят извне и с ними надо работать оперативно, то незачем их сохранять в EEPROM. 

3. Если верить описанию на ваш мк, то EEPROM у него всего 1024 байта. Вы же хотите записать в него в восемь раз больше.

4. Освойте логические побитовые операции. Сейчас вы храните каждый бит в одном байте, что является крайне избыточным вариантом. Такой массив даже в RAM не поместиться. Зато эти данные можно уложить в 1024 байта, что уже более-менее приемлимо. 

Автор: UniBomb 21.2.2011, 09:36
Ещё пачка замечаний:

1. Вы как-то должны отлавливать момент начала генерирования этих самых 8192 ноликов и единичек, иначе вы рискуете считать мусор.

2. Непонятно также что такое "с каждым тактом генерирует 8192 раза нолик или единичку". Такт - это время между двумя импульсами генератора, соответственно за один такт максимум можно выдать только одно значение. Может быть имелось в виду за какое-то определённое время?

3. Также вызывает сомнение участок кода, когда происходит захват значения и запись его в EEPROM:

Код

    for(int i=1;i<=SIZE;i++)
    {
        DelayMs(250);
        eeprom_write(i,RA0);
    }


Получается, что вы захватываете значение с частотой 4 раза в секунду. Что ну никак не вяжется с "с каждым тактом генерирует 8192 раза"  smile К тому же следует помнить, что операция записи в EEPROM тоже занимает какое-то время, которое нужно учитывать в функции "DelayMs". Задержку в этой функции условно можно выразить как 250-время_выполнения(eeprom_write).

Автор: xvr 21.2.2011, 12:56
Есть у меня подозрение, что окошко, с содержимым EEPROM, которое вы смотрите, показывает содержимое EEPROM в вашей прошивке, а не в контролере  smile 
Хотя могу и ошибаться - последний раз в MPLab ходил несколько лет назад   smile 

Автор: UniBomb 21.2.2011, 13:54
xvr, было бы странно, если бы среда в режиме отладки не симулировала бы EEPROM в этом своём окошке  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)