Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Тема закрыта

Таймеры в качестве генератора тактовой частоты

Пт июл 27, 2012 17:59:26

Здравствуйте, уважаемые коты.
Года три не занимался AVRами, и вот снова пришлось...
Разумеется, открыв CVAVR и протеус - как будто попал на другую планету.

В общем, минимальная задача: подключить дисплей WG12232Eк контроллеру ATmega8535 (ну и, разумеется, хоть что-то отрисовать на нем).
Данный дисплей характерен тем, что ему требуется внешняя тактовая частота 2кгц.

Подскажите, как правильно настроить (и использовать) таймер с его прерыванием для получения нужной частоты?
Тактовая частота процессора 16мгц.

Был бы очень благодарен за ответ в стиле "для чайника" и с примером настройки визарда проекта.

PS: а в целом задача - дать новую жизнь колонкам MICROLAB SOLO6C, контроллер и эквалайзер которых приказали долго жить. "Раз пошла такая пьянка", хочу сделать графический дисплей, который будет отображать громкость (большими цифрами), часики... В последствии припаять к ним ещё датчик температуры и радио цифровое :) А еще есть идея сделать детектор входящего сигнала, при активации которого колонки сами включатся (когда поступит звук на вход). Всё это сделать управляемым с пульта... Планы, конечно, Наполеоновские, но желание есть. Правда, не могу найти ни одного примера использования таймера как генератор частоты...

Re: Таймеры в качестве генератора тактовой частоты

Пт июл 27, 2012 21:24:13

Вот минимальный код для WinAVR (под AVR Studio 4.18) для Atmega48/88/168(p). С CVAVR различий немного.
Простая настройка таймера в режим CTC.
Ровно 2 кГц на выводе регистра OC0A. А вообще, вариантов много.

Код:
#include <avr/io.h>

#define OSC_speed 8000000            //Тактовая частота

int main (void)
{
    //Настройка генератора частоты на Timer0, выход OC0A
    DDRD |= _BV(PD6);             //На выход
    TCCR0A |= _BV(COM0A0);   //Toggle pin
    TCCR0A |= _BV(WGM01);    //CTC mode
    TCCR0B |= _BV(CS01);       //Предделитель тактовой частоты 8 мГц на 8
    OCR0A = 0x00F9;

     while(1);
}


Для ATmega8535 нужно поменять имена регистров.

Код:
                                       //Настройка генератора частоты на Timer0, выход OC0
     DDRB |= _BV(PB3);      //На выход
     TCCR0 |= _BV(COM00);   //Toggle pin
     TCCR0 |= _BV(WGM01);   //CTC mode
     TCCR0 |= _BV(CS01);   //Предделитель тактовой частоты 8 мГц на 8
     OCR0 = 0xF9;


Просто показалось много 40-ногого контроллера для 15-выводного ЖКИ.

Re: Таймеры в качестве генератора тактовой частоты

Сб июл 28, 2012 06:01:07

Спасибо большое!
Буду экспериментировать.
Кстати, что такое "_BV"? Cvavr не понимать её :)

Кстати, ни у кого нет примеров работы с указанным дисплеем? В целом теорию понял, но и не отказался бы посмотреть на чужую реализацию...

Re: Таймеры в качестве генератора тактовой частоты

Сб июл 28, 2012 06:43:51

Формируем 2 кГц, используя прерывание по переполнению таймера 0:

Изображение
Вложения
wizard.jpg
(30.51 KiB) Скачиваний: 2750

Re: Таймеры в качестве генератора тактовой частоты

Сб июл 28, 2012 07:15:59

Спасибо большое!

Я уже экспериментами добился, хотя этот вариант тоже очень хороший.
Я использовал
Код:
TCCR1A=0b01000000;
// Делитель частоты CLK/64 = 250kHz
TCCR1B=0b00000011;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x40;
OCR1BH=0x00;
OCR1BL=0x00;
TIMSK=0x10;
#asm("sei")



, чтоб таймер сам менял состояние ноги OC1A, и с прерываниями издеваюсь... Ну и продолжаю эксперименты :)

Кстати, мне кажется, или Протеус неправильно измеряет частоту?
Тема закрыта