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

Таймер AVR

22.05.2020, 23:17. Просмотров 218. Ответов 5
Метки нет (Все метки)

Здравствуйте.

Суть проекта: генерировать прямоугольный сигнал (меандр) с регулируемой частотой в диапазоне 1Hz...100kHz (1s...10us) и выводом частоты на дисплей 16х2. Регулировка осуществляется кнопками.

Выполнение: атмега16, таймер 1 (16 бит - 65535 тактов) частота ядра 8МГц, при двух коэфф. деления (1:1 и 1:256) можно регулировать в данном диапазоне. Использую режим "нормал" с прерыванием по переполнению 0 --> 65535. Ввожу расчётные значения в регистр TCNT1 для 1Гц (34285) и 100кГц (65534), не ясно как осуществить программно варьированием частотой в данном диапазоне. Таблиц
Собственно задача состоит в добавлении функции расчёта частоты и регулировку. HELP.

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
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <stdio.h>
#include "main.h"
#include "lcd.h"
 
#define F_CPU 8000000UL 
                        
static char lcd_buffer[16];                     // output string buffer for lcd
static int freq;                                // variable for frequency
 
static void tc1_init()
{
    TCCR1A &= ~(1 << WGM11) & ~(1 << WGM10);    
    TCCR1B &= ~(1 << WGM13) & ~(1 << WGM12);    // "normal" mode            
    TIMSK  |= (1 << TOIE1);                     // OVF interrupt enable
    TCNT1 = 0;                                  // set initial timer value
}
 
static void io_init()
{
    DDRB = 0x00;                                // PB input buttons
    DDRD = 0x20;                                // PD5 output gen
}
 
static void timer_freq()
{   
    TCCR1B |= (1 << CS12);                      // prescaler 1:256                          
    TCNT1 = 34285;                              // start at 1Hz (1sec)  
}
 
static void wave_adj()                          // frequency adjusting
{
    if(~PINB & (1 << 0))                        // PB0 log 0 increase freq
    {
        freq =+ 10;
        _delay_ms(250);
    }
 
    if(~PINB & (1 << 1))                        // PB1 log 0 decrease freq
    {
        freq -= 10;
        _delay_ms(250);
    }
}
 
ISR(TIMER1_OVF_vect)
{
    PORTD ^= (1 << 5);                          // toggle log level 
    TCNT1 = 34285;          
}
 
int main(void)
{
    sei();                                      // enable global interrupts
    port_init();
    io_init();
    tc1_init();
    lcd_init();
    lcd_load();                                 // progress black bar and project's name
    lcd_clear();
    timer_freq();
    
    while (1)
    {
        
        wave_adj();
        
        set_pos(0,0); string_lcd("SETTING FREQ = ");
        
        set_pos(0,1); string_lcd("= ");
        
    //  sprintf(lcd_buffer, "%u", freq );
        string_lcd(lcd_buffer);
        
        set_pos(8,1); string_lcd("Hz"); 
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.05.2020, 23:17
Ответы с готовыми решениями:

Таймер-счетчик в AVR
Доброго времени суток. Моим заданием на л.р. было: используя таймер-счетчик, обеспечить выдачу...

Прграммирование микроконтроллера на AVR (Универсальный таймер)
Здравствуйте, нужно описание (комментарий) к каждому присвоению, установки адреса в начало и т.д. ...

Есть таймер на на AVR запитанный от сети через резистор
как максимально обеспечить безперебойность работы схемы при воздествии сетевых помех есть ли...

AVR AVRISP STK500 V3.0 USB ISP Programmer for AVR IC
Люди помогите плз. не могу разобраться. приобрел этот чудный девайс (AVR AVRISP STK500 V3.0 USB...

5
404 / 192 / 40
Регистрация: 21.09.2008
Сообщений: 661
24.05.2020, 15:13 2
Я бы присмотрелся к режиму таймера CTC (Clear Timer on Compare Match). Меняя значение регистра OCR1A, можно гибко добиваться изменения частоты. Для поддержки частоты 100 кГц Таймером1 при F_CPU=8000000UL и единичном делителе значение в OCR1A будет ((8000000/100000)/2)-1=39. Увеличивая это значение, уменьшаем частоту. Однако при максимальном значении OCR1A = 65535, частота будет 1/((65535+1)*2/8000000)=61 Гц. Поэтому для достижения частот менее 61 Гц, надо будет активировать делитель Таймера1 на 256. Соответственно, пересчитать значение в OCR1A.
1
0 / 0 / 0
Регистрация: 04.03.2019
Сообщений: 2
24.05.2020, 15:39  [ТС] 3
Sharpey, за ответ спасибо, были составлены расчётные таблицы с OCR и TCNT. С OCR перестройка частоты чуть лучше чем с TCNT, но не намного, однако задание подразумевает использовать режим Normal по переполнению. Вопрос состоит в программной реализации регулировки частоты с использованием кнопок и условно с заданием множителей, если есть какие-нибудь примеры, поделитесь пожалуйста. Спасибо.
0
404 / 192 / 40
Регистрация: 21.09.2008
Сообщений: 661
24.05.2020, 17:32 4
Примеров, увы, нет.
0
Тутошний я
1848 / 995 / 182
Регистрация: 03.11.2009
Сообщений: 3,321
Записей в блоге: 2
25.05.2020, 02:33 5
сперва я бы завёл переменную под частоту меандра. при нажатии кнопок она будет перезаписываться.
потом настроил таймер на минимальное кратное значение.
если предделитель СК/1
100000Гц = 10мкс. полупериод 5мкс. 40 тактов.
99999Гц = 40,0004 такта
если подстраивать таймер под частоту, с точностью до герца не получается.
а если считать такты, то 41 такт = 97560,97Гц. тоже не получается.

тактовая частота 8МГц. это мало.
0
Модератор
8201 / 6071 / 811
Регистрация: 14.02.2011
Сообщений: 21,062
25.05.2020, 08:26 6
Цитата Сообщение от sharpey Посмотреть сообщение
Примеров, увы, нет.
и не будет
например для частоты 100кГц делитель 80, следующий натуральный будет 81
какая частота будет при 81??? 8000000/81= 98 765,43, как получить 99кГц или даже 999999.5????
тут надо идти другим путем, почитай как реализуются цифровые генераторы
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.05.2020, 08:26

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

Анализ стека AVR / AVR stack analysis
Привет! Уперся я в стек, и решил понять что почем. Нашел вот такой вот скриптик:...

AVR Atmega324PU не прошивается AVR ISP Mk2
Добрый день. На плату впаян данный микроконтроллер в корпусе tqfp. При подключении программатора...

AVR Studio 6 и AVR Toolchain вопросы!
Всем доброго времени суток. Решил я написать софтинку в новой студии от Атмела AVR Studyo 6. Все...

AVR Studio 6 Avr simulator
Подскажите каким образом стартануть прогу в avr symulator с адреса boottooder (atmega8a, 0x0F80)....

Как подружить AVR+AVR?
Приветствую Вас уважаемые форумчане! Требуется связать 2 AVR-ки, по классической схеме Master -&gt;...

CAVR против AVR Studio, что не так в программе под AVR Studio
Проблема такая, есть исходник, если его компилировать в CAVR заливаю в МК все работает, если этот...


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

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

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