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

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

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

Реакции никакой.
Проверил - именно на команды, связанные с таймером
:shock:

Добавлено after 33 minutes 11 seconds:
В ходе последних мучений выяснил, что проблема именно в передаче значения как входного параметра - даже с volatile не хочет считывать так, как мне это нужно
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь

Сообщение prinv »

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

Сообщение ARV »

An-SU писал(а):проблема именно в передаче значения как входного параметра - даже с volatile не хочет считывать так, как мне это нужно
чудеса, да и только!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

Сообщение prinv »

[uquote="ARV",url="/forum/viewtopic.php?p=3473415#p3473415"]чудеса, да и только![/uquote]
Вот в этом и есть косяк AVR - отладчик стоит неразумных денег.
Я после MSP430 и теперь на STM32 смотрю на эту проблему с недоумением.
Никакая контра не уйдёт от нас
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18682
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

[uquote="prinv",url="/forum/viewtopic.php?p=3473424#p3473424"]Я после MSP430 и теперь на STM32 смотрю на эту проблему с недоумением.[/uquote]вот только давайте без вот этого вот!
для AVR в том их понимании, как у большинства любителей, вообще нет необходимости в отладчиках! если не симулятор студии, то уж протеус точно покрывает все потребности разработчика. для особо гениальных, конечно, потребуется нечто большее - тогда пусть и платят. разбаловались отладчиками, даже наподумать сил не оставили...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

Сообщение prinv »

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

Сообщение ARV »

сейчас как раз тот случай, чтобы повыкидывать из кода лишние манипуляции с SREG, бесконечные cli()-sei(), повсеместные volatile, разобраться с алгоритмом управления таймером и сделать так, что бы заработало с пол-пинка. а отладчик тут окажет медвежью услугу.

Добавлено after 51 second:
хотя при желании можно воспользоваться симулятором студии или (для ШИМ-а предпочтительнее) протеусом.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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

prinv, а не подскажете, каким образом можно записать, чтобы регистр считывал величины переменных?

ARV, команды с SREG и cli()-sei() я брал из технического описания для микросхемы (отечественный аналог 128), где приводился следующий отрывок кода как правильный для изменения регистров таймера. volatile накидывал до кучи, пытаясь оживить программу, да
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18682
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

An-SU писал(а):отечественный аналог 128
чевой-чевой?! :shock: :shock: :shock:
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

Сообщение prinv »

[uquote="An-SU",url="/forum/viewtopic.php?p=3473447#p3473447"]prinv, а не подскажете, каким образом можно записать, чтобы регистр считывал величины переменных?[/uquote]

Имя_регистра = имя_переменной

Добавлено after 1 minute 5 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3473461#p3473461"]чевой-чевой?! :shock: :shock: :shock:[/uquote]
Вот тут тоже кофе поперхнулся. 1887ВЕ7Т, 1887ВЕ8Т используете?
An-Su, может покажете нам - что вы там делаете? :))
Никакая контра не уйдёт от нас
Контактная информация:
Открыл глаза
Сообщения: 72
Зарегистрирован: Пн окт 01, 2018 11:33:59

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

Не, просто в связи с более подробным описанием таймеров на русском читал методичку для 1887ВЕ7Т.
:)

"Имя_регистра = имя_переменной" - так в моем коде оно так и объявлялось...
Вымогатель припоя
Аватара пользователя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь

Сообщение prinv »

Да, просто вместо вызова функции присвойте значение регистру.

Добавлено after 8 hours 50 minutes 48 seconds:
Сделал на ATMega16A.
Не работало, пока я не сообразил, что в прерывании нужно обнулить счётчик.

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

#define F_CPU 8000000UL

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

uint16_t Sch = 10000;

ISR(TIMER1_COMPA_vect) /* Timer/Counter1 Compare Match A */
{
	PORTB ^= _BV(PB3);
	/* Не забываем обнулить счётчик!!! */
	TCNT1 = 0;
};

void ti_ini(uint16_t temp)
{
	// Инициализация Timer1 16bit
	TCCR1B = 0;			// Остановили таймер
	TCCR1A = 0;			// Обычный режим
	TCNT1 = 0;			// Начальное значение счётчика таймера
	OCR1A = temp;		// Значение сравнения
	TIMSK = _BV(OCIE1A);// Разрешаем прерывание при совпадении с А
	TCCR1B = _BV(CS11) | _BV(CS10); // Запуск таймера, предделитель CLK/64
}

int main(void)
{
	/* Светодиоды */
	DDRB = _BV(PB3);
	DDRD = _BV(PD7);

	/* Подтяжка вверх для кнопок */
	PORTC = _BV(PC1) | _BV(PC0);
	
	ti_ini(Sch);

	sei();
    while (1) 
	{

		if (!(PINC & _BV(PC0))) // нажата кнопка PC0
		{
			PORTD ^= _BV(PD7);
			Sch /= 2;
			ti_ini(Sch);
			_delay_ms(100);
			
		}
		if (!(PINC & _BV(PC1))) // нажата кнопка PC1
		{
			PORTD ^= _BV(PD7);
			Sch *= 2;
			ti_ini(Sch);
			_delay_ms(100);
		}

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

Сообщение ARV »

prinv писал(а):Не работало, пока я не сообразил, что в прерывании нужно обнулить счётчик
так вроде ж шла речь про режим СТС, или я опять все перепутал?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

Сообщение prinv »

И в режиме CTC тоже всё работает

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

ISR(TIMER1_COMPA_vect) /* Timer/Counter1 Compare Match A */
{
	PORTB ^= _BV(PB3);
};

void ti_ini(uint16_t temp)
{
	// Инициализация Timer1 16bit
	TCCR1B = 0;			// Остановили таймер
	TCCR1A = 0;			
	TCNT1 = 0;			// Начальное значение счётчика таймера
	OCR1A = temp;		// Значение сравнения
	TIMSK = _BV(OCIE1A);// Разрешаем прерывание при совпадении с А
	TCCR1B = _BV(WGM12) | _BV(CS11) | _BV(CS10); // Запуск таймера в режиме CTC, предделитель CLK/64
}
Добавлено after 11 minutes 32 seconds:
Работает и в случае простого присваивания OCR1A = Sch;

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

		if (!(PINC & _BV(PC0))) // нажата кнопка PC0
		{
			PORTD ^= _BV(PD7);
			Sch /= 2;
			OCR1A = Sch;
//			ti_ini(Sch);
			_delay_ms(100);
			
		}
		if (!(PINC & _BV(PC1))) // нажата кнопка PC1
		{
			PORTD ^= _BV(PD7);
			Sch *= 2;
			OCR1A = Sch;
// 			ti_ini(Sch);
			_delay_ms(100);
		}
В общем, проблему так и не получилось повторить
Никакая контра не уйдёт от нас
Контактная информация:
Открыл глаза
Сообщения: 72
Зарегистрирован: Пн окт 01, 2018 11:33:59

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

prinv, уважаемый, спасибо Вам огромное!
На самом деле код заработал у меня еще в пятницу, когда я поставил переназначение OCR сразу со входного параметра функции, а не путано, как у меня было (может, еще что изменил, но оно стало работать)

На данный момент имеется лишь проблема с тем, что изменение частоты при нажатии на кнопку происходит кратковременно, только во время нажатия, словно я использую while
Не подскажете..?
Вымогатель припоя
Аватара пользователя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь

Сообщение prinv »

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

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

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

#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 Sch;

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

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

static void TI_Write(unsigned int Sch)
{
 unsigned int sreg = SREG;
 cli();
 OCR1A=Sch;
SREG=sreg;
}

int main(void)
{
   cli();
   DDRC=0xFF;
   Sch=100; //в реале период / 2
   ti_in();
   sei();

    while (1)
    {
      if (!(PINE &= (1<<PE1)))
       TI_Write(300);

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

Сообщение ARV »

An-SU писал(а):static void TI_Write(unsigned int Sch)
{
 unsigned int sreg = SREG;
 cli();
 OCR1A=Sch;
SREG=sreg;
}
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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

ARV, ну удаление особой роли в данном случае не сыграет, повторюсь, я просто ориентировался на:
https://docplayer.ru/59393693-Mikroshem ... dl-to.html 124 страница сверху
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18682
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Ответить

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