Compare commits

...

4 Commits

Author SHA1 Message Date
41a94612dc Удалить 'README.md' 2023-06-21 13:18:46 +00:00
7fde8a352f Загрузил(а) файлы в '' 2023-06-21 13:18:23 +00:00
67f31a96dc Загрузил(а) файлы в ''
Добавлена проверка адреса на наличие ошибок перед чтением из ПЗУ.
2023-06-21 13:17:50 +00:00
baa98357c1 device address added 2023-03-28 14:44:10 +03:00
3 changed files with 58 additions and 25 deletions

View File

@ -1,25 +0,0 @@
# Modbus устройство на AVR
# Задание
Устройство поключено к питанию всегда. Взаимодействие по интерфейсу UART (RS-485) и протоколу Modbus.
- Discrete Inputs - 4 штуки
- Coils - 4 штуки
- Input registers - 2 канала АЦП
- Holding Registers - 1 штука: адрес на шине Modbus.
Адрес по умолчанию 0х32. Адрес хранить в ПЗУ чипа.
Адреса данных определить самостоятельно.
# Участники
Южакова Лада
Салангина Анастасия
Макуц Ольга
# Составляющие задачи
- Изучить Modbus (Салангина Анастасия)
- Изучить UART (Макуц Ольга)
- Определить, как происходит передача по протоколу (Салангина Анастасия)
- Разобрать назначение и способы использования регистров и вхоов-выходов (Макуц Ольга)
- Изучить, как переопределять адрес по умолчанию в ПЗУ (Южакова Лада)
- Изучить, как определять адреса данных в ПЗУ (Южакова Лада)
- Изучить, как использовать RX/TX (Макуц Ольга)
- Изучить, что такое верхняя архитектура (все)
- Изучить ПЗУ (Южакова Лада)
- Изучить кольцевой буфер (Южакова Лада)
- Понять, в какой полседовательности будет работать программа (все)

46
device_address.c Normal file
View File

@ -0,0 +1,46 @@
#include "device_address.h"
uint8_t EEPROM_ReadByte(uint32_t adr)
{
while (EECR & (1<<EEPE));
EEAR = adr;
EECR |= (1<<EERE);
return EEDR;
}
void EEPROM_WriteByte(uint32_t adr, uint8_t value)
{
while (EECR & (1<<EEPE));
EEAR = adr;
EEDR = value;
EECR |= (1<<EEMPE);
EECR |= (1<<EEPE);
}
uint8_t get_device_address(void)
{
if(is_valid_device_address())
{
return EEPROM_ReadByte(0);
}
else
{
return get_default_address();
}
}
void write_device_address(uint8_t address)
{
EEPROM_WriteByte(0, address);
EEPROM_WriteByte(1, ~address);
}
uint8_t get_default_address(void)
{
return DEFAULT_MODBUS_ADDRESS;
}
int is_valid_device_address(void)
{
return ((EEPROM_ReadByte(0) ^ EEPROM_ReadByte(1)) == 0xFF);
}

12
device_address.h Normal file
View File

@ -0,0 +1,12 @@
#ifndef DEVICE_ADDRESS_H
#define DEVICE_ADDRESS_H
#include <stdint.h>
#include <avr/io.h>
#define DEFAULT_MODBUS_ADDRESS (32)
uint8_t get_device_address(void);
void write_device_address(uint8_t address);
uint8_t get_default_address(void);
int is_valid_device_address(void);
#endif /*DEVICE_ADDRESS_H*/