|
|
  |
ATxmega |
|
|
|
Apr 11 2010, 00:05
|
Местный
  
Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527

|
Цитата(МП41 @ Apr 11 2010, 01:18)  Интересно, а будут ли работать винстаровские или аналогичные индикаторы 16х2 с Xmega, если индикатор питать штатными 5В, но управляя уровнями 3.3В? У HD44780 при 5В питании логическая 1 >= 2.2В Так что работать должно, но есть еще целый зоопарк аналогов. А у них может быть что угодно с уровнями.
|
|
|
|
|
Apr 11 2010, 04:06
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 10-10-05
Пользователь №: 9 463

|
Цитата(МП41 @ Apr 11 2010, 04:18)  Интересно, а будут ли работать винстаровские или аналогичные индикаторы 16х2 с Xmega, если индикатор питать штатными 5В, но управляя уровнями 3.3В? Неохота ставить преобразователь уровней или искать индикатор с 3В питанием. LPC2103 (3.6В) работает.
|
|
|
|
|
Apr 19 2010, 14:25
|
Частый гость
 
Группа: Участник
Сообщений: 191
Регистрация: 11-02-09
Из: Краснодар
Пользователь №: 44 686

|
Возникла задача получения точного прерывания на Xmege по времени. Использую таймер с соответствующим счетом от кварца Crystal: 14.7456Mhz с умножением на PLL=2 т.е. частота тактирования 29491200 Гц, как откалибровать таймер? Вот код: (сейчас все работает, но хочется повысить точность (желательно программно, т.е. не делать отдельно макетку для точного определения частоты кварца). Код //ICC-AVR application builder // Target : ATxmega128A1 /// Crystal: 14.7456Mhz
#include <ioxm128A1v.h> #include <AVRdef.h>
// Прерывание по окончанию счета #pragma interrupt_handler iv_TCE1_OVF_isr:54 void iv_TCE1_OVF_isr(void) { TCE1.CTRLA=0x00; // stop Timer 1 порта Е TCE1.CNT.i=0x8F80; // установка значения для счета flag_rs232=1; TCE1.CTRLA|=0x07; //start Timer 1 порта Е }
//TIMER1 initialize - prescale: 1, actual value: 1,000 Sec (0,0%) // Тактовая частота таймера 29491200 Гц //Деление на 1024 // Установка для счета 0x8F80 void timerE1_init(void) { TCE1.CTRLA=0x00; // stop Timer 1 порта Е TCE1.CNT.i=0x8F80; // установка значения для счета TCE1.INTCTRLA = 0x01; // Разрешение прерывания по переполнению - уровень низкий. TCE1.CTRLA|=0x07; //start Timer 1 порта Е }
void clock (void)// Функция установки тактирования от кварцевого генератора с умножением частоты в 2 раза { //Настраиваем тактирование //Кварц 16МГц, умножение на 2 OSC.XOSCCTRL=0xc3; //Кварц(12-16),16К циклов (сb) или 256К - (с3) OSC.CTRL|=0x08; //Включаем кварцевый генератор do{} while ((OSC.STATUS & 0x08)==0); //ожидаем готовности кв. генератора OSC.PLLCTRL=0xc2;// PLL от кварца, К=2 OSC.CTRL|=0x10;//Включаем PLL do{} while ((OSC.STATUS & 0x10)==0); //Ожидаем готовности PLL //переключаемся на тактирование от PLL asm ("ldi r16,0xd8"); asm ("ldi r17,0x04"); asm ("out 0x34,r16"); asm ("sts 64,r17"); OSC.CTRL&=~BIT(0); //выключаем внутренний генератор на 2 МГц, работаем от внешнего кварца }
void PMIC_SET (void) { // Разрешение прерывания и установка какие прерывания разрешены CLI(); PMIC.CTRL |= 0x07; // Enable interrupts in the PMIC. SEI(); // Enable the global interrupt flag.
}
|
|
|
|
|
Apr 20 2010, 14:42
|
Частый гость
 
Группа: Участник
Сообщений: 191
Регистрация: 11-02-09
Из: Краснодар
Пользователь №: 44 686

|
Цитата(MDD @ Apr 20 2010, 18:22)  Не совсем понятен Ваш вопрос. Вы хотите всегда иметь на на выходе интервал, ближайший к 1сек при любом заранее неизвестном кварце? Вопрос вот чем: у нас есть регистр TCE1.CNT.i=0x8F80; // установка значения для счета в котором необходимо установить число для счета таймера и зависит оно от частоты кварца (которое в общем может отличаться от того что на нем написано - немного естественно). Есть решение аппаратное: делаем макетку, ставим кварц и частотомером вымеряем частоты кварца точно и на ее основе получаем значение регистра TCE1.CNT.i - при котором прерывание будет происходить максимально близко к 1 сек (грубо говоря 1,00000001 сек). Я же хочу используя возможности Xmege - получиться ту же точность без вымерения кварца - возможно ли это ? (Если да - то каким путем).
|
|
|
|
|
Apr 20 2010, 18:54
|
Частый гость
 
Группа: Участник
Сообщений: 191
Регистрация: 11-02-09
Из: Краснодар
Пользователь №: 44 686

|
Цитата(MDD @ Apr 20 2010, 21:57)  Вы получаете свою частоту 1Гц вначале за счет деления на 1024 в прескаллере, затем за счет деления на 28800 в самом счетчике. Изменяя коэф деления на 1, например 27799, получим частоту 1.00003Гц Можно объединить два таймера в один 32-х разрядный с общим коэф деления 29491200. Тогда изменяя коэф деления на 1, например 29491199, получим частоту 1.00000003Гц. Т.е. шаг подстройки на три порядка более тонкий. Правда сам я не пробовал соединять так таймеры, но даташит вроде такую возможность обещает. Но в любом случае для оценки правильности интервала Вам потребуется какой-то внешний эталон частоты или времени. Правильно я понимаю - частоту кварца можно узнать только внешне (программно из Xmege я ее не узнаю). По таймерам понятно (если использовать 64-бит еще точнее можно сделать  ) Не хочется макетку делать.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|