Всем доброго дня.
Перешел я полностью на AtmelStudio 6.2 и вот засада, мож я дурак, а может не я. Короче мне нужно дергать разные функции в программе через разные промежутки времени. Например одну раз в секунду, другую раз в 5 секунд, третью раз в минуту и т. д. Настроил таймер Т1 на прерывание по совпадению раз в секунду. Все работает, раз в секунду контроллер обрабатывает прерывание. Проверял, кидал байт в UART. Но вот затык. Если создать глобальную переменную и в прерывании писать в нее единицу, а ля флаг выставить,
то в основной функции main, если ее вставить в условие if или цикл, она не работает так как она всегда в нуле. Но это еще не все. Если перед if или циклом вывести значение переменной куда угодно, например в UART или просто в порт, то значение переменной хаотично меняется независимо не от прерывания, не от чего либо. Как будто она становится генератором случайных чисел. Что за бред. Два дня убил так и не понимаю что за косяк. Я упростил код до банальной работы только с прерыванием по таймеру.
Условие if(time) не выполняется, а вот это USART_STR("Interrupt"); в порт пишется.
Может я что-то не догоняю?????
Перешел я полностью на 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;
}
}
};
Может я что-то не догоняю?????
Я не волшебник, я только лечусь
