ATtiny13 не входит в основной цикл while(1){}

Обсуждаем контроллеры компании Atmel.
Ответить
Аватара пользователя
Uragan90
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Ср окт 07, 2009 12:27:03
Откуда: Tver

ATtiny13 не входит в основной цикл while(1){}

Сообщение Uragan90 »

Доброго всем времени суток!!!
Суть проблемы такая:
Хочу посчитать импульсы на INT0 и по таймеру перекидывать PB3 если за время нескольких переполнений счётчика пришло определённое кол-во импульсов.
Если код пишу в самих прерываниях то всё работает, а вот если из основного цикла пытаюсь получать значения счётчиков то ничего не выходит! Прога компилируется, но в протеусе не работает!
Как же так, не пойму!!!! Помогите разобраться плиз

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

#define F_CPU 1200000UL    //Определяем тактовую частоту

#include <avr/io.h>
#include <avr/interrupt.h> //Заголовочный файл для работы с прерываниями
#include <util/delay.h>    //Место хранения _delay_us()

unsigned int i=0;
unsigned char count=0;

int main(void)
{
	cli();  //На время инициализации периферии, запрещаем все прерывания
	
/* Инициализации портов */
DDRB  = 0x7D; // = 0b00001101;
PORTB = 0x00; // = 0b00000000;

/* Инициализации внешнего прерывания INT0 */
GIMSK |= (1<<INT0);               // Разрешение прерываний INT0 на входе PB1
MCUCR |= (0<<ISC01) | (0<<ISC00); // при перепаде из 1 в 0

/* Инициализации таймера/счётчика */
TCCR0A  = 0x00;                          //Нормальная работа счётчика
TCNT0   = 139;
TIMSK0 |= 1<<TOIE0;                    // Разрешение прерываний по переполнению
TCCR0B |=(1<<CS02)|(1<<CS00);          //Делитель на clk/1024

	
	sei();  //Общее разрешение прерываний
 
	 
	while (1) {
		if (count==10)      //Если в прерывании таймера было 10 переполнений то...
		{
			if (i>=10)      //И поступало за это время 10 импульсов на INT0 то...
			{
				PORTB ^= 1<<PB3; //Сигнализируем пином порта PB3
				i=0;     //сбросим кол-во импульсов
				count=0; //Сбросим счётчик переполнений таймера
			}
		}
		
		
	}
}


/* Обработчик внешнего прерывания INT0 */
ISR(INT0_vect)  // Обработчик прерываний
{
	i++;
}

/* Обработчик прерывания таймера/счётчика */
ISR(TIM0_OVF_vect)
{
	TCNT0  = 139;  
    count++;
}
Я мог бы изменить весь Мир, но бог зажал исходники :(
Реклама
Аватара пользователя
rxstart1
Вымогатель припоя
Сообщения: 508
Зарегистрирован: Пт фев 22, 2013 18:00:43
Откуда: Беларусь, г. Гомель

Re: ATtiny13 не входит в основной цикл while(1){}

Сообщение rxstart1 »

Попробуй обработчики прерываний перед main() поставить и у тебя main ничего не возвращает правильнее написать void main (void)
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: ATtiny13 не входит в основной цикл while(1){}

Сообщение ARV »

не надо ничего пробовать, надо все делать правильно, только и всего!

в очередной 100500-й раз повторяю: переменные, которые используются и в обработчике прерываний и в каких-то иных местах программы обязательно должны объявляться volatile - это закон! в вашем коде таких переменных 2: это i и count
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Uragan90
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Ср окт 07, 2009 12:27:03
Откуда: Tver

Re: ATtiny13 не входит в основной цикл while(1){}

Сообщение Uragan90 »

rxstart1 писал(а):Попробуй обработчики прерываний перед main() поставить и у тебя main ничего не возвращает правильнее написать void main (void)
Попробовал и само собой ничего не изменилось!
Я мог бы изменить весь Мир, но бог зажал исходники :(
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Uragan90
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Ср окт 07, 2009 12:27:03
Откуда: Tver

Re: ATtiny13 не входит в основной цикл while(1){}

Сообщение Uragan90 »

ARV писал(а):не надо ничего пробовать, надо все делать правильно, только и всего!

в очередной 100500-й раз повторяю: переменные, которые используются и в обработчике прерываний и в каких-то иных местах программы обязательно должны объявляться volatile - это закон! в вашем коде таких переменных 2: это i и count
Огромаднейшее вам спасибо!!!!! ПОМОГЛО!!!!!!!!!! :beer:
Я мог бы изменить весь Мир, но бог зажал исходники :(
Реклама
Ответить

Вернуться в «AVR»