Compare commits

...

7 Commits
master ... adc

3 changed files with 80 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 (Макуц Ольга)
- Изучить, что такое верхняя архитектура (все)
- Изучить ПЗУ (Южакова Лада)
- Изучить кольцевой буфер (Южакова Лада)
- Понять, в какой полседовательности будет работать программа (все)

37
device_adc.c Normal file
View File

@ -0,0 +1,37 @@
#include "device_adc.h"
uint16_t value = 0;
char high_adc = 0, low_adc = 0;
ISR(ADC_vect)
{
low_adc = ADCL;
high_adc = ADCH;
value = (high_adc << 8) | low_adc;
}
void adc_init(void)
{
// Опорное напряжение на входе AREF
ADMUX &= ~REFS0_MASK;
// Выравнивание результата вправо
ADMUX &= ~ADLAR_MASK;
// Коммутация выбранного входа с АЦП (ADC0)
ADMUX &= ~(MUX3_MASK | MUX2_MASK | MUX1_MASK | MUX0_MASK);
// Разерешение работы АЦП
ADCSRA |= ADEN_MASK;
// Запуск работы АЦП
ADCSRA |= ADSC_MASK;
// Предделитель частоты (128)
ADCSRA |= ADPS2_MASK | ADPS1_MASK | ADPS0_MASK;
// Разрешение прерывания от АЦП
ADCSRA |= ADIE_MASK;
// Непрерывный режим работы АЦП
ADCSRA |= ADATE_MASK;
sei();
}
uint16_t get_adc_value(void)
{
return value;
}

43
device_adc.h Normal file
View File

@ -0,0 +1,43 @@
#ifndef DEVICE_ADC_H
#define DEVICE_ADC_H
#include <avr/interrupt.h>
#include <stdint.h>
#include <avr/io.h>
#define F_CPU 16000000
#define REFS1_BIT (7)
#define REFS1_MASK (1<<REFS1_BIT)
#define REFS0_BIT (6)
#define REFS0_MASK (1<<REFS0_BIT)
#define ADLAR_BIT (5)
#define ADLAR_MASK (1<<ADLAR_BIT)
#define MUX3_BIT (3)
#define MUX3_MASK (1<<MUX3_BIT)
#define MUX2_BIT (2)
#define MUX2_MASK (1<<MUX2_BIT)
#define MUX1_BIT (1)
#define MUX1_MASK (1<<MUX1_BIT)
#define MUX0_BIT (0)
#define MUX0_MASK (1<<MUX0_BIT)
#define ADEN_BIT (7)
#define ADEN_MASK (1<<ADEN_BIT)
#define ADPS2_BIT (2)
#define ADPS2_MASK (1<<ADPS2_BIT)
#define ADPS1_BIT (1)
#define ADPS1_MASK (1<<ADPS1_BIT)
#define ADPS0_BIT (0)
#define ADPS0_MASK (1<<ADPS0_BIT)
#define ADSC_BIT (6)
#define ADSC_MASK (1<<ADSC_BIT)
#define ADIF_BIT (4)
#define ADIF_MASK (1<<ADIF_BIT)
#define ADIE_BIT (3)
#define ADIE_MASK (1<<ADIE_BIT)
#define ADATE_BIT (5)
#define ADATE_MASK (1<<ADATE_BIT)
void adc_init(void);
uint16_t get_adc_value(void);
#endif /*DEVICE_C_H*/