Светодиод и кнопка

Модератор: boogyman

Re: Светодиод и кнопка

Сообщение:#21  Сообщение AntonChip » 18 июл 2014, 21:04

Вот пример опроса кнопок по таймеру
Код: Выделить всё
volatile unsigned char kod_key;

ISR (TIMER2_OVF_vect)
{
     if (bit_is_clear(PIND, PD0))  kod_key = 1;
else if (bit_is_clear(PIND, PD1))     kod_key = 2;
else if (bit_is_clear(PIND, PD2))   kod_key = 3;
else if (bit_is_clear(PIND, PD3)) kod_key = 4;
else kod_key = 0;
}

настройка таймера
Код: Выделить всё
TCCR2 |= (1 << CS22)|(1 << CS21)|(1 << CS20); // Таймер 2 для опроса клавиатуры раз в 32 мс
TIMSK |= (1 << TOIE2); // разрешение прерывания по переполнению таймера 2
Аватара пользователя
AntonChip
Администратор
 
Сообщения: 190
Зарегистрирован: 24 дек 2011, 21:11
Откуда: Киров

Re: Светодиод и кнопка

Сообщение:#22  Сообщение Scroodge » 07 авг 2014, 05:22

Всем привет! Подскажите знающие, как решить задачу: при первом нажатии светодиод моргает с одной частотой, при следующем нажатии - частота меняется, при последнем нажатии - выключается? Интересует на си в avr студии. Спасибо!
Аватара пользователя
Scroodge
Любитель
 
Сообщения: 13
Зарегистрирован: 06 авг 2014, 21:22
Откуда: Астана, Казахстан

Re: Светодиод и кнопка

Сообщение:#23  Сообщение AntonChip » 07 авг 2014, 09:42

Для формирования разных частот можно использовать 16-ти битный таймер, который работает в режиме СТС , где для управления частотой сигнала в регистр ICR1 заносятся предварительно расчитанные значения, сигнал снимается с выхода OC1A.
Аватара пользователя
AntonChip
Администратор
 
Сообщения: 190
Зарегистрирован: 24 дек 2011, 21:11
Откуда: Киров

Re: Светодиод и кнопка

Сообщение:#24  Сообщение Scroodge » 07 авг 2014, 15:40

А получится без применения таймера? С помощью util_delay? Если можно, пример для светодиода и одной кнопки.
Аватара пользователя
Scroodge
Любитель
 
Сообщения: 13
Зарегистрирован: 06 авг 2014, 21:22
Откуда: Астана, Казахстан

Re: Светодиод и кнопка

Сообщение:#25  Сообщение AntonChip » 07 авг 2014, 20:09

Самый простой пример
Код: Выделить всё
#include <avr/io.h>
#include <util/delay.h>   

int main(void)
{
DDRB = 0x00; // Кнопка к PB0
PORTB = 0xFF;
DDRD = 0xFF; // Светодиод к PD0
PORTD = 0x00;   

char s_1 = 0;

while(1)
{
  if((PINB & ( 1 << PB0)) == 0)
   {
    while((PINB & ( 1 << PB0)) == 0){} // Ждем отпускания кнопки
    _delay_ms(10);
    s_1++;
    if(s_1 > 2) s_1 = 0;
   }

if(s_1 == 0)
{
PORTD &= ~(1 << PD0); // Выключаем светодиод
}

if(s_1 == 1)
{
PORTD |= (1 << PD0); // Включаем светодиод
_delay_ms(250);
PORTD &= ~(1 << PD0); // Выключаем светодиод
_delay_ms(250);
}

if(s_1 == 2)
{
PORTD |= (1 << PD0); // Включаем светодиод
_delay_ms(25);
PORTD &= ~(1 << PD0); // Выключаем светодиод
_delay_ms(25);
}

}
}
Аватара пользователя
AntonChip
Администратор
 
Сообщения: 190
Зарегистрирован: 24 дек 2011, 21:11
Откуда: Киров

Re: Светодиод и кнопка

Сообщение:#26  Сообщение Scroodge » 08 авг 2014, 17:36

Спасибо! В протеусе все работает прекрасно. Поясни, пожалуйста: char s_1 = 0 -объявили число s_1 и присвоили ему число 0, правильно? Что потом с ним происходит: s_1++; и почему мы сравниваем s_1 с 0, 1 и 2?
Аватара пользователя
Scroodge
Любитель
 
Сообщения: 13
Зарегистрирован: 06 авг 2014, 21:22
Откуда: Астана, Казахстан

Re: Светодиод и кнопка

Сообщение:#27  Сообщение AntonChip » 08 авг 2014, 17:46

При инициализации контроллера, т.е. после включения питания переменной s_1 присвоено значение 0, значит светодиод не горит при включении питания.
Этой командой s_1++ к нашей переменной добавляем единицу при каждом отпускании кнопки.
В бесконечном цикле переменную проверяем на значение 0, 1, 2, где уже запускается уже определенный цикл.
Аватара пользователя
AntonChip
Администратор
 
Сообщения: 190
Зарегистрирован: 24 дек 2011, 21:11
Откуда: Киров

Re: Светодиод и кнопка

Сообщение:#28  Сообщение Scroodge » 08 авг 2014, 18:17

Не могу вкурить, мы ведь в установке на порт D уже подали все 0, потушили светодиод PortD=0x00?
Аватара пользователя
Scroodge
Любитель
 
Сообщения: 13
Зарегистрирован: 06 авг 2014, 21:22
Откуда: Астана, Казахстан

Re: Светодиод и кнопка

Сообщение:#29  Сообщение AntonChip » 08 авг 2014, 18:38

Scroodge писал(а):Не могу вкурить, мы ведь в установке на порт D уже подали все 0, потушили светодиод PortD=0x00?

Это инициализация, а дальше идет основной цикл
Аватара пользователя
AntonChip
Администратор
 
Сообщения: 190
Зарегистрирован: 24 дек 2011, 21:11
Откуда: Киров

Re: Светодиод и кнопка

Сообщение:#30  Сообщение Scroodge » 08 авг 2014, 19:56

Спасибо, Антон. Почитаю еще Белова
Аватара пользователя
Scroodge
Любитель
 
Сообщения: 13
Зарегистрирован: 06 авг 2014, 21:22
Откуда: Астана, Казахстан

Re: Светодиод и кнопка

Сообщение:#31  Сообщение Scroodge » 09 авг 2014, 04:13

Слушай, Антон, а можно в этой же программе добавить:если нажать и удерживать кнопку в любом месте светодиод выключится? Или тут уже без прерываний не обойтись?
Аватара пользователя
Scroodge
Любитель
 
Сообщения: 13
Зарегистрирован: 06 авг 2014, 21:22
Откуда: Астана, Казахстан

Re: Светодиод и кнопка

Сообщение:#32  Сообщение AntonChip » 13 авг 2014, 18:00

Можно без прерываний сделать
Аватара пользователя
AntonChip
Администратор
 
Сообщения: 190
Зарегистрирован: 24 дек 2011, 21:11
Откуда: Киров

Re: Светодиод и кнопка

Сообщение:#33  Сообщение Scroodge » 13 авг 2014, 18:07

Подскажи, если не трудно. Хочу в машине регулировать обороты мотора отопителя с помощью программного ШИМа, но знаний пока не хватает, именно по программированию. Спасибо!
Аватара пользователя
Scroodge
Любитель
 
Сообщения: 13
Зарегистрирован: 06 авг 2014, 21:22
Откуда: Астана, Казахстан

Re: Светодиод и кнопка

Сообщение:#34  Сообщение AntonChip » 13 авг 2014, 21:58

ШИМ это значит все равно использование прерывания по таймеру, если хочешь чтоб все нормально работало. На сайте есть статья "Использование ШИМ", для примера пойдет. А для контроллера мотора я бы посоветовал использовать аппаратный ШИМ. Кстати контроллер печки я делал на attiny13, с переменным резистором, выкладываю код
Вложения
oven_attiny13.rar
Контроллер печки
(39.26 КБ) Скачиваний: 1293
Аватара пользователя
AntonChip
Администратор
 
Сообщения: 190
Зарегистрирован: 24 дек 2011, 21:11
Откуда: Киров

Re: Светодиод и кнопка

Сообщение:#35  Сообщение Scroodge » 15 авг 2014, 10:26

Спасибо, Антон! Такой вопрос относительно твоего кода для мотора отопителя: Каким образом вход РВ2 реагирует на изменение сопротивления?
Аватара пользователя
Scroodge
Любитель
 
Сообщения: 13
Зарегистрирован: 06 авг 2014, 21:22
Откуда: Астана, Казахстан

Re: Светодиод и кнопка

Сообщение:#36  Сообщение AntonChip » 15 авг 2014, 14:04

Вход PB2 это вход АЦП, в зависимости от того какое напряжение на этом входе меняется скважность ШИМ
Аватара пользователя
AntonChip
Администратор
 
Сообщения: 190
Зарегистрирован: 24 дек 2011, 21:11
Откуда: Киров

Re: Светодиод и кнопка

Сообщение:#37  Сообщение Scroodge » 07 окт 2014, 06:34

Антон, извини за назойливость, но повторю вопрос: как на 8 меге собрать контроллер отопителя с индикацией из 8 светодиодов. Интересует код в avr studio 6. Спасибо!
Аватара пользователя
Scroodge
Любитель
 
Сообщения: 13
Зарегистрирован: 06 авг 2014, 21:22
Откуда: Астана, Казахстан

Re: Светодиод и кнопка

Сообщение:#38  Сообщение AntonChip » 22 окт 2014, 20:16

Scroodge писал(а):Антон, извини за назойливость, но повторю вопрос: как на 8 меге собрать контроллер отопителя с индикацией из 8 светодиодов. Интересует код в avr studio 6. Спасибо!


Вот пример кода только в AVRStudio4, в шестую переделать не составит особого труда. Код для Atmega8. Все задержки поменять на указанные в скобках или по своему усмотрению, мин. задержки сделал для симуляции в протеусе
Код: Выделить всё
#include <avr/io.h>
#include <util/delay.h>

unsigned int adc_bufer = 0;

void start_pwm(void)
{
TCCR2 |= (1 << COM21)|(1 << WGM21)|(1 << WGM20)|(1 << CS20); // режим FAST PWM, сброс OC2 при сравнении
PORTB |= (1 << PB1); // включаем светодиод
}

void stop_pwm(void)
{
TCCR2 = 0x00; // выключаем таймер
OCR2 = 0x00;
TCNT2 = 0x00;
PORTB &= ~(1 << PB1); // Выключаем светодиод
}

int main (void)
{
PORTB = 0x00;
DDRB = 0b00000011; // PB0, PB1 - выход
DDRD = 0xFF;
PORTD = 0x00;
   
ADCSRA |= (1 << ADEN)|(1 << ADPS2)|(1 << ADPS1); // Включаем ADC, предделитель на 64
ADMUX |= (1 << ADLAR)|(1 << MUX0); // Помещаем результат в ADCH, Вход ADC1

ACSR |= (1 << ACD); // Отключаем аналаговый компаратор

stop_pwm(); // Выключаем ШИМ

ADCSRA |= (1 << ADSC); // начало преобразования
while((ADCSRA&(1 << ADIF)) == 0);
{
adc_bufer = ADCH;  // Считываем  ADC в буфер
}

if(adc_bufer > 50)
{
start_pwm();
for(char a=0; a < 32; a++)
{
_delay_ms(2); // 250ms
}
}
else
{
stop_pwm();
}

while(OCR2 < adc_bufer)
{
ADCSRA |= (1 << ADSC); // начало преобразования
while((ADCSRA&(1 << ADIF))== 0); // Ждем флага окончания преобразования
{
adc_bufer = ADCH;  // Считываем  ADC
}
OCR2++; // Плавный запуск мотора
_delay_ms(1); // 100ms
}   

while(1)
{
ADCSRA |= (1 << ADSC);   //Начинаем преобразование
_delay_ms(1);
while((ADCSRA&(1 << ADIF))== 0); // Ждем флага окончания преобразования   
{
//adc_bufer = ADCH;  // Считываем  ADC
OCR2 = ADCH;

if (ADCH > 50)
     PORTD = 0b00000001;         
else
     PORTD = 0b00000000;         
if (ADCH > 75)
    PORTD = 0b00000011;     
if (ADCH > 100)
    PORTD = 0b00000111;
if (ADCH > 125)
    PORTD = 0b00001111;
if (ADCH > 150)
    PORTD = 0b00011111;
if (ADCH > 175)
    PORTD = 0b00111111;
if (ADCH > 200)
    PORTD = 0b01111111;
if (ADCH > 225)
    PORTD = 0b11111111;
}

if(ADCH > 50)
{
start_pwm();
}
else
{
stop_pwm();
}

if(ADCH > 51)
{
  if(OCR2 < 50)
  OCR2++;
 _delay_ms(100); // 100ms
}
}
}

Аватара пользователя
AntonChip
Администратор
 
Сообщения: 190
Зарегистрирован: 24 дек 2011, 21:11
Откуда: Киров

Re: Светодиод и кнопка

Сообщение:#39  Сообщение Scroodge » 29 окт 2014, 13:19

Почему-то в протеусе сразу подает 1 на весь порт D, а на изменение реостата не реагирует никак. Наверное где-то напортачил. Вход АЦП берем ножку PC1, верно?
Аватара пользователя
Scroodge
Любитель
 
Сообщения: 13
Зарегистрирован: 06 авг 2014, 21:22
Откуда: Астана, Казахстан

Re: Светодиод и кнопка

Сообщение:#40  Сообщение Scroodge » 29 окт 2014, 13:35

И почему ты вот эту строчку закомментировал? //adc_bufer = ADCH; // Считываем ADC
Аватара пользователя
Scroodge
Любитель
 
Сообщения: 13
Зарегистрирован: 06 авг 2014, 21:22
Откуда: Астана, Казахстан

Пред.След.

Вернуться в Микроконтроллеры AVR

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Rambler's Top100