ATMega 8515, timer comparator

Обсуждаем контроллеры компании Atmel.
Ответить
ZhukV
Родился
Сообщения: 15
Зарегистрирован: Вс дек 08, 2013 21:15:53

ATMega 8515, timer comparator

Сообщение ZhukV »

Доброго времени суток всем.

Не могу понять, что происходит с ATMega 8515 при использовании таймера и компаратора.
Проблема заключается в том, что прерывание на векторе компаратора происходит только после первого переполнении таймера, то есть:

1. Проходит первый раз, не запуская прерывание
2. Перепполняется, устнавливается в 0
3. Далее все норм, прерывание срабатывает.

Среда разработки Atmel Studio. Проверяю в Proteus.

Исходный код:

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

#include <avr/io.h>
#include <avr/interrupt.h>

ISR (TIMER0_COMP_vect)
{
	PORTA ^= (1 << 0);
}

int main(void)
{
	// Configure PORT [A]
	DDRA = 0xFF;
	PORTA = 0x00;
	
	// Configure PORT [C]
	DDRC = 0xFF;
	PORTC = 0x00;

	// Configure timers
	OCR0 = 0b10000000;
	TCNT0 = 0x00;
	TCCR0 |= (1 << CS01) | (1 << CS02);
	TIMSK |= (1 << OCIE0);
	
	SREG |= (1 << 7);
	
	while(1)
	{
		PORTC = TCNT0;
	}
}
P.S. Простите, может вопрос глупый, учусь пока :)
Реклама
codenamehawk
Вымогатель припоя
Сообщения: 530
Зарегистрирован: Вт фев 09, 2010 17:52:26

Re: ATMega 8515, timer comparator

Сообщение codenamehawk »

Попробуйте так

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

#include <avr/io.h>
#include <avr/interrupt.h>

ISR (TIMER0_COMP_vect)
{
   PORTA ^= (1 << 0); 
}

int main(void)
{
   // Configure PORT [A]
   DDRA = 0xFF;
   PORTA = 0x00;

   // Configure PORT [C]
   DDRC = 0xFF;
   PORTC = 0x00;

   // Configure timers
   TCNT0 = 0x00;
   OCR0 = 0b10000000;
   TIMSK |= (1 << OCIE0);

   sei();
   TCCR0 |= (1 << CS00) | (1 << CS02); //Тут я поменял на работу от clk /1024 

   while(1)
   {
      PORTC = TCNT0;
   }
}
Остальные изменения найдете ?

"Это-ж надо было так ошибиться!...сказал ежик, слезая с кактуса."
Это я про то, как у вас с "Compare" получился "компаратор".

В принципе ваша программа рабочая, при условии, что вы не думаете о "Аналоговом компараторе".
Проблема заключается в том, что прерывание на векторе "сравнения" происходит только после первого переполнении таймера, то есть:

1. Проходит первый раз, не запуская прерывание
Тут вы ошибаетесь, оно происходит как положенно.
При отладке в "AVR Studio" все это хорошо видно.
Интересно как в протеусе вы увидели, что прерывание не происходит?
Реклама
ZhukV
Родился
Сообщения: 15
Зарегистрирован: Вс дек 08, 2013 21:15:53

Re: ATMega 8515, timer comparator

Сообщение ZhukV »

Большое спасибо за ответ.

Вижу в Протеусе я тем, что в теле основной программы, PORTC вывожу аналогично таймеру (PORTC = TCNT0), в результате, светодиодами я вижу текущее значение TCNT0

Нас сколько я вижу, то Вы поменяли TCCR0 на тактирование от внутреннего генератора, но, к сожалению, стоит задача тактирования от внешнего, в результате и были установлены биты 0b00000110 в регистр TCCR0; В Вашем же примере, Вы его устанавливаете 0b00000101

P.S. Пробывал, не помогло
P.S.S. Относительно ошибок в названиях систем, Вы уж простите, только начинаю изучать эти технологии...
codenamehawk
Вымогатель припоя
Сообщения: 530
Зарегистрирован: Вт фев 09, 2010 17:52:26

Re: ATMega 8515, timer comparator

Сообщение codenamehawk »

ZhukV писал(а): Нас сколько я вижу, то Вы поменяли TCCR0 на тактирование от внутреннего генератора, но, к сожалению, стоит задача тактирования от внешнего, в результате и были установлены биты 0b00000110 в регистр TCCR0; В Вашем же примере, Вы его устанавливаете 0b00000101
Эта замена только для удобства отладки в АВР студио, от этого правильность работы прерываний не изменится.

Раз студия показала правильную работу, то и в железе будет работать. (Если в железе будете использовать кнопку для тактирования, не забудьте про дребезг контактов.)

Тут протеус врет, проверьте в железе, я с таким сам сталкивался.
Реклама
Эиком - электронные компоненты и радиодетали
ZhukV
Родился
Сообщения: 15
Зарегистрирован: Вс дек 08, 2013 21:15:53

Re: ATMega 8515, timer comparator

Сообщение ZhukV »

Спасибо, вполне вероятно, что протеус врет. Сегодня же попробую на железе :)
Реклама
Ответить

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