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

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


Тверской

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

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

while (1)

{

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

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

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

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

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

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

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

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

или проще

for(;i>0;i--)

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

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

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

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

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

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

Реклама: АО КОМПЭЛ, ИНН: 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 серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

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

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

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

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

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

Продукция 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 раз.

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

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

смысл той конструкции в том что при ненажатых кнопках на выходе не чистая 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 пользователей онлайн

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