Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.04.2014, 14:13   #1
EvilHero
Пользователь
 
Регистрация: 19.11.2010
Сообщений: 12
По умолчанию Задержка в программе. прерывание.

Здравствуйте уважаемые программисты, помогите пожалуйста поправить программу. Суть в том, что я пишу программу для микроконтроллера atmega8 для измерения напряжения разомкнутой цепи (НРЦ) и замкнутой цепи (НЗЦ) батареи, используя внешний АЦП, подключенный через SPI, и выводу информации на 7-сегментый индикатор. Вначале измеряется НРЦ, далее, по нажатию кнопки подключается сопротивление при помощи полевого транзистора, в этот момент индикация должна прекратиться и возобновиться через 5 секунд, вывести на индикатор НЗЦ.

Основная проблема в том, что информация выводится постоянно с прерыванием основной программы по таймеру.

Код:
#include <iom8.h>
#include <util/delay.h>
#include <avr/io.h>
#include "lcd_lib.h"
#include "mcp3001.h"
#include <avr/interrupt.h>

#define F_CPU 4000000
//                  		    0    1    2    3    4    5    6    7    8    9 
const unsigned char codes[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

unsigned char data[4]={0x00,0x00,0x00,0x00};
unsigned char counter=0;

void pause (unsigned int a)	// подпрограмма паузы			
{ unsigned int i;

  for (i=a;i>0;i--)
   ;
}

void init_timer (void)
{
  TIMSK=(1<<TOIE0);							//Прерывание по переполнению таймера
  TCCR0=(0<<CS00)|(1<<CS01)|(0<<CS02);		
}

void convert_data (unsigned int x)			//конвертация получнного кода с ацп
{


unsigned int temp,res;
 temp=x;
 res=temp/1000;				//Пересчет 1000-х
 data[3]=codes[res]|0x80;
 temp=temp-res*1000;

 res=temp/100;				//Пересчет 100-х
 data[2]=codes[res];
 temp=temp-res*100;

 res=temp/10;				//Пересчет 10-х
 data[1]=codes[res];
 temp=temp-res*10;

 data[0]=codes[temp];		//Пересчет 1-х
}

ISR (TIMER0_OVF_vect)		//подпрограмма индикации, срабатывает по переполнению счетчика.
{
 PORTD=0xff;
 PORTC=_BV(counter);		//Выбор индикатора
 PORTD=~data[counter];		//Запись кода
 counter=(counter+1)%4;		//Переход к следующему индикатору

TCNT0=0x00;		//очистка таймера
}

int main()
{


SPI_MasterInit();
unsigned int adc=0;
DDRD=0xff;				
PORTD=0x00;
DDRC=0xff;
PORTC=0x0f;
pause(1000);			//пауза

init_timer(); 			//инициализация таймера

sei();					//разрешаем прерывание

while(1)
	{
	if ((PINB&0x01)==0x00)  //Если кнопка нажата
		{
		cli();                                 // запрещаем прерывание
		PORTB = 1<<6;			// подключаем сопротивление
		pause (50000);			// тут пауза не срабатывает, данные все равно отлылаются на индикатор
		adc=ReceiveADC()/0.25; // получение даных с ацп
		convert_data(adc);		// конвертация
		sei();	                          // разрешаем прерывание
		}
	if ((PINB&0x01)==0x01) 
		{
		PORTB = 0<<6;			// отключение сопротивления
		adc=ReceiveADC()/0.25;
		convert_data(adc);	
		}
	}
}
http://yadi.sk/d/tbwGLm7sMFPcX - ссылка на проекты в протеусе и в AVR Studio
Изображения
Тип файла: jpg Точечный рисунок.JPG (83.3 Кб, 98 просмотров)

Последний раз редактировалось EvilHero; 11.04.2014 в 14:41.
EvilHero вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задержка в программе в секундах как? FleXik Общие вопросы Delphi 4 24.01.2013 04:22
Задержка EXMP Visual C++ 4 19.05.2012 11:21
Задержка revanatar Общие вопросы C/C++ 3 30.10.2011 17:42
Задержка в программе на gtk abr_question Общие вопросы C/C++ 6 21.12.2009 23:54
Задержка JRcoker Общие вопросы Delphi 11 08.08.2008 00:38