Обсуждаем контроллеры компании Atmel.
Ответить

Ср июн 20, 2007 18:24:48

И ещё вопрос. Чтоб создать обработчик прерывания в CodeVision нужно:

interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
PORTB|=1<<PORTB.0;
}

а вот где взять список правильно написанных вторых частей строки(выделенно) а то мне компилятор выдал interrupt vector exceeds allowable range

Ср июн 20, 2007 19:03:29

Да вроде как CodeWizard обычно их сам правильно пишет... :wink:

Ср июн 20, 2007 19:43:40

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

Aheir писал(а):Да вроде как CodeWizard обычно их сам правильно пишет... :wink:


Мастер CVAVR обычно все пишет правильно.

Я еще ни разу не видел где либо сообщения что он
что-то не верно сделал - точно по-заказу "лепит".

Чт июн 21, 2007 05:08:47

Negor писал(а):Имхо уж очень легко ты разкидываешся таймерами... я понимаю, если бы их было штук восемь... а так два таймера(я изучаю тини2313) и, как правильно заметил ARV один просто будет молотить и энергия расходуется в никуда...

эээ. ну не обязательно на таймер вешать одну задачу. Если не хватает таймеров, можно попробовать их так оптимально настроить, чтобы каждая из задач могла использовать таймер для своих целей.
на счёт молотить. ИМХО думаю молотить таймером например 10 раз в сек ничем не хуже чем в бесконечном цикле периодически вызывать процедуру опроса портов с замиранием в delay. тут может получиться гораздо чаще сем 10 раз в секунду.

Чт июн 21, 2007 20:30:42

Народ, выручайте. В программе два программных ШИМа(аппаратные не стал делать из-за того что мне нужны конкретные выводы МК). Запускаю в отладчике, и получаются что программа работает только в прерываниях(основной "бесконечный цикл выполняется только при старте....") прилагаю архив проэкта в CodeVision и Сишный листинг. Симулирую в AvrStudio4
Вложения
main.c
Сишный листинг
(1 KiB) Скачиваний: 1193
DoubleColorLight.zip
Весь проэкт в CodeVision
(23.8 KiB) Скачиваний: 694

Вт июн 26, 2007 17:01:41

Кажется понял в чём проблема...вроде как пока выполняется обработчик прерывания по переполнению, таймер успевает заново переполнится и флаг перехода на обработчик переполнения устанавливается... вот только как сделать чтоб были волки целы и овцы сыты?(чтоб переполнение по таймеру, но таймер во время обработуи прерывания не считал?)

Ср июн 27, 2007 07:03:46

Попробую перейти на ICC

Ср июн 27, 2007 11:34:37

Negor писал(а):Попробую перейти на ICC

Negor, ты хоть на коноплю перейди - проблема сама по себе не пропадет. Надо думать, разбираться.

Таймер считает, пока его не остановишь указанием 000 в качестве номера коэффициента предделителя тактовой частоты (а уж в какой регистр - это ты сам вспоминай :) ) Если прерывания возникают слишком часто, что обработчик не успевает завершиться - думай: скорее всего ты либо неверно поставил себе задачу (и соответственно неверное решение получил), либо чего-то не учел. Может быть, ты слишком высокую частоту ШИМ решил делать, не соответственно своим задачам. Например, для получения приличного качества речи при помощи ШИМ надо делать ее на частоте 8000 Гц, а для регулирования яркости светодиода - достаточно и 100 Гц. Вот и прикинь.

Но даже при 8000 Гц обработчик МК должен уж каким-то супергигантским быть, чтобы таймер успевал переполняться - тактовая частота МК все же минимум в 100 раз выше (а то и в 1000), что соответствует примерно 80 командам на один "тик" таймера (а для переполнения этих тиков требуется далеко не один, как я понимаю).

Чт июн 28, 2007 12:36:16

Как остановить таймер, я знаю, и придумал примерно такую штуку - при входе в обработчик прерывания останавливать таймер, а вконце обработчика запускать...

Сб июл 14, 2007 18:48:23

Помогите пожалуста разобратся с программкой... Стянул с AVRFreaks.net вроде как калькулятор для таймеров... но что то у мну ничего не получается(нужно переполнение каждую секунду)
Вложения
Калькулятор значений таймеров.zip
(21.35 KiB) Скачиваний: 965

Сб июл 14, 2007 20:03:37

Не пора ли бросить надеяться на чужие подсказки, пусть даже в виде таких прекрасных программ как CodeVision или вышеупомянутый калькулятор таймеров, Negor? Может, надо все-таки заняться мозговой деятельностью - таймеры рассчитываются вполне доступно для тех, кто выучил таблицу умножения и умеет конвертировать десятичные числа в шестнадцатиричные. Тем более, если освоен калькулятор Windows :)

как все-таки сильно желание не своим умом дойти до решения, а поскорее на чужих решениях чего-то сварганить :(

Пн июл 16, 2007 17:38:29

ТОв.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 т.е. так

Код:
 
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...

Пн июл 16, 2007 18:05:25

Negor писал(а):ТОв.tych, зачем в начале прерывания останавливать таймер, записывать в него значение а потом запускать?

Разве нельзя просто в конце прерывания записать нужное значение в рег. таймера как сделал я?


Можно конечно.

Пн июл 16, 2007 18:09:26

Negor писал(а):С таким кодом циферки меняются оч. долго... секунды 3-4...


Прверьте на какой частоте работает МК.

Обновлять число в таймере нужно в начале обработчика прерывания.

Пн июл 16, 2007 18:36:03

Обновлять число в таймере нужно в начале обработчика прерывания.

Пробовал... не помогает...

Прверьте на какой частоте работает МК.

Из приборов есть только авомметр...

Пн июл 16, 2007 18:51:04

а звукового входа нет в ПК ??? :lol: :lol:

Компьютер со звуковой платой - это 2х канальный нч осциллограф.

http://autodevice.ru/oscill.htm

программы - любые звуковые редакторы а лучше специальные - спектралаб, вэйвлаб.

Скачать можно в низу в библиотеке в кратком курсе.

========

ИЛИ сделайте прошивку включающую на 20 сек светодиод да измерьте реальное время.
Последний раз редактировалось tych Пн июл 16, 2007 18:57:26, всего редактировалось 2 раз(а).

Пн июл 16, 2007 18:52:11

Negor писал(а):
Обновлять число в таймере нужно в начале обработчика прерывания.

Пробовал... не помогает...


Это для повышения точности счета промежутков между переполнениями.

Пн июл 16, 2007 19:39:24

Думаю что с частотой всё ок, т.к. фузы не трогал... но проверю... да, мои расчёты верны надо полагать?

Пн июл 16, 2007 22:44:30

Помнится, были темы про частоту тини2313, с которой они с завода выходят... так вот, где гарантия, что у "не менявшихся" фузов состояние как раз на 4 МГц? судя по тому, что цифры меняются редко (раз в 3-4 секунды) очень может быть, что частота как раз 1 МГц... tych дело говорит - напиши программку мигания светодиода (в которой будешь на 100% уверен) и убедись в правильности расчетной частоты.

Расчеты таймера вроде верны...
Ответить