CodeVision AVR в вопросах и ответах
- Negor
- Вымогатель припоя
- Сообщения: 586
- Зарегистрирован: Ср мар 07, 2007 22:58:02
- Откуда: Черкассы, Украина
- Контактная информация:
И ещё вопрос. Чтоб создать обработчик прерывания в CodeVision нужно:
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
PORTB|=1<<PORTB.0;
}
а вот где взять список правильно написанных вторых частей строки(выделенно) а то мне компилятор выдал interrupt vector exceeds allowable range
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
PORTB|=1<<PORTB.0;
}
а вот где взять список правильно написанных вторых частей строки(выделенно) а то мне компилятор выдал interrupt vector exceeds allowable range
There is only 10 kind of people: those who understands binary code and those who dont!!!
- Реклама
- tych
- Э...
- Сообщения: 2792
- Зарегистрирован: Ср апр 04, 2007 08:39:14
- Откуда: Москва
- Контактная информация:
Вы б прочитали ТАКИ курс.Negor писал(а):И ещё вопрос. Чтоб создать обработчик прерывания в CodeVision нужно:
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
PORTB|=1<<PORTB.0;
}
а вот где взять список правильно написанных вторых частей строки(выделенно) а то мне компилятор выдал interrupt vector exceeds allowable range
Это обычное название функции - может делать его любым допустимым в Си.
А вот это - TIM0_COMPA - важно писать правильно !
Это названия прерываний по таблице в даташите.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
- tych
- Э...
- Сообщения: 2792
- Зарегистрирован: Ср апр 04, 2007 08:39:14
- Откуда: Москва
- Контактная информация:
Мастер CVAVR обычно все пишет правильно.Aheir писал(а):Да вроде как CodeWizard обычно их сам правильно пишет...
Я еще ни разу не видел где либо сообщения что он
что-то не верно сделал - точно по-заказу "лепит".
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
эээ. ну не обязательно на таймер вешать одну задачу. Если не хватает таймеров, можно попробовать их так оптимально настроить, чтобы каждая из задач могла использовать таймер для своих целей.Negor писал(а):Имхо уж очень легко ты разкидываешся таймерами... я понимаю, если бы их было штук восемь... а так два таймера(я изучаю тини2313) и, как правильно заметил ARV один просто будет молотить и энергия расходуется в никуда...
на счёт молотить. ИМХО думаю молотить таймером например 10 раз в сек ничем не хуже чем в бесконечном цикле периодически вызывать процедуру опроса портов с замиранием в delay. тут может получиться гораздо чаще сем 10 раз в секунду.
- Реклама
- Negor
- Вымогатель припоя
- Сообщения: 586
- Зарегистрирован: Ср мар 07, 2007 22:58:02
- Откуда: Черкассы, Украина
- Контактная информация:
Народ, выручайте. В программе два программных ШИМа(аппаратные не стал делать из-за того что мне нужны конкретные выводы МК). Запускаю в отладчике, и получаются что программа работает только в прерываниях(основной "бесконечный цикл выполняется только при старте....") прилагаю архив проэкта в CodeVision и Сишный листинг. Симулирую в AvrStudio4
- Вложения
-
- DoubleColorLight.zip
- Весь проэкт в CodeVision
- (23.8 КБ) 810 скачиваний
-
- main.c
- Сишный листинг
- (1 КБ) 1300 скачиваний
There is only 10 kind of people: those who understands binary code and those who dont!!!
- Negor
- Вымогатель припоя
- Сообщения: 586
- Зарегистрирован: Ср мар 07, 2007 22:58:02
- Откуда: Черкассы, Украина
- Контактная информация:
Кажется понял в чём проблема...вроде как пока выполняется обработчик прерывания по переполнению, таймер успевает заново переполнится и флаг перехода на обработчик переполнения устанавливается... вот только как сделать чтоб были волки целы и овцы сыты?(чтоб переполнение по таймеру, но таймер во время обработуи прерывания не считал?)
There is only 10 kind of people: those who understands binary code and those who dont!!!
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Negor, ты хоть на коноплю перейди - проблема сама по себе не пропадет. Надо думать, разбираться.Negor писал(а):Попробую перейти на ICC
Таймер считает, пока его не остановишь указанием 000 в качестве номера коэффициента предделителя тактовой частоты (а уж в какой регистр - это ты сам вспоминай
Но даже при 8000 Гц обработчик МК должен уж каким-то супергигантским быть, чтобы таймер успевал переполняться - тактовая частота МК все же минимум в 100 раз выше (а то и в 1000), что соответствует примерно 80 командам на один "тик" таймера (а для переполнения этих тиков требуется далеко не один, как я понимаю).
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Negor
- Вымогатель припоя
- Сообщения: 586
- Зарегистрирован: Ср мар 07, 2007 22:58:02
- Откуда: Черкассы, Украина
- Контактная информация:
Помогите пожалуста разобратся с программкой... Стянул с AVRFreaks.net вроде как калькулятор для таймеров... но что то у мну ничего не получается(нужно переполнение каждую секунду)
- Вложения
-
- Калькулятор значений таймеров.zip
- (21.35 КБ) 1098 скачиваний
There is only 10 kind of people: those who understands binary code and those who dont!!!
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Не пора ли бросить надеяться на чужие подсказки, пусть даже в виде таких прекрасных программ как CodeVision или вышеупомянутый калькулятор таймеров, Negor? Может, надо все-таки заняться мозговой деятельностью - таймеры рассчитываются вполне доступно для тех, кто выучил таблицу умножения и умеет конвертировать десятичные числа в шестнадцатиричные. Тем более, если освоен калькулятор Windows 
как все-таки сильно желание не своим умом дойти до решения, а поскорее на чужих решениях чего-то сварганить
как все-таки сильно желание не своим умом дойти до решения, а поскорее на чужих решениях чего-то сварганить
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Negor
- Вымогатель припоя
- Сообщения: 586
- Зарегистрирован: Ср мар 07, 2007 22:58:02
- Откуда: Черкассы, Украина
- Контактная информация:
ТОв.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ю
вот мой "зародыш" часов...
Здесь вывод на два семисегм. индикатора секунд. Если бы у меня всё получилось, я бы помощи не просил. Конечно, я мог пропустить что-то другое...
На кнопки внимания можно не обращать... С таким кодом циферки меняются оч. долго... секунды 3-4...
Тов.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 т.е. так
Код: Выделить всё
TCNT1H=С2;
TCNT1L=F7;
Код: Выделить всё
TCCR1B=(1<<CS12);
вот мой "зародыш" часов...
Здесь вывод на два семисегм. индикатора секунд. Если бы у меня всё получилось, я бы помощи не просил. Конечно, я мог пропустить что-то другое...
Код: Выделить всё
#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();
}
}
There is only 10 kind of people: those who understands binary code and those who dont!!!
- tych
- Э...
- Сообщения: 2792
- Зарегистрирован: Ср апр 04, 2007 08:39:14
- Откуда: Москва
- Контактная информация:
Можно конечно.Negor писал(а):ТОв.tych, зачем в начале прерывания останавливать таймер, записывать в него значение а потом запускать?
Разве нельзя просто в конце прерывания записать нужное значение в рег. таймера как сделал я?
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
- tych
- Э...
- Сообщения: 2792
- Зарегистрирован: Ср апр 04, 2007 08:39:14
- Откуда: Москва
- Контактная информация:
Прверьте на какой частоте работает МК.Negor писал(а):С таким кодом циферки меняются оч. долго... секунды 3-4...
Обновлять число в таймере нужно в начале обработчика прерывания.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
- tych
- Э...
- Сообщения: 2792
- Зарегистрирован: Ср апр 04, 2007 08:39:14
- Откуда: Москва
- Контактная информация:
а звукового входа нет в ПК ???
Компьютер со звуковой платой - это 2х канальный нч осциллограф.
http://autodevice.ru/oscill.htm
программы - любые звуковые редакторы а лучше специальные - спектралаб, вэйвлаб.
Скачать можно в низу в библиотеке в кратком курсе.
========
ИЛИ сделайте прошивку включающую на 20 сек светодиод да измерьте реальное время.
Компьютер со звуковой платой - это 2х канальный нч осциллограф.
http://autodevice.ru/oscill.htm
программы - любые звуковые редакторы а лучше специальные - спектралаб, вэйвлаб.
Скачать можно в низу в библиотеке в кратком курсе.
========
ИЛИ сделайте прошивку включающую на 20 сек светодиод да измерьте реальное время.
Последний раз редактировалось tych Пн июл 16, 2007 18:57:26, всего редактировалось 2 раза.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
- tych
- Э...
- Сообщения: 2792
- Зарегистрирован: Ср апр 04, 2007 08:39:14
- Откуда: Москва
- Контактная информация:
Это для повышения точности счета промежутков между переполнениями.Negor писал(а):Пробовал... не помогает...Обновлять число в таймере нужно в начале обработчика прерывания.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Помнится, были темы про частоту тини2313, с которой они с завода выходят... так вот, где гарантия, что у "не менявшихся" фузов состояние как раз на 4 МГц? судя по тому, что цифры меняются редко (раз в 3-4 секунды) очень может быть, что частота как раз 1 МГц... tych дело говорит - напиши программку мигания светодиода (в которой будешь на 100% уверен) и убедись в правильности расчетной частоты.
Расчеты таймера вроде верны...
Расчеты таймера вроде верны...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!


