Продолжаю мучать ARM...

Вчера/сегодня разобрался с семисегментными индикаторами (пока только на 1 разряд), энкодером и пьезопищалкой.



Энкодер по-началу отказывался работать: пропускал шаги или наоборот отсчитывал лишние. Решилось корректировкой алгоритма (тот, что был в статье Ди так и не заработал — написал по-своему) и кондерами по 1мкФ для подавления дребезга.

Есть у меня один вопрос к тем, кто работает с дискавери:
После выхода из режима отладки, дискавери подвисает и возвращает её к жизни только очередной запуск по F5 из режима отладки. Я конечно не против, но хотелось-бы иметь возможность запустить прогу, сразу после заливки в МК. Без входа в отладочный режим.
(Все вышесказаное относится к Keil uVision4)

— UPD — Исходники, специально для Риты :)

Все сделано на базе Demo проекта, поэтому в проекте куча ненужных файлов.

Вот основной цикл:
while(1) //Бесконечный цикл..
  {
   if ((GPIOC->IDR & GPIO_IDR_IDR4) == 0) //Если один из каналов энкодера прижат к земле..
    if (Enc_state != 0)					  //а до этого он был на +3
 	{
	 if ((GPIOC->IDR & GPIO_IDR_IDR5) == 0)	// Если второй канал при этом на земле..
	  {
	   if (count < 9)		   //Если счетчик < 9
	   {
	    count++;			   //То инкрементируем
	   }
	   else					   //Если счетчик уперся в верхнюю границу, то
	   {
		SoundEnabled = 1;	   //Врубаем пищалку...
		SoftTimers[0] = 250;   //на 250 мсек.
	   }
	  }
	  else					  // Если второй канал энкодера на +3
	  {
	    if (count > 0)	 	  //Если счетчик > 0
	    {
	     count--;		 	  //Декрементим его..
	    }
	    else				  //Если уперся в нижнюю границу (т.е. = 0)
	    {
	   	SoundEnabled = 1;	  //Врубаем пищалку...
	    SoftTimers[0] = 250;  //на 250 мсек.
	    }
	  }
	}
   Enc_state = GPIOC->IDR & GPIO_IDR_IDR4; //Обновляем Enc State - предыдушее состояние 1го канала.
   Delay(1); //Антидребезговая тупилка.
  }
}


А это прерывание от системного таймера. Происходит раз в миллисекунду:

/*
Сие вызывается каждую мс.
Прерывание от системного таймера (или как-там эта штука называется??)
*/
void TimingDelay_Decrement(void)
{

  GPIOA->ODR = Numbers[count];	//Обновляем содержимое индикатора.
  //Было-бы круто вынести в обработчик софтового таймера, а то каждую мс обновлять индикатор это не гуд...

  //Софтверные таймеры. Их десяток. Обрабатываются просто: если не=0, то декремент.
  for (tmp_dword = 0; tmp_dword < 10; tmp_dword++)
  {
   if (SoftTimers[tmp_dword] != 0)
    {
	 SoftTimers[tmp_dword]--;
    }
  }

  //Если нулевой таймер сдулся, то выключаем звук.
  if (SoftTimers[0] == 0) SoundEnabled = 0;

  //Если звук включен, то инвертим пин C0.
  if (SoundEnabled != 0) GPIOC -> ODR = GPIOC -> ODR ^ GPIO_ODR_ODR0;
}


А вот и сам проект: dl.dropbox.com/u/15427465/coder/7seg_Encoder_Buzzer.rar

P.S. Дальше будет АЦП. Чтение референс мануала показало, что он очень крут (Если сравнивать с АЦП в AVR). Что буду делать конкретно — пока не решил. Возможно, вольтметер с 4х разрядным индикатором…
  • +1
  • 26 апреля 2011, 22:06
  • dcoder

Комментарии (11)

RSS свернуть / развернуть
Позволь взглянуть на исходники.
0
  • avatar
  • Rita
  • 27 апреля 2011, 05:00
Все это делалось на основе Demo проекта (мигалка, которая по-умолчанию зашита в дискавери) — использовал его как шаблон. Исходники выложу ближе к вечеру.
0
Добавил исходники в пост.
0
если среда позволяет вызывать внешние программы по хоткею, то вот подключи
ziblog.ru/2011/03/25/obnovlenie-stm32-st-link-utility/
и будет тебе счастье :)
0
  • avatar
  • ZiB
  • 27 апреля 2011, 05:25
Спасибо, попробую.
0
Не знаю как с дискавери (не добрался еще до нее), а с моей макеткой прога запускается сразу после выхода из отладки. А чтоб в отладку не лазить — там наверху есть кнопочка «Load» по которой прога просто заливается в мк без отладки.
0
Да заливается-то она лекго и непринужденно, только потом без пинка (в виде отладочного режима) дискавери не стартует. Незнаю, может это я туплю где-то.
0
У меня то же самое. Можно попробовать IAR, а можно попытаться обновить прошивку ST-Link до 1.12.3. Только у меня почему-то выдает ошибку и ничего не обновляет.
www.st.com/internet/evalboard/product/219866.jsp
На странице Design Support в самом низу.
0
на STM8L-Discovery так же- заливает, но не стартует
0
Попробовал обновить — вылетела с ошибкой :(
0
Возможно это какой-то глюк ST-Link'a. Кокос сразу запускает без дополнительных пинков.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.