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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Таймеры, Опять они родимые=))
dvs85
сообщение May 29 2008, 03:49
Сообщение #16


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

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



Никак не могу придумать эту программу.
Ну включил я компаратор, он выдал прерывание которое включило таймер. Не могу придумать теперь как выключить его.
Алгоритм программы не могу придумать. Подскажите, плиз!!!
Go to the top of the page
 
+Quote Post
dvs85
сообщение Jun 16 2008, 00:44
Сообщение #17


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

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



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

Сделал следующее: настройка компаратора на срабатыванию по переднему фронту; когда появляется импульс срабатывает компаратор и включает прерывание, которое включает счет таймером. А вот как выключить таймер по появлению заднего фронта понять не могу...
Go to the top of the page
 
+Quote Post
Lepeksiy
сообщение Jun 16 2008, 06:19
Сообщение #18


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 25-04-07
Пользователь №: 27 294



Включаешь прерывание по изменению компаратора (ACIS0=0, ACIS1=0).
И в обработчике прерывания проверяешь выход компаратора ACO и либо включаешь, либо выключаешь таймер.
Код
if (ACSR & (1 << ACO))
{
// код включения
}
else
{
// код выключения
}
Go to the top of the page
 
+Quote Post
dvs85
сообщение Jun 16 2008, 22:23
Сообщение #19


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

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



Спасибо. А то уже замучился.
Go to the top of the page
 
+Quote Post
dvs85
сообщение Jun 17 2008, 00:36
Сообщение #20


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

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



Код
#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. Почему так и как это исправить?
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 24th August 2025 - 21:36
Рейтинг@Mail.ru


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