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 - управление яркостью светодиода с помощью ШИМ.
EEPROM -- чтение и запись данных в память EEPROM
Автор: Андрей Шаройко <vanyamboe@gmail.com>