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
- Откуда: Москва
- Контактная информация:
Aheir писал(а):Да вроде как CodeWizard обычно их сам правильно пишет...
Мастер CVAVR обычно все пишет правильно.
Я еще ни разу не видел где либо сообщения что он
что-то не верно сделал - точно по-заказу "лепит".
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Negor писал(а):Имхо уж очень легко ты разкидываешся таймерами... я понимаю, если бы их было штук восемь... а так два таймера(я изучаю тини2313) и, как правильно заметил ARV один просто будет молотить и энергия расходуется в никуда...
эээ. ну не обязательно на таймер вешать одну задачу. Если не хватает таймеров, можно попробовать их так оптимально настроить, чтобы каждая из задач могла использовать таймер для своих целей.
на счёт молотить. ИМХО думаю молотить таймером например 10 раз в сек ничем не хуже чем в бесконечном цикле периодически вызывать процедуру опроса портов с замиранием в delay. тут может получиться гораздо чаще сем 10 раз в секунду.
- Negor
- Вымогатель припоя
- Сообщения: 586
- Зарегистрирован: Ср мар 07, 2007 22:58:02
- Откуда: Черкассы, Украина
- Контактная информация:
Народ, выручайте. В программе два программных ШИМа(аппаратные не стал делать из-за того что мне нужны конкретные выводы МК). Запускаю в отладчике, и получаются что программа работает только в прерываниях(основной "бесконечный цикл выполняется только при старте....") прилагаю архив проэкта в CodeVision и Сишный листинг. Симулирую в AvrStudio4
- Вложения
-
- DoubleColorLight.zip
- Весь проэкт в CodeVision
- (23.8 КБ) 808 скачиваний
-
- main.c
- Сишный листинг
- (1 КБ) 1296 скачиваний
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
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Negor писал(а):Попробую перейти на ICC
Negor, ты хоть на коноплю перейди - проблема сама по себе не пропадет. Надо думать, разбираться.
Таймер считает, пока его не остановишь указанием 000 в качестве номера коэффициента предделителя тактовой частоты (а уж в какой регистр - это ты сам вспоминай
Но даже при 8000 Гц обработчик МК должен уж каким-то супергигантским быть, чтобы таймер успевал переполняться - тактовая частота МК все же минимум в 100 раз выше (а то и в 1000), что соответствует примерно 80 командам на один "тик" таймера (а для переполнения этих тиков требуется далеко не один, как я понимаю).
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Negor
- Вымогатель припоя
- Сообщения: 586
- Зарегистрирован: Ср мар 07, 2007 22:58:02
- Откуда: Черкассы, Украина
- Контактная информация:
Помогите пожалуста разобратся с программкой... Стянул с AVRFreaks.net вроде как калькулятор для таймеров... но что то у мну ничего не получается(нужно переполнение каждую секунду)
- Вложения
-
- Калькулятор значений таймеров.zip
- (21.35 КБ) 1095 скачиваний
There is only 10 kind of people: those who understands binary code and those who dont!!!
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 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);
также при каждом переполнении необходимо обновлять значение ЕСТЕ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...
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
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Помнится, были темы про частоту тини2313, с которой они с завода выходят... так вот, где гарантия, что у "не менявшихся" фузов состояние как раз на 4 МГц? судя по тому, что цифры меняются редко (раз в 3-4 секунды) очень может быть, что частота как раз 1 МГц... tych дело говорит - напиши программку мигания светодиода (в которой будешь на 100% уверен) и убедись в правильности расчетной частоты.
Расчеты таймера вроде верны...
Расчеты таймера вроде верны...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!