Compare commits
4 Commits
master
...
eeprom_add
Author | SHA1 | Date | |
---|---|---|---|
41a94612dc | |||
7fde8a352f | |||
67f31a96dc | |||
baa98357c1 |
25
README.md
25
README.md
@ -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
46
device_address.c
Normal 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
12
device_address.h
Normal 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*/
|
Loading…
Reference in New Issue
Block a user