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

Игра "лампочки" На Atmega 328P


maxbelyx

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

Именно приведенная схема не заработает, базы VT3, VT4 висят на аналоговых входах. Если я правильно помню, переключить их на выход невозможно. ...

Не путайте зря человека.

Аналоговые входы могут работать как самые обычные порты на вход-выход.

Стандартный ток светодиода 3...5 мА. В принципе можно и без транзисторов. Но это не слишком хороший вариант (плохая схемотехника).

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

Используя Atmega8515 с 40 ножками, можно просто все светодиоды повесить на свой пин и кнопки на свой пин. Я верно понимаю? Можно и без кварца сделать, он тут просто ни к чему.

Максим

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

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

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

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

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

По своей глупости и незнанию выбрал не тот микроконтроллер. Ну что-ж, будет уроком. Наверное тогда переделаю все на него. Сроки так дико затянуты что разбираться, кажется, буду дольше, чем сделать на другом МК. Жаль, что не обратил внимание на совет про "предельно простую схему" в самом начале. :)

Максим.

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

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

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

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

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

Именно приведенная схема не заработает, базы VT3, VT4 висят на аналоговых входах. Если я правильно помню, переключить их на выход невозможно. ...

Не путайте зря человека.

Аналоговые входы могут работать как самые обычные порты на вход-выход.

Стандартный ток светодиода 3...5 мА. В принципе можно и без транзисторов. Но это не слишком хороший вариант (плохая схемотехника).

Обратите внимание, что это не просто аналоговые входы. Про PC0-PC5 я ничего не говорил. А вот выводы ADC6, ADC7 работают ТОЛЬКО как аналоговые, ADC6 != PC6, потому что PC6 == RESET, это другой вывод. Более того, выводы ADC6, ADC7 в DIP-корпусе просто не разведены. Либо я чего-то не знаю, тогда буду раз за разъяснение.
По своей глупости и незнанию выбрал не тот микроконтроллер. Ну что-ж, будет уроком. Наверное тогда переделаю все на него
Не обязательно. На ATmega8 тоже прекрасно можно сделать, просто придется освоить динамическую индикацию, что в любом случае полезно. Схему можно использовать, например, такую. Только надо помнить что нельзя подавать на PD4-PD7 лог.1, а индикацию осуществлять переключением портов на вход-выход. Либо можно поставить последовательно с каждой кнопкой резистор ~1 кОм, либо диод. Но проще все-таки играться DDR'ом.

post-58864-0-06206300-1468612487_thumb.jpeg

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

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

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

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

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

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

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

Чтож, переделал схему на Atmega8515L.

Все светодиоды подключил на PORTA и PORTC, а кнопки на все PORTB и PORTD.

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

Инициализировал PORTB и PORTВ на вход: (Хотя наверное этого можно было и не делать)

DDRB = 0x00;

DDRD = 0x00;

PORTB = 0x00;

PORTD = 0x00;

После чего функцию ButtonState (проверка состояния кнопок) переписал по такому подобию (пример с работой кнопок на хабре):

/*1 кнопка*/

if((PINB&(1 << PB0)) == 1)

{

if (LED1_PIN & (1<<LED1_BIT)) LED1_OFF();

else LED1_ON();

if (LED2_PIN & (1<<LED2_BIT)) LED2_OFF();

else LED2_ON();

if (LED5_PIN & (1<<LED5_BIT)) LED5_OFF();

else LED5_ON();

}

Но программа все же отказалась запускаться. Что может теперь быть не так? Если быть точным, она запускается, и почему то загорается 10 лампа, хотя по логике не должна :) И на нажатия на кнопки никак не реагирует. Кнопки кстати подключены к пинам, и к +5В. При замыкании на пине устанавливается логическая единица.

С уважением,

Максим

Game.zip

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

Инициализировал PORTB и PORTВ на вход: (Хотя наверное этого можно было и не делать)
О как! И PORTB и еще раз PORTB :-) На счет инициализации вы правы - можно не делать, но перестраховка не повредит.
if((PINB&(1 << PB0)) == 1)
Лучше проверять на неравенство нулю, чтобы не было ошибок при проверке остальных битов. Например, (PINB & (1<<5)) вернет 0b00x00000 = 32, где х - логический уровень на PB5. Лучше использовать конструкцию if((PINB & (1<<PB0))!=0) или, сокращенно, if(PINB & (1<<0)). константа PB0 равна нулю (как и подобные, PORTB0, PINB0 или как PORTC5 = PINC5 = PC5 = 5), а булевым значением true является любое ненулевое число, тогда как false только ноль. Для проверки на нулевое значение, соответственно, используем равенство нулю вместо неравенства, либо логическое НЕ: if( !(PINB & (1<<0)) ).
if (LED1_PIN & (1<<LED1_BIT)) LED1_OFF();
Вот здесь можно использовать LED1_PORT для проверки состояния. Но ладно, будем надеяться, не будете слишком его перегружать...
И на нажатия на кнопки никак не реагирует. Кнопки кстати подключены к пинам, и к +5В. При замыкании на пине устанавливается логическая единица.
А к земле подтянуть резисторами не забыли? Устанавливается ли лог.0 при размыкании?

Именно поэтому (как минимум, в AVR) кнопки обычно вешают между выводом и землей, так что нажатому состоянию соответствует лог.0, а при отпускании встроенный подтягивающий резистор (DDRx=0 ; PORTx=1) обеспечивает лог.1.

#define WIN_DDR DDRA
У ATmega8515 есть еще урезанный PORTE, всякую мелочь можно на него выводить, а на PE2(OC1B) даже пищалку, хотя тут уже придется таймеры осваивать. Кстати, не увидел у вас чего-то вроде WIN_DDR |= (1<<WIN_BIT);
void LED1_ON(void)

{

LED1_PORT |=(1<<LED1_BIT);

}

void LED2_ON(void)

{

LED2_PORT |=(1<<LED2_BIT);

}

Оформить лучше как макрос, которому передавать номер диода или хотя бы порт и бит, LED_ON(LED1_PORT, LED1_BIT). Впрочем, это скорее удивление "и не лень было тратить время набивая кучу одинаковых процедур".
#include <stdio.h>
Это зачем?
while(1)

{

//ButtonState();

//GameWin();

}

Надеюсь, в реальном коде это раскомментировано
void ButtonInit(void)
Здесь настраиваете выводы для всего порта сразу, а у светодиодов - побитно.
/*Условие выйгрыша - все лампы потухли*/
Как?! Ну как можно допускать подобные ошибки?!
if ((LED1_PORT & (0<<LED1_BIT))
Кстати, так и не исправили. Вы вообще читаете, что вам пишут? Это условие никогда не выполнится. Делает, понимаешь, побитовый AND с нулем и еще чего-то ждет...
void ButtonState(void)

...

if((PINB&(1 << PB1)) == 1)

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

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

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

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

Благодарен за титаническое терпение :)

PORTB и PORTD, конечно же, опечатался.

Условия проверки кнопок переделал по типу if(!(PINB & (1<<0))).

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

Касательно WIN_PORT пока не трогал, это будет следующей проблемой. (Хотя надеюсь что не будет(Чертов Eclipse ругается почему то на PORTE когда пытаюсь его использовать))

Закомментировал при тестировании, при реальной проверке было раскомментировано.

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

После всех манипуляций и отключении (пока) функции GameWin вроде все заработало, но, из за дикого дребезга кнопок все перемигивается.

Думаю, как избавиться от него, может добавить некоторой задержки после опроса кнопки и снова опросить, и, если нажатие подтвердится, - выполнять условие? (судя по простым примерам из интернета о том как избавиться от дребезга).

Что то в роде:

if(!(PINB & (1<<0)))
{
_delay_ms(50);
if(!(PINB & (1<<0)))
{
...условие
}
}

*********************************

Отвечая самому себе - да, такой способ сработал, кнопки стали стабильно нажиматься и срабатывать. Мало ли кто еще из новичков читает данную тему.

Теперь что касается функции выИгрыша, сделал так:


if (!(PINA & ((1<<PA0)|(1<<PA1)|(1<<PA2)|(1<<PA3)|(1<<PA4)|(1<<PA5)|(1<<PA6)|(1<<PA7))) &&
(!(PINC & ((1<<PC0)|(1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4)|(1<<PC5)|(1<<PC6)|(1<<PC7)))))

Вроде все заработало. Сейчас все протестирую еще несколько раз конечно, но на первый взгляд.

Спасибо всем огромное:)

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

Протеус отказался наотрез запускаться под Wineом
Странно, а у меня даже настраивать не пришлось, сразу все заработало...
Eclipse ругается почему то на PORTE
В настройках точно выставлена ATmega8515 а не AT90S8515? Они почти одинаковы, но вторая не обладает портом Е. Впрочем, вывод OC1B есть и там, так что в крайнем случае можно извратнуться на таймере. Впрочем, еще проще сделать световой эффект победы на самой диодной матрице.
Думаю, как избавиться от него, может добавить некоторой задержки после опроса кнопки
Достаточно просто опрашивать кнопки с интервалом 20-200 мс. В вашей задаче можно просто в бесконечный цикл добавить _delay_ms(100); В серьезном проекте так делать не стоит, но у вас параллельных задач нет и контроллер все равно 80% времени ничего полезного не делает. Проверять кнопки несколько раз за цикл бессмысленно.
Теперь что касается функции выИгрыша, сделал так:
А не проще было if(PORTA == 0x00 && PORTC == 0x00)? Использую PORT вместо PIN, поскольку предполагается, что снаружи состояние диодов изменить нельзя, только сам контроллер может сделать это - что он запишет в PORTx, то там и останется до проверки победы. PIN в этом плане чуть менее надежен, впрочем не намного.

.

Вы пытаетесь организовать работу с кнопками и диодами "профессионально", используя макросы. Это похвально, однако для такой задачи это лишнее. Кроме того, вы крайне неэффективно их используете, так что программа усложняется и для написания и для понимания. Если после завершения (надеюсь, успешного!) этого прибора желание разбираться с контроллерами не пропадет, могу показать более удобные макросы.

.

Стоит добавить рандома для начального значения поля. Функция рандома находится в <stdlib.h>, в качестве "зерна" можно использовать время первого выигрыша на стандартном "простом" поле. Для этого перед бесконечным циклом включаете таймер: TCCR0 = (0b001<<CS00) и в процедуре победы после красивой анимации переставить "зерно": srand(TCNT0). Ну и можно сразу же заполнить поле:

random(); //чтобы 8-битное зерно обновилось до полного размера

PORTA = random();

PORTC = random();

По-моему это самый простой способ разнообразить игру.

Ну и стоит подумать над самой победной анимацией, тут особых проблем быть не должно.

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

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

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

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

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

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

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

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

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

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

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

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

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