Подскажите как сделать регулировку частоты бегущей дорожки

Обсуждаем контроллеры компании Atmel.
Ответить
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Чт май 01, 2014 11:31:03

Сообщение leshaast »

Здравствуйте. Подскажите пожалуйста, как сделать регулировку частоты (скорости) бегущей дорожки от двух кнопок (РС4 -больше, РС5- меньше).
Программу без регулировки написал:
#define F_CPU 1000000
#include <avr/delay.h>
#include <avr/io.h>

void preset()
{
DDRB = 0xFF; // PORTB работает на выход
DDRC = 0b00001111; // PC0-PC3 работает на выход, остальные РС4-РС7 на вход
DDRD = 0b00000000; // Весь порт работает на вход
PORTB = 0x00; // по умолчанию 0
PORTC = 0b11110000; // PC0-PC3 по умолчанию 0, к РС4-РС7 включены подтягивающие резисторы
PORTD = 0b11111111;// на весь порт включен подтяг резист
}
int main(void)
{preset();
while(1)
{
for (int b=0; b<=7; b++)
{PORTB = (1<<b);
_delay_ms(200);}
PORTB = 0x00;
for (int c=0; c<=3; c++)
{PORTC = (1<<c);
_delay_ms(200);}
PORTC = 0x00;
}
}
а вот как сюда кнопки регулировки пристроить не пойму пока (знаний не хватает). Хотелось бы регулировать с определенным диапазоном "+" или "-" например по 100мс, т.е. менять кнопками функцию _delay_ms. Если можно, то с комментариями. МК ATmega8, 12 светодиодов РВ0-РВ7 и РС0-РС3 и кнопки РС4 больше, т.е. =100мс, РС5 меньше, т.е. -100мс
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Курсач что-ль?
Docendo discimus
Контактная информация:
Реклама
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Чт май 01, 2014 11:31:03

Сообщение leshaast »

Да нет, человек попросил (не знаю зачем ему это), а я только учюсь с AVR на СИ писать
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Чт май 01, 2014 11:31:03

Сообщение leshaast »

#define F_CPU 1000000
#include <avr/delay.h>
#include <avr/io.h>

void preset()
{
DDRB = 0xFF; // PORTB работает на выход
DDRC = 0b00001111; // PC0-PC3 работает на выход, остальные РС4-РС7 на вход
DDRD = 0b00000000; // Весь порт работает на вход
PORTB = 0x00; // по умолчанию 0
PORTC = 0b11110000; // PC0-PC3 по умолчанию 0, к РС4-РС7 включены подтягивающие резисторы
PORTD = 0b11111111;// на весь порт включен подтяг резист
}

int main(void)
{preset();
unsigned char N=100;//создаем счетную пере менную N и присваиваем ей начальное значение 100мс
char Flag1=0;//Создаем флажок для кнопки 1 (больше) РС4
//char Fiag2=0;//Создаем флажок для кнопки 2 (меньше) РС5
while(1)
{
if (PINC&(1<<PC4))//опрашиваем кнопку больше РС4, если на ней 1, то...
{
Flag1=1;//кнопка нажата ставим флаг в 1
_delay_ms(10);//Защита от дребезга
}
if ((Flag1==1)&&(!(PINC&(1<<PC4))))//Условие кнопка была нажата, а потом отпущена, то...
{N+=100; Flag1=0;}//увеличиваем N на 100 и сбрасываем флаг1 в 0


for (int b=0; b<=7; b++)
{PORTB = (1<<b);
_delay_ms(N);}
PORTB = 0x00;
for (int c=0; c<=3; c++)
{PORTC = (1<<c);
_delay_ms(N);}
PORTC = 0x00;
}
}
Почему здесь выдается ошибка по циклу задержки. Вот эту строчку не воспринимает {N+=100; Flag1=0;}//увеличиваем N на 100 и сбрасываем флаг1 в 0,
а N=100 в начале прописано воспринимает
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Чт май 01, 2014 11:31:03

Сообщение leshaast »

Да, изменил char на short, а то больше 255 число не воспринимается. В ручную меняю цифры N=... все работает, а вот это:
{N+=10; Flag1=0;}//увеличиваем N на 10 и сбрасываем флаг1 в 0
почему то условие не воспринимается
Реклама
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Чт май 01, 2014 11:31:03

Сообщение leshaast »

Пишет:" Error2 builtin avr delay cycles expects an integer constant" и еще 4 такие же ошибки снизу написаны
Реклама
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Сообщение pokk »

настройте таймер на 1-10ms и там просто инкрементируйте перемененные.
А в главном цикле опрашивайте их.
На конечных автоматах задержка будет выглядит так

Код: Выделить всё

switch(mode){
case 0:{
  if(timer>100){ // Если значение таймерной переменной больше 100 то  
          //переключаемся в состояние 1 и выполняем то что там иначе сидим в состоянии 0 
          //и ожидаем пока переменная инкрементируется
      mode=1;
  }
break;
}
case 1:{
PORTC = (1<<c);     ///// Я так и не понял что это такое 
...............
}

}

Вот тут почитайте про опрос кнопки там где-то хорошие примеры выкладывали.
http://radiokot.ru/forum/viewtopic.php?f=61&t=79801
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Чт май 01, 2014 11:31:03

Сообщение leshaast »

Спасибо.
Ответить

Вернуться в «AVR»