Функция eeprom в PIC16F887

Модератор: boogyman

Ответить
Аватара пользователя
Smile
Новичок
Сообщения: 3
Зарегистрирован: 13 ноя 2015, 20:27

Функция eeprom в PIC16F887

#1

Сообщение Smile »

Здравствуйте, недавно начал заниматься программированием PIC. Написал программу запоминания карты, но так получилось, что программа сохраняет действия в оперативной памяти и после выключения карта стирается, мне необходимо, чтобы он записывал карту и после RESET например, карта была сохранена и он спокойно ее воспроизводил. Подскажите что можно сделать.

Код: Выделить всё

#include "motor.c"

#define MEM_SIZE 40
#define TMR_DX 50

// Данные с ИК пульта ДУ
unsigned char ir_data=0;

// Данные о пройденном пути
unsigned int mem[MEM_SIZE];
unsigned char mem_cmd[MEM_SIZE];
// Размер массива данных пройденного пути
unsigned char mem_size=0;

// Декодирование данных с пульта
void decode()
{
 if(ir_data=='a' || ir_data=='A') ir_data=1;
 else if(ir_data=='b' || ir_data=='B') ir_data=2;
 else if(ir_data=='c' || ir_data=='C') ir_data=3;
 else if(ir_data=='d' || ir_data=='D') ir_data=4;
 else ir_data=0;
}

// Приём данных с пульта
void interrupt()
{
 char i;

 // Проверка флага прерывания
 if(INTCON.INTF)
 {
  Delay_us(416);
  for(i=0;i<8;i++)
  {
   Delay_us(833);
   // Сдвиг данных на 1 бит вправо
   ir_data = ir_data>>1;
   // Если на входе RB0 1, то в конец ir_cmd добавить 1
   if((PORTB & 0x01)==1) ir_data = ir_data | 0x80;
  }
  Delay_us(833);
  decode(); // Декодировать даннные
  // Сбросить флаг прерывания
  INTCON.INTF = 0;
 }
}

// Очистка памяти
void mem_clear()
{
 unsigned int i;
 for(i=0;i<MEM_SIZE;i++)
 {
  mem[i]=0;
  mem_cmd[i]=0;
 }
}

void _go()
{
 unsigned int i,j;
 unsigned char cmd;
 unsigned int tmr;

 for(i=0;i<=mem_size;i++)
 {
  cmd = mem_cmd[i];
  tmr = mem[i];

  if(cmd==1)
  {
   m_left_bwd();
   m_right_bwd();
  }
  else if(cmd==2)
  {
   m_left_bwd();
   m_right_fwd();
  }
  else if(cmd==3)
  {
   m_left_fwd();
   m_right_bwd();
  }
  else if(cmd==4)
  {
   m_left_fwd();
   m_right_fwd();
  }
  for(j=0;j<tmr;j++) Delay_ms(TMR_DX+10);
 }
 m_left_stop();
 m_right_stop();
}

void main()
{
 unsigned char key;

 // RB0 в цифровой вход
 ANSELH.F4 = 0;
 TRISA.F4=1;
 // Прерывание происходит по спаду уровня сигнала
 OPTION_REG.INTEDG = 0;
 // Разрешить прерывания по изменению уровня сигнала INT/PB0
 INTCON.INTE = 1;
 // Разрешить прерывания
 INTCON.GIE = 1;

 // Инициализируем двигатели
 m_init();

 // Настроить вывод светодиода и мигнуть им когда очиститься память
 TRISB.F3=0;

 PORTB.F3=1;
 mem_clear();
 Delay_ms(200);
 PORTB.F3=0;

 for(;;)
 {
  Delay_ms(TMR_DX);
  if(!PORTA.F4) _go(); // Запускаем движение по карте

   if(ir_data!=0)
   {
    //Загружаем данные из временной переменной ir_data
    key = ir_data;
    ir_data = 0;

    // Если команда отличается от предыдущей
    if(mem_cmd[mem_size]!=key)
    {
     // Выбираем следующую ячейку памяти
     mem_size++;
     if(mem_size==MEM_SIZE)
     {
      PORTB.F3=1; // Зажигаем светодиод
      while(1) if(!PORTA.F4) _go(); // Запускаем движение по карте
     }
     // Сохраняем команду для её последующего сравнения
     mem_cmd[mem_size]=key;
     // Увеличиваем время простоя команды
     mem[mem_size]++;
    }
    else
    {
     // Увеличиваем время простоя команды
     mem[mem_size]++;
    }

   if(key==1)
   {
    m_left_bwd();
    m_right_bwd();
   }
   else if(key==2)
   {
    m_left_bwd();
    m_right_fwd();
   }
   else if(key==3)
   {
    m_left_fwd();
    m_right_bwd();
   }
   else if(key==4)
   {
    m_left_fwd();
    m_right_fwd();
   }

  }
  else
  {
   m_left_stop();
   m_right_stop();
  }

 }
}
Аватара пользователя
Smile
Новичок
Сообщения: 3
Зарегистрирован: 13 ноя 2015, 20:27

Re: Функция eeprom в PIC16F887

#2

Сообщение Smile »

Изучал даташит, руководство по микроконтроллерам, но ничего не выходит.
Аватара пользователя
AntonChip
Администратор
Сообщения: 265
Зарегистрирован: 24 дек 2011, 22:11
Откуда: Киров
Контактная информация:

Re: Функция eeprom в PIC16F887

#3

Сообщение AntonChip »

А что за карта?
Аватара пользователя
Smile
Новичок
Сообщения: 3
Зарегистрирован: 13 ноя 2015, 20:27

Re: Функция eeprom в PIC16F887

#4

Сообщение Smile »

Это не карта, микроконтроллер запоминание направление и время движения.
Ответить