Бакометр на Attiny2313

Обсуждаем электронику на колесах. Нужен увлажнитель воздуха для Камаза? Вам сюда.
sirop4ik89
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Ср июн 03, 2015 16:11:19

Re: Бакометр на Attiny2313

Сообщение sirop4ik89 »

Как использовать АЦП в меге что бы конвертировать из вольт в литры???
Реклама
Аватара пользователя
Arwood
Держит паяльник хвостом
Сообщения: 986
Зарегистрирован: Чт янв 13, 2011 13:51:26

Re: Бакометр на Attiny2313

Сообщение Arwood »

Организацией таблицы в памяти. С присвоением значений.
"Ячейка 1 - литр
Ячейка 2 - 2 литра
.............. - полный бак"
Заполнять таблицу при тарировке - залил литр, нажал кнопку, залил второй - снова нажал.
Или: Пустой бак - нажал. Залил половину - снова нажал. Полный - опять нажал.
Промежуточные значения - пусть контроллер сам считает.
Реклама
sirop4ik89
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Ср июн 03, 2015 16:11:19

Re: Бакометр на Attiny2313

Сообщение sirop4ik89 »

Буду думать и искать как сделать :shock: Пока не знаю как. Доперел пока до этого:
Спойлер#define F_CPU 4000000UL // Тактовая частота микроконтроллера 4 МГц
#define LEDS_OK // Используется индикатор с общим катодом

// Подключаю стандартные библиотеки
#include <avr/io.h> // Ножки ввода-вывода
#include <util/delay.h> // Задержки
#include <avr/interrupt.h> // Прерывания

// Сегменты, должны быть в пределах одного порта МК
#define LED_SEG_A 6
#define LED_SEG_B 0
#define LED_SEG_C 2
#define LED_SEG_D 3
#define LED_SEG_E 4
#define LED_SEG_F 5
#define LED_SEG_G 1
#define LED_SEG_PORT PORTD
#define LED_SEG_DDR DDRD

// Знакоместа, должны быть в пределах одного порта МК
#define LED_DIG_1A 0
#define LED_DIG_1B 1
#define LED_DIG_2A 2
#define LED_DIG_2B 3
#define LED_DIG_3A 4
#define LED_DIG_3B 5
#define LED_DIG_PORT PORTC
#define LED_DIG_DDR DDRC

const uint8_t codes[14]=
{
(1<<LED_SEG_A)|(1<<LED_SEG_B)|(1<<LED_SEG_C)|(1<<LED_SEG_D)|(1<<LED_SEG_E)|(1<<LED_SEG_F), // цифра 0
(1<<LED_SEG_B)|(1<<LED_SEG_C), // цифра 1
(1<<LED_SEG_A)|(1<<LED_SEG_B)|(1<<LED_SEG_D)|(1<<LED_SEG_E)|(1<<LED_SEG_G), // цифра 2
(1<<LED_SEG_A)|(1<<LED_SEG_B)|(1<<LED_SEG_C)|(1<<LED_SEG_D)|(1<<LED_SEG_G), // цифра 3
(1<<LED_SEG_B)|(1<<LED_SEG_C)|(1<<LED_SEG_F)|(1<<LED_SEG_G), // цифра 4
(1<<LED_SEG_A)|(1<<LED_SEG_C)|(1<<LED_SEG_D)|(1<<LED_SEG_F)|(1<<LED_SEG_G), // цифра 5
(1<<LED_SEG_A)|(1<<LED_SEG_C)|(1<<LED_SEG_D)|(1<<LED_SEG_E)|(1<<LED_SEG_F)|(1<<LED_SEG_G), // цифра 6
(1<<LED_SEG_A)|(1<<LED_SEG_B)|(1<<LED_SEG_C)|(1<<LED_SEG_F), // цифра 7
(1<<LED_SEG_A)|(1<<LED_SEG_B)|(1<<LED_SEG_C)|(1<<LED_SEG_D)|(1<<LED_SEG_E)|(1<<LED_SEG_F)|(1<<LED_SEG_G), // цифра 8
(1<<LED_SEG_A)|(1<<LED_SEG_B)|(1<<LED_SEG_C)|(1<<LED_SEG_D)|(1<<LED_SEG_F)|(1<<LED_SEG_G), // цифра 9
0b00000000, // пробел (код 10)
(1<<LED_SEG_G), // прочерк (код 11)
(1<<LED_SEG_F)|(1<<LED_SEG_E)|(1<<LED_SEG_D), // символ L (код 12)
(1<<LED_SEG_A)|(1<<LED_SEG_B)|(1<<LED_SEG_C)|(1<<LED_SEG_D)|(1<<LED_SEG_E)|(1<<LED_SEG_F)|(1<<LED_SEG_G)|(1<<LED_SEG_DP), // зажечь все сегменты (код 13)

};

#define SEG_BLANK 10 // пробел
#define SEG_MINUS 11 // прочерк
#define SEG_DEGREE 12 // символ литры
#define SEG_ALL 13 // зажечь все сегменты


volatile uint8_t digit = 0; // Номер текущего знакоместа динамической индикации
volatile uint8_t digit1 = 0; // Цифра или символ, выводимые в 1 знакоместо
volatile uint8_t digit2 = 0; // Цифра или символ, выводимые во 2 знакоместо
volatile uint8_t digit3 = 0; // Цифра или символ, выводимые в 3 знакоместо

int main(void)
{
while(1)
{
// Настраиваю ножки МК для сегментов
LED_SEG_DDR |= 0xFF;
LED_SEG_PORT |= 0x00;

// Настраиваю ножки МК для знакомест
LED_DIG_DDR |= (1 << LED_DIG_1A)|(1 << LED_DIG_1B)|(1 << LED_DIG_2A)|(1 << LED_DIG_2B)|(1 << LED_DIG_3A)|(1 << LED_DIG_3B);
LED_DIG_PORT |= 0x00;

// Настраиваю таймер 0 для динамической индикации
// 4000000 Гц / 64 предделитель / 255 переполнение / 3 знакоместа = 81 раз в секунду обновляется семисегментный индикатор
// 4000000 Гц / 8 предделитель / 255 переполнение / 3 знакоместа = 653 раза в секунду обновляется семисегментный индикатор
// 8000000 Гц / 64 предделитель / 255 переполнение / 3 знакоместа = 163 раза в секунду обновляется семисегментный индикатор
// 8000000 Гц / 8 предделитель / 255 переполнение / 3 знакоместа = 1307 раз в секунду обновляется семисегментный индикатор
// 10000000 Гц / 64 предделитель / 255 переполнение / 3 знакоместа = 204 раза в секунду обновляется семисегментный индикатор
// 10000000 Гц / 8 предделитель / 255 переполнение / 3 знакоместа = 1633 раза в секунду обновляется семисегментный индикатор
// 12000000 Гц / 64 предделитель / 255 переполнение / 3 знакоместа = 245 раз в секунду обновляется семисегментный индикатор
// 12000000 Гц / 8 предделитель / 255 переполнение / 3 знакоместа = 1960 раз в секунду обновляется семисегментный индикатор
// 16000000 Гц / 64 предделитель / 255 переполнение / 3 знакоместа = 326 раз в секунду обновляется семисегментный индикатор
// 16000000 Гц / 8 предделитель / 255 переполнение / 3 знакоместа = 2614 раз в секунду обновляется семисегментный индикатор
//TCCR0B |= (1 << CS00) | (1 << CS01); // Предделитель на 64
TCCR0B |= (1 << CS01); // Предделитель на 8
TIMSK |= (1 << TOIE0); // Разрешаю прерывания по таймеру 0
asm volatile ("sei"); // Глобально разрешаю прерывания

// При старте бакометра делаю тест всех сегментов 0.5 секунды
digit1 = SEG_ALL;
digit2 = SEG_ALL;
digit3 = SEG_ALL;
}
}
Я понял еще что забыл разрешить АЦП. И как его назначить например на ножку 14??? :dont_know:
Аватара пользователя
Mishany
Электрический кот
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Re: Бакометр на Attiny2313

Сообщение Mishany »

какая мега и в каком корпусе?
если мега 8 (32ноги) то АЦП можно задействовать только на 19,22 и 23-28 ногах
настройка 2-х регистров АЦП
ADCSRA
ADMUX
Последний раз редактировалось Mishany Чт мар 03, 2016 09:00:22, всего редактировалось 1 раз.
Реклама
Эиком - электронные компоненты и радиодетали
sirop4ik89
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Ср июн 03, 2015 16:11:19

Re: Бакометр на Attiny2313

Сообщение sirop4ik89 »

кораус DIP. Можно и 19 ногу использовать
Типо тогодолжно выйти?:
ADCSRA |= (1 << ADEN)
|(1 << ADSC)
|(1 << ADFR)
|(1 << ADPS2)|(1 << ADPS1)
|(1 << ADIE);
ADMUX |= (1 << REFS1)|(1 << REFS0);
Последний раз редактировалось sirop4ik89 Чт мар 03, 2016 09:03:20, всего редактировалось 1 раз.
Реклама
Аватара пользователя
Mishany
Электрический кот
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Re: Бакометр на Attiny2313

Сообщение Mishany »

тогда только 23-28 ноги, а 19,22 только для TQFP\MLF корпуса
Реклама
sirop4ik89
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Ср июн 03, 2015 16:11:19

Re: Бакометр на Attiny2313

Сообщение sirop4ik89 »

Ну щас тогда перепешу ноги индикатора..
Аватара пользователя
Mishany
Электрический кот
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Re: Бакометр на Attiny2313

Сообщение Mishany »

в даташите расписаны все ноги с альтернативными функциями на 2 странице
Изображение
пользуйтесь примерами хотя вижу что уже почитали)))
и про АЦП
Я бы посоветовал программу писать под 1 МГц тактовой что б fuse оставить на заводских установках, для этого надо только делители частоты подправить в таймере и АЦП(если непрерывное преобразование включено рекомендовано по ДШ в пределах 50-200кГц)
Последний раз редактировалось Mishany Чт мар 03, 2016 09:19:37, всего редактировалось 1 раз.
sirop4ik89
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Ср июн 03, 2015 16:11:19

Re: Бакометр на Attiny2313

Сообщение sirop4ik89 »

Увидел. А я чего то не понял? если включу вот так ацп как я написал? у меня все ноги от 23 до 28 станут аналоговыми входами? И если я подключу датчик уровня например на ногу 28 то как мне писать что бы МК понял что ему надо использовать именно эту ногу для чтения датчика? :dont_know:
Да это я именно и прочитал, только я основную часть так слабо понял..
Аватара пользователя
Mishany
Электрический кот
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Re: Бакометр на Attiny2313

Сообщение Mishany »

канал выбирается 4 битами в ADMUX, одновременно может работать только один канал, если надо больше каналов то в программе переключать каналы
MUX3..0 выбор входного канала
0000 ADC0
0001 ADC1
0010 ADC2
0011 ADC3
0100 ADC4
0101 ADC5
Сам АЦП всего один, но к нему можно подключить один из 6 каналов которые жестко привязаны к ногам с 23 по 28
пример 2 каналов

Код: Выделить всё

ISR(ADC_vect)
{
ADCSRA = 0; // Выключаем АЦП 
if((ADMUX & 0x0F)==1) // Если был выбран канал ADC1
{
voltage_value = voltage_value + ADC; // Суммируем измеренные значения напряжения и помещаем в буфер
ADMUX = (ADMUX & 0xF0) | 0; // Выбираем канал ADC0
}
взято от сюда
sirop4ik89
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Ср июн 03, 2015 16:11:19

Re: Бакометр на Attiny2313

Сообщение sirop4ik89 »

Тоесть я должен поставить так:
ADMUX=(0<<MUX0)|(1<<MUX1)|(0<<MUX2)|(1<<MUX3)|(1<<REFS0)|(1<<REFS1);
???
Аватара пользователя
Mishany
Электрический кот
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Re: Бакометр на Attiny2313

Сообщение Mishany »

нет, в такой комбинации MUX3...0 пустая настройка, я дал табличку выбора канала, какой канал выбран? ADC5 на 28 ноге?
ADMUX=(1<<MUX0)|(1<<MUX2)|(1<<REFS0)|(1<<REFS1); ADC5 и внутр. ИОН напряжением 2.56 V
и какая битность АЦП 8 или 10? т.е. 0...255 или 0...1023?
sirop4ik89
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Ср июн 03, 2015 16:11:19

Re: Бакометр на Attiny2313

Сообщение sirop4ik89 »

битность 8
Аватара пользователя
Mishany
Электрический кот
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Re: Бакометр на Attiny2313

Сообщение Mishany »

тогда вот так:
ADMUX=(1<<MUX0)|(1<<MUX2)|(1<<REFS0)|(1<<ADLAR)|(1<<REFS1); ADC5, внутр. ИОН напряжением 2.56 V, 8бит
и значение брать из ADCH регистра, т.е.

Код: Выделить всё

unsigned char value_dut;
///////
value_dut=ADCH;
sirop4ik89
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Ср июн 03, 2015 16:11:19

Re: Бакометр на Attiny2313

Сообщение sirop4ik89 »

А разница кварц убирать? Я читал уже не раз что внутренний тактовый генератор постоянно куда то плывет. А кварц все таки стабильнее, особенно не китайский если ставить.
Аватара пользователя
musor
Друг Кота
Сообщения: 39197
Зарегистрирован: Сб сен 13, 2014 16:27:32
Откуда: СпиртоГонск созвездия Омега

Re: Бакометр на Attiny2313

Сообщение musor »

блин люди 4разряда без кварца делают а тут показометр с 30%погрещностью датчика... и ставить кварЦ с ег ударонестойкостью? БРЕД
а плыть будет не частота...скорее опорное и питание...хотя ствить внецни ИОН для 2цифр-БРЕД
ну ладно
пилите Шура ПИЛИТЕ(с) это даже интересно как получится :)))
тока для меги яб и волтер и ампермерт приделал до кучи
ZМудрость(Опыт и выдержка) приходит с годами.
Все Ваши беды и проблемы, от недостатка знаний.
Умный и у дурака научится, а дураку и ..
Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает
Аватара пользователя
Mishany
Электрический кот
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Re: Бакометр на Attiny2313

Сообщение Mishany »

правильно, вообще кварц ставиться там где необходима стабильность и точность на примере UART, USB и т.д., и работой с таймерами для измерений чего либо, или для запуска меги на частоте более 8МГц....
sirop4ik89
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Ср июн 03, 2015 16:11:19

Re: Бакометр на Attiny2313

Сообщение sirop4ik89 »

ну нет так нет. Спасибо Mishany за разьяснения. Я почему просто выбрал кварц. Я хотел сделать так что-бы при бросковом взгляде на индикатор не было ощущения мерцания.
А вот ваши высказывания ув "musor" я готов опровергнуть. Во первых
musor писал(а):и ставить кварЦ с ег ударонестойкостью?
И от чего же выдраный не китайский кварц с японской магнитолы стал не ударостойким???? Который в принципе стоял в машине и переносил все вибрации и т.д.
musor писал(а):тока для меги яб и волтер и ампермерт приделал до кучи
Так приделывайте. Если вы не читали ветку с самого начала, где необходимо что бы в одном корпусе был один прибор то не надо сразу тут делать из проекта БК!
Была бы возможность сделать на тини ябы сделал, но увы в ней нет этого зло**ного АЦП.
Уважаемый вы бы чего подсказали лучше по делу и пояснили, а зайти и наговорить лишнего это каждый может.
Аватара пользователя
Mishany
Электрический кот
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Re: Бакометр на Attiny2313

Сообщение Mishany »

ощущение мерцания только из-за низкой частоты динамической индикации, но не как из-за кварца, без кварца частота может на несколько процентов плавать из-за температуры, не более, в остальном все стабильно работает.
sirop4ik89
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Ср июн 03, 2015 16:11:19

Re: Бакометр на Attiny2313

Сообщение sirop4ik89 »

И тут опять ступор :( Я чет не как не пойму как организовать запись калибровочных значений в епром..
Я понимаю что надо активировать епром:
Спойлер

Код: Выделить всё

#define d0 ~(0x3F) // 0
#define d1 ~(0x06) // 1
#define d2 ~(0x5B) // 2
#define d3 ~(0x4F) // 3
#define d4 ~(0x66) // 4
#define d5 ~(0x6D) // 5
#define d6 ~(0x7D) // 6
#define d7 ~(0x07) // 7
#define d8 ~(0x7F) // 8
#define d9 ~(0x6F) // 9
 
unsigned char s;
unsigned char eeprom_var EEMEM; // определяем переменную в EEPROM
Взято отсюда: http://radioparty.ru/prog-avr/program-c ... son-eeprom

Там индикатор на 1 знак. И прописано число от 0 до 9. А бак у меня 39л. Тоесть мне каждый литр надо так вбивать? Что бы получилось так?:
Спойлер

Код: Выделить всё

#define d1 ~(0x06) // 1
#define d2 ~(0x5B) // 2
#define d3 ~(0x4F) // 3
#define d4 ~(0x66) // 4
#define d5 ~(0x6D) // 5
#define d6 ~(0x7D) // 6
#define d7 ~(0x07) // 7
#define d8 ~(0x7F) // 8
#define d9 ~(0x6F) // 9
#define d10 ~(0x06) // 10
#define d12 ~(0x5B) // 11
#define d13 ~(0x4F) // 12
#define d14 ~(0x66) // 13
и т.д.
 

Или как?
Arwood писал(а):Организацией таблицы в памяти. С присвоением значений.
"Ячейка 1 - литр
Ячейка 2 - 2 литра
.............. - полный бак"

Так же не вкурил пока как организовать эту таблицу :dont_know:
блин, вообще трешь. Я тут думаю как кнопками натыкать значение и записать а должно то быть по другому.. МК читает с ацп значение, я выставляю сколько литров я залил кнопками и нажимаю ОК, далее мк присваивает этому значению которое я вбил значение взятое с ацп и пишет в епром.
И при следующих включениях устройства он от туда их считывает и показывает на индикатор.
Треш вообщем..
Ответить

Вернуться в «АвтоМотоВело»