Чт фев 02, 2017 13:58:08
Чт фев 02, 2017 14:14:30
Чт фев 02, 2017 15:41:23
Пт фев 03, 2017 17:31:04
Естественно...FreshMan писал(а):выходит чем больше сопротивление резистора подтяжки тем сильнее он ловит всякие помехи ?
Пт фев 03, 2017 17:56:33
Пт фев 03, 2017 19:04:25
Пт фев 03, 2017 20:59:49
Ну просто всему есть разумные пределы... А то можно и продолжить тему, почему они например не сделали внутренний отключаемый последовательный резистор? чтобы можно было сразу светодиод вешать???FreshMan писал(а):тогда я вот что не возьму в толк: почему специ из AVR поставили подтягивающий резистор номиналом в 20-50кОм ?
почему бы не поставить 4,7кОм ?
Кстати а вы знаете о такого рода проблеме как энергосбережение??? есть же много батарейных устройств... представьте что конкуренты ставят 50к резисторы, а вы поставили 4к7... так вот теперь когда вы будете нажимать на кнопочку своего устройства, ваша батареечка будет садится в 10 раз быстрее чем у конкурентов!!!!! как вам такие перспективы?FreshMan писал(а):они что о подобного рода проблемах не ведали ?
Пт мар 16, 2018 15:56:01
Пт мар 16, 2018 19:48:32
Сб мар 17, 2018 21:17:29
Сб мар 17, 2018 21:19:51
Сб мар 17, 2018 22:22:01
Вс мар 18, 2018 07:08:57
Вс мар 18, 2018 16:43:26
Вс мар 18, 2018 17:28:59
Чт янв 10, 2019 22:09:14
#include <avr/io.h> /* Device specific include file */
#include "hd44780.h" /* EZ-LCD include file (библиотека по японской технологии) */
#include <util/delay.h> //Delay library
#include <avr/interrupt.h> //Interrupt library
//#include "xprintf.h"
//#include <avr/pgmspace.h>
//#include <stdio.h>
//#include <string.h>
//#include <avr/eeprom.h>
#define RED PD7
#define YELLOW PD6
#define GREEN PD5
#define BTN1 PD0
#define BTN2 PD1
#define BTN3 PD2
static volatile uint8_t divider, state=0, keys=0, btns=0, flags=0;
void toggle (uint8_t color)
{
if (~PIND&(1<<color))
{
PORTD|=(1<<color);
}
else
{
PORTD&=~(1<<color);
}
}
void buttons (void)
{
btns=~PIND; //читаем PIND в переменную и инвертируем прочитанное
btns=btns&((1<<BTN1)|(1<<BTN2)|(1<<BTN3)); //отсекаем лишние разряды, оставляем только кнопки
switch(btns)
{
case (1<<BTN1): //если нажата кнопка 1
if(~flags&(1<<BTN1)) //если флаг первой кнопки не установлен, то
{
flags|=(1<<BTN1); //устанавливаем флаг
toggle(RED); //что-то делаем
}
break; //и на выход
case (1<<BTN2): //если нажата кнопка 2
if(~flags&(1<<BTN2)) //если флаг второй кнопки не установлен, то
{
flags|=(1<<BTN2); //устанавливаем флаг
toggle(YELLOW); //что-то делаем
}
break; //и на выход
case (1<<BTN3): //если нажата кнопка 3
if (~flags&(1<<BTN3)) //если флаг третьей кнопки не установлен, то
{
flags|=(1<<BTN3); //устанавливаем флаг
toggle(GREEN); //что-то делаем
}
break; //и на выход
default: //если не нажата ни одна кнопка
flags=0; //сбрасываем все флаги
break; //и на выход
}
keys=0; //сбрасываем флаг разрешения опроса кнопок
}
/*void button (void)
{
if (~PIND&(1<<BTN1) && state==0) // если кнопка нажата и флаг не установлен, то
{
toggle(RED); // вызываем переключалку красного светодиода
//toggle(GREEN);
}
if (~PIND&(1<<BTN1)) // если кнопка нажата, то
{ state=1; } // устанавливаем флаг
else
{ state=0; } // если отпущена, то опускаем флаг
keys=0;
}
*/
ISR(TIMER0_OVF_vect) //прерывание по переполнению
{
divider++; //увеличиваем щоччик
if (divider==3) // 61Гц/3=20Гц (или 50 мс)
{
divider=0; //сбрасываем щоччик
keys=1; //устаналиваем флаг разрешения опроса кнопок
}
}
int main (void)
{
//Инициализация портов I/O
//PORTB это LCD порт, инициализируется в файле hd44780.c
//Ноги PB0 и PB1 свободны
ACSR|=(1<<ACD); //отключение компаратора
DDRD|=(1<<PD7)|(1<<PD6)|(1<<PD5); //ноги PD7, PD6, PD5 на выход
PORTD|=(1<<PD0)|(1<<PD1)|(1<<PD2); //подключение подтягивающих резисторов
//Инициализируем таймер для кнопок
TCCR0|=(1<<CS02)|(0<<CS01)|(1<<CS00); //таймер0 с предделителем 1024, т.е. 8000000/1042=7812,5Гц (или 128мс)
TCNT0=128; //значение щ0ччика 7812,5/128=61Гц (или 16мс)
TIMSK|=(1<<TOIE0); //разрешаем прерывание таймера0 по переполнению
//Баловство-приветствие
lcd_init(); /* Initialize LCD */
_delay_ms(200);
lcd_putc(0x56); //V
_delay_ms(200);
lcd_putc(0x41); //A
_delay_ms(200);
lcd_putc(0x44); //D
_delay_ms(200);
lcd_putc(0x45); //E
_delay_ms(200);
lcd_putc(0x47); //G
_delay_ms(200);
lcd_locate(1,3); //ставим курсор на вторую строку, 4-е знакоместо
lcd_putc(0x44); //D
_delay_ms(200);
lcd_putc(0x41); //A
_delay_ms(200);
lcd_putc(0x44); //D
_delay_ms(200);
lcd_putc(0x45); //E
_delay_ms(200);
lcd_putc(0x47); //G
_delay_ms(500);
lcd_locate(0,0); //почему-то нужен возврат на нулевую позицию, я х.з?
lcd_putc('\f'); //очистка экрана и возврат курсора "домой"
sei(); //сеем
while(1) //бесконечный цикл
{
if(keys==1) //если флаг разрешения опроса кнопок поднят, то
{
buttons(); //опрашиваем кнопки
}
}
}
Пт янв 11, 2019 09:37:32
Пт янв 11, 2019 09:47:26
Пт янв 11, 2019 11:17:26