AVR studio в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
An-SU
Открыл глаза
Сообщения: 72
Зарегистрирован: Пн окт 01, 2018 11:33:59

Re: AVR studio в вопросах и ответах

Сообщение An-SU »

ARV, вот только что в 100-й раз проверил :?

Если нужно подробно, то:
Рабочий:

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

#define F_CPU 8000000UL	//obyavleniye chastoty CPU mk
#include <avr/io.h>	//podklucheniye biblioteki mk
#include <avr/interrupt.h>	//podklucheniye biblioteki zaderjek
#include <util/delay.h>	//podklucheniye zaderjek
#include <stdio.h>


volatile unsigned int static Sch=0;

ISR(TIMER1_COMPA_vect)	//функция, выполняемая автоматически, при совпадении числел - счетчика и установленного значения
{
	PORTC=~PORTC;
}


int main(void)
{
	sei();
	DDRC=0xFF;

	Sch=1000; //в реале период / 2
	TCCR1B|=(1<<WGM12);	//бит режима работы таймера - по совпадению
	TIMSK|=(1<<OCIE1A);	
	TCCR1A|=0;	//регистр управления таймером/счетчиком
	TCNT1|=0;	//Регистр таймера/счетчика
	OCR1A=Sch;	//значение сравнения, до 16 бит
	TCCR1B|=(1<<CS12);	//установка делителя (=64, стр. 145)

    while (1) 
    {
		if (!(PINE &= (1<<PE4))) 
		{
			cli();
		}

		if (!(PINE &= (1<<PE3)))
		{
			sei();
		}
    }
}

Не рабочий:

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

#define F_CPU 8000000UL	//obyavleniye chastoty CPU mk
#include <avr/io.h>	//podklucheniye biblioteki mk
#include <avr/interrupt.h>	//podklucheniye biblioteki zaderjek
#include <util/delay.h>	//podklucheniye zaderjek
#include <stdio.h>


volatile unsigned int static Sch=0;

volatile void ti_ini (void)
{	
			Sch=1000; //в реале период / 2
			TCCR1B|=(1<<WGM12);	//бит режима работы таймера - по совпадению
			TIMSK|=(1<<OCIE1A);	
			TCCR1A|=0;	//регистр управления таймером/счетчиком
			TCNT1|=0;	//Регистр таймера/счетчика
			OCR1A=Sch;	//значение сравнения, до 16 бит
			TCCR1B|=(1<<CS12);	//установка делителя (=64, стр. 145)
}


ISR(TIMER1_COMPA_vect)	//функция, выполняемая автоматически, при совпадении числел - счетчика и установленного значения
{
	PORTC=~PORTC;
}


int main(void)
{
	sei();
	DDRC=0xFF;
	ti_ini();	//инициализация таймера

    while (1) 
    {
		if (!(PINE &= (1<<PE4))) 
		{
			cli();
		}

		if (!(PINE &= (1<<PE3)))
		{
			sei();
		}
    }
}
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: AVR studio в вопросах и ответах

Сообщение ARV »

попробовал собрать оба ваших кода. не считая варнинга компилятора на volatile void ti_ini(void), оба варианта отличаются ровно на 2 команды call и ret - для вызова функции, в остальном совпадают байт в байт. если описать функцию ti_ini, как положено static void ti_ini(void), то оба варианта дают 100% одинаковый код. оба варианта должны работать одинаково.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
An-SU
Открыл глаза
Сообщения: 72
Зарегистрирован: Пн окт 01, 2018 11:33:59

Re: AVR studio в вопросах и ответах

Сообщение An-SU »

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

Re: AVR studio в вопросах и ответах

Сообщение ARV »

у вас две абсолютно одинаковые программы, одна работает, другая нет - при чем тут отладочная плата?
проблема вероятнее всего в том, что вы ДУМАЕТЕ, будто есть связь между "выносом" в функцию и неработоспособностью программы, а на самом деле этой связи нет. например, думаете, что прошиваете, а на самом деле нет. или что-то аналогичное - досадное недоразумение.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
An-SU
Открыл глаза
Сообщения: 72
Зарегистрирован: Пн окт 01, 2018 11:33:59

Re: AVR studio в вопросах и ответах

Сообщение An-SU »

AVR, сейчас в ходе манипуляций программа стала идентично работать, если к вынесенной функции приписать модификатор static.
Но я не могу понять почему именно от него такой целебный эффект, ведь судя по его описанию он вообще не должен играть такой роли.

Добавлено after 3 minutes 46 seconds:
Хотя на разных сайтах разное описание этого модификатора, на одном как раз было с подходящим для меня смыслом.
Спасибо за ответы и надеюсь, каким-нибудь новичкам поможет моя кучка текста. :)
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: AVR studio в вопросах и ответах

Сообщение Аlex »

Помогла, скорее, не установка функции как static, а снятия с неё volatile.
Очень даже интересно, что Вы этим квалификатором пытались сделать ...
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: AVR studio в вопросах и ответах

Сообщение ARV »

при наличии static компилятор понимает, что данная функция никому больше не будет нужна, а в текущем файле она используется 1 раз, поэтому её код можно внедрить прямо в тело main - получается 100% тот же самый вариант, что и без функции вообще.
квалификатор volatile в определении функции - это явно лишнее, не ошибка, компилятор реагирует предупреждением, и игнорирует, получается обычный вызов функции, как если бы без static

в любом случае код получается одинаковый, и вести себя по-разному не может. проблема у вас в чем-то другом.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
An-SU
Открыл глаза
Сообщения: 72
Зарегистрирован: Пн окт 01, 2018 11:33:59

Re: AVR studio в вопросах и ответах

Сообщение An-SU »

Аlex, volatile я накинул недавно, перебирая разные варианты исправлений.

ARV, возможно... Но с ней работает. Я грешу пока на объявление таймера. Но вроде у меня всё же задано верно?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: AVR studio в вопросах и ответах

Сообщение ARV »

я не вникал в настройки таймера, но могу утверждать, что они ведут себя одинаково как в отдельной функции, так и без неё.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
An-SU
Открыл глаза
Сообщения: 72
Зарегистрирован: Пн окт 01, 2018 11:33:59

Re: AVR studio в вопросах и ответах

Сообщение An-SU »

Большое спасибо за ответы!
А не подскажите - почему при нажатии кнопки, которая по плану должна изменять частоту мерцания светодиода, этого не происходит?
Кнопка 3 замедляет мигание и кнопка 4 ускоряет, вызывая функцию TIM16_Write, в которой происходит изменение предела сравнения чисел в СТС.

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

#define F_CPU 8000000UL   //obyavleniye chastoty CPU mk
#include <avr/io.h>   //podklucheniye biblioteki mk
#include <avr/interrupt.h>   //podklucheniye biblioteki zaderjek
#include <util/delay.h>   //podklucheniye zaderjek
#include <stdio.h>

unsigned int static Sch=0;
unsigned int i=0;
unsigned char static sreg=0;
static void ti_ini (void)
{   
         Sch=1000; //Предел регистра сравнения чисел в СТС
         TCCR1B|=(1<<WGM12);   //бит режима работы таймера - по совпадению
         TIMSK|=(1<<OCIE1A);   //Разрешение прерывания по совпадению для канала
         TCCR1A|=0;   //регистр управления таймером/счетчиком
         TCNT1|=0;   //Регистр таймера/счетчика
         OCR1A=Sch;   //значение сравнения, до 16 бит
         TCCR1B|=(1<<CS12);   //установка делителя (=64, стр. 145)
}

ISR(TIMER1_COMPA_vect)   //функция, выполняемая автоматически, при совпадении числел - счетчика и установленного значения
{
   //Изменение состояния порта - "зажигание"/"гашение" светодиодов
   PORTC=~PORTC;
}

static void TIM16_Write(unsigned int i)

{
   //Изменение переменной, хранящей величину предела регистра сравнения
   Sch=i;
   // Запоминание состояния общего флага прерываний
   sreg = SREG;
   // Запрет прерываний
   cli();
   //Копирование значения в регистр сравнения
   OCR1A = Sch;
   // Восстановление состояния общего флага прерываний
   SREG = sreg;
}

int main(void)
{
   sei();
   DDRC=0xFF;
   ti_ini();   //инициализация таймера

    while (1)
    {
      //Ожидаемое учащение мигания светодиодов
      if (!(PINE &= (1<<PE4)))
      {
         TIM16_Write(Sch/2);
      }
      //Ожидаемое замедление скорости мигания светодиодов 
      if (!(PINE &= (1<<PE3)))
      {
         TIM16_Write(Sch*2);
      }
    }
}
Аватара пользователя
prinv
Вымогатель припоя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь
Контактная информация:

Re: AVR studio в вопросах и ответах

Сообщение prinv »

Попробуй убрать все манипуляции с cli и SREG

Добавлено after 1 minute 13 seconds:
И правильнее будет сначала инициализировать таймер, а потом уже разрешать прерывания.
Никакая контра не уйдёт от нас
An-SU
Открыл глаза
Сообщения: 72
Зарегистрирован: Пн окт 01, 2018 11:33:59

Re: AVR studio в вопросах и ответах

Сообщение An-SU »

prinv, спасибо, поставил разрешение после

А манипуляции те взяты из пособия по микросхеме, где правильным способом записи данных в регистры считали таковой. Но я убрал все подобные команды - ничего не изменилось. :(
Аватара пользователя
prinv
Вымогатель припоя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь
Контактная информация:

Re: AVR studio в вопросах и ответах

Сообщение prinv »

В ti_ini непонятно какие значения регистров, с которыми делается присвоение Логическое ИЛИ.

Добавлено after 2 minutes 33 seconds:
Я бы как-нибудь так записал

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

         Sch=1000; //Предел регистра сравнения чисел в СТС
         TCCR1B=0;
         TCCR1A=0;   //регистр управления таймером/счетчиком
         TCNT1=0;   //Регистр таймера/счетчика
         OCR1A=Sch;   //значение сравнения, до 16 бит
         TIMSK=(1<<OCIE1A);   //Разрешение прерывания по совпадению для канала
         TCCR1B=(1<<CS12) |   //установка делителя (=64, стр. 145)
                (1<<WGM12);   //бит режима работы таймера - по совпадению

Никакая контра не уйдёт от нас
An-SU
Открыл глаза
Сообщения: 72
Зарегистрирован: Пн окт 01, 2018 11:33:59

Re: AVR studio в вопросах и ответах

Сообщение An-SU »

prinv, пробовал и так, результат аналогичный.
Но у меня проблема с переназначением частоты таймера, а не его объявления...
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: AVR studio в вопросах и ответах

Сообщение akl »

Не скажу за все семейство AVR, но предделитель на 64 для многих AVR задается

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

        ; TCCR1B=(1<<CS12);   //установка делителя (=64, стр. 145) 
         TCCR1B=(0<<CS12)|(1<<CS11)|(1<<CS10);   //установка делителя 64
Аватара пользователя
prinv
Вымогатель припоя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь
Контактная информация:

Re: AVR studio в вопросах и ответах

Сообщение prinv »

Кстати, да
Какой МК используется? Атмега128?
Никакая контра не уйдёт от нас
An-SU
Открыл глаза
Сообщения: 72
Зарегистрирован: Пн окт 01, 2018 11:33:59

Re: AVR studio в вопросах и ответах

Сообщение An-SU »

Прошу прощения за задержку

akl, Вы имеете в виду обнуление остальных регистров в TCCR1B?

prinv, да, он

Добавлено after 28 minutes 53 seconds:
Как и думал, уточнение прочих CSn1 результатов не дало.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: AVR studio в вопросах и ответах

Сообщение akl »

Нет. Предделитель у Вас установлен на 256, а в комменте 64
СпойлерИзображение
Вложения
предделитель_m128.PNG
(50.6 КБ) 392 скачивания
An-SU
Открыл глаза
Сообщения: 72
Зарегистрирован: Пн окт 01, 2018 11:33:59

Re: AVR studio в вопросах и ответах

Сообщение An-SU »

akl, а, прошу прощения, что ввел в заблуждение, он и должен быть 256, я просто не стер старое пояснение

Но тем не менее, это на переназначение частоты мигания не влияет :(
Аватара пользователя
prinv
Вымогатель припоя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь
Контактная информация:

Re: AVR studio в вопросах и ответах

Сообщение prinv »

А при нажатии на кнопку TIM16_Write вообще вызывается?
Никакая контра не уйдёт от нас
Ответить

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