Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 13.05.2020
Сообщений: 13
1

Переключение частоты таймера

23.05.2020, 20:16. Просмотров 148. Ответов 3
Метки нет (Все метки)

Здравствуйте. Мне необходимо установить на таймере частоту импульсов 200, 100, 60, 50, 1Гц. Но как бы я не экспериментировал с делителем ничего путного не получается, быть может я что то делаю не так? Если не трудно проверьте пожалуйста код.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <util/delay.h>
 
 
//--------------------------------------------
unsigned char i=0;
 
//--------------------------------------------
void timer_ini(void)
{
    TCCR1B |= (1<<WGM12); // устанавливаем режим СТС (сброс по совпадению)
    TIMSK |= (1<<OCIE1A);   //устанавливаем бит разрешения прерывания 1ого счетчика по совпадению с OCR1A(H и L)
    OCR1AH = 0b00111101; //записываем в регистр число для сравнения
    OCR1AL = 0b00001001;
    
}
//--------------------------------------------
ISR (TIMER1_COMPA_vect)
  {
   static uint8_t b=0;
switch(b)
   {
      case 0:PORTC =(1<<0)|(0<<1);   break;        // светодиод 1 включить// светодиод  2 выключить
       case 1:PORTC =(1<<0)|(1<<1);   break;    // светодиод 1 включить // светодиод  2 включить
        case 2: PORTC =(0<<0)|(1<<1);     break; // светодиод 1 выключить     // светодиод  2 включить
           case 3:  PORTC =(0<<0)|(0<<1);   break;   // светодиод 1 выключить // светодиод  2 выключить
        }
b++;
b%=4;
          
  }
  
//--------------------------------------------
  
int main(void)
{
     DDRC = 0xFF;
     PORTC=0x00;
     DDRD = 0xFF;
     PORTD=0x00;
     DDRB = 0x00;
     PORTB=0XFF;
      
   timer_ini();
   
   sei(); //разрешаем приревания
 
   while(1)
        {   
             switch(i){
               case 1:  PORTD=0b00000001;break;            //установим делитель.             
                  case 2:  PORTD=(1<<1);break;                //установим делитель.         
                 case 3:  PORTD=(1<<2);break; //установим делитель.            
                    case 4:  PORTD=(1<<3);break;                    //установим делитель.                    
                         case 5:  PORTD=(1<<4);break; //установим делитель.        
                 }  
        
             //Переключение делителя  
          switch(i){
               case 1:  TCCR1B = (1<<CS10);break;            //установим делитель. 
                  case 2:  TCCR1B = (0<<CS10)|(1<<CS11);break;                //установим делитель.         
                 case 3:  TCCR1B = (1<<CS11)|(1<<CS10);break; //установим делитель.            
                    case 4:  TCCR1B = (0<<CS11)|(0<<CS10)|(1<<CS12);break;                    //установим делитель.                
                         case 5:  TCCR1B = (0<<CS11)|(1<<CS10)|(1<<CS12);;break; //установим делитель.                 
                 }  
                 
      if (bit_is_clear(PINB, 0)){ //Если нажата кнопка РВ0 то увеличиваем значение i на едениу
      
     if(i<5){
        _delay_ms(1700);
         i=i+1;
         _delay_ms(1700);
      }else { i=0;}
        
 
     if (bit_is_clear(PINB, 1)){  //Если нажата кнопка РВ1 то уменщаем значение i на едениу
      
     if(i>0){
        _delay_ms(1700);
         i=i-1;
         _delay_ms(1700);
        }
        }
        }
        }
        }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.05.2020, 20:16
Ответы с готовыми решениями:

Расчет частоты таймера контроллера AT89C5131
Контроллер AT89C5131. Нужно расчитать минимальную частоту переполнения таймера 2 (Timer 2) данного...

Смена частоты системного таймера
Меняю частоту системного таймера, и, соответственно, сую ему своё прерывание: org 0x7c00 xor...

Получить слова длиной Х по убыванию частоты появления в тексте с указанием этой частоты
На входе программа получает *.тхт файл и число Х. На выходе - возвращает слова длиной Х по убыванию...

Различие частоты сигнала и частоты его АКФ
Здравствуйте. Я думал, что если взять обычный синусоидальный сигнал, найти его АКФ, то частота не...

3
Модератор
8201 / 6071 / 811
Регистрация: 14.02.2011
Сообщений: 21,062
24.05.2020, 10:31 2
Цитата Сообщение от Azerhud Посмотреть сообщение
на таймере частоту импульсов 200, 100, 60, 50, 1Гц.
именно на таймере? иначе все делается гораздо проще
устанавливаем частоту сработки таймера 1000 Гц (1мсек)
объявляем глобальную переменную(переменные) и в обработчике прерываний увеличиваем её, при достижении значения 5, 10..... обнуляем её и делаем нужные действия
таким образом можно запустить хоть сто таймеров используя только один физический

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
объявляем глобальную переменную(переменные)
хотя я это уже показал в предыдущей теме
1
125 / 43 / 12
Регистрация: 23.03.2018
Сообщений: 169
24.05.2020, 12:25 3
Цитата Сообщение от Azerhud Посмотреть сообщение
Мне необходимо установить на таймере частоту импульсов 200, 100, 60, 50, 1Гц
Представь себе у тебя есть таймер. Но у этого таймера очень тупая настройка:
1. В первом режиме он устанавливается по 1 секунде (1с, 2с, 3с, 4с, 5с и т.д.)
2. Во втором режиме он устанавливается только по 0,1 секунды (0,1с, 0,2с, 0,3с, 0,4с, 0,5с и т.д.)
3. И в третьем режиме он устанавливается только по 0,01 секунды (0,01с, 0,02с, 0,03с, 0,04с, 0,05с и т.д.)
И причем одновременно установить несколько режимов нельзя: грубо говоря ты не сможешь установить таймер сразу на 3,45 с.
Чтобы засечь 3,45 тебе надо сначала запустить таймер в первом режиме на 3 сек, потом переключиться во второй режим и запустить таймер на 0,4 с а потом в третьем режиме включить на 0,05 с.
И примерно по такому принципу и работают таймеры в микроконтроллерах.
Но с другой стороны тебе никто не мешает таймер держать все время в третьем режиме ставить на 0,01с но запускать его 345 раз (0,01x345=3,45 сек) и так же получишь необходимые 3,45 с. ValeryS, такой принцип и предлагает:
выбираешь маленькое значение таймера, с помощью которого (запуская его несколько раз) сможешь добиваться всех необходимых частот. 1мс - идеальная цифра для этого.
1
0 / 0 / 0
Регистрация: 13.05.2020
Сообщений: 13
24.05.2020, 15:00  [ТС] 4
Спасибо за помощь, практически готовый проект с исходником во вложенном архиве. Был бы весьма признателен если б уделили время и проверили на правильность, а то чувствую, перемудрил. Но работает
0
Вложения
Тип файла: rar forum.rar (28.3 Кб, 1 просмотров)
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.05.2020, 15:00

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Определить частоты частости, накопленные частоты и частости для данных статистических данны
за 2003 год получены группировки доходов одного из акционерных обществ. Определить частоты ....

Помогите опознать диодный мост таймера духовки Hansa BOEM 624000, диодный мост таймера
Помогите опознать диодный мост таймера духовки Hansa BOEM 624000 мост смд маленький примерно...

Частоты
Могут ли частоты помочь в распределении букв, делаю голосовой набор текста по формуле F=N/T, если...

Делитель частоты
Чего-то на меня нашел ступор. У меня имеется массив в котором записано гармоническое колебание...

Делители частоты
как его реализовать через стандартный двоичный счетчик путем введения обратных связей?

Умножитель частоты
Добрый день! Необходимо собрать умножитель частоты, только сигнал изменяет частоту в пределах...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.