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

 
 
> старанности в работе timer0, mega16
covsh
сообщение Jul 1 2008, 16:08
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 7-04-05
Пользователь №: 3 947



здравствуйте.

столкнулся со следующим непонятным поведением timer0 на atmega16.
первоначально была программа, в которой, помимо всего прочего, таймер отсчитывал 5 мс по кругу.
однако после добавления куска инициализации uart, а точнее только разрешения работы передатчика, приводит к тому что таймер срабатывает раз в 10 мс.
все это я прекрасно вижу на осциллографе. стоит только убрать бит TXEN, как все становиться нормально.

я с МК работаю недавно, и на ум ничего не приходит самому.
в чем может быть дело???

далее предлагаю исходник. компилятор IAR 5.11 (все оптимизации выключены)

Код
#define ENABLE_BIT_DEFINITIONS

#include <stdio.h>
#include <inavr.h>
#include <iom16.h>


#define USART_PC


volatile int intFront;    //содержит значения фронта сигнала по которому происходит прерывание (0 - спадающий, 1 - возрастающий)


//================================================================
//На вход подается сигнал с частотой 100 Гц, длительность импульса 160 мкс
//
//
//================================================================

#pragma vector=INT0_vect  
__interrupt void int0_gen(void)
{
  if (intFront==0)
  {
    //============================================================
    //спадающий фронт сигнала
    TIMSK |= (1<<OCIE0);  //разрешения прерывания таймера по совпадению
    TCCR0  = 0x0D;        //start timer
  }
  else
  {
     //установка генерации прерывания по спадающему фронту фронту
     intFront = 0;
      
     GICR  &= ~(1<<INT0);                //запрещение прерывания на INT0
     MCUCR |=  (1<<ISC01);               //генерация прерывания по спадающему фронту сигнала на ножже 11 (INT0)
     MCUCR &= ~(1<<ISC00);
     GICR  |=  (1<<INT0);                //разрешение прерывания на INT0
  
  }
}

//================================================================
//Обработка прерывания по совпадению таймера
//
//
//================================================================
#pragma vector=TIMER0_COMP_vect      
__interrupt void timer0_5ms(void)  
{
  
  PORTA ^= 0x01;
  TIMSK &= ~(1<<OCIE0);                //запрещение прерывания таймера по совпадению
  TCCR0  =  0x08;                      //останавливаем таймер
  //============================================================
  //установка генерации прерывания по возрастающему фронту
  intFront = 1;
  GICR  &= ~(1<<INT0);                //запрещение прерывания на INT0
  MCUCR |= (1<<ISC01) | (1<<ISC00);   //генерация прерывания по нарастающему фронту сигнала на ножке 11 (INT0)
  GICR  |= (1<<INT0);                 //разрешение прерывания на INT0
  
}


void timer0_init(void)               //таймер на 5 мс
{
TCCR0 = 0x00;  //stop
TCNT0 = 0x00;  //set count
OCR0  = 0x24;  //set compare
TCCR0 = 0x08;  //пока остановлен
//TCCR0 = 0x0D; //start timer
}



void uart_pc_init(void)
{
   UCSRB = 0x00; //disable while setting baud rate
   UCSRA = 0x00;
   UCSRC = (1<<URSEL) | 0x06;
   UBRRL = 0x03; //set baud rate lo
   UBRRH = 0x00; //set baud rate hi
   UCSRB = 0x18; // !!!! после включения передатчика и начинаются все казусы
}


int main( void )
{
  __disable_interrupt();                //disable all interrupts
  DDRA |= (1<<PA0);                     //PortA0 as output
  timer0_init();
  void uart_pc_init(void)

  intFront = 0;                         //сигнал того что первоначально прерывание по спадающему фронту
  MCUCR |= (1<<ISC01);                  //генерация прерывания по спадающему фронту на ножке 11 (INT0)
  GICR  |= (1<<INT0);                   //разрешение внешнего прерывания
  __enable_interrupt();                 //разрешения всех прерываний
  
  while(1)
  {
  
  }

}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Александр Куличо...
сообщение Jul 1 2008, 17:53
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 256
Регистрация: 6-03-06
Из: Украина, г. Винница
Пользователь №: 15 017



Цитата
но все таки, разве это могло служить причиной того что таймер начал взводится через раз (раз в 10 мс), при добавление просто куска инициализации UART?


Нет, это не причина. Но для выяснения причины Вам не помешало бы описать, что вы хотите получить в конечном результате. И еще мне непонятно, что означает "таймер начал взводится через раз (раз в 10 мс)"? Увеличился период от запуска до останова таймера или же он стал запускаться в 2 раза реже?
Бегло проанализировав код и комментарии, могу сказать, что при отрицательной полярности импульса на INT0 таймер будет запускаться после каждого второго спада на INT0 (каждых 20мс) и через 5мс инвертировать порт РА0.
Если полярность импульса положительная, то таймер будет запускаться при каждом спаде на INT0 (т.е. каждых 10мс/100Гц). Но тогда не совсем понятно, зачем настраивать прерывание INT0 по фронту только для того, чтобы после поступления этого самого фронта перенастроить INT0 на спад сигнала?
Go to the top of the page
 
+Quote Post
covsh
сообщение Jul 1 2008, 19:32
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 7-04-05
Пользователь №: 3 947



Цитата(Александр Куличок @ Jul 1 2008, 21:53) *
Нет, это не причина. Но для выяснения причины Вам не помешало бы описать, что вы хотите получить в конечном результате.

на прикрепленном файле я нарисовал что должно быть. на вход контроллера подается ШИМ с периодом 10 мс. мне важны два момента: 5 мс после спадающего фронта и 160 мкс после возрастающего. в этим промежутки времени необходимо делать некоторые вычисления.
Цитата
И еще мне непонятно, что означает "таймер начал взводится через раз (раз в 10 мс)"? Увеличился период от запуска до останова таймера или же он стал запускаться в 2 раза реже?

у меня создалось такое ощущение, т.к. раньше каждый раз когда срабатывал таймер он инвертировал ножку порта, т.е. через каждые 5 мс. а после включения USART по осциллографу видно что ножда стола инвертироваться каждые 10 мс.
Цитата
Бегло проанализировав код и комментарии, могу сказать, что при отрицательной полярности импульса на INT0 таймер будет запускаться после каждого второго спада на INT0 (каждых 20мс) и через 5мс инвертировать порт РА0.

что-то я не могу понять, в моей задумке таймер должен срабатывать только при спадающем фронте
Цитата
Если полярность импульса положительная, то таймер будет запускаться при каждом спаде на INT0 (т.е. каждых 10мс/100Гц). Но тогда не совсем понятно, зачем настраивать прерывание INT0 по фронту только для того, чтобы после поступления этого самого фронта перенастроить INT0 на спад сигнала?

мне нужно знать где какой фронт у сигнала что бы запустить таймер (спадабщий фронт) и что бы проводить измерения (возрастающий фронт)

вообщем надеюсь по картинке все сразу станет понятно smile.gif
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- covsh   старанности в работе timer0, mega16   Jul 1 2008, 16:08
- - Александр Куличок   А что размещено по вектору передатчика UART? IMHO...   Jul 1 2008, 16:54
|- - covsh   Цитата(Александр Куличок @ Jul 1 2008, 20...   Jul 1 2008, 17:39
- - Александр Куличок   Цитатачто-то я не могу понять, в моей задумке тайм...   Jul 1 2008, 19:43
|- - covsh   Цитата(Александр Куличок @ Jul 1 2008, 23...   Jul 1 2008, 20:34
- - SasaVitebsk   На мой взгляд. 1) TCNT тоже надо обнулять, раз ты ...   Jul 1 2008, 20:01
- - Александр Куличок   Цитатаможет и дурацкий вопрос, но все же:что такое...   Jul 1 2008, 21:37
|- - covsh   Цитата(Александр Куличок @ Jul 2 2008, 01...   Jul 2 2008, 09:53
|- - _Pasha   Цитата(covsh @ Jul 2 2008, 12:53) да, при...   Jul 2 2008, 10:35
|- - covsh   Цитата(_Pasha @ Jul 2 2008, 14:35) Неправ...   Jul 3 2008, 17:08
|- - _Pasha   Цитата(covsh @ Jul 3 2008, 21:08) или я ч...   Jul 3 2008, 17:36
|- - Александр Куличок   Цитата(covsh @ Jul 3 2008, 20:08) а объяс...   Jul 3 2008, 17:39
|- - covsh   большое спасибо все, разобрался   Jul 3 2008, 19:13
- - defunct   Что-то я не понял зачем намудрено с переключением ...   Jul 2 2008, 15:45
- - Александр Куличок   ЦитатаЭдак Вы все выпавшие флаги прерывания очисти...   Jul 2 2008, 22:41


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 01:34
Рейтинг@Mail.ru


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