Страница 3 из 421
Добавлено: Ср июн 20, 2007 18:24:48
Negor
И ещё вопрос. Чтоб создать обработчик прерывания в CodeVision нужно:
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
PORTB|=1<<PORTB.0;
}
а вот где взять список правильно написанных вторых частей строки(выделенно) а то мне компилятор выдал interrupt vector exceeds allowable range
Добавлено: Ср июн 20, 2007 19:03:29
Aheir
Да вроде как CodeWizard обычно их сам правильно пишет...

Добавлено: Ср июн 20, 2007 19:43:40
tych
Negor писал(а):И ещё вопрос. Чтоб создать обработчик прерывания в CodeVision нужно:
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
PORTB|=1<<PORTB.0;
}
а вот где взять список правильно написанных вторых частей строки(выделенно) а то мне компилятор выдал interrupt vector exceeds allowable range
Вы б прочитали ТАКИ курс.
Это обычное название функции - может делать его любым допустимым в Си.
А вот это - TIM0_COMPA - важно писать правильно !
Это названия прерываний по таблице в даташите.
Добавлено: Ср июн 20, 2007 19:45:21
tych
Aheir писал(а):Да вроде как CodeWizard обычно их сам правильно пишет...

Мастер CVAVR обычно все пишет правильно.
Я еще ни разу не видел где либо сообщения что он
что-то не верно сделал - точно по-заказу "лепит".
Добавлено: Чт июн 21, 2007 05:08:47
Кашпо
Negor писал(а):Имхо уж очень легко ты разкидываешся таймерами... я понимаю, если бы их было штук восемь... а так два таймера(я изучаю тини2313) и, как правильно заметил ARV один просто будет молотить и энергия расходуется в никуда...
эээ. ну не обязательно на таймер вешать одну задачу. Если не хватает таймеров, можно попробовать их так оптимально настроить, чтобы каждая из задач могла использовать таймер для своих целей.
на счёт молотить. ИМХО думаю молотить таймером например 10 раз в сек ничем не хуже чем в бесконечном цикле периодически вызывать процедуру опроса портов с замиранием в delay. тут может получиться гораздо чаще сем 10 раз в секунду.
Добавлено: Чт июн 21, 2007 20:30:42
Negor
Народ, выручайте. В программе два программных ШИМа(аппаратные не стал делать из-за того что мне нужны конкретные выводы МК). Запускаю в отладчике, и получаются что программа работает только в прерываниях(основной "бесконечный цикл выполняется только при старте....") прилагаю архив проэкта в CodeVision и Сишный листинг. Симулирую в AvrStudio4
Добавлено: Вт июн 26, 2007 17:01:41
Negor
Кажется понял в чём проблема...вроде как пока выполняется обработчик прерывания по переполнению, таймер успевает заново переполнится и флаг перехода на обработчик переполнения устанавливается... вот только как сделать чтоб были волки целы и овцы сыты?(чтоб переполнение по таймеру, но таймер во время обработуи прерывания не считал?)
Добавлено: Ср июн 27, 2007 07:03:46
Negor
Попробую перейти на ICC
Добавлено: Ср июн 27, 2007 11:34:37
ARV
Negor писал(а):Попробую перейти на ICC
Negor, ты хоть на коноплю перейди - проблема сама по себе не пропадет. Надо думать, разбираться.
Таймер считает, пока его не остановишь указанием 000 в качестве номера коэффициента предделителя тактовой частоты (а уж в какой регистр - это ты сам вспоминай

) Если прерывания возникают слишком часто, что обработчик не успевает завершиться - думай: скорее всего ты либо неверно поставил себе задачу (и соответственно неверное решение получил), либо чего-то не учел. Может быть, ты слишком высокую частоту ШИМ решил делать, не соответственно своим задачам. Например, для получения приличного качества речи при помощи ШИМ надо делать ее на частоте 8000 Гц, а для регулирования яркости светодиода - достаточно и 100 Гц. Вот и прикинь.
Но даже при 8000 Гц обработчик МК должен уж каким-то супергигантским быть, чтобы таймер успевал переполняться - тактовая частота МК все же минимум в 100 раз выше (а то и в 1000), что соответствует примерно 80 командам на один "тик" таймера (а для переполнения этих тиков требуется далеко не один, как я понимаю).
Добавлено: Чт июн 28, 2007 12:36:16
Negor
Как остановить таймер, я знаю, и придумал примерно такую штуку - при входе в обработчик прерывания останавливать таймер, а вконце обработчика запускать...
Добавлено: Сб июл 14, 2007 18:48:23
Negor
Помогите пожалуста разобратся с программкой... Стянул с AVRFreaks.net вроде как калькулятор для таймеров... но что то у мну ничего не получается(нужно переполнение каждую секунду)
Добавлено: Сб июл 14, 2007 20:03:37
ARV
Не пора ли бросить надеяться на чужие подсказки, пусть даже в виде таких прекрасных программ как CodeVision или вышеупомянутый калькулятор таймеров,
Negor? Может, надо все-таки заняться мозговой деятельностью - таймеры рассчитываются вполне доступно для тех, кто выучил таблицу умножения и умеет конвертировать десятичные числа в шестнадцатиричные. Тем более, если освоен калькулятор Windows
как все-таки сильно желание не своим умом дойти до решения, а поскорее на чужих решениях чего-то сварганить 
Добавлено: Пн июл 16, 2007 17:38:29
Negor
ТОв.
tych, зачем в начале прерывания останавливать таймер, записывать в него значение а потом запускать? Разве нельзя просто в конце прерывания записать нужное значение в рег. таймера как сделал я?
Тов.
ARV, не подумайте что я прям так сразу обратился к калькулятору частот... Смысл расчёта я понял, калькулятор Windows в инженерном режиме освоен и всё вроде должно было бы получится... но необходимой задержки я так и не получил... Поэтому попытался обратится к стороннему софту (больше из-за неуверенности в правильности рассуждений). Конечно я бы мог взять прошивку от других часов, и разобратся в ней (уж чего чего а часов на АВРах наделали достаточно) но... хочу свою прошивку под свою схему и чтоб работала она так, как придумал я, поэтому и вылазят всякие проблемы...
Вобщем вводная:
МК ATTiny2313 работает от внутр. RC-генератора.
Fuse выставлены на 4 МГц (В сост. лог "1" наход. CKSEL1).
Я расскажу как я рассуждал.
Итак частота МК 4 Мгц=4000000 тактов в сек.
Без пределителя один счёт 16 разр. таймера за
=> 1/4000000=0,00000025 сек.
при делителе 256 один счёт таймера
=> 0,00000025*256=0,000064 в сек.
значит счётов для переполнения в одну сек.
=> 1/0,000064=15625.
значит для переполнения в одну секунду необходимо занести в счётчик таймера
=>65536-15625 = 49111 <=> 0xC2F7 т.е. так
и затем запустить таймер установив соотвю пределитель:
также при каждом переполнении необходимо обновлять значение ЕСТЕ1ю
вот мой "зародыш" часов...
Здесь вывод на два семисегм. индикатора секунд. Если бы у меня всё получилось, я бы помощи не просил. Конечно, я мог пропустить что-то другое...
Код: Выделить всё
#include<tiny2313>
#include<delay>
unsigned char i=0,j=0;
unsigned char Digit[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x27,0x7F,0x6F};
unsigned char FrstState,ScndState,RealState,Flag;
unsigned char ScndH=0xC2,ScndL=0xF7;
void KeyState(void)
{
FrstState=~PIND;
ScndState=FrstState & ~PIND;
RealState=(ScndState) & ~(Flag);
Flag=ScndState;
}
void OutFrst(unsigned char Digit)
{
PORTD|=0x03;
PORTB=Digit;
PORTD&=0x7e;
}
void OutScnd(unsigned char Digit)
{
PORTD|=0x03;
PORTB=Digit;
PORTD&=0x7d;
}
interrupt [TIM0_OVF] void timer0_ovf_isr (void)
{
OutFrst(Digit[i]);
delay_us(25);
OutScnd(Digit[j]);
}
interrupt [TIM1_OVF] void timer1_ovf_isr (void)
{
i++;
if (i>9)
{
i=0;
j++;
};
if (j>5) j=0;
TCNT1H=ScndH;
TCNT1L=ScndL;
}
void main(void)
{
TCNT1H=ScndH;
TCNT1L=ScndL;
DDRB=0xff;
DDRD=0x03;
PORTD=0x7f;
#asm("SEI");
TIMSK=(1<<TOIE0)|(1<<TOIE1);
TCCR0B=(1<<CS00);
TCCR1B=(1<<CS12>9)
{
i=0;
j++;
};
if (j>9) j=0;
KeyState();
}
}
На кнопки внимания можно не обращать... С таким кодом циферки меняются оч. долго... секунды 3-4...
Добавлено: Пн июл 16, 2007 18:05:25
tych
Negor писал(а):ТОв.tych, зачем в начале прерывания останавливать таймер, записывать в него значение а потом запускать?
Разве нельзя просто в конце прерывания записать нужное значение в рег. таймера как сделал я?
Можно конечно.
Добавлено: Пн июл 16, 2007 18:09:26
tych
Negor писал(а):С таким кодом циферки меняются оч. долго... секунды 3-4...
Прверьте на какой частоте работает МК.
Обновлять число в таймере нужно в начале обработчика прерывания.
Добавлено: Пн июл 16, 2007 18:36:03
Negor
Обновлять число в таймере нужно в начале обработчика прерывания.
Пробовал... не помогает...
Прверьте на какой частоте работает МК.
Из приборов есть только авомметр...
Добавлено: Пн июл 16, 2007 18:51:04
tych
а звукового входа нет в ПК ???
Компьютер со звуковой платой - это 2х канальный нч осциллограф.
http://autodevice.ru/oscill.htm
программы - любые звуковые редакторы а лучше специальные - спектралаб, вэйвлаб.
Скачать можно в низу в библиотеке в кратком курсе.
========
ИЛИ сделайте прошивку включающую на 20 сек светодиод да измерьте реальное время.
Добавлено: Пн июл 16, 2007 18:52:11
tych
Negor писал(а):
Обновлять число в таймере нужно в начале обработчика прерывания.
Пробовал... не помогает...
Это для повышения точности счета промежутков между переполнениями.
Добавлено: Пн июл 16, 2007 19:39:24
Negor
Думаю что с частотой всё ок, т.к. фузы не трогал... но проверю... да, мои расчёты верны надо полагать?
Добавлено: Пн июл 16, 2007 22:44:30
ARV
Помнится, были темы про частоту тини2313, с которой они с завода выходят... так вот, где гарантия, что у "не менявшихся" фузов состояние как раз на 4 МГц? судя по тому, что цифры меняются редко (раз в 3-4 секунды) очень может быть, что частота как раз 1 МГц... tych дело говорит - напиши программку мигания светодиода (в которой будешь на 100% уверен) и убедись в правильности расчетной частоты.
Расчеты таймера вроде верны...