Страница 1 из 1
Помогите с кодом.
Добавлено: Сб окт 10, 2020 14:01:13
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);
}
}
}
}
Добрый день. Помогите с кодом программа не работает.
Re: Помогите с кодом.
Добавлено: Сб окт 10, 2020 15:55:42
BlackKilkennyCat
Если запятую поставить после "Помогите", то вопрос становится более логичным, а ответ - очевидным.
Автор, ты бы хоть комментарии к коду написал, что и где хочешь получить. Глядишь, сам бы ошибку и нашёл.
И какой смысл писать PINA&(1<<0) и PINA&(1<<1) ?
Re: Помогите с кодом.
Добавлено: Сб окт 10, 2020 16:04:42
Demiurg
ТС. На будущее. Не нужно выкладывать простыню кода. Ваш вопрос на форумах подобных этому должен звучать так: типа народ, есть девайс, функционал такой то. Эта фича работает, эта нет. Или все не работает. Где я накосячил? Ну и самое. Если вы все проверили, книги, даташиты почитали. В программу до покраснения глаз смотрели. А не так, что при малейшем затруднении, побежали на форум.
Ваши простыни никому не интересны без описания. Поверьте.
Re: Помогите с кодом.
Добавлено: Сб окт 10, 2020 16:10:28
BlackKilkennyCat
но я всё же подскажу: у циклов разные приращения счётчиков, разные условия проверки, но начальные значение одинаковы...
Re: Помогите с кодом.
Добавлено: Сб окт 10, 2020 16:10:54
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);
}
}
}
}
Попробуй так... А вообще, хотелось бы изначально описание увидеть. И хорошо бы указать контроллер...
Re: Помогите с кодом.
Добавлено: Сб окт 10, 2020 16:47:32
Salih
Я недавно начал работать на AVR. Использую контроллер atmega16. Хочу сделать ШИМ с регулировкой скважности сигнала. Кнопка на ноге PA0 уменьшает скважность а на PA1 увеличивает. Но программа не работает. Скорее всего у меня какая та ошибка в цикле.
Добавлено after 1 minute 22 seconds:
Работаю на Atmel Studio 7
Re: Помогите с кодом.
Добавлено: Сб окт 10, 2020 17:33:41
BlackKilkennyCat
Согласно коду кнопки не уменьшают и не увеличивают, а запускают постоянное увеличение от минимума до максимума с шагом 1, и наоборот, постоянное уменьшение. Формулируйте точнее.
Re: Помогите с кодом.
Добавлено: Сб окт 10, 2020 18:09:50
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,...
Re: Помогите с кодом.
Добавлено: Сб окт 10, 2020 18:59:01
Alek_von_German
Спойлер
Код: Выделить всё
if (!(PINA & (1<<0)))//
{
d++;
OCR1A = d;
_delay_ms(30);
}
if (!(PINA & (1<<1)))//
{
d--;
OCR1A = d;
_delay_ms(30);
}
Разницы я не заметил ни при "!", ни при "~". Но может Вы и правы.
Re: Помогите с кодом.
Добавлено: Сб окт 10, 2020 19:35:29
NStorm
Alek_von_German, хотя нет, проверил, avr-gcc в данном случае с любой включенной оптимизацией генерит просто инструкцию sbic + переход.
Re: Помогите с кодом.
Добавлено: Сб окт 10, 2020 19:56:28
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);
}
}
}
Re: Помогите с кодом.
Добавлено: Сб окт 10, 2020 19:58:24
BlackKilkennyCat
можно мильёном способов. ТС скопипастит и будет счастлив.
Re: Помогите с кодом.
Добавлено: Пн окт 12, 2020 14:28:08
Salih
Не работает. На выводе PD5 тишина, при нажатии на кнопки. И на протеусе и на макетке протестил.
Re: Помогите с кодом.
Добавлено: Пн окт 12, 2020 21:09:03
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);
}
}
}
}
Вот это у меня работает.
Re: Помогите с кодом.
Добавлено: Вт окт 13, 2020 09:45:03
Salih
У меня было настроен таймер как FastPWM. А вы сделали ШИМ с коррекцией фазы и частоты по даташиту? А в чем разница между ними? И то и другое ШИМ.
Re: Помогите с кодом.
Добавлено: Вт окт 13, 2020 09:58:43
NStorm
В ДШ ведь написано, в чем разница. И графики состояний приведены. Посмотрите графики хотя бы для начала. Самое главное отличие - Fast PWM "крутит" только инкрементирует таймер. А другие режимы "вверх-вниз" считают.
Добавлено after 2 minutes 20 seconds:
Вот тут просто расписано различие режимов:
http://easyelectronics.ru/avr-uchebnyj- ... -shim.html
Одно НО - написано "В этом режиме счетчик считает от нуля до 255", хотя для 16-битного таймера разрешение ШИМ конечно же может быть больше.