Форум РадиоКот https://radiokot.ru/forum/ |
|
Таймеры в качестве генератора тактовой частоты https://radiokot.ru/forum/viewtopic.php?f=20&t=76068 |
Страница 1 из 1 |
Автор: | Johnson [ Пт июл 27, 2012 17:59:26 ] |
Заголовок сообщения: | Таймеры в качестве генератора тактовой частоты |
Здравствуйте, уважаемые коты. Года три не занимался AVRами, и вот снова пришлось... Разумеется, открыв CVAVR и протеус - как будто попал на другую планету. В общем, минимальная задача: подключить дисплей WG12232Eк контроллеру ATmega8535 (ну и, разумеется, хоть что-то отрисовать на нем). Данный дисплей характерен тем, что ему требуется внешняя тактовая частота 2кгц. Подскажите, как правильно настроить (и использовать) таймер с его прерыванием для получения нужной частоты? Тактовая частота процессора 16мгц. Был бы очень благодарен за ответ в стиле "для чайника" и с примером настройки визарда проекта. PS: а в целом задача - дать новую жизнь колонкам MICROLAB SOLO6C, контроллер и эквалайзер которых приказали долго жить. "Раз пошла такая пьянка", хочу сделать графический дисплей, который будет отображать громкость (большими цифрами), часики... В последствии припаять к ним ещё датчик температуры и радио цифровое А еще есть идея сделать детектор входящего сигнала, при активации которого колонки сами включатся (когда поступит звук на вход). Всё это сделать управляемым с пульта... Планы, конечно, Наполеоновские, но желание есть. Правда, не могу найти ни одного примера использования таймера как генератор частоты... |
Автор: | woosterstring [ Пт июл 27, 2012 21:24:13 ] |
Заголовок сообщения: | Re: Таймеры в качестве генератора тактовой частоты |
Вот минимальный код для 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-выводного ЖКИ. |
Автор: | Johnson [ Сб июл 28, 2012 06:01:07 ] |
Заголовок сообщения: | Re: Таймеры в качестве генератора тактовой частоты |
Спасибо большое! Буду экспериментировать. Кстати, что такое "_BV"? Cvavr не понимать её Кстати, ни у кого нет примеров работы с указанным дисплеем? В целом теорию понял, но и не отказался бы посмотреть на чужую реализацию... |
Автор: | pyzhman [ Сб июл 28, 2012 06:43:51 ] | ||
Заголовок сообщения: | Re: Таймеры в качестве генератора тактовой частоты | ||
Формируем 2 кГц, используя прерывание по переполнению таймера 0: СпойлерКод: #include <mega8535.h> // Timer 0 overflow interrupt service routine interrupt [TIM0_OVF] void timer0_ovf_isr(void) { PORTA.0= ~PORTA.0; //инвертируем выход TCNT0= 0xC2; // предустановка на срабатывание через 250 мксек } void main(void) { PORTA=0x00; DDRA=0x01; // портА бит 0 на выход // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 250,000 kHz // Mode: Normal top=FFh // OC0 output: Disconnected TCCR0=0x03; // прескалер // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x01; // разрешаем прерывание по переполнению от таймер0 // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00; // Global enable interrupts #asm("sei") while (1) { }; }
|
Автор: | Johnson [ Сб июл 28, 2012 07:15:59 ] |
Заголовок сообщения: | Re: Таймеры в качестве генератора тактовой частоты |
Спасибо большое! Я уже экспериментами добился, хотя этот вариант тоже очень хороший. Я использовал Код: 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, и с прерываниями издеваюсь... Ну и продолжаю эксперименты Кстати, мне кажется, или Протеус неправильно измеряет частоту? |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |