1. Мне нужно в программе взаимодействовать с двумя кнопками, но почему то по одной получается, а когда задаю обе, то симулятор вообще никак не реагирует на нажатия
Т.е. если сделать в инициализации :
Код: Выделить всё
DDRB = (0<<PB5)|(0<<PB6);
PORTB = (1<<PB5)|(1<<PB6);
то симулятор не будет реагировать на нажатие, ни кнопки PB6, ни кнопки PB5. А если сделать :
Код: Выделить всё
DDRB = (0<<PB5);
PORTB = (1<<PB5);
То с PB5 все будет хорошо работать, аналогично если оставить только PB6.
2. Мне нужно по нажатию кнопки изменять частоту мигания на 40 процентов ( либо в большую сторону, либо в меньшую сторону, в зависимости от нажатой кнопки).
К сожалению такие записи, как у меня сейчас Frequency_yellow = 65536 - 800000/1024/2; - не катят. Нужно написать алгоритм, при котором частота сама высчитывалась
я пробовал так, чтобы уменьшить на 40 процентов.
Код: Выделить всё
Frequency_yellow_temp_first = Frequency_yellow / 4;
Frequency_yellow_temp_second = Frequency_yellow /8;
Frequency_yellow_temp_three = Frequency_yellow /16;
Frequency_yellow_percent = Frequency_yellow /4 + Frequency_yellow /8 + Frequency_yellow /16;
Frequency_yellow = Frequency_yellow - Frequency_yellow_percent;
Но так не работает.
Вот условие :Разработать программу, реализующую генератор изменяемой частоты. Начальная частота – 0.5 Гц, т.е. желтый индикатор 1 с горит, 1 с не горит и т.д. Нажатие кнопки 1 приводит к увеличению частоты на 40%, нажатие кнопки 2 уменьшает частоту на 40%. Для облегчения замера частот использовать красный и зеленый индикаторы: красный должен мигать с частотой в 10 раз большей основной частоты (желтого индикатора), а зеленый должен мигать с частотой в 10 раз меньше основной. Одновременное нажатие обеих кнопок должно возвращать генератор в исходное состояние – 0.5 Гц
Код
Код: Выделить всё
// инициализация
void Ititual(){
// красная лампочка
DDRE = (1<<PE1)|(1<<PE2)|(1<<PE3);
PORTE = (1<<PE1)|(1<<PE2)|(1<<PE3);
// кнопка
DDRB = (0<<PB5)|(0<<PB6);
PORTB = (1<<PB5)|(1<<PB6);
// предделитель наймера 1024
TCCR1B = (1<<CS00)|(0<<CS01)|(1<<CS02);
// прерывание поп переполнению таймера.
TIMSK = (1<<OCIE1B);
TCNT1 = 65536 - 800000/1024/8;
sei();
Step = 1;
UBRR1H = 0;
UBRR1L = 51;
step_inc=0;
step_dec=0;
//разрешаем прием-передачу
UCSR1B = (1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1)|(0<<TXCIE1);
//устанавливаем асинхронный режим работы и формат посылки: 8 бит, 1 стопповый бит
UCSR1C = (0<<USBS1)|(1<<UCSZ10)|(1<<UCSZ11)|(0<<UCSZ12)|(0 << UMSEL1)|(0<<UPM10)|(0<<UPM11);
}
// обработка нажатия кнопки
void button_on_inc(){
button = 1; // теперь кнопка нажата
Send_Status(Button_was_pressed); // сообщили о нажатии кнопки
step_inc ++;
}
void button_on_dec(){
button = 2; // теперь кнопка нажата
Send_Status(Button_was_pressed); // сообщили о нажатии кнопки
step_dec++;
}
// мигание лампочки
void switch_lamp_yellow (){
TCNT1 = Frequency_yellow;
if ((PINB && (1<<PB6)) == (0<<PB6)){ // проверяем нажатие кнопки
button_on_inc(); // если нажата, меняем время
}
if ((PINB && (1<<PB5)) == (0<<PB5)){ // проверяем нажатие кнопки
button_on_dec(); // если нажата, меняем время
}
PORTE = PINE^(1<<PE3);
if (Count_time_seconds == 10) {
PORTE = PINE^(1<<PE2);
Count_time_seconds = 0;
Count_time_seconds_red++;
if (Count_time_seconds_red == 10) {
PORTE = PINE^(1<<PE1);
Count_time_seconds_red=0;
}
}
Count_time_seconds++; // шаг сделан
}
SIGNAL(SIG_OUTPUT_COMPARE1B){
switch(Step){
case 1:
if (button == 0){ // если не нажата кнопка
Frequency_yellow = 65536 - 800000/1024/8; // 0.5 ghz
switch_lamp_yellow(); // помигали лампочклй
}
// переходим по нажатию кнопки
if (button == 1) {
//ВОТ ТУТ ДОЛЖНО БЫТЬ УМЕНЬШЕНИЕ ЧАСТОТЫ, ТАКИЕ ЗАПИСИ НЕ КАТЯТ.
if (step_inc == 1 ) {
Frequency_yellow = 65536 - 800000/1024/4;
}
if (step_inc == 2) {
Frequency_yellow = 65536 - 800000/1024/2;
}
if (step_inc == 3) {
Frequency_yellow = 65536 - 800000/1024;
}
if (step_inc == 4) {
Frequency_yellow = 65536 - 800000/256;
}
if (step_inc == 5) {
Frequency_yellow = 65536 - 800000/128;
}
if (step_inc == 6) {
Frequency_yellow = 65536 - 800000/64;
}
if (step_inc == 7) {
Frequency_yellow = 65536 - 800000/32;
}
}
if (button == 2){
//ТУТ ДОЛЖНО БЫТЬ УВЕЛИЧЕНИЕ ЧАСТОТЫ
Frequency_yellow = 65536 - 800000/1024/32;
switch_lamp_yellow();
}
}
}
// прерывание при получении данных по USART
SIGNAL (SIG_USART1_RECV)
{
Add_byte_to_queue(UDR1);
}
// главная программа
int main()
{
Ititual(); // инициализация
while (1){ // бесконечный цикл
Work_command();
}
return 0;
}
Подскажите, пожалуйста