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

 
 
> Захват в ATMega64, Помогите новичку
Tomade
сообщение Jun 18 2008, 06:49
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 26-05-08
Пользователь №: 37 817



Помогите, пожалуйста, начинающему чайнику. Задача - сделать измеритель/индикатор скорости вращения двигателя постоянного тока (до 12 тысяч оборотов в минуту).
Для начала написал программу, которая анализирует наличие сигнала на ножке захвата ICP1 (PD4 контроллера ATMega 64L) и при его поступлении выводит на вывод PE2 импульс, который можно наблюдать на осциллографе симулятора VMLAB (это для изучения и отладки), инкрементирует текущее (произвольное) число и выводит это число на LCD cимулятора.
Что же получилось? После запуска программы около 2 секунд инициируется LCD (это нормально), на его экран выводится число 25. Затем в симуляторе подаётся импульс на PD4. По идее подпрограмма прерывания по захвату должна выработать импульс "отрицательной" полярности длительностью 5 мс, инкрементировать число 25 и вывести на экран LCD число 26. Однако происходит следующее:
после первой подачи импульса захвата на выводе PE2 генерируется импульс с задержкой около 2 сек, число 26 тоже появляется с такой же задержкой;
начиная со второго импульса захвата число 26 уже не инкрементируется, а выходные импульсы на PE2 продолжают генерироваться с такой же задержкой.
Вопросы: откуда такая задержка при подаче импульсов захвата? Почему число инкрементируется только один раз?

#include <mega64.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x1B ;PORTA
#endasm
#include <lcd.h>
#include<stdio.h>
#include<delay.h>

// LCD display buffer
char lcd_buffer[33];
unsigned int x = 0x00;

void __vivod_LCD(void) { //Функция вывода на ЖКИ
sprintf(lcd_buffer,"%i",x); //Запись в буфер ЖКИ
lcd_clear(); //Очистка экрана ЖКИ
lcd_puts(lcd_buffer); //Вывод на ЖКИ
}

// Timer 1 input capture interrupt service routine
interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
PORTE.2=0;
delay_ms(5);
PORTE.2=1;
x++;
__vivod_LCD ();
}
void main(void)
{
// Input/Output Ports initialization
PORTA=0x00;
DDRA=0x00;
PORTD=0xFF;
DDRD=0x00;
PORTE=0xFF;
DDRE=0x0FF;
// Timer/Counter 1 initialization
// Clock source: T1 pin Falling Edge
TCCR1A=0x00;
TCCR1B=0x81;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
OCR1CH=0x00;
OCR1CL=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x24;
ETIMSK=0x00;
// LCD module initialization
lcd_init(16);
x=25;
__vivod_LCD ();

#asm("sei")
while (1)
{
}
}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SasaVitebsk
сообщение Jun 18 2008, 10:54
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Чёто не понял вообще вашего алгоритма. И непонятно откуда у вас сигнал поступает.

Но одно совершенно ясно. 12000 об/мин - это 5мс на оборот. LCD - медленное устройство, ещё медленнее - глаз человека, поэтому нет смысла выводить на дисплей значения часто. К томуже дисплей может просто банально неуспевать обновлять картинку.

Алгоритм зависит от того, что вы планируете мерить. Можно считать обороты или мерить период. Во 2 случае у вас всегда будет мгновенное значение скорости высчитанное с точностью в зависимости от Fclk проца. В первом - прямое значение.

Для первого случая алгоритм примерно такой.
1) Задаём интервал отображения информации (прерывание от таймера 2 к примеру). Например 10 секунд. В этом прерывании выводим значение X*6 (значение числа импульсов за 10 сек *6 = число за 60 сек. Где Х - значение с таймера захвата. Обнуляем по прочтению
2) Инициализируем таймер захвата на счёт импульсов.

Можно сделать в прерывании только признак вывода инфы, а выводить в голове, по анализу признака.
Go to the top of the page
 
+Quote Post



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

 


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


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