Выполнение функции раз в секунду

Обсуждаем цифровые устройства...
Ответить
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 198
Зарегистрирован: Вт ноя 07, 2006 00:09:58
Откуда: Москва

Сообщение Gurvinok »

Всем доброго дня.
Перешел я полностью на AtmelStudio 6.2 и вот засада, мож я дурак, а может не я. Короче мне нужно дергать разные функции в программе через разные промежутки времени. Например одну раз в секунду, другую раз в 5 секунд, третью раз в минуту и т. д. Настроил таймер Т1 на прерывание по совпадению раз в секунду. Все работает, раз в секунду контроллер обрабатывает прерывание. Проверял, кидал байт в UART. Но вот затык. Если создать глобальную переменную и в прерывании писать в нее единицу, а ля флаг выставить,
то в основной функции main, если ее вставить в условие if или цикл, она не работает так как она всегда в нуле. Но это еще не все. Если перед if или циклом вывести значение переменной куда угодно, например в UART или просто в порт, то значение переменной хаотично меняется независимо не от прерывания, не от чего либо. Как будто она становится генератором случайных чисел. Что за бред. Два дня убил так и не понимаю что за косяк. Я упростил код до банальной работы только с прерыванием по таймеру.

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

#define F_CPU 3686400					// Частота кварца

#include <avr/io.h>
#include <avr/interrupt.h>
#include <mylib/usart.h>				// Функции приема/передачи байта

// Глобальные переменные

uint8_t counter;						// Счетчик буфера USART
uint8_t buf[50];						// Буфер USART
bool time=false;						// Переменная таймера



// Обработчики прерываний

ISR(TIMER1_COMPA_vect)			// Раз в секунду
{
	time = true;                // Поднимаем флаг
	USART_STR("Interrupt");
	TCNT1H=0x00;
	TCNT1L=0x00;
}

ISR(USART_RX_vect)			// По приходу данных в UDR
{
	buf[counter] = UDR;	// Читаем данные по приходу в USART и пихаем их в буфер
	counter++;
}



int main(void)
{

	// USART Инициализация
	// Параметры связи: 8 бит, 1 стоп-бит, Без проверки четности
	// USART RXD:       Включен
	// USART TXD:       Включен
	// USART Режим:     Асинхронный
	// USART Битрейт:   19200
	
	UCSRA = 0x00;		// Флаги
	UCSRB = 0x98;		// Прерывания, разрешение приема/передачи
	UCSRC = 0x86;		// Формат посылки
	UBRRH = 0x00;		// Скорость
	UBRRL = 0x0B;		// передачи
	
	// Таймер 1 А раз в 1 секунду
	
	TCCR1B = 0x03;		// Делитель на 64
	TCNT1H = 0x00;		// Счетчик
	TCNT1L = 0x00;
	OCR1AH = 0xE1;		// Кегистр сравнения
	OCR1AL = 0x00;
	
	TIMSK |= (1<<OCIE1A);
	
	sei();				// Разрешение прерываний
	

	while(1)
	{

		if(time)
		{
			USART_STR("TRUE");
			time = false;
		}

		
	}
};
Условие if(time) не выполняется, а вот это USART_STR("Interrupt"); в порт пишется.
Может я что-то не догоняю????? :dont_know:
Я не волшебник, я только лечусь
Контактная информация:
Реклама
Вымогатель припоя
Сообщения: 601
Зарегистрирован: Ср янв 06, 2010 10:01:46

Сообщение metan »

Насколько я знаю, можно попробовать так:
volatile bool time=false; // Переменная таймера
Реклама
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 198
Зарегистрирован: Вт ноя 07, 2006 00:09:58
Откуда: Москва

Сообщение Gurvinok »

СПАСИТЕЛЬ!!! ЗАРАБОТАЛО!!!
Я не волшебник, я только лечусь
Контактная информация:
Ответить

Вернуться в «Цифровая техника»