Страница 1 из 1

Первая программа "Тахометр"

Добавлено: Чт фев 21, 2008 01:24:43
knyaz*
Вот написал первую программу оцените...
Вопрос перед заливкой и сборкой цепи хочу поинтересоватся какие могут быть ошибки в программе...

Код: Выделить всё

//Version 1.0.1
//Частота кварцевого резонатора 32,768 Hz
#include<avr>		
#include<avr>
int temp;	//Переменная для хранения числа импульсов
int cat[3];	//В массив записываются разряды
		//Для вывода на сегмент
char segments[] = { 0x7e, 0xc, 0xb6, 0x9e, 0xcc, 0xda, 0xfa,
                    0xe, 0xfe, 0xde };	
//Прерывание на входе INT0
ISR(SIG_INTERRUPT0)
{
	temp++;		//Счет импульсов при каждом импулсе добавит 1
}
//Прерывание при переполнении T/C0
ISR(SIG_OVERFLOW0)
{
	TCNT0=0x80;	//Записываем 128 для того что бы прерывание
			//происходило каждую секунду
	temp=temp*6;	//Число прешедших на вход импульсов
			//умножаем на 6
	cat[0]=temp%10;	//Делим на 10 остаток в масив 1-разряд
	temp=temp/10;	//Оставляем 2 разряда 
	cat[1]=temp%10;	//Делим на 10 остаток в масив 2-разряд
	cat[2]=temp/10;	//Делим на 10 целое число в масив 3-разряд
	temp=0;		//Обнуляем счетчик импульсов
}
int main(void)
{
DDRB=0xFE;	//Конфигурация порта В 11111110
DDRD=0x07;	//Конфигурация порта D 00000111
GIMSK=0x40;	//Внешнее прерывание на входе INT0 активно
MCUCR=0x0B;	//Прерывание на входе INT0 по возрастаюшему фронту
TCCR0B=0x04;	//Частота тактов делится на 256
TIFR=0x00;	//Сбрасываем флаги прерываний от T/C0
TIMSK=0x02;	//Прерывание при переполнении T/C0
TCNT0=0x80;	//Записываем 128 для того что бы прерывание
		//происходило каждую секунду
ACSR=0x80;	//Выключение аналогово компаратора
sei();		//Глобальное разрешение прерываний
while(1){
PORTD=0x01;		//Зажигаем первый разряд
PORTB=segments[cat[0]];	//Зажигаем элементы разряда
PORTD=0x02;		//зажигаем второй разряд
PORTB=segments[cat[1]];	//Зажигаем элементы разряда
PORTD=0x04;		//Зажигаем тертий разряд
PORTB=segments[cat[2]];	//Зажигаем элементы разряда
};
}
:))

Добавлено: Чт фев 21, 2008 11:53:22
Reboot_s
Я не знаю, но по моему( а может и нет) выложу общее мнение.
А хрен (огородний овощ 8) ) его знает!
Все ошибки обычно выявляются при симулировании процеса или на макетке, а потом устраняются.
Сомневаюсь, что кто-то будет сидеть считать, что у вас на выводах порта и куда оно подается. Если нет грубых ошибок налицо, врятли кто-то найдет другие. Причем кода выкладываете текст программы, удосуживайтесь выкладывать хотя бы принципиальную схему устройства или описание его работы.

Добавлено: Чт фев 21, 2008 14:01:48
Сэр Мурр
Подобные листинги программ надо оформлять в виде приложения к сообщению- для экономии трафика при просмотре и скорости загрузки страницы. Кому интересно- тот откроет приложение и посмотрит.

Добавлено: Чт фев 21, 2008 22:20:02
ua9ssa
Выложи полный исходник программы...

Добавлено: Чт фев 21, 2008 23:10:05
knyaz*
схема
Изображение
Исходники[b/]
http://webfile.ru/1759665

Правдо еще плату саму не собирал/
Но при отладке в avrstudio неплохие результаты программа показала///
Кстати ктонибудь может дать ссылу на какойнить учебник по VMLAB///
Буду очень благодарен! :))

Добавлено: Пт фев 22, 2008 12:27:03
СанСаныч
А я делал по другому, измерял не число импульсов, а период
между импульсами. После внешнего прерывания необходимо
запретить на время примерно 0.002с реакцию на внешние прерывания, чтобы не ловить помехи от системы зажигания.

Добавлено: Пн фев 25, 2008 16:14:27
knyaz*
Как можно избавится от мерцания сегментов/// задержки мало помогают///

Добавлено: Сб май 03, 2008 16:23:03
Krik99
Если можно, поделитесь куском кода под CodeVision AVR , который измеряет количество оборотов для тахометра, а остальной код, ну там вывод на LED у меня есть. За ранние спасибо. :)