Формирователь импульсов на Atmega328P. Помогите написать код

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 2
Зарегистрирован: Вт ноя 09, 2021 08:21:46

Сообщение 21111986 »

после трёх сигналов МК должен выдать один сигнал регулируемой длительности. сам я в программировании не сильно разбираюсь поэтому прошу помощи. регулировка длительности кнопками + и - которые подтягивают выводы на землю. отсчёт тактов на INT0,

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

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

#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
int i = 0;
unsigned char d = 100;
unsigned char c = 0;


void count()
{
	for (unsigned char c=0; c<d; c++)                  // тут собственно и проблема. пытался реализовать регулируемый цикл где каждый цикл будет  означать  задержку на некоторое время _delay_us
	{
		
		PORTB=(1<<5);
		_delay_us(1);
	
	}
		PORTB &= ~(1<<5);
	

}

int main(void)
{
	DDRB=0b11111111;
	PORTB=0b00000000;
	DDRC=0b0000000;
	PORTC=0b1111111;
	EICRA = 0b00000010;
	EIMSK = 0b00000001;
	sei();
	
	while (1)
	
	{
		if (PINC0 == 0)                                                // увеличение длительности импульса
		{
			d++;
			_delay_ms(10);
		}
		if (PINC1 == 0)                                                  // уменьшение длительности импульса
		{
			d--;
			_delay_ms(10);
		}
		
		
	}
}


ISR (INT0_vect)                                                 // отсчёт импульсов
{
	i++;
	if (i>=3)
	{
		count();          
		i=0;
	}
}

Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Переменные volatile.
Docendo discimus
Контактная информация:
Реклама
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение parovoZZ »

Глобальная переменная I должна быть volatile
Самсусамыч

Сообщение Самсусамыч »

[uquote="21111986",url="/forum/viewtopic.php?p=4118729#p4118729"]после трёх сигналов МК должен выдать один сигнал регулируемой длительности.[/uquote]
Чтобы написать нужный алгоритм, указанной информации маловато. Необходимо дополнительно знать:
• Что является источником входного сигнала (генератор (какая частота); контактная группа…)?
• Максимальная длительность выходного сигнала?
• Градация регулируемого выходного сигнала?
• Как Вы планируете визуализировать регулировку выходного сигнала?
• Дополнительные нюансы (если есть)?
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Это для реального устройства за деньги. А для курсача проканает.
Docendo discimus
Контактная информация:
Реклама
Опытный кот
Аватара пользователя
Сообщения: 760
Зарегистрирован: Сб окт 22, 2016 17:33:32
Откуда: кг

Сообщение Карбофос »

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

if (PINC0 == 0)                                                // увеличение длительности импульса
      {
         d++;
         _delay_ms(10);
      }
А чему у вас PINC0 равно?
Реклама
Родился
Сообщения: 2
Зарегистрирован: Вт ноя 09, 2021 08:21:46

Сообщение 21111986 »

Карбофос писал(а):

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

if (PINC0 == 0)                                                // увеличение длительности импульса
      {
         d++;
         _delay_ms(10);
      }
А чему у вас PINC0 равно?
если нажимаешь кнопку должен быть ноль. изначально на PORTC0 подаётся 5 вольт. PINC0 как я понимаю это для чтения напряжения на PORTC0
Опытный кот
Аватара пользователя
Сообщения: 760
Зарегистрирован: Сб окт 22, 2016 17:33:32
Откуда: кг

Сообщение Карбофос »

Вот так вот:

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

if (PINC0 == 0) 
не надо.

Надо вот так:

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

if(0 == (PINC & (1 << PINC0)))
Или так:

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

if(~PINC & (1 << PINC0))
или так:

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

if(0 == (PINC & _BV(PINC0)))
или так:

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

if(~PINC & _BV(PINC0))
или так:

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

if(bit_is_clear(PINC, PINC0))
Ответить

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