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

 
 
> Простенькая программка измерения длительности импульса.
Зверюга
сообщение Aug 30 2008, 07:37
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 413
Регистрация: 15-12-06
Пользователь №: 23 563



Здравствуйте. Подкиньте пожалуйста примерчик на CodeVision для непрерывного измерения длительности импульса контроллером AVR.

Я так прикидываю, что нужно запускать по прерыванию с пина таймер, по следующему прерыванию останавливать, читать сколько натикало, сбрасывать и вновь запускать. Дискретность - максимально возможная для таймера в atmega32.

В интернете видел только готовые очень мудрые проекты, выдрать из которых суть сложновато, да и то для IAR и WinAVR.


Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Зверюга
сообщение Aug 31 2008, 17:46
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 413
Регистрация: 15-12-06
Пользователь №: 23 563



Подпаял резистор, конденсатор ненашел. Все равно ресетится, но уже со значением MCUCSR=0x01, то есть бит, означающий что на ресет подан низкий уровень равен нулю.

Вопрос: значит, ресет от помех все-таки был, сейчас помеха (0 на ресете) не вылазит - мне искать конденсатор? Проблема то вроде устранена.

ПРо ватчдог я соврал - сейчас проверяю включен он или выключен.


Так, если я правильно понял:

Цитата
Для того, чтобы включить сторожевой таймер, достаточно установить в 1 бит WDE -Watch Dog Enable.
А вот выключить так просто не получится - и сделано это для защиты от тех же сбоев... Для выключения надо проделать следующие действия:
Записать одновременно в WDE и WDTOE значения "1"
В течение 4-х тактов процессора записать "0" в WDE.


ТО выключить сторожевой таймер если он включен нужно так:
WDTCR=0x18;
WDTCR=0x10;


Делаю это. Происходит ресет со значением WDTCR=0, MCUCSR=1; То же и без принудительного выключения. Кстати, почему вы решили что он включен - по умолчанию он ведь выключен.
Что за бред....

BOD - если вы имеете ввиду фьюзы, то у меня BODEN=1.

Далее.....

Последовал совету:
Цитата
Следовательно, если в программе нужно определять режим сброса - то после анализа этих бит их просто нужно установить в "0". Тогда сброс по сторожевому таймеру можно будет определить по отсутствию "1" в вышеописанных битах.


Сделал так:
Код
void main(void)
{  

//WDTCR=0x18;      
//WDTCR=0x10;


lcd_init();
backcolor=black;
textcolor=yellow;

lcd_clr();        
fill_screen(black);          

lcd_setxy(20,20);
lcd_str_fl("MCUCSR=",f8x14, textcolor);
lcd_str_ram(MCUCSR,f8x14, textcolor);
lcd_setxy(20,40);
lcd_str_fl("WDTCR=",f8x14, textcolor);
lcd_str_ram(WDTCR,f8x14, textcolor);

MCUCSR=0x00;
delay_ms(3000);
INT_ON; это включение прерывания, установлено черех #define


    
}



В итоге на экран выводится
WDTCR=0,
MCUCSR=0;

Получается что сброс по сторожевому таймеру?

Убираю комментарии со строк WDTCR=0x18; WDTCR=0x10; (опять таки, если я правильно понял как отключить сторожа) - тот же эффект.
Go to the top of the page
 
+Quote Post
sKWO
сообщение Aug 31 2008, 18:53
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530



Цитата(Зверюга @ Aug 31 2008, 20:46) *
Получается что сброс по сторожевому таймеру?
Убираю комментарии со строк WDTCR=0x18; WDTCR=0x10; (опять таки, если я правильно понял как отключить сторожа) - тот же эффект.

детектор питания отключён, с ресетом Вы справились, правда это не защитит от наносекундных помех без
хорошей земли (разводки) и конденсатора.
Получается что сторожевой таймер у вас командовал парадом.
Ну и начинайте уже заниматься основной задачей. Вот как я планирую сделать тахометр:
Код
//Chip type: ATmega8535
//Chip clock 14,745600Mh
/*******************************************************************************
* Тахометр четырёхтактного двигателя. Импульсы подаются с прерывателя. За один
* оборот проходит два импульса. Для измерения частоты оборотов двигателя
* исспользуется таймер один. Он запущен в свободном режиме счёта. Предделитель
* тактовой выбран 64, т.о. тактовая таймера составляет 230,400 kHz. Для даного
* таймера разрешено два прерывания: по завату по спаду импульса и по переполнению.
* Для измерения периода следования входных импульсов с прерывателя исспользовано
* прерывание режима захвата. Т.о. производится измерение полупериода (два импульса
* за оборот).
* В прерывании захвата производится копирование состояние счётчика на момент прерывания
* из регистра захвата ICR1. Прерывание переполнение происходит каждые 0.25мс в котором
* происзводится обновление информации выводимой на ЖКИ.
*******************************************************************************
#include <inavr.h>
#include <ioavr.h>
#include <stdint.h>
#include <stdlib.h>
#define OborotiZaMinConst 6912000
/* Определение глобальных переменных*/
signed int CaptureTmp, CaptureOld;
signed int PPeriod;
div_t dtmp;
char str_tmp[6];

// Timer 1 overflow interrupt service routine
#pragma vector = TIMER1_OVF_vect
__interrupt void Timer1_overflow(void)
{
  //частное (quot) и остаток (rem)
/*div_t
typedef struct {
    int quot, rem;
    } div_t;
*/
char i;
signed int OborotiZaMin;
  
  str_tmp[5] = 0;  
  OborotiZaMin = (OborotiZaMinConst + (PPeriod >> 1)) / PPeriod;

  dtmp = div(OborotiZaMin, 10);
  str_tmp[4] = dtmp.rem + '0';  
  dtmp = div(dtmp.quot, 10);
  str_tmp[3] = dtmp.rem + '0';  
  dtmp = div(dtmp.quot, 10);
  str_tmp[2] = dtmp.rem + '0';  
  dtmp = div(dtmp.quot, 10);
  str_tmp[1] = dtmp.rem + '0';  
  str_tmp[0] = dtmp.quot + '0';  
// Гашение незначащих нулей
  for (i = 0; i < 4; ++i)
    if (str_tmp[i] == '0')
      str_tmp[i] = ' ';
    else
      break;



}
// Timer 1 input capture interrupt service routine
#pragma vector = TIMER1_CAPT_vect
__interrupt void Timer1_input_capture(void)
{
  CaptureTmp = ICR1;
  PPeriod = CaptureTmp - CaptureOld;
  CaptureOld = CaptureTmp;
}
void TimOneInit (void){
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 230,400 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: On
// Input Capture Interrupt: On
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x03;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
}
int main( void )
{
TimOneInit();
_enableinterupt();
  for(;;){
  }

}

В общем, код ещё на стадии разработки, но Вам для маленького направления пойдёт.


--------------------
нельзя недооценивать предсказуемость глупости
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Зверюга   Простенькая программка измерения длительности импульса.   Aug 30 2008, 07:37
- - rv3dll(lex)   Цитата(Зверюга @ Aug 30 2008, 11:37) Здра...   Aug 30 2008, 08:00
|- - sKWO   Цитата(rv3dll(lex) @ Aug 30 2008, 11...   Aug 30 2008, 08:30
- - Зверюга   бр.... оговорился... мне период и нужен. Не значю ...   Aug 30 2008, 12:00
|- - sKWO   запускайте таймер который имеет режим захвата во ф...   Aug 30 2008, 14:14
- - Зверюга   Господа, слишком непонятно и поверхностно... Ни ст...   Aug 30 2008, 15:29
|- - sKWO   Цитата(Зверюга @ Aug 30 2008, 18:29) Я во...   Aug 30 2008, 19:53
- - Зверюга   Боюсь Ваш метод мне не подойдет. Объясню: время не...   Aug 31 2008, 13:25
|- - sKWO   Вы глобально не разрешили прерывания. инициализаци...   Aug 31 2008, 13:57
- - Зверюга   ЦитатаЖКИ графический, успеет? четыре милисекунды ...   Aug 31 2008, 14:13
|- - sKWO   Цитата(Зверюга @ Aug 31 2008, 17:13) Проч...   Aug 31 2008, 14:31
- - Зверюга   Спасибо конечно, но вот разрешение прерываний не д...   Aug 31 2008, 14:53
|- - sKWO   Цитата(Зверюга @ Aug 31 2008, 17:53) ЭТО ...   Aug 31 2008, 15:18
- - Зверюга   ЦитатаКак у Вас организован внешний сброс? Чё к р...   Aug 31 2008, 15:20
|- - sKWO   Цитата(Зверюга @ Aug 31 2008, 18:20) К ре...   Aug 31 2008, 15:33
- - Зверюга   Вы по-моему опережаете события... Я не решил пробл...   Aug 31 2008, 19:06
|- - sKWO   Цитата(Зверюга @ Aug 31 2008, 22:06) Я вс...   Aug 31 2008, 19:23
- - Зверюга   ТАК, ПОХОЖЕ ГЛЮК ВСЕ ТАКИ СВЯЗАН С БИБЛИОТЕКОЙ ЖКИ...   Aug 31 2008, 19:39
|- - rezident   Цитата(Зверюга @ Sep 1 2008, 01:39) Госпо...   Aug 31 2008, 21:16
|- - sKWO   Цитата(Зверюга @ Aug 31 2008, 22:39) Code...   Sep 1 2008, 17:23
- - Зверюга   Вы не правы. Это наименее вероятная причина. Функц...   Sep 1 2008, 03:17
- - Cyber_RAT   замените для чистоты эксперимента функцию на асме ...   Sep 2 2008, 04:40
- - Зверюга   Цитатазамените для чистоты эксперимента функцию на...   Sep 2 2008, 05:20


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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 16:09
Рейтинг@Mail.ru


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