Глюканул AVR Studio 4.19

Обсуждаем контроллеры компании Atmel.
Ответить
Открыл глаза
Аватара пользователя
Сообщения: 47
Зарегистрирован: Вт авг 13, 2013 12:13:07

Сообщение mehanik_all »

Приветствую. Ничего не предвещало беды, и до сегодняшнего дня _delay_ms (V) работало как часы и не вызывало проблем, но сегодня этот кусок дерьма потребовал от меня "целочисленную константу". В чём прикол? Как исправить? Можно ли сбросить как-то все настройки программы на первоначальные? Поможет ли установка Atmel Studio 5/6/7?

Добавлено after 51 second:
Переустановка программы не помогла.
Реклама
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

А вы какую ему скормили?
Контактная информация:
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

mehanik_all писал(а):этот кусок дерьма
Хороший отзыв об инструменте :facepalm:
Зачем тогда пользуетесь ? Выкиньте на свалку его ...
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 47
Зарегистрирован: Вт авг 13, 2013 12:13:07

Сообщение mehanik_all »

[uquote="Alexeyslav",url="/forum/viewtopic.php?p=4083829#p4083829"]А вы какую ему скормили?[/uquote]
Спойлер

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

#define F_CPU 8000000UL // Я использую внутренний генератор 8 МГц

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

volatile uint8_t V=0;

volatile uint8_t int_adc=0;


ISR(ADC_vect)		//функция прерывания АЦП
{
V=ADCH;	//запись значения с вывода ADC старших 8-ми бит с учётом выравнивания ADCW влево (ADLAR=1)
}



int main(void){

	DDRD |= _BV (PD6)| _BV (PD5);		//установить как выход (установить 1)
	PORTD &=~ (_BV (PD6)| _BV (PD5));	//установить 0 на выводах

	DDRB |= _BV (PB5);		//установить как выход (установить 1)
	PORTB &=~ _BV (PB5);	//установить 0 на выводах

	

	//TIMSK0 |= _BV(TOIE0);	//разрешить прерывание по переполнению таймера Т0
	TCCR0A &=~ (_BV(WGM01)| _BV(WGM00));		//Режим работы
	TCCR0B &=~ _BV(WGM02);						//таймера Normal
	TCCR0B |= _BV(CS02)| _BV(CS00);		//предделитель таймера
	TCCR0B &=~ _BV(CS01);				//Т0 clk/1024
	TCCR0A &=~ _BV(COM0A1);		//Управление выводами OCn
	TCCR0A |= _BV(COM0A0);		//меняется на противоположное

	ACSR |= _BV (ACD);	//выключить компаратор

	ADMUX |= _BV (REFS1)| _BV (REFS0);	//источник опорного напряжения - внутренний 1,1В
	//ADMUX |= _BV (MUX1)| _BV (MUX0);	//входной канал MUX3...0
	ADMUX |= _BV (ADLAR);	//выравнивание результата преобразования - влево (для удобства 8 бит в регистре ADCH)
	ADCSRA |= _BV (ADEN);	//включить АЦП
	ADCSRA |= _BV (ADATE);	//выбор режима работы АЦП - по ADTS2...0
	ADCSRA |= _BV (ADIE);	//разрешить прерывание
	ADCSRA |= _BV (ADPS2)| _BV(ADPS0);	//выбор частоты преобразования - 250 кГц
	ADCSRB |= _BV (ADTS2);	//выбор источника сигнала для запуска преобразования - переполнение таймера Т0
			
	sei ();

	while(1){

	
	if (int_adc<20) int_adc++;
	else int_adc=0;

	if (int_adc>=0 && int_adc<=5)
        {
        ADMUX &=~ (_BV (MUX1)| _BV (MUX0));	//ADC0
        }
	if (int_adc>=6 && int_adc<=10)
        {
        ADMUX |= _BV (MUX0);				//ADC1
		ADMUX &=~ _BV (MUX1);
        }
	if (int_adc>=11 && int_adc<=15)
        {
		ADMUX &=~ _BV (MUX0);				//ADC2
        ADMUX |= _BV (MUX1);
        }
	if (int_adc>=16 && int_adc<=20)
        {
		ADMUX |= _BV (MUX0);				//ADC3
        ADMUX |= _BV (MUX1);
        }

	ADCSRA |= _BV (ADSC);	//запуск АЦП (запускается один раз)

	PORTB &=~ _BV (PB5);
	_delay_ms (V);
	PORTB |= _BV (PB5);
	_delay_ms (V);

	}
}
[uquote="Аlex",url="/forum/viewtopic.php?p=4083830#p4083830"]
mehanik_all писал(а):этот кусок дерьма
Хороший отзыв об инструменте :facepalm:
Зачем тогда пользуетесь ? Выкиньте на свалку его ...[/uquote]

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

Добавлено after 1 hour 17 minutes 14 seconds:
Откатил программу до версии 4.18. Пока полёт нормальный. Совет "выкинуть на свалку" помог :)))
Реклама
Эиком - электронные компоненты и радиодетали
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Вообще то 4.19 самая устойчивая версия студии...
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15589
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

А простая переустановка и не поможет.
Надо для начала и автоматическую деинсталяцию и удаление вручную остатков делать.
8)
Возможно на ПК еще какие-то варианты GCC были позднее установлены (из ардуинки к примеру или еще из чего) да прописались где-то... или диск... сбойнул...
:dont_know:
Реклама
Встал на лапы
Сообщения: 80
Зарегистрирован: Вс фев 21, 2021 13:01:40
Откуда: Прокопьевск

Сообщение Михаил_avr »

_delay_ms принимает только константу, туда нельзя писать переменную, если раньше работало то не должно было лучше напишите так

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

void delay(int v) 
{
while (v) 
{
_delay_ms(1);
V--;
} 
} 

И используйте функцию delay.

P. S.
Хотя если переменная не менялась то могло бы и работать
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков

Сообщение slav0n »

опять сказки какие-то рассказываете...
вот же прототип:

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

static inline void _delay_ms(double __ms) __attribute__((always_inline));
ohmycode!
primuss3.com
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 47
Зарегистрирован: Вт авг 13, 2013 12:13:07

Сообщение mehanik_all »

В общем поковырялся ещё пару часов. Снёс всё начисто. ОС Win7 64. Установил 4.19, WinAVR. В чистом виде всё это дело не компилит, хз почему, нужен AVR Toolchain. Это у всех так или только у меня? Ставлю его. И вот тут и зарыта собака, delay.h компилятор берёт из тулчейна, я его переименовал и закинул delay.h из WinAVR. Теперь код _delay_ms (V) работает как на 4.18, на который кстати у меня AVR Toolchain не требовался и на WinXP не установлен с 4.18. В чём прикол с этим AVR Toolchain не знаю, разбираться пока лень, если кто в курсе пишите.
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков

Сообщение slav0n »

да и кодик ТС не айс.
вот примерная конструкция перебора входов АЦП:

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

int_adc++;

if (int_adc == 20) {
    int_adc = 0;
    ADMUX &= ~(_BV(MUX1) | _BV(MUX0)); //ADC0
}
else
if (int_adc == 5 || int_adc == 10 || int_adc == 15) {
    ADMUX++;//next input
} 
ohmycode!
primuss3.com
Контактная информация:
Мучитель микросхем
Сообщения: 419
Зарегистрирован: Пт окт 28, 2011 16:01:18

Сообщение ~Dimon~ »

C:\Program Files (x86)\Atmel\AVR Tools\AVR Toolchain\avr\include\util\delay.h
Там есть описание поведения (у меня 4.18), судя по нему, использовать переменную можно, но...
Настоятельно рекомендуют передавать на вход константное выражение, которое может быть вычислено на этапе компиляции, и не отключать оптимизации.
В противном случае вы получите разжиревший бинарник и сильно (даже в разы) увеличенные задержки, из за арифметики с double в рантайме.
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков

Сообщение slav0n »

вообще-то все уже на таймерах и прерываниях сидят, а если очень нужны задержки, то кто-то давным-давно написал либу на асме без использования регистров.
лично я не помню уже где ее взял, но пользуюсь при необходимости
Вложения
wait.rar
(1.26 КБ) 130 скачиваний
ohmycode!
primuss3.com
Контактная информация:
Мучитель микросхем
Сообщения: 419
Зарегистрирован: Пт окт 28, 2011 16:01:18

Сообщение ~Dimon~ »

Это да, но ТС спрашивал про софтовую.
Еще можно точно отмерять задержки через АЦП, USART, TWI, SPI, если все таймеры заняты какой то другой работой.
Открыл глаза
Аватара пользователя
Сообщения: 47
Зарегистрирован: Вт авг 13, 2013 12:13:07

Сообщение mehanik_all »

[uquote="~Dimon~",url="/forum/viewtopic.php?p=4087551#p4087551"]вы получите разжиревший бинарник и сильно (даже в разы) увеличенные задержки, из за арифметики с double в рантайме.[/uquote]
Для небольшого кода это не особо важно, мне просто нужно было по быстрому проверить железо. Я написал небольшой хидер со своими функциями delay, на будущее. А по сути, как оказалось, виновата не студия, а используемые библиотеки. В 4.19 используется по умолчанию библиотека Toolchain, в 4.18 WinAVR, и у них разные delay.h. Можно в 4.19 в настройках проекта указать пути к WinAVR, и всё будет как в старых версиях студии. Думаю тему можно закрывать на этом.
Ответить

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