Перейти к содержанию
С Днём Победы! ×

Помогите с программированием микроконтроллера


Dimko1983
Перейти к решению Решено Алексей Еремеев,

Рекомендуемые сообщения

6 часов назад, v1ct0r сказал:

я попробую вам помочь

А можно спросить, а то может я чего не.

:unsure: Если вы решите полностью задачку за школьника, вы ему помогли или усугубили его невежество с уверенностью, что всего можно добиться даром и за чужой счёт?

Изменено пользователем valentinovich
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

38 минут назад, valentinovich сказал:

А можно спросить, а то может я чего не

Валентинович, мне слава богу 40 лет и я далеко не школьник. У всех нас есть специализация в разных сферах. Например я профессионал в сфере светового оборудования и всю свою жизнь посвятил этому. Но в каких-то сферах всегда, у любого человека есть пробелы. Или просто пелена. И тогда он обращается за помощью. Суть Ваших высказываний мне близка с одной стороны - я по такому принципу воспитываю дочь. Я не решаю ей задачи по математике, а беседую с ней, контролируя, чтобы мысли шли в правильном русле. Иногда (реально Иногда!) Приходится решать. Но это уже вопросы к системе образования. Так вот я о чем - помогать это не плохо. Если взрослый человек просит помощи- это не стыдно. Откликающимся людям -респект и уважуха. Но Вы почему то в данной ветке ни слова помощи не сказали, а только лишь картинками и постами демонстрировали сообществу свое отношение к тем, кто не так силён в микроэлектронике. И еще к тем вашим (наверное) коллегам, которые хотят и могут (!) помочь. Из всего, что Вы написали выделим что? Работаю за еду. И помощь школьникам. А сами то что предложили? Не можете помочь. Не хотите. А может не умеете - так Вас лично никто и не просит. Что ж Вы за других решаете и смешиваете с грязью желание откликнуться на просьбу?

В сообщениях, прикрепленных файлах, я (кмк) указал, что пытался сам решить вопрос. Не смог. Признаю. И только лишь поэтому пишу на форум. 
Огромное спасибо всем откликнувшимся! Был удивлен, когда увидел огонек у темы. Дискуссия жива. Все посты читаю. Пытаюсь, изучаю, читаю материал по теме, смотрю. Времени мало к сожалению. Движение не такое быстрое, как хотелось бы, Но хочу разобраться. 

Изменено пользователем Dimko1983
Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

50 минут назад, Dimko1983 сказал:

В сообщениях, прикрепленных файлах, я (кмк) указал, что пытался сам решить вопрос. Не смог. Признаю. 

Но хочу разобраться. 

Ну если Вы действительно написали этот код, то уже знакомы с прерываниями и написать код вызова прерывания по таймеру каждые 1мс для Вас не должно вызвать трудностей.
Покажите здесь этот код и поможем разобраться как его дописать для решения Вашей задачи.

1 час назад, Dimko1983 сказал:

А может не умеете

А  брать на слабо не стоит... результат может быть обратным.

Ссылка на комментарий
Поделиться на другие сайты

Особенности хранения литиевых аккумуляторов и батареек

Потеря емкости аккумулятора напрямую зависит от условий хранения и эксплуатации. При неправильном хранении даже самый лучший литиевый источник тока с превосходными характеристиками может не оправдать ожиданий. Технология, основанная на рекомендациях таких известных производителей литиевых источников тока, как компании FANSO и EVE Energy, поможет организовать правильный процесс хранения батареек и аккумуляторов. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

1 минуту назад, IMXO сказал:

Ну если Вы действительно написали этот код

Не писал. Не присваиваю чужих лавров. И в своем стартовом посте это указал! Убрал ненужное мне. Подредакировал - это да. Но автор не я. И я честно в этом признался. 
А на слабо не беру. Мне действительно от этого лучше не станет. Просто ответил по факту. 

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Ну и как тогда Вам помочь?
Ситуация примерно следующая: Вы просите помочь решить по математике квадратное уравнение и по ходу вопросов/ответов выясняется , что Вы не знаете сложения и таблицы умножения...:unsure:

Ссылка на комментарий
Поделиться на другие сайты

Задача очень проста, непонятно, почему народ гнёт пальцы и пытается воспитать из ТС выдающегося программиста :) .

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

#define F_CPU 8000000UL    // Работаем от внутреннего генератора 8МГц.
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
	//Настройка портов ввода вывода******************************************************************
	DDRB = 0b11111111;  // Настраиваем порт B на выход.
	DDRD &= ~(1 << 2);   // Настраиваем ножку порта PD2 на вход
	PORTD |= (1 << 2);   // Подтягиваем PD2 внутренним резистором к +5в.
	PORTB = 0x00;

	while (1)
	{
		// Первый диод
		PORTB = 0x01; // работает диод1
		_delay_ms(3000);
		PORTB = 0x00; // выкл

		while (!(PORTD & 0x04)){}; // Ждём, если чё, пока не отпущена кнопка
		_delay_ms(50);

		// Второй диод
		while (PORTD & 0x04){}; // Ждём, пока не нажата кнопка

		PORTB = 0x02; // работает диод2
		_delay_ms(1500);
		PORTB = 0x00;// выкл

		while (!(PORTD & 0x04)){}; // Ждём, пока не отпущена кнопка
		_delay_ms(50);

		// Третий диод
		while (PORTD & 0x04){}; // Ждём, пока не нажата кнопка

		PORTB = 0x04; // работает диод3
		_delay_ms(1500);
		PORTB = 0x00;// выкл

		while (!(PORTD & 0x04)){}; // Ждём, пока не отпущена кнопка
		_delay_ms(50);
  
  		while (PORTD & 0x04){}; // Ждём, пока не нажата кнопка
	}
}

 

Изменено пользователем Yurkin2015
Ссылка на комментарий
Поделиться на другие сайты

потому что код не соответствует хотелке...
 

Цитата

Требуется: 1) при включении загорается Первый диод на 3 секунды и гаснет. Микроконтроллер ждет нажатия кнопки.

 

Изменено пользователем IMXO
Ссылка на комментарий
Поделиться на другие сайты

выкладываю свой код

[code]
//!!!!!!!!!!!!!!!!!ВНИМАНИЕ!!!!!!!!!!!!!!!
//кнопка подключает низкий уровень - 0 вольт,на ненажатой кнопке присутствует "1"
//от встроенного "подтягивающего" резистора
//светодиоды подключены через ограничивающие резисторы к +5 вольт
//!!!ВНИМАНИЕ!!!  при использовании других пинов ввода/вывода
//подставлять нужные обозначения только в строках #define !!!!!!
//подавление дребезга контактов в некоторой мере решено через "delay",
//но желательно продублировать аппаратно, зашунтировав контакты емкостью

#define BUTTON1_PIN A1  // номер вывода кнопки равен A1

#define LED3_PIN 12     // номер вывода светодиода3 равен 12
#define LED2_PIN 11     // номер вывода светодиода2 равен 11
#define LED1_PIN 10     // номер вывода светодиода1 равен 10

boolean buttonState;      // состояние кнопки
boolean buttonPrevState;  // предыдущее состояние кнопки

int i = 0 ;

void setup() {
  pinMode(BUTTON1_PIN, INPUT_PULLUP);  // определяем вывод A1 (кнопка) как вход
  pinMode(LED1_PIN, OUTPUT);        // определяем вывод 10 (светодиод1) как выход
  pinMode(LED2_PIN, OUTPUT);        // определяем вывод 11 (светодиод2) как выход
  pinMode(LED3_PIN, OUTPUT);        // определяем вывод 12 (светодиод3) как выход

  digitalWrite(LED1_PIN, HIGH);
  digitalWrite(LED2_PIN, HIGH);
  digitalWrite(LED3_PIN, HIGH);

  digitalWrite(LED1_PIN, LOW);
  delay(3000);                     //зажигаем на 3 сек. 1 светодиод
  digitalWrite(LED1_PIN, HIGH);

  
}

void loop() {
 

metka3:

  buttonPrevState = buttonState;        // предыдущее состояние кнопки = текущему
  buttonState = digitalRead(BUTTON1_PIN); //записываем состояние кнопки в переменную buttonState
  delay(100); //задержка на дребезг контактов
  
  if (i == 0)
    goto metka0;

  if (i == 1)
    goto metka1;

  if (i == 2)
    goto metka2;


metka0:   //LED2

  if (  ( buttonState) == LOW  && (buttonPrevState)  == HIGH ) {
    // предыдущее состояние кнопки - отжата, а текущее - нажата
    
    digitalWrite(LED2_PIN, LOW);
    delay(1500);
    digitalWrite(LED2_PIN, HIGH);
    i = i + 1;
    goto metka3;
  }

metka1:  //LED3

  if (  ( buttonState) == LOW  && (buttonPrevState)  == HIGH ) {
    // предыдущее состояние кнопки - отжата, а текущее - нажата
    
    digitalWrite(LED3_PIN, LOW);
    delay(1500);
    digitalWrite(LED3_PIN, HIGH);
    i = i + 1;
    goto metka3;
  }

metka2:  //LED1

  if (  ( buttonState) == LOW  && (buttonPrevState)  == HIGH ) {
    // предыдущее состояние кнопки - отжата, а текущее - нажата
   
    digitalWrite(LED1_PIN, LOW);
    delay(3000);
    digitalWrite(LED1_PIN, HIGH);
    i = i + 1;
    goto metka3;
  }
  if (i >= 3)  i = 0;

}

[/code]

 

все гениальное просто. чем проще тем надежнее.

Ссылка на комментарий
Поделиться на другие сайты

38 minutes ago, IMXO said:

код не соответствует хотелке..

Ну, ладно. Всего делов-то передвинуть первую строчку цикла на последнее место.

Уже поправил, спасибо за замечание.

Ссылка на комментарий
Поделиться на другие сайты

3 часа назад, Dimko1983 сказал:

я профессионал в сфере светового оборудования и всю свою жизнь посвятил этому. Но в каких-то сферах всегда, у любого человека есть пробелы. Или просто пелена. И тогда он обращается за помощью

Сорри, вы обращаетесь не за помощью, а с просьбой что-то вам сделать (и уже похоже начинаете требовать :( ).

3 часа назад, Dimko1983 сказал:

мне слава богу 40 лет и я далеко не школьник

Тем более, странно, что вы не понимаете что есть что. Вам здесь никто ничего не должен, а я как преподаватель, категорически против кому-то и что-то давать в готовом виде. Помочь, да. Но вам уже сказали, что помочь вам можно при условии, что вы хоть чего-то освоили в программировании. Вы же, это ясно видно, что даже не понимаете, что вам тут советуют по поводу алгоритма программы. 

Т.е. по другому - (сугубо Имхо) или вы пытаетесь освоить что такое МК вообще и "с чем их едят", затем азы программирования и тогда вам помогут, или платите и вам сделают всё, что вы хотите.

Ссылка на комментарий
Поделиться на другие сайты

5 часов назад, IMXO сказал:

switch/case ни как?

не дорос еще

я далеко не программист и никогда им не был

так балуюсь иногда

поэтому, как могу - так и делаю

главное что работает согласно хотелке @Dimko1983

 

все гениальное просто. чем проще тем надежнее.

Ссылка на комментарий
Поделиться на другие сайты

8 часов назад, Yurkin2015 сказал:

Надо сделать код по-простому

 Все понятно , для не знатоков программирования . Кое-что из цифровой техники  только надо знать .

Ссылка на комментарий
Поделиться на другие сайты

  • Решение

по-простому


#define F_CPU 8000000UL    // Работаем от внутреннего генератора 8МГц

/* ------------------------------------------------------------------------- */

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

/* ------------------------------------------------------------------------- */

// раскомментировать если считать нажатие в момент отпускания
//#define PRESS_ON_FALL  1

#define LEDS_PORT      PORTB
#define LEDS_DDR       DDRB

#define LED_1_BIT      0
#define LED_2_BIT      1
#define LED_3_BIT      2

#define LED_1_ON       do { LEDS_PORT |= (1 << LED_1_BIT); } while (0)
#define LED_1_OFF      do { LEDS_PORT &= ~(1 << LED_1_BIT); } while (0)
#define LED_2_ON       do { LEDS_PORT |= (1 << LED_2_BIT); } while (0)
#define LED_2_OFF      do { LEDS_PORT &= ~(1 << LED_2_BIT); } while (0)
#define LED_3_ON       do { LEDS_PORT |= (1 << LED_3_BIT); } while (0)
#define LED_3_OFF      do { LEDS_PORT &= ~(1 << LED_3_BIT); } while (0)

#define LED_1_ON_TIME  3000
#define LED_2_ON_TIME  1500
#define LED_3_ON_TIME  1500

#define BUTTONS_PORT   PORTD
#define BUTTONS_DDR    DDRB
#define BUTTONS_PIN    PIND
#define BUTTON_1_BIT   2

#define BUTTON_1_GET() (!(BUTTONS_PIN & (1 << BUTTON_1_BIT)))

/* ------------------------------------------------------------------------- */

void button_wait_press(void)
{
  // убеждаемся что кнопка отжата
  while (BUTTON_1_GET()) asm("nop");

  // ждем пока кнопку нажмут и немного подержат (антидребезг)
  uint8_t check_counter = 0;
  while (1)
  {
    if (BUTTON_1_GET()) 
    {
      check_counter++;
    }
    else 
    {
      check_counter = 0;
    }
    _delay_us(100);
    if (check_counter > 100) break; 
  }

  // если нужно - ждем отпускания
  #ifdef PRESS_ON_FALL
  while (BUTTON_1_GET()) asm("nop");
  #endif
}

/* ------------------------------------------------------------------------- */

int main(void)
{

    // Настраиваем порт B (3 пина) на выход
    LEDS_DDR  |= (1 << LED_1_BIT) | (1 << LED_2_BIT) | (1 << LED_3_BIT);
    // гасим светодиоды 
    LED_1_OFF; LED_2_OFF; LED_3_OFF;

    // Настраиваем ножку порта PD2 на вход
    BUTTONS_DDR &= ~(1 << BUTTON_1_BIT);
    // Подтягиваем PD2 внутренним резистором к +5в
    BUTTONS_PORT |= (1 << BUTTON_1_BIT);


    while(1)
    {

      LED_1_ON; 
      _delay_ms(LED_1_ON_TIME);
      LED_1_OFF;
      button_wait_press();

      LED_2_ON; 
      _delay_ms(LED_2_ON_TIME);
      LED_2_OFF;
      button_wait_press();

      LED_3_ON; 
      _delay_ms(LED_3_ON_TIME);
      LED_3_OFF;
      button_wait_press();

    }

}

/* ------------------------------------------------------------------------- */

 

Ссылка на комментарий
Поделиться на другие сайты

23 часа назад, IMXO сказал:

switch/case ни как?

 

18 часов назад, v1ct0r сказал:

не дорос еще

я далеко не программист и никогда им не был

так балуюсь иногда

побаловался немного :) получилось, значит теперь уже дорос

[code]
//!!!!!!!!!!!!!!!!!ВНИМАНИЕ!!!!!!!!!!!!!!!
//кнопка подключает низкий уровень - 0 вольт,на ненажатой кнопке присутствует "1"
//от встроенного "подтягивающего" резистора
//светодиоды подключены через ограничивающие резисторы к +5 вольт
//!!!ВНИМАНИЕ!!!  при использовании других пинов ввода/вывода
//подставлять нужные обозначения только в строках #define !!!!!!
//подавление дребезга контактов в некоторой мере решено через "delay",
//но желательно продублировать аппаратно, зашунтировав контакты емкостью

#define BUTTON_PIN A1  // номер вывода кнопки равен A1

#define LED3_PIN 12     // номер вывода светодиода3 равен 12
#define LED2_PIN 11     // номер вывода светодиода2 равен 11
#define LED1_PIN 10     // номер вывода светодиода1 равен 10

boolean buttonState;      // состояние кнопки
boolean buttonPrevState;  // предыдущее состояние кнопки

int i;

void setup() {
  pinMode(BUTTON_PIN, INPUT_PULLUP); // определяем вывод A1 (кнопка) как вход
  pinMode(LED1_PIN, OUTPUT);        // определяем вывод 10 (светодиод1) как выход
  pinMode(LED2_PIN, OUTPUT);        // определяем вывод 11 (светодиод2) как выход
  pinMode(LED3_PIN, OUTPUT);        // определяем вывод 12 (светодиод3) как выход

  digitalWrite(LED2_PIN, HIGH);
  digitalWrite(LED3_PIN, HIGH);

  digitalWrite(LED1_PIN, LOW);
  delay(3000);                     //зажигаем на 3 сек. 1 светодиод
  digitalWrite(LED1_PIN, HIGH);

}

void loop() {

  buttonPrevState = buttonState;        // предыдущее состояние кнопки = текущему
  buttonState = digitalRead(BUTTON_PIN); //записываем состояние кнопки в переменную buttonState
  
  if (  ( buttonState) == LOW  && (buttonPrevState)  == HIGH ) {
    // предыдущее состояние кнопки - отжата, а текущее - нажата


    switch (i) {
      case 0: {
          digitalWrite(LED2_PIN, LOW);
          delay(1500);
          digitalWrite(LED2_PIN, HIGH);
          i++;
        }
        break;
      case 1: {
          digitalWrite(LED3_PIN, LOW);
          delay(1500);
          digitalWrite(LED3_PIN, HIGH);
          i++;
        }
        break;
      case 2: {
          digitalWrite(LED1_PIN, LOW);
          delay(3000);
          digitalWrite(LED1_PIN, HIGH);
          i = 0;
        }
        break;
      default:
        i = 0;
        break;
    }
  }
}
[/code]

PS      я вообще не знал как им пользоваться и зачем он нужен(switch/case), нужды не было

оказалось довольно удобно

так что благодарю за пинок :) 

Изменено пользователем v1ct0r

все гениальное просто. чем проще тем надежнее.

Ссылка на комментарий
Поделиться на другие сайты

Спасибо всем! Спасибо хейтерам за науку, спасибо Алексею за решение. Виктор, Спасибо! Ваш код тоже работает. Сравнил, сопоставил. На работающем примере понял как строить код программы, выяснил, чего не хватало мне для решения по алгоритму моему. Допилил. Работает. Есть еще чему учиться и вы мне многое дали. 
Вопрос номер два - есть ли возможность в Протеусе при трассировке печатной платы поменять цвет дорожки? Плата односторонняя. Мне с моим зрением очень бледно все. Прям лицом в монитор. 

Изменено пользователем Dimko1983
Добавить смысл
Ссылка на комментарий
Поделиться на другие сайты

14 часов назад, Dimko1983 сказал:

Вопрос номер два - есть ли возможность в Протеусе при трассировке печатной платы поменять цвет дорожки? 

View - Edit Layer colours (Ctrl+L) - Proteus8

Ссылка на комментарий
Поделиться на другие сайты

В 10.08.2023 в 19:05, Dimko1983 сказал:

Дано -Атмега, три светодиода (через резистор), одна кнопка.

Требуется: 1) при включении загорается Первый диод на 3 секунды и гаснет. Микроконтроллер ждет нажатия кнопки.

2) нажимаем на кнопку - загорается Второй диод на 1.5 секунды и гаснет. Ожидание следующего нажатия.

3) нажимаем на кнопку - загорается Третий диод на 1.5 секунды и гаснет. Ожидание следующего нажатия.

4) нажимаем на кнопку - Первый диод загорается на 3 секунды и гаснет. Таким образом цикл должен замкнуться и все повторится по алгоритму с начала. 

МК тактируется на частоте 1 МГц от внутреннего генератора. Задействованы выводы:

Первый светодиод - РВ0.

Второй светодиод - РВ1.

Третий светодиод - РВ2.

Кнопка - РD7. Кнопка замыкает вывод на GND.

 

Прошивка: mega8.hex

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...