Перейти к содержанию

Варианты Опроса Кнопок В Avr Studio 6


Тверской

Рекомендуемые сообщения

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

да,уже эту часть доработал :)

while (1)

{

char i=PIND;// читаем portD

i=(~i)&0x0F;// в i - число заданное нажатыми кнопками

так сделал, теперь надо с цифрами в FOR разобраться чтоб повторял столько сколько в переменной храниться, а то всё наоборот выходит

Изменено пользователем Тверской
Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Так замените инкремент на декремент. Вместо

for(i=i;i<15;i++)

можно написать

for(j=0;j<i;j++)

или проще

for(;i>0;i--)

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

И снова всем здравствуйте :)

Спустя неделю и изучив ваши советы, я разродился нижеприведённым кодом)

//стенд проверки АР и Л.С.

//tiny2313

//Тверь,Медведев Евгений

#define F_CPU 8000000

#include <avr/io.h>

#include <util/delay.h>

void preset() //установка работы портов B и D

{

DDRB = 0xFF; //порт B работает на выход

PORTB = 0xFF; //на выходе порта B везде 1

DDRD= 0x00; //порт D работает на вход

PORTD = 0xFF; // подтяжка резисторами

}

char i; //задаём переменную в которой будет содержатся число извещателей в л.с.

unsigned int v; //задаём переменную в которой будет содержатся оставшееся время питания до имп. сброса

int main(void)

{

preset();// установили работу портов В и D

while (1) //зацикливаем выполнение программы

{

char i=PIND;// считываем с порта D заданное кол-во изв-ей в л.с.

i=(~i)&0x0F;// записываем это значение в переменную i

while ((PIND==0x7F)) //пока не нажаты кнопки

{

//то формируем импульс сброса и подаём питание в л.с.

{

PORTB = 0x00; // отключаем сигнал

_delay_ms(16); //формируем импульс сброса

PORTB = 0xff; // подключаем сигнал

_delay_ms(1264); // питание в л.с.

}

}

// если нажата хоть одна кнопка, то формируем импульс сброса

{

PORTB = 0x00; // отключаем сигнал

_delay_ms(16); //формируем импульс сброса

// считываем с переменной кол-во извещателей

for (i=i; i>0; i--)// столько же раз подаём в л.с. адресные импульсы

{

if ((~PIND)&(1 << 4))//PIND=(0x01&(PIND>>4))

{

PORTB = 0xFF; // подключаем сигнал

_delay_ms(9); // время работы извещателя до имп.квит.

PORTB = 0x00; // начало формиров.имп.квит.

_delay_us(500); //формируем имп.квит.

PORTB = 0xFF; // подключаем сигнал

_delay_ms(6.5); //формируем 2-ю половину работы изв.

PORTB = 0x00; // отключаем сигнал

_delay_us(250); //формируем адресный импульс

}

else

{

PORTB = 0xFF; // подключаем сигнал

_delay_ms(16); // время работы извещателя

PORTB = 0x00; // начало адр.импульса

_delay_us(250); //формируем адр.импульс

}

}

}

// по окончанию импульсов подключаем питание

PORTB = 0xff; // подключаем сигнал

v =(1250-16-(i*16.25)+0.25);//вычитаю из общей длины-импульс сброса-кол-во изв-й * на время работы одного изв-ля + адресная задержка последнего извещателя

_delay_ms(v); // оставшееся время до прихода нового импульса сброса

}

чтобы получить то что я хотел изначально мне осталось отладить последние 2 строки. Беда в том что delay (насколько информировали меня различные источники) не может быть дробной цифрой а у меня как раз дробная выходит. Как можно ещё задержать сигнал на дробное число миллисекунд?

P.S. за v =(1250-16-(i*16.25)+0.25) прошу неругать,написал чтобы незабыть)

На всякий случай прикрепляю схему в шпротеусе.

shema.rar

Изменено пользователем Тверской
Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока (материалы вебинара)

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Использовать не милли- а микросекунды, например. _delay_us();

if ((~PIND)&(1 << 4))
Довольно оригинальное решение. Чаще пишут if(!(PIND & (1<<PD4))), но по сути оба варианта верны.
char i=PIND;// считываем с порта D заданное кол-во изв-ей в л.с.

i=(~i)&0x0F;// записываем это значение в переменную i

while ((PIND==0x7F))

А в чем сакральный смысл такой конструкции? Допустим, кнопки не нажаты; считываем/обрабатываем их, получаем i=0; выжидаем, пока хоть одну кнопку на нажмут (причем на PD7 в это время обязательно должен быть лог.0), дальше продолжаем выполнение алгоритма.
P.S. за v =(1250-16-(i*16.25)+0.25) прошу неругать,написал чтобы незабыть)
Раз уж времянка - фиг с ней, неоптимальностью. Для надежности сделайте явное приведение типов.
Беда в том что delay не может быть дробной цифрой
Объявлен он как _delay_ms(double). Беда в том, что он предпочитает принимать константы, а не переменные.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

смысл той конструкции в том что при ненажатых кнопках на выходе не чистая 1 а с импульсом сброса в 16мс. Конешно оптимизировать наверно ещё что-то можно, но я делал по порядку как представляю, чтоб понятно было.

с мс на мкс переделать непроблема, но вопрос в том что в delay незаписать переменную так и останется.

Вот думаю может через что-то повторять delay_us (250), цифра кратная всем нужным интервалам, переделаю формулу и буду её повторять столько сколько надо.

Что скажете?

Изменено пользователем Тверской
Ссылка на комментарий
Поделиться на другие сайты

Вполне возможный вариант. А на аппаратном таймере не пробовали считать время?

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

unsigned int v;
v = (1250 - 16 - (i*16.25) + 0.25);;

Данная переменная уже не будет содержать дробной части, т.е. количество миллисекунд всегда будет целое.

Если лень разбираться с аппаратными возможностями МК, дробные интервалы можно задавать с помощью меньшей задержки в цикле (при этом надо учесть что цикл вносит доп.задержку). Например, 1.5мс можно получить используя задержку в 100мк:

void delay100us(int t) {
while(t > 0) {
_delay_us(100);
t--;
}
}

delay100us(15); // задержка в 1.5мс

Опа, не внимательно прочитал пост Тверской и написал кучу лишних буков: вы творец своей программы, конечно можно.

Изменено пользователем BerZerKku
Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Только не вверх, а вниз. Просто обрезание дробной части. В Вашем случае что из 3.7, что из 3.1 получится 4.

Упс, только что сказал одно, а пример привел обратный. Конечно, 3.

Изменено пользователем COKPOWEHEU

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

тьфу, точно. Видимо, отвлекся, пока писал :-)

Конечно, при переводе из дробного числа в целое, дробная часть просто отбрасывается. Так, из чисел 3.1, 3.7, 3.999, 22/7 получится число 3.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

В отличие от науки, в технике этот вопрос часто бесполезен. Какая практическая польза от знания причины выбора размера байта именно в 8 бит? Или выделения всего 4 первычных логических дисков на одном физическом жестком диске (кажется, уже пофиксили, но не уверен)? Или расположения выводов микросхемы именно в таком противоестественном порядке (561ИП2, да и многие другие, например)? Или выбора напряжения осветительной сети именно 220 В? Или от знания, почему электрон считается отрицательной частицей, а не положительной? Или даже почему выбраны именно такие эталоны физических величин (только посмотрите на определение метра)?

Хотя когда собственное устройство не работает как надо, как раз с вопроса "почему" и надо начинать. Обычно потом появляется вопрос "Так, вот тут была ошибка, как оно хоть как-то умудрялось работать?!".

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Имелось ввиду почему именно отрасывается, а не округляется по законам математики (x<0.5;x=0 , x>0.4;x=1), много интересного можно было узнать.

Насчет логических разделов зависит от разметки, у mbr (которому винда так сильно симпотизирует) это ограничение все еще есть, хотя уже есть разметка GPT (MAC'овая), и там все нормально, никаких ограничений, но винда туда не ставится, с линуксом получше вроде. Хотя это информация может уже устарела, давно не приходилось системы переставлять :)

А что у метра, что у секунды опредедения не для обычных смертных (а это не наука случаем). Про 220В курс школьной физики, хочешь нехочешь, а узнаешь (тоже больше науки, чем техники). Байт=8бит, может и не нужно, но это историяИТ, а она меня всегда привлекала, так что пошел читать про биты :umnik2:

P.S

"как оно хоть как-то умудрялось работать?!". "- так это в программирование обычное дело :crazy:

Изменено пользователем Syltetooy
Ссылка на комментарий
Поделиться на другие сайты

Потому что INT, число округлиться вверх до ближайцего целого числа. 3.7 --> 4, так же как 3.1 -- 4.

значит мне нужен тип данных float ?

Ссылка на комментарий
Поделиться на другие сайты

Согласен с Syltetooy. Ибо, если бы человек интересовался именно вопросом "Почему так, а не иначе", он бы не задавал подобных вопросов :

значит мне нужен тип данных float ?
:)

Начало изучения языка всегда должно быть с изучения типов переменных.

Тверской, какой тип нужен именно Вам - решать только Вам.

Ссылка на комментарий
Поделиться на другие сайты

А что у метра, что у секунды опредедения не для обычных смертных (а это не наука случаем).
Имелось в виду почему выбрали для единицы длины и времени именно такие величины, а не те, которые воспроизводятся более логичными способами. В смысле, понятия "длина", "время" и правда ближе к науке, а вот выбор конкретного эталона - скорее к технике. Секунда - 9 192 631 770 колебания атома цезия-133! Как будто нельзя было подобрать более круглое число и более распространенный элемент. Согласен, отчасти это обусловлено какими-то объективными соображениями, но по большей части - просто дань традиции.
значит мне нужен тип данных float ?
В общем случае дробные числа в контроллерах нужны достаточно редко. Ваш это случай или нет - решать Вам.
"Почему так, а не иначе"
А не знаете, это прописано в языке, или зависит от реализации? В смысле существуют ли реализации Си, где преобразование float-int идет в большую сторону или с честным округлением?

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

А не знаете, это прописано в языке, или зависит от реализации? В смысле существуют ли реализации Си, где преобразование float-int идет в большую сторону или с честным округлением?

Понятия не имею. Пока не встречал, не приходилось настолько в язык углубляться. Но ручками же не трудно реализовать.

Ссылка на комментарий
Поделиться на другие сайты

Всем снова здравствуйте :) ну и по написали вы тут)

Перечитав с десяток раз всё выше написанное и вникнув в ваши советы я доразродил свой код до конца и получил то что хотел ^_^ (ну по крайней мере в протеусе)

#define F_CPU 10000000

#include<avr/io.h>

#include <util/delay.h>

void preset() //установка работы портов B и D

{

DDRB = 0xFF; //порт B работает на выход

PORTB = 0xFF; //на выходе порта B везде 1

DDRD= 0x00; //порт D работает на вход

PORTD = 0xFF; // подтяжка резисторами

}

char i; //задаём переменную в которой будет содержатся число извещателей в л.с.

int main(void)

{

preset();// установили работу портов В и D

while (1) //зацикливаем выполнение программы

{

char i=PIND;// считываем с порта D заданное кол-во изв-ей в л.с.

i=(~i)&0x0F;// записываем это значение в переменную i

PORTB = 0x00; // отключаем сигнал

_delay_ms(16); //формируем импульс сброса

// считываем с переменной кол-во извещателей

for (i=i; i>0; i--)// столько же раз подаём в л.с. адресные импульсы

{

if ((~PIND)&(1 << 4))//PIND=(0x01&(PIND>>4))

{

PORTB = 0xFF; // подключаем сигнал

_delay_ms(9); // время работы извещателя до имп.квит.

PORTB = 0x00; // начало формиров.имп.квит.

_delay_us(500); //формируем имп.квит.

PORTB = 0xFF; // подключаем сигнал

_delay_ms(6.5); //формируем 2-ю половину работы изв.

PORTB = 0x00; // отключаем сигнал

_delay_us(250); //формируем адресный импульс

}

else

{

PORTB = 0xFF; // подключаем сигнал

_delay_ms(16); // время работы извещателя

PORTB = 0x00; // начало адр.импульса

_delay_us(250); //формируем адр.импульс

}

}

// по окончанию импульсов подключаем питание

PORTB = 0xFF;

//делаем задержку питания в зависимости от кол-ва заданных извещателей

switch (PIND=(~PIND)&0x0F)

{

case 1:_delay_ms(1218);

break;

case 2:_delay_ms(1201.75);

break;post-120077-0-30173100-1407424838_thumb.jpg

case 3:_delay_ms(1185.5);

break;

case 4:_delay_ms(1169.25);

break;

case 5:_delay_ms(1153);

break;

case 6:_delay_ms(1136.75);

break;

case 7:_delay_ms(1120.5);

break;

case 8:_delay_ms(1104.25);

break;

case 9:_delay_ms(1088);

break;

case 10:_delay_ms(1071.75);

break;

case 11:_delay_ms(1055.5);

break;

case 12:_delay_ms(1039.25);

break;

case 13:_delay_ms(1023);

break;

case 14:_delay_ms(1006.75);

break;

case 15:_delay_ms(990.5);

break;

// если кол-во не задано, то задержка = 1234 ms

default:_delay_ms(1234);

};switch

}

}

нестал я крутить покругу много раз delay чтоб получить определённой длины задержку, а реализовал её с помощью функции switch, хотя с ней тоже пришлось повозиться, во всех описаниях на неё пишут что в круглые скобки ей можно указать переменную,но моя i туда неполезла потому описал её иначе)

на следущей неделе буду пробовать заливать прогу в чип, на работе есть stk500 (вставлю ей в свободную панель свой мк и буду прошивать чип) и и avr studio 4, помогите фьюзы правильно выставить)

в протеусе они выглядят так

post-120077-0-65819700-1407425086_thumb.jpg

непойму вот что, например в протеусе отключен делитель частоты на 8, в фьюзах тогда непосредственно перед заливкой соответствующая галка на этом пункте должна стоять или быть снята?

Кварц будет внешний на 10МГц.питание 5 вольт.

post-120077-0-30173100-1407424838_thumb.jpg

что за время указывают в ms после 14 СК + сколько то миллисекунд?

Изменено пользователем Тверской
Ссылка на комментарий
Поделиться на другие сайты

непойму вот что, например в протеусе отключен делитель частоты на 8, в фьюзах тогда непосредственно перед заливкой соответствующая галка на этом пункте должна стоять или быть снята?
Запрограммированный фуз-бит - выставленный в 0. Как там именно в Вашем прошивальщике все это выглядит - не знаю.
что за время указывают в ms после 14 СК + сколько то миллисекунд?
Время между запуском кварца и стартом программы. СК - такты кварца. Теоретически сделано для защиты от дребезга питания или чего-то подобного. Для любителей не слишком важно, я выставляю на максимум.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

  • 1 год спустя...

первое место где за два дня нарыл доходчивую инфу по опросу пина, все после асма и CVavr, видимо не у меня одного нитаз вместо мозга, благодарю за доходчивое описание

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...