EEPROM - чтение и запись данных в память EEPROM

В примере EEPROM демонстрируется использование нескольких классов:

  • Класс, реализующий функции 16-битного таймера-счётчика 1, используется для отсчёта времени задержки мигающего светодиода (как в примере timer).

  • Вспомогательный класс потенциометра Pot (файл misc/pot.h) используется для управления временем задержки мигающего светодиода.

  • Класс, реализующий функции интерфейса последовательного порта USART, используется для управления чтением и записью времени задержки в памяти EEPROM.

После сброса из памяти EEPROM по адресу 0 считывается время задержки мигания светодиода. Поворотом потенциометра можно установить новое время задержки. По последовательному порту можно отправить следующие команды:

  • Символ W -- для записи текущего значения потенциометра в память EEPROM по адресу 0.

  • Символ R -- для чтения времени задержки из памяти EEPROM по адресу 0.

Исходный код примера:

/*

* eeprom.cpp

*

* VE_AVR_Library EEPROM read/write LED Blinking Using ADC Control Example.

*

* Created on: 11.05.2012

* Author: andrey

*/

#include <ve_avr.h>

#include <misc/ve_led.h>

#include <misc/ve_pot.h>


#define LED DEV_GPIOD, 7 // Set up your own values here: PORT, PIN

#define LED_POT_CHANNEL AnalogMux::CH_ADC0 // Set up your own value here: ADC channel


volatile bool bLedOn = false;

uint16_t potValue;

uint16_t ledBlinkDelay; // Delay between LED blinks.

bool usePotValue; // Use current pot value as ledBlinkDelay.

char hexChar(uint8_t hex);


int main()

{

DEV_POWER.adcOn();

DEV_POWER.timer1On();

DEV_POWER.usart0On();


led::setup(LED);


Pot pot;

pot.setup(LED_POT_CHANNEL);

potValue = pot.getValue() << 6;

DEV_EEPROM[0] >> ledBlinkDelay; // We take LED blink delay stored in EEPROM at 0


usePotValue = false; // To use EEPROM value, not current pot value


DEV_TIMER1.setClockSelect(TimerW::Prescaler_64);

DEV_TIMER1.setWaveGenMode(TimerW::FastPWM_OCRA);

DEV_TICTRL1.outCompIntEnableA();


DEV_USART0.setBaudRate(57600);

DEV_USART0.transmitterEnable();

DEV_USART0.receiverEnable();


enableInterrupts();


DEV_USART0 << "VE_AVR EEPROM examplen";

DEV_USART0 << "Type R or Wn";


while(true) {

uint16_t newPotValue = pot.getValue() << 6; // Read current pot value.

if (! usePotValue) {

if ((newPotValue & 0xF800) != (potValue & 0xF800)) {

usePotValue = true; // use current pot value

ledBlinkDelay = newPotValue;

}

}

else

ledBlinkDelay = newPotValue;

potValue = newPotValue;

if (bLedOn)

led::on(LED);

else

led::off(LED);

if (! DEV_USART0.isDataRegisterEmpty()) { // Read commands from Serial.

char ch;

DEV_USART0 >> ch;

switch (ch) {

case 'R': // READ command

case 'r':

DEV_USART0 << "Reading value... ";

DEV_EEPROM[0] >> ledBlinkDelay;

DEV_USART0 << hexChar(ledBlinkDelay >> 8);

DEV_USART0 << hexChar(ledBlinkDelay);

DEV_USART0 << " OKn";

usePotValue = false;

break;

case 'W': // WRITE command

case 'w':

DEV_USART0 << "Writing value... ";

DEV_EEPROM[0] = newPotValue;

DEV_EEPROM[0] >> ledBlinkDelay;

DEV_USART0 << hexChar(ledBlinkDelay >> 8);

DEV_USART0 << hexChar(ledBlinkDelay);

DEV_USART0 << " OKn";

usePotValue = false;

break;

default:

break;

}

}

}

}


ISR(TIMER1_COMPA_vect)

{

DEV_TIMER1.setOutputCompareA(potValue);

bLedOn = ! bLedOn;

}


char hexChar(uint8_t hex)

{

char ret = (hex & 0x0F);

return (ret <= 9) ? (ret + '0') : (ret + 'A'- 10);

}

Предыдущий пример: usart - передача данных по последовательному порту USART.

Следующий пример: LEDfade - управление яркостью светодиода с помощью ШИМ.

Скачать библиотеку VE_AVR.

Автор: Андрей Шаройко <vanyamboe@gmail.com>