реклама на сайте
подробности

 
 
> Таймеры, Опять они родимые=))
dvs85
сообщение May 19 2008, 04:17
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 86
Регистрация: 24-03-08
Из: Владивосток
Пользователь №: 36 170



Всем здрасте!
Продолжаю разбираться с таймерами..
Сейчас делаю такое простейшее задание - секундомер.
То бишь через каждую секунду наступает прерывание и светодиод на STK500 моргает.
Написал такую программу
Код
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

//----------------------------------
ISR (TIMER1_COMPA_vect)
{
        PORTA = 0x00;
        _delay_ms(500);
        PORTA = 0xff;
}

//----------------------------------
int main (void)
{
    DDRA = 0xff;
    TIMSK  = (1<<OCIE1A);
    TCCR1B = (1<<CS12)|(1<<WGM13);
    OCR1A   = 15624;
    sei();
     for(;;)
      {
      asm("nop");
      asm("nop");
      }
}


Но она работает не так как я хотел)). Наступает одно прерывание и все.. Дальше никаких действий не происходит..
МК - Атмега16, пишу в АВР Студио.
Подскажите, что не так?



Сори, нашел ошибку.. Прошу прощения

Сообщение отредактировал dvs85 - May 19 2008, 04:17
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
dvs85
сообщение May 28 2008, 01:43
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 86
Регистрация: 24-03-08
Из: Владивосток
Пользователь №: 36 170



Подскажите, в чем ошибка алгоритма этой программы?

Сказали, только, что алгоритм неправильный, а в чем ошибка не сказали..
Код
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

unsigned char OVF;                            //Счетчик переполнения
unsigned int FrontR, FrontF;                        //Для сохранения времени появления нарастающего и
                                                    //спадающего фронта импульса
unsigned long TimeClocks;
unsigned long TimeClocks_ms;
//========================================
//Прерывание по переполнению таймера

ISR(TIMER1_OVF_vect)                  //Если возникает прерывание по переполнению таймера,
{
    OVF++;                    //то увеличить значение счетчика переполнений
}

//=========================================
//Прерывание по захвату

ISR(TIMER1_CAPT_vect)                //При возникновении прерывания по захвату таймера,
{
               
    if ((PIND & 0x40)!=0)            //Если PD6 = высокому уровню
     {
      FrontR = ICR1;            //Запись времени возникновения захвата в EdgedR
      TCCR1B = TCCR1B & 0xBF;        //Установить захват по спадающему фронту
     }
    else                     //Если PD6 = низкий уровень
     {
      FrontF = ICR1;                //сохранить значение в EdgedF
      TCCR1B =TCCR1B| (1<<ICES1);
      //Вычислить временной интервал
      TimeClocks = (unsigned long)FrontF -     (unsigned long)FrontR + (unsigned long)OVF* 0x10000;
      //Подсчитать значение  в милисек
              TimeClocks_ms = TimeClocks/500;
     }    
}
int main (void)
{
    DDRC = 0XFF;
    TIMSK |= (1 << TOIE1)|(1<<TICIE1);    //разрешение прерывания по захвату и по переполнению
      TCCR1B|=(1<< ICES1)|(1 << CS10);    //установка коэф.деления = 8 и захват по нарастающему фронту
    sei();                    //Общее разрешение прерываний
    while(1);
    {
    }                    //Зацикливание пока не начнется прерывание
}

Программа теоритически должна считать временной интервал имульса

Сообщение отредактировал dvs85 - May 28 2008, 01:43
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- dvs85   Таймеры   May 19 2008, 04:17
- - dvs85   Решил дописать программу помоднее=)) Чтобы контрол...   May 21 2008, 05:02
|- - Палыч   Цитата(dvs85 @ May 21 2008, 08:02) Может ...   May 21 2008, 05:30
- - dvs85   Убрал. Все равно стопорится. На этой записи Кодvoi...   May 21 2008, 05:37
|- - Палыч   Цитата(dvs85 @ May 21 2008, 08:37) Убрал....   May 21 2008, 05:54
- - dvs85   Действительно.. Ха. Теперь он до трех считает))   May 21 2008, 05:56
- - Палыч   Цитата(dvs85 @ May 21 2008, 08:56) Ха. Те...   May 21 2008, 06:55
- - dvs85   ЦитатаХорошо, что до трёх! Посмотрите на своё ...   May 21 2008, 22:03
|- - Палыч   Цитата(dvs85 @ May 22 2008, 01:03) Кстати...   May 22 2008, 06:11
- - mdmitry   В документации по avr-libc все подробно сказано пр...   May 22 2008, 08:48
- - dvs85   А я даже и не знаю. Изначально в примерах так было...   May 23 2008, 02:49
|- - Палыч   Цитата(dvs85 @ May 28 2008, 04:43) Сказал...   May 28 2008, 14:40
- - dvs85   Примерно то же мне сказали другие люди. Также они ...   May 28 2008, 23:31
- - dvs85   И еще вопрос.. Какую функцию выполняет бит АСО? Ко...   May 29 2008, 00:48
- - dvs85   Никак не могу придумать эту программу. Ну включил...   May 29 2008, 03:49
- - dvs85   Подскажите!!!! Сделал следу...   Jun 16 2008, 00:44
- - Lepeksiy   Включаешь прерывание по изменению компаратора (ACI...   Jun 16 2008, 06:19
- - dvs85   Спасибо. А то уже замучился.   Jun 16 2008, 22:23
- - dvs85   Код#include <avr/io.h> #include <util/...   Jun 17 2008, 00:36


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 19:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.01383 секунд с 7
ELECTRONIX ©2004-2016