Страница на этапе разработки
Сегодня мы с Вами поработаем с энергонезависимой памятью: EEPROM.
EEPROM — внутренняя перезаписываемая энергонезависимая память, т.е данные в этой памяти остаются и после отключения питания. Микроконтроллер Atmega8 имеет 512 байт энергонезависимой памяти.
Для работы с памятью существует библиотека eeprom.h, которая имеет следующие функции:
uint8_t eeprom_read_byte (const uint8_t *__p) - прочитать байт
uint16_t eeprom_read_word (const uint16_t *__p) - прочитать слово (2 байта)
uint32_t eeprom_read_dword (const uint32_t *__p) - прочитать двойное слово (4 байта)
void eeprom_write_byte (uint8_t *__p, uint8_t __value) - запись байта
void eeprom_write_word (uint16_t *__p, uint16_t __value) - запись слова (2 байта)
void eeprom_write_dword (uint32_t *__p, uint32_t __value) - запись дв. слова (4 байта)
Для проверки работы нашей программы мы будем через USART отправлять данные с ячейки нашей памяти на экран, так же сможем посмотреть данные в EEPROM через Microchip Studio, зайдя в Device Programming и перейдя на закладку memories. Далее считываем значения памяти и смотрим, что ее содержимое:
** картинка***
#define F_CPU 4000000 // Рабочая частота контроллера
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
#include <xc.h>
#define BAUD 9600L // Скорость обмена данными
#define UBRRL_value (F_CPU/(BAUD*16))-1 //Согластно заданной скорости подсчитываем значение для регистра UBRR
char b;
uint8_t EEMEM eepro_x;// переменная для передачи адресса
ISR(USART_RXC_vect)// прерывание на прием данных
{
b = UDR; // считываем данные
}
void init_USART() {
UBRRL = UBRRL_value; //Младшие 8 бит UBRRL_value
UBRRH = UBRRL_value >> 8; //Старшие 8 бит UBRRL_value
UCSRB |=(1<<TXEN)|(1<<RXEN); //Бит разрешения передачи и приема
UCSRC |=(1<< URSEL)|(1<< UCSZ0)|(1<< UCSZ1); //Устанавливем формат 8 бит данных
UCSRB |= (1<<RXCIE);// разрешаем прерывание по приему данных
sei();// разрешение глобального прерывания
}
void send_UART(char value) {
while(!( UCSRA & (1 << UDRE))); // Ожидаем когда очистится буфер передачи
UDR = value; // Помещаем данные в буфер, начинаем передачу
}
int main(void)
{
uint8_t eepro_x1 = 47; //47 в аски код 0,
init_USART(); //инициализация
send_UART(‘O’);
send_UART(‘K’);
send_UART(‘!’);
send_UART(0x0D); //переход в начало строки
send_UART(0x0A);//переход на новую строку
while(1) {
if (b == ‘1’){
eeprom_write_byte(&eepro_x, eepro_x1);
send_UART(eepro_x1);
send_UART(0x0D); //переход в начало строки
send_UART(0x0A);//переход на новую строку
_delay_ms(500);
b= ‘0’;
}
if (b == ‘2’){
eepro_x1 = eeprom_read_byte(&eepro_x);
send_UART(eepro_x1);
send_UART(0x0D); //переход в начало строки
send_UART(0x0A);//переход на новую строку
_delay_ms(500);
b= ‘0’;
}
if (b == ‘3’){
eepro_x1++;
send_UART(eepro_x1);
send_UART(0x0D); //переход в начало строки
send_UART(0x0A);//переход на новую строку
_delay_ms(500);
b= ‘0’;
}
}
}