Помогите с кодом.

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 4
Зарегистрирован: Сб окт 10, 2020 13:50:59

Сообщение Salih »

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

#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>


void pwm_settings()
{
	// PWM SETTINGS
	TCCR1A |= (1 << COM1A1)|(0 << COM1A0)
	|(1 << WGM11)|(1 << WGM10);
	TCCR1B |= (1 << WGM12)|(1 << WGM13)|(0 << CS12)|(1 << CS11)|(0 << CS10);
	TCNT1 = 0x00;
	ICR1 = 0xFF;
	OCR1A = 0x00;
};



int main(void)
{
	unsigned char d=0;
	DDRA &= ~((1<<PA0)|(1<<PA1));
	PORTA |=(1<<PA0)|(1<<PA1);	
	DDRD |=(1<<PD5);
	
	void pwm_settings();
	
	
			
			
	while(1)
	{
	   	   	
		if (0== (PINA&(1<<0)))
	   	{
		for(d=0; d<255; d++)
		    {
			OCR1A = d;
			_delay_ms(30);
		    }
		}
		if (0== (PINA&(1<<1)))
		{
		for(d=0; d>255; d--)
		    {
			OCR1A = d;
			_delay_ms(30);
		    }
		}
	}	
			
}
Добрый день. Помогите с кодом программа не работает.
Реклама
Собутыльник Кота
Сообщения: 2905
Зарегистрирован: Ср ноя 29, 2017 06:58:50

Сообщение BlackKilkennyCat »

Если запятую поставить после "Помогите", то вопрос становится более логичным, а ответ - очевидным.
Автор, ты бы хоть комментарии к коду написал, что и где хочешь получить. Глядишь, сам бы ошибку и нашёл.
И какой смысл писать PINA&(1<<0) и PINA&(1<<1) ?
Реклама
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

ТС. На будущее. Не нужно выкладывать простыню кода. Ваш вопрос на форумах подобных этому должен звучать так: типа народ, есть девайс, функционал такой то. Эта фича работает, эта нет. Или все не работает. Где я накосячил? Ну и самое. Если вы все проверили, книги, даташиты почитали. В программу до покраснения глаз смотрели. А не так, что при малейшем затруднении, побежали на форум.
Ваши простыни никому не интересны без описания. Поверьте.
Контактная информация:
Собутыльник Кота
Сообщения: 2905
Зарегистрирован: Ср ноя 29, 2017 06:58:50

Сообщение BlackKilkennyCat »

но я всё же подскажу: у циклов разные приращения счётчиков, разные условия проверки, но начальные значение одинаковы...
Последний раз редактировалось BlackKilkennyCat Сб окт 10, 2020 16:12:02, всего редактировалось 1 раз.
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Аватара пользователя
Сообщения: 118
Зарегистрирован: Вт апр 21, 2020 07:44:24
Откуда: Сумы, Украина

Сообщение Alek_von_German »

Спойлер

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

#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>


void pwm_settings()
{
	// PWM SETTINGS
	TCCR1A = (1 << COM1A1)|(0 << COM1A0)|(0 << WGM11)|(1 << WGM10);//
	TCCR1B = (1 << WGM12)|(0 << WGM13)|(0 << CS12)|(1 << CS11)|(0 << CS10);//
	TCNT1 = 0x00;
	
	OCR1A = 0x00;
};



int main(void)
{
	unsigned char d=0;
	DDRA &= ~((1<<PA0)|(1<<PA1));
	PORTA =(1<<PA0)|(1<<PA1);
	DDRD =(1<<PD5);
	
	pwm_settings();//
	sei();//
	
	
	
	while(1)
	{
		
		if (~PINA&(1<<0))//
		{
			
			for(; d<255;d++ )
			{
				
				OCR1A = d;
				_delay_ms(30);
			}
		}
		if (~PINA&(1<<1))//
		{
			
			for(; d>0; d--)
			{
				OCR1A = d;
				_delay_ms(30);
			}
		}
	}
	
}
Попробуй так... А вообще, хотелось бы изначально описание увидеть. И хорошо бы указать контроллер...
Хочется всё и сразу, а получаешь нихрена и постепенно...
Реклама
Родился
Сообщения: 4
Зарегистрирован: Сб окт 10, 2020 13:50:59

Сообщение Salih »

Я недавно начал работать на AVR. Использую контроллер atmega16. Хочу сделать ШИМ с регулировкой скважности сигнала. Кнопка на ноге PA0 уменьшает скважность а на PA1 увеличивает. Но программа не работает. Скорее всего у меня какая та ошибка в цикле.

Добавлено after 1 minute 22 seconds:
Работаю на Atmel Studio 7
Реклама
Собутыльник Кота
Сообщения: 2905
Зарегистрирован: Ср ноя 29, 2017 06:58:50

Сообщение BlackKilkennyCat »

Согласно коду кнопки не уменьшают и не увеличивают, а запускают постоянное увеличение от минимума до максимума с шагом 1, и наоборот, постоянное уменьшение. Формулируйте точнее.
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

Alek_von_German, "if (~PINA&(1<<0))//" - конечно с точки зрения C одно и тоже будет, но боюсь так компилятор сгенерит немного избыточного код для считывания и инверсии регистра.
"if (!(PINA & (1<<0)))" уж лучше так.

Salih, как написано у вас при разовом нажатии кнопки будет увеличивать заполнение до максимума. Аналогично было бы при уменьшении, если бы вы не ошиблись и не написали бы там "for(d=0; d>255; d--)". d никогда не может стать больше 255. Оно будет по кругу бесконечно меняться 0, 255, 254, 253,...
Встал на лапы
Аватара пользователя
Сообщения: 118
Зарегистрирован: Вт апр 21, 2020 07:44:24
Откуда: Сумы, Украина

Сообщение Alek_von_German »

Спойлер

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

if (!(PINA & (1<<0)))//
		{
				d++;
				OCR1A = d;
			    _delay_ms(30);
		
		}
		if (!(PINA & (1<<1)))//
		{
			    d--;
				OCR1A = d;
				_delay_ms(30);
			
		}
Разницы я не заметил ни при "!", ни при "~". Но может Вы и правы.
Последний раз редактировалось Alek_von_German Сб окт 10, 2020 19:41:15, всего редактировалось 1 раз.
Хочется всё и сразу, а получаешь нихрена и постепенно...
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

Alek_von_German, хотя нет, проверил, avr-gcc в данном случае с любой включенной оптимизацией генерит просто инструкцию sbic + переход.
Встал на лапы
Аватара пользователя
Сообщения: 118
Зарегистрирован: Вт апр 21, 2020 07:44:24
Откуда: Сумы, Украина

Сообщение Alek_von_German »

Можно еще так сделать:
Спойлер
while(1)
{
if (!(PINA & (1<<0)))//
{
while (OCR1A<255)
{
d++;
OCR1A = d;
_delay_ms(3);
}
}
if (!(PINA & (1<<1)))//
{
while (OCR1A>0)
{
d--;
OCR1A = d;
_delay_ms(3);
}
}
}
Хочется всё и сразу, а получаешь нихрена и постепенно...
Собутыльник Кота
Сообщения: 2905
Зарегистрирован: Ср ноя 29, 2017 06:58:50

Сообщение BlackKilkennyCat »

можно мильёном способов. ТС скопипастит и будет счастлив.
Родился
Сообщения: 4
Зарегистрирован: Сб окт 10, 2020 13:50:59

Сообщение Salih »

Не работает. На выводе PD5 тишина, при нажатии на кнопки. И на протеусе и на макетке протестил.
Встал на лапы
Аватара пользователя
Сообщения: 118
Зарегистрирован: Вт апр 21, 2020 07:44:24
Откуда: Сумы, Украина

Сообщение Alek_von_German »

Salih, всё потому, что таймер настроен не правильно, скорее всего. Я не особо вникал.
Спойлер

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

#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>


void pwm_settings()
{
	// PWM SETTINGS
	TCCR1A = (1 << COM1A1)|(0 << COM1A0)|(0 << WGM11)|(1 << WGM10);//
	TCCR1B = (1 << WGM12)|(0 << WGM13)|(0 << CS12)|(1 << CS11)|(0 << CS10);//
	TCNT1 = 0x00;
	
	OCR1A = 0x00;
};



int main(void)
{
	unsigned char d=0;
	DDRA &= ~((1<<PA0)|(1<<PA1));
	PORTA =(1<<PA0)|(1<<PA1);
	DDRD =(1<<PD5);
	
	pwm_settings();//
	sei();//
	
	
	
	while(1)
	{
		if (!(PINA & (1<<0)))//
		{
			while (OCR1A<255)
			{
				d++;
				OCR1A = d;
				_delay_ms(3);
			}
		}
		if (!(PINA & (1<<1)))//
		{
			while (OCR1A>0)
			{
				d--;
				OCR1A = d;
				_delay_ms(3);
			}
		}
	}
}
Вот это у меня работает.
Хочется всё и сразу, а получаешь нихрена и постепенно...
Родился
Сообщения: 4
Зарегистрирован: Сб окт 10, 2020 13:50:59

Сообщение Salih »

У меня было настроен таймер как FastPWM. А вы сделали ШИМ с коррекцией фазы и частоты по даташиту? А в чем разница между ними? И то и другое ШИМ.
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Сообщение NStorm »

В ДШ ведь написано, в чем разница. И графики состояний приведены. Посмотрите графики хотя бы для начала. Самое главное отличие - Fast PWM "крутит" только инкрементирует таймер. А другие режимы "вверх-вниз" считают.

Добавлено after 2 minutes 20 seconds:
Вот тут просто расписано различие режимов: http://easyelectronics.ru/avr-uchebnyj- ... -shim.html
Одно НО - написано "В этом режиме счетчик считает от нуля до 255", хотя для 16-битного таймера разрешение ШИМ конечно же может быть больше.
Ответить

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