Вторник, 07.05.2024, 17:11
Приветствую Вас Гость | RSS
Главная | Каталог статей | Регистрация | Вход
Меню сайта
Реклама Google
Форма входа
Категории раздела
Это нужно знать! [17]
Изучаем AVR [30]
Программаторы [12]
Необходимое ПО [8]
Готовые устройства [73]
Справочная [38]
Инструмент [0]
Технология [8]
Литература [0]
Arduino скетчи [18]
Поиск
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Микроконтроллеры - это просто!
Главная » Статьи » Arduino скетчи

Запись/чтение EEPROM микроконтроллера

К аналоговому входу Analog In 0 микроконтроллера Arduino подключен потенциометр (см. Как подключить к Arduino...). Вращением потенциометра изменяется время задержки мигания светодиода на выводе Digital 13. Через терминал Serial Monitor Arduino IDE можно подавать команды:

R -- считать значение задержки из EEPROM
W -- записать текущее значение потенциометра в EEPROM
После сброса микроконтроллера из EEPROM считывается значение, которое используется как время задержки мигания светодиода, но если начать поворачивать потенциометр, то как время задержки мигания светодиода используется уже текущее значение, задаваемое потенциометром. Чтобы светодиод мигал с временем задержки из EEPROM, нужно прочитать значение задержки из EEPROM (команда R).

Скетч использует библиотеку VEduino (скачать), после установки библиотеки его можно найти в меню Файл-Примеры-VEduino-VEduino_EEPROM.

Ниже приведён код скетча:

/**

 * This is an example sketch for VEduino Library.
 * It shows how to read and write EEPROM.
 * 
 * Connect potentiometer to analog input 0 of the Adruino board.
 * Rotate the pot to change the delay of the LED blinks.
 * Use Arduino IDE Serial Monitor to read and store current pot value
 * in the microcontroller's EEPROM:
 * Type W to write stored value.
 * Type R to read stored value.
 *
 * 
 */
#include <ve_avr.h> // This sketch uses VEduino Library.
 
#define LED_PIN 13 // It should blink.
 
// These variables are volatile, since their values are changing by interrupt handler.
volatile bool bLedOn = false;
 
uint16_t potValue; // Previous read pot value.
uint16_t ledBlinkDelay; // Delay between LED blinks.
bool usePotValue; 
 
void setup()
{
 pinMode(LED_PIN, OUTPUT); // Setup LED pin as OUTPUT pin. 
 DEV_EEPROM[0] >> ledBlinkDelay; // We take LED blink delay stored in EEPROM at 0
 potValue = analogRead(0) << 6; // Pot value multiplied by 2 six times.
 usePotValue = false; // To use EEPROM value, not current pot value.
 DEV_TIMER1.setClockSelect(TimerW::Prescaler_64); // 16MHz / 64 = 250 kHz. Timer1 will 
 // increase its TCNT value each 4 us.
 DEV_TIMER1.setWaveGenMode(TimerW::FastPWM_OCRA); // Timer1 will compare its TCNT value
 // with its OCRA value and
 // each time when TCNT1 = OCR1
 DEV_TICTRL1.outCompIntEnableA(); // TIMER1_COMPA_vect ISR handler
 // will be called. 
 Serial.begin(19200); // We will use Serial Monitor.
 // Type W to store pot value.
 // Type R to read stored pot value.
 interrupts(); // Enable interrupts.
 Serial.println("VEduino EEPROM example");
 Serial.println("Type R or W");
}
 
void loop()
{
 uint16_t newPotValue = analogRead(0) << 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) // If LED should be switched on
 digitalWrite(LED_PIN, HIGH); // LED pin should be high voltage level.
 else 
 digitalWrite(LED_PIN, LOW); // LED should be switched off here.
 
 if (Serial.available()) { // Read commands from Serial.
 char ch = Serial.read();
 switch (ch) {
 case 'R': // READ command
 case 'r':
 Serial.print("Reading value... ");
 DEV_EEPROM[0] >> ledBlinkDelay;
 Serial.print(ledBlinkDelay);
 Serial.println(" OK");
 usePotValue = false;
 break;
 case 'W': // WRITE command 
 case 'w':
 Serial.print("Writing value... ");
 DEV_EEPROM[0] = newPotValue;
 DEV_EEPROM[0] >> ledBlinkDelay;
 Serial.print(ledBlinkDelay);
 Serial.println(" OK");
 usePotValue = false;
 break;
 default:
 break;
 }
 }
}
 
// DEV_TIMER1 Output Compare A interrupt handler
ISR(TIMER1_COMPA_vect)
{
 DEV_TIMER1.setOutputCompareA(ledBlinkDelay); // This sets next interrupt timeout. 
 bLedOn = ! bLedOn; // This says the main program to change LED state.
}
Категория: Arduino скетчи | Добавил: Alex (02.06.2014)
Просмотров: 1836 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Copyright MyCorp © 2024