Jump to content
Тверской

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

Recommended Posts

А на что будет реагировать, если Вы

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

убрали из основного цикла ? :)

Share this post


Link to post
Share on other sites

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

while (1)

{

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

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

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

Edited by Тверской

Share this post


Link to post
Share on other sites

Изготовление 2-х слойных плат от 2$, а 4-х слойных от 5$!

Быстрое изготовление прототипа платы всего за 24 часа! Прямая доставка с нашей фабрики!

Смотрите видео о фабрике JLCPCB: https://youtu.be/_XCznQFV-Mw

Посетите первую электронную выставку JLCPCB https://jlcpcb.com/E-exhibition чтобы получить купоны и выиграть iPhone 12, 3D-принтер и так далее...

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

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

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

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

или проще

for(;i>0;i--)


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

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

Share this post


Link to post
Share on other sites

Безмостовые ККМ для 99% КПД!

Схема коррекции коэффициента мощности (ККМ) на основе так называемого «тотемного столба» (Totem Pole) обладает минимально возможными потерями и потенциально может обеспечить самые жесткие требования к энергоэффективности источников питания. Компания Wolfspeed представляет референсную разработку – плату ККМ CRD-02AD065N на базе собственных карбид-кремниевых MOSFET и диодов с наилучшими в отрасли характеристиками.

Подробнее

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

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

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

//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

Edited by Тверской

Share this post


Link to post
Share on other sites

Гибридные IGBT - сила Si и SiC в одном корпусе!

Компания Infineon представила новые гибридные IGBT-транзисторы на 650 В, которые сочетают в себе преимущества технологий TRENCHSTOP и CoolSiC. Использование SiC-диода Шоттки позволяет значительно расширить возможности IGBT и снизить уровень энергии, необходимой для включения транзистора (Eon), а также уменьшить потери на переключение.

Подробнее

Ещё существует delay_us - задержка в микросекундах. Но, скорее всего, аргументом должна быть константа.

ЗЫ: Советую изучить таймеры.

Share this post


Link to post
Share on other sites

Вебинар «Параметры выше, цена ниже. Обновление в линейке AC/DC- и DC/DC-преобразователей MORNSUN» (26.01.2021)

Приглашаем 26 января на бесплатный вебинар, посвящённый преимуществам и отличиям новых источников питания и DC/DC-преобразователей Mornsun. На вебинаре будут рассмотрены изолированные и неизолированные DC/DC-преобразователи последнего, четвертого, поколения (R4) и компактные модульные источники питания второго и третьего поколений (семейства LS/R3 и LD/R2) на плату. Рассмотрим новую группу продукции – встраиваемые источники питания в кожухе.

Подробнее

Использовать не милли- а микросекунды, например. _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 раз.

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

Share this post


Link to post
Share on other sites

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

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

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

Что скажете?

Edited by Тверской

Share this post


Link to post
Share on other sites

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


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

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

Share this post


Link to post
Share on other sites

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мс

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

Edited by BerZerKku

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Edited by COKPOWEHEU

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

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

Share this post


Link to post
Share on other sites

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

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


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

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

Share this post


Link to post
Share on other sites

Интересный факт. 95% интересуется "А что же будет", и только 5% "Почему так, а не иначе", а жаль..

Share this post


Link to post
Share on other sites

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

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


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

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

Share this post


Link to post
Share on other sites

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

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

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

P.S

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

Edited by Syltetooy

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


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

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

#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 СК + сколько то миллисекунд?

Edited by Тверской

Share this post


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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...