Диоды к существующей программе (схеме) , для топикстартера темы , програмировать он не умеет, в схемотехнике то должен уметь разбираться, просто исходим из того что есть, и модернизируем диодами, цена которых копейки (извиняйте кто не понял сарказм предыдущего сообщения).. Эту схему сделал бы на свой лад , на меге 8 и с "цыферами"... мне кажется так и покрасивей.... Код таким вот образом Спойлер
Код:
#include <mega8.h> #include <delay.h>
flash unsigned char led[11]={ 0b10000000, 0b00000110, 0b01011011, 0b01001111, 0b01100110, 0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111, 0b00111111}; // Массив "led" во flash-памяти, flash unsigned char pind[11]={ 0b10000000, 0b00000010, 0b00000100, 0b00001000, 0b00010000, 0b00100000, 0b00001010, 0b00010010, 0b00010100, 0b00000000, 0b00000000}; // Массив "pind" во flash-памяти, unsigned char i=0; // переменная void main(void) { PORTB=0b11111111; // Port B initialization DDRB=0b00000000; PORTC=0b01000000; // Port C initialization DDRC=0b00111111; PORTD=0b00000000; // Port D initialization DDRD=0b011111111;
while (1) { PORTD=led[i]; PORTC= pind[i]; if (PINB.0==0) i=1; if (PINB.1==0) i=2; if (PINB.2==0) i=3; if (PINB.3==0) i=4; if (PINB.4==0) i=5; if (PINB.5==0) i=6; if (PINB.6==0) i=7; if (PINB.7==0) i=8; delay_ms(50); }; }
Вот это другое дело (сужу по коду пока что с телефона сижу). Киньте схему картинкой? Но реле то все равно нужно через "драйвер" пускать - хотя бы диод в параллель если реле пять вольт.
Ну вот и появились первые наработки... прошил ATTiny2313 прошивкой, которую написал korsaj, собрал схему по протеусу, запустил и получилось следующее: когда я подаю 5в с 7805 на контроллер загорается светодиод с 19 вывода контроллера, при нажатии на какую либо из кнопок загорается соответствующий светодиод, когда отпускаю кнопку - соответствующий кнопке светодиод гаснет, а светодиод с 19 ноги горит постоянно (вне зависимости нажата другая кнопка или нет). При прошивке выставил стандартные фьюзы... Схему делал для проверки работы прошивки непосредственно на контроллере Такая штука вышла: http://s018.radikal.ru/i522/1211/df/60923e9e359f.jpg
Там вроде не принципиально, можно оставить и по умолчанию заводские установки новой меги 1 МГц. А сама прошивка скопилирована в проекте который настроен на тактовую частоту 4 МГц. МК тактируется от внутреннего RS осциллятора. Для PonyProg, и CodeVisionAVR выглядят так:
... контроллер загорается светодиод с 19 вывода контроллера, при нажатии на какую либо из кнопок загорается соответствующий светодиод, когда отпускаю кнопку - соответствующий кнопке светодиод гаснет, а светодиод с 19 ноги горит постоянно (вне зависимости нажата другая кнопка или нет).
Проверяйте потенциал не 4 выводе, он должен быть +5В, если меньше 2,5 вольт то так и будет работать, мк видит что кнопка нажата.
C@at писал(а):
Там вроде не принципиально, можно оставить и по умолчанию заводские установки новой меги 1 МГц.
У Атмеги2313 вроде заводской 8МГц с делителем на 8.
у меня примерно такая же задача, но входов-выходов поболее(( подскажите как реализовать такое: 1кнопка-реле10,11 2кнопка-реле5,7 3кнопка-реле4,9 4кнопка-реле9 5кнопка-реле2,12 6кнопка-реле9,10,11 7кнопка-реле1,7 8кнопка-реле1,6 9кнопка-реле1,2 10кнопка-реле1,3 11кнопка-реле1,2,3,4,6,7
так же как и в случае выше нужно управление кнопками без фиксации. есть еще один нюанс-при включении устройства все реле должны быть выключены,то есть не задействован ни один канал....помогите кто сможет..заранее спасибо!
у меня примерно такая же задача, но входов-выходов поболее(( подскажите как реализовать такое:
Реализовать такое , у вас два варианта. 1) Самостоятельно (НО .... при этом вам придется потратится на мегу 16, иметь на компьютере компилятор CodeVisionAVR, и протеус)
2) Просить кого либо тут, пока он не проникнется вашей проблемой и поможет вам от начала и до конца (при этом все обойдется тини2313, и пара сдвиговых регистров НС595).
Так вот для первого варианта, исходник который находится в этой ветке форума Спойлер
Код:
#include <mega8.h> #include <delay.h>
flash unsigned char led[11]={ 0b10000000, 0b00000110, 0b01011011, 0b01001111, 0b01100110, 0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111, 0b00111111}; // Массив "led" во flash-памяти, flash unsigned char pind[11]={ 0b10000000, 0b00000010, 0b00000100, 0b00001000, 0b00010000, 0b00100000, 0b00001010, 0b00010010, 0b00010100, 0b00000000, 0b00000000}; // Массив "pind" во flash-памяти, unsigned char i=0; // переменная void main(void) { PORTB=0b11111111; // Port B initialization DDRB=0b00000000; PORTC=0b01000000; // Port C initialization DDRC=0b00111111; PORTD=0b00000000; // Port D initialization DDRD=0b011111111;
while (1) { PORTD=led[i]; PORTC= pind[i]; if (PINB.0==0) i=1; if (PINB.1==0) i=2; if (PINB.2==0) i=3; if (PINB.3==0) i=4; if (PINB.4==0) i=5; if (PINB.5==0) i=6; if (PINB.6==0) i=7; if (PINB.7==0) i=8; delay_ms(50); }; }
Это очень простой вариант, можно сказать примитив, возможно вы быстро и сами разберетесь сами в этом исходнике (в помощь вам CodeVisionAVR, и протеус). Если нет, то здесь найдется сотня котов которые вам помогут поправить его, или предложат свой вариант , для Atmega16 это все будет примитив....
Второй вариант просить все с нуля, тут тоже десяток людей найдется которые вам помогут, но это уже будет наверное не все так быстро.
У меня например есть подобное в арсенале. Но к сожалению пока не имею времени сочинить еще что-то подобное...
СпойлерУправление выходами в любом порядке .
С клавиатуры набираем нужный нам номер управляемого выхода, нажимаем кнопку ввод , выход включается.
При повторном наборе этого номера, нажимаем кнопку *ввод , выход выключается.
Состояние выходов (вкл. - выкл.) сохраняется в энергонезависимой памяти МК.
Возможен вариант , сброса всех выходов в состояние "выключено" для этого набираем с клавиатуры "33" и кнопку *ввод ......
Принцип работы такой: управляем поочередным включением 32 выходов с помощью клавиатуры, например для включения выхода 13 , нужно набрать на клавиатуре число 13, оно должно отобразиться на индикаторах, после чего, нажав на ввод сработал выход №13 и удерживался до набора следующего номера. То есть в данный момент времени включен только один выбранный выход.
у меня примерно такая же задача, но входов-выходов поболее(( подскажите как реализовать такое: ...... так же как и в случае выше нужно управление кнопками без фиксации. есть еще один нюанс-при включении устройства все реле должны быть выключены,то есть не задействован ни один канал...
А как Вам такой вариант? В архиве проект в Proteus и прошивка. Добавил для симметрии еще одну кнопку - Сброс, можно не ставить.
у меня примерно такая же задача, но входов-выходов поболее(( подскажите как реализовать такое: ...... так же как и в случае выше нужно управление кнопками без фиксации. есть еще один нюанс-при включении устройства все реле должны быть выключены,то есть не задействован ни один канал...
А как Вам такой вариант? В архиве проект в Proteus и прошивка. Добавил для симметрии еще одну кнопку - Сброс, можно не ставить.
Огромное спасибо!!!! в протеусе все работает так как надо,правда сброс не срабатывает...но в принципе он мне не нужен..буду проверять в железе..о результатах на днях отпишусь...ещё раз спасибо!
Я допустил ошибку в Proteus, пересоедините заново кнопку SW12.
slava_tuit писал(а):
...буду проверять в железе...
Тогда несколько советов. 1. В железе уделите внимание подбору резисторов. Собственно, пределы срабатывания кнопок довольно демократичны, но лучше подобрать ближе к указанным в проекте. Если установить виртуальный вольтметр, то можно посмотреть напряжения срабатывания кнопок. 2. На входе в МК желательно установить небольшие (0,01 - 0,1 мкФ) конденсаторы. По крайней мере предусмотрите под них место. В прошивке реализована программная защита от воздействия помех и дребезга, но при срабатывании реле все может быть. Большая емкость наоборот, может привести к неправильному определению кнопки. 3. Ну и конденсаторы по питанию... Тут маслом каши не испортишь...
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения