Модераторы: PILOT, ManiaK, Mazzi
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Частота прерываний, рассчёт и установка 
V
    Опции темы
Annuta
Дата 19.3.2007, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 3.10.2006
Где: Dubna

Репутация: нет
Всего: 1



Привет всем.! Только знакомлюсь с работой с контролерами и решила написать прогу которая бы устанавливала бы определённую частоту прерываний, ну например 20КГц. В хелпе вижу примерчик 
 
Код

/*
 * Timer 1 Interrupt Service Routine: executes every 100 clock cycles
 */

static unsigned long overflow_count = 0;

void timer1_ISR (void) interrupt 3 {
  overflow_count++;                 // Increment
}



void timer ()


  TMOD = (TMOD & 0x0F) | 0x10;       

  TH1 = 256 - 100;                 
  TL1 = TH1;
  ET1 = 1;                      
  TR1 = 1;                     
  EA  = 1;                

  while (1);
   
}


Этот пример устанавливает частоту прерываний в 10 КГЦ -- как мне его изменить.. как вообще рассчитать частоту прерываний..??? Делаю эту прогу - хочу посмотреть миандр на осциллографе... А на какой ножке будет сигнал...?? Буду очень признательна за подробный ответ и пример...  спасибо.


--------------------
Программист - это комбинация лени и логики !
PM MAIL   Вверх
Mazzi
Дата 19.3.2007, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



Если я правильно понял, этот контроллер какой-то из 51 контроллеров.  У большинства этих контроллеров на вход таймера подаётся частота кварца делённая на 12. Во время переполнения таймера происходит прерывание. 

Для расчёта времени между двумя прерываниями используем формулу:

    время_в_микросекундах = (1/(частота_кварца_в_мегагерцах/12))*(255 - значение_регистра_TH1)


В твоём коде  добавлю комментарии
/*
 * Timer 1 Interrupt Service Routine: executes every 100 clock cycles
 */

static unsigned long overflow_count = 0;

void timer1_ISR (void) interrupt 3 {
  overflow_count++;                 // Increment
}



void timer ()


  TMOD = (TMOD & 0x0F) | 0x10;       

  TH1 = 256 - 100;// таймер переполняется после 100 инкрементов, меняя это число можешь менять
// время которое будет выдерживать твой таймер
  TL1 = TH1;
  ET1 = 1;                      
  TR1 = 1;                     
  EA  = 1;                

  while (1);

Добавлено @ 18:43 


да, ещё, чтобы увидеть меандр на ножке измени код функции обслуживания прерывания



data  unsigned  char  my_timer = 0;// добавляем переменную счётчик


void timer1_ISR (void) interrupt 3 {

  overflow_count++;                 // Increment
  my_timer++;
  P1 = my_timer;
}



после этого на выходах порта P1 ты можешь наблюдать прямоугольные импульсы. Если контроллер в 40выводном DIP-корпусе то это выводы с 1 по 8, если в другом,то смотри даташит на контроллер.


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
Annuta
Дата 19.3.2007, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 3.10.2006
Где: Dubna

Репутация: нет
Всего: 1



... ОООГРОМНОЕ спасибо Mazzi,  за подробный ответ, я попробывала, но меандры не получила... к сожелению... написала так...
 
Код

static unsigned long overflow_count = 0;
data  unsigned  char  my_timer = 0;// äîáàâëÿåì ïåðåìåííóþ ñ÷¸ò÷èê

void timer1_ISR (void) interrupt 3 
{
  overflow_count++;  // Increment
  my_timer++;
  A2 = my_timer;
}

 void timer ()

  TMOD = (TMOD & 0x0F) | 0x20;         
  TH1 = 256 - 100;                 
  TL1 = TH1;
  ET1 = 1;                      
  TR1 = 1;                     
  EA  = 1;                
  
  while (1);        
}
. . . . . .  

 case USB_Timer:

    timer1_ISR;                                    
    EP6FIFOBUF[1] = USB_ANSWER_SUCCESS;                    

  break;


Может чё нить не правильно написала...гляньте опытным глазом....

Это сообщение отредактировал(а) Annuta - 20.3.2007, 10:51
--------------------
Программист - это комбинация лени и логики !
PM MAIL   Вверх
Metal_Heart
Дата 20.3.2007, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а почему бы и нет?
**


Профиль
Группа: Участник
Сообщений: 728
Регистрация: 31.3.2005
Где: Москва

Репутация: 1
Всего: 12



Annuta, а что-то хоть получила, или вообще ничего?

Добавлено @ 11:09 
Код

A2 = my_timer;


А2 - это порт?


--------------------
 не стыдно учиться, а стыдно не учиться 
PM ICQ   Вверх
Annuta
Дата 20.3.2007, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 3.10.2006
Где: Dubna

Репутация: нет
Всего: 1



Да ... там сигнал равен стабильно 1 ... и он не меняется... может надо осциллограф настроить по другому...???
или сделать такой вызов  ??? 
Код

 case USB_Timer:
    timer();
    timer1_ISR;                                     
    EP6FIFOBUF[1] = USB_ANSWER_SUCCESS;                     
  break;

вместо моего ???
У меня порт А  на нём вывод (ножка) A2 вот ...
.... 
 сама  нашла баг...  smile ....
надо было так писать
Код

 void timer ()


  TMOD = (TMOD & 0x0F) | 0x20;       // Óñòàíàâëèâàåì ðåæèì 16 áèò
  
  TH1 = 256 - 100;                 // ïåðåãðóæàåì TL1 
  TL1 = TH1;
  ET1 = 1;                      // ïðåðûâàíèå ðàâíî 1 
  TR1 = 1;                     // Çàïóñêàåì òàéìåð 1
  EA  = 1;                // Ãëîáàëüíîå Ðàçðåøåíèå Ïðåðûâàíèé
  
  while (1)
  {
    A2^=1;
  }        
}


.... спасибо всем за помощь  smile 

Это сообщение отредактировал(а) Annuta - 20.3.2007, 11:31
--------------------
Программист - это комбинация лени и логики !
PM MAIL   Вверх
Metal_Heart
Дата 20.3.2007, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а почему бы и нет?
**


Профиль
Группа: Участник
Сообщений: 728
Регистрация: 31.3.2005
Где: Москва

Репутация: 1
Всего: 12



сделай так:
Код

A2 = 1 & my_timer;


Добавлено @ 11:37 
Просто Mazzi своим кодом:
Код

 P1 = my_timer;
 
писал целый байт в 8-разрядный порт, в результате на младшем разряде порта ты бы могла видеть миандр наивысшей частоты...

а в твоем случае, как я понял, это лишь одна нога, поэтому надо бы "экранировать"  с помощью &1 (можно и с другим числом  smile  )

Добавлено @ 11:38 
Annuta, молодец!

Добавлено @ 11:39 
не забудь тему пометить как решенную  smile 


--------------------
 не стыдно учиться, а стыдно не учиться 
PM ICQ   Вверх
cardinal
Дата 20.3.2007, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 8
Всего: 99




 ! 
cardinal
Mazzi, пользуйтесь тегами "код"!



--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.0718 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.