Перейти к содержанию
    

Никак не могу придумать эту программу.

Ну включил я компаратор, он выдал прерывание которое включило таймер. Не могу придумать теперь как выключить его.

Алгоритм программы не могу придумать. Подскажите, плиз!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите!!!! :help::help::help:

 

Сделал следующее: настройка компаратора на срабатыванию по переднему фронту; когда появляется импульс срабатывает компаратор и включает прерывание, которое включает счет таймером. А вот как выключить таймер по появлению заднего фронта понять не могу...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Включаешь прерывание по изменению компаратора (ACIS0=0, ACIS1=0).

И в обработчике прерывания проверяешь выход компаратора ACO и либо включаешь, либо выключаешь таймер.

if (ACSR & (1 << ACO))
{
// код включения
}
else
{
// код выключения
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdlib.h>
//-------------------------
unsigned char i,b;
//-------------------------
const float k = 0.1;
//-------------------------
//Прерывание по переполнени     таймера
ISR(TIMER1_OVF_vect)          //Если возникает прерывание по переполнению таймера,
{
    i++;               //то увеличить значение счетчика переполнений
}
//-------------------------
//Программа для передачи через СОМ порт
void USART_Transmit (unsigned char data)  
{
    while (!(UCSRA&(1<<UDRE)));                //Пока UDRE 0, делать ->
    UDR=data;
}
//-------------------------
int Sec_USART (unsigned char *p  )
{
    float sec;
    unsigned int valsec = *p;
    sec = valsec;                    //в sec - значение valsec
    sec = sec * k;    
    char s[5];                    //умножить sec на к=0,0048 и результат записать в себя
    dtostrf (sec, 5, 1, s);        /Преобразовать значение секунд типа double в строку символов
    USART_Transmit (s[0]);
    USART_Transmit (s[1]);
    USART_Transmit (s[2]);    
    USART_Transmit (s[3]);
    USART_Transmit (s[4]);    
    return 0;
}
//-------------------------
ISR (TIMER1_COMPA_vect)
{
    b ++;                //Значение счетчика
    Sec_USART (&b );
}
//------------------------
ISR (ANA_COMP_vect)         //Прерывание от компаратора
    if (ACSR & (1 << ACO))
     {
      TCCR1B = TCCR1B|((1<<CS10)|(1<<CS12)); //Коэф. предделителя = 1024
     }    
    else
     {
      TCCR1B =TCCR1B & 0b11111010;                
     }                            
}
//--------------------------

//-------------------------
int main()
{
    ACSR|= (1<<ACIE)|(1<<ACBG);            //Инициализация компаратора
    TCCR1B =TCCR1B| (1<<WGM12);
    TIMSK =TIMSK| (1<<OCIE1A);
    OCR1A = 39062;                    //В регистре сравнения 39062
            sei();
    for(;;)
     {
      asm ("nop");
      asm ("nop");
     }
}

 

Почему то в симуляторе он через сом порт передает первое значение 0,1 с, а затем зависает в функции USART_Transmit. Почему так и как это исправить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...