Программирование микроконтроллера на Cи

Обсуждаем контроллеры компании Atmel.
Закрыто
drac0Sha
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Вт окт 09, 2012 14:09:39

Программирование микроконтроллера на Cи

Сообщение drac0Sha »

Здравствуйте, возникла проблема с программирование под ATmega128 :
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;
}


Подскажите, пожалуйста
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Программирование микроконтроллера на Cи

Сообщение urry »

это что такое ?
Frequency_yellow_percent = Frequency_yellow /4 + Frequency_yellow /8 + Frequency_yellow /16;

обоснуйте формулу, плиз.
увеличить на 40% - это текущее значение частоты умножить на 1.4 и ничего более.
формула определения значения таймера при переполнении уже есть
tmr1=65536- Fin/Fout, где Fin - частота входящая на таймер,Fout - требуемая частота.
Единственное уточнения - для получения меандра по прерыванию частота должна быть в 2 раза выше.
Как бы уже не первый раз с этим вопросом выходите...
drac0Sha
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Вт окт 09, 2012 14:09:39

Re: Программирование микроконтроллера на Cи

Сообщение drac0Sha »

Ты предлагаешь для увеличения частоты
Frequency_yellow = Frequency_yellow*1.4 ; ?
Так ?
BigCryziMashinGan
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Чт ноя 20, 2008 20:02:30

Re: Программирование микроконтроллера на Cи

Сообщение BigCryziMashinGan »

drac0Sha писал(а):Ты предлагаешь для увеличения частоты
Frequency_yellow = Frequency_yellow*1.4 ; ?
Так ?


Да.
drac0Sha
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Вт окт 09, 2012 14:09:39

Re: Программирование микроконтроллера на Cи

Сообщение drac0Sha »

попробовал Frequency_yellow = Frequency_yellow * 1.4; - не работает . Вот, например на умножение на целое число (на 2) работает.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Программирование микроконтроллера на Cи

Сообщение Аlex »

Логику включите, блин. В таком случае, у Вас, эта переменная - целочисленная. Как её можно умножить напрямую на нецелое число ?
Делайте её с плавающей или фиксированной точкой. Либо число 1.4 представьте в виде дроби, в числителе которой будет целое число.
Рановато Вы полезли в программирование. Да и тема по Си уже существует - постите туда.
Закрыто

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