Сегодня 28 ноября, четверг ГлавнаяНовостиО проектеЛичный кабинетПомощьКонтакты Сделать стартовойКарта сайтаНаписать администрации
Поиск по сайту
 
Ваше мнение
Какой рейтинг вас больше интересует?
 
 
 
 
 
Проголосовало: 7276
Кнопка
BlogRider.ru - Каталог блогов Рунета
получить код
Микроконтроллеры
Микроконтроллеры
Голосов: 1
Адрес блога: http://mcucpu.blogspot.com/
Добавлен: 2012-12-19 11:16:08 блограйдером ILS
 

Часы на STM32VL Discovery

2014-06-06 10:10:00 (читать в оригинале)


Плата STM32 Discovery несколько лет назад произвела настоящий «взрыв» интереса среди любителей микроконтроллерной техники. За прошедшее время появились как новые процессоры, так и новые варианты отладочных плат Discovery. Тем не менее, первую плату еще можно использовать в качестве основы разнообразных устройств. Одним из таких могут стать часы.
Схема часов
Принципиальная схема часов не отличается от таковой в других проектах. Индикатор, подключенный для реализации динамического режима, две кнопки настройки и несколько служебных светодиодов составляют практически всю схему. Все остальные элементы уже разведены и установлены на STM32VL Discovery. Все что требуется – запрограммировать алгоритм работы. Условно этот алгоритм можно разбить на несколько частей: динамическая индикация, настройка модуля RTC, опрос часов, настройка времени. Для программирования выбран компилятор MikroC.
Динамическая индикация реализуется стандартно, через прерывание. Особых проблем при ее реализации не возникло. Гораздо больше времени ушло на запуск RTС. Множество регистров, зачастую расположенных в разных блоках, запутывают программиста. Тем не менее, результат получился простой и работоспособный. Определение времени также не вызвало больших затруднений, так как реализуется банальным делением. Например:
  tmp = (RTC_CNTH << 16) + RTC_CNTL; //Получение значения счетчиков
  hour = ((tmp % (365 * 24 * 3600)) % (24 * 3600)) / 3600; //Часы
  minutes = (((tmp % (365 * 24 * 3600)) % (24 * 3600)) % 3600)/ 60; //Минуты
  seconds = (((tmp % (365 * 24 * 3600)) % (24 * 3600)) % 3600)% 60; //Секунды
Если для 8-ми разрядных микроконтроллеров приведенный код тяжел, то в 32-разрядных он не составляет особых проблем, так как деление реализовано аппаратно.
Наибольшее время пришлось потратить на реализацию алгоритма установки времени. Первоначальное решение сделать его через прерывания на кнопках показалось громоздким и плохо работающим, поэтому было решено вернуться к чему-то подобному, что легко прописывалось в 8-ми разрядных системах. Установка времени выполнена простым сложением счетчика RTC и числа 60 для увеличения минут, или 3600 для часов. Такая операция очень проста. Единственный ее недостаток заключается в изменении значения часов, если минуты становятся больше 59.
Схема первоначально была собрана на макетной плате и показала хорошую работоспособность. Сейчас есть желание сделать шилд под STM32VL Discovery, на который установить термометр, датчик давления, реле и звонок.

 Программа часов


#define Dig1_On GPIOB_ODR.B1
#define Dig2_On GPIOB_ODR.B0
#define Dig3_On GPIOB_ODR.B4
#define Dig4_On GPIOB_ODR.B5
#define mig_max 300
unsigned long  tmp;
int Dig_show; //Текущая цифра
int Dig1,Dig2,Dig3,Dig4; //Цифры для индикации
int hour, minutes, seconds;  //Время
int mig,rezim,sec;
int btn0,cnt_btn0,btn1,btn1s,cnt_btn1; //Кнопки

void Read_RTC(){
  tmp = (RTC_CNTH << 16) + RTC_CNTL;
  hour = ((tmp % (365 * 24 * 3600)) % (24 * 3600)) / 3600;
  minutes = (((tmp % (365 * 24 * 3600)) % (24 * 3600)) % 3600)/ 60;
  seconds = (((tmp % (365 * 24 * 3600)) % (24 * 3600)) % 3600)% 60;
}

void Set_DIG12(){
  Dig1=hour/10;
  Dig2=hour%10;
}

void Set_DIG34(){
  Dig3=minutes/10;
  Dig4=minutes%10;
}

//Преобразование цифры в код индикатора
 int Mask(int Dig){
  dig=dig & 0x000f;
  switch(Dig){
     case 0:  {return 0xED00; break;}
     case 1:  {return 0x2100; break;}
     case 2:  {return 0x7C00; break;}
     case 3:  {return 0x7900; break;}
     case 4:  {return 0xB100; break;}
     case 5:  {return 0xD900; break;}
     case 6:  {return 0xDD00; break;}
     case 7:  {return 0x6100; break;}
     case 8:  {return 0xFD00; break;}
     case 9:  {return 0xF900; break;}
     case 10: {return 0x0000; break;}
  }
}

//Прерывание по таймеру2. Переключение цифр на индикаторе
void Timer2_interrupt() iv IVT_INT_TIM2 {
  TIM2_SR.UIF = 0;
  if (RTC_CRL.secf) {sec=~sec; RTC_CRL.secf=0;} //Секундной мигание
  switch(Dig_show){
     case 1: {Dig4_On=0; GPIOB_ODR = mask(Dig1); Dig1_On=1; break;}
     case 2: {Dig1_On=0;  if (sec) GPIOB_ODR = mask(Dig2)+0x0200;
                              else GPIOB_ODR = mask(Dig2);
                                                 Dig2_On=1; break;}
     case 3: {Dig2_On=0; GPIOB_ODR = mask(Dig3); Dig3_On=1; break;}
     case 4: {Dig3_On=0; GPIOB_ODR = mask(Dig4); Dig4_On=1; break;}
  }
  Dig_show++;
  if(Dig_show>4) Dig_show=1;
  mig++;
  if (mig>300)mig=0;
}

//Прерывание по таймеру 3. Выход из режима установки
void Timer3_interrupt() iv IVT_INT_TIM3 {
  TIM3_SR.UIF = 0;
  Rezim=0;
  TIM3_CR1.CEN = 0;
 }

void Set_param(){
  TIM3_CNT=0;
  btn0=1;
  btn1=1;
  btn1s=0;
  PWR_CR.DBP = 1;

  while (rezim>0){
    TIM3_CR1.CEN = 1;
    //Переключение режимов
    cnt_btn0=0;
    if (btn0==0){
      do{cnt_btn0++;}while(GPIOC_IDR.B0&&(cnt_btn0<10000));
      if(cnt_btn0==10000){rezim++; btn0=1; TIM3_CNT=0;}
    }
    cnt_btn0=0;
    if (btn0==1){
      do{cnt_btn0++;}while(!GPIOC_IDR.B0&&(cnt_btn0<10000));
      if(cnt_btn0==10000){btn0=0;}
    }
    if (rezim>2&&!btn0)rezim=0;
   
    //Опрос кнопки установки
    cnt_btn1=0;
    if (btn1==0){
      do{cnt_btn1++;}while(GPIOC_IDR.B1&&(cnt_btn1<10000));
      if(cnt_btn1==10000){btn1=1; btn1s=1; TIM3_CNT=0;}
    }
    cnt_btn1=0;
    if (btn1==1){
      do{cnt_btn1++;}while(!GPIOC_IDR.B1&&(cnt_btn1<10000));
      if(cnt_btn1==10000){btn1=0;}
    }
   
    if (Rezim==1){
      Read_RTC();
      Set_DIG12();
      if (mig>150){
      Set_DIG34();}else {
        Dig3=10;
        Dig4=10;
        if (btn1s){
          RTC_CRL.CNF=1;
          tmp=RTC_CNTL+60;
          RTC_CNTL=tmp;
          btn1s=0;
          RTC_CRL.CNF=0;
        }
      }
    }
   
    if (Rezim==2){
      Read_RTC();
      Set_DIG34();
      if (mig>150){
      Set_DIG12();}else {
        Dig1=10;
        Dig2=10;
        if (btn1s){
          GPIOC_ODR.B11=~GPIOC_ODR.B11;
          RTC_CRL.CNF=1;
          tmp=(RTC_CNTH << 16)+RTC_CNTL+3600;
          RTC_CNTL=tmp&0x0000ffff;
          RTC_CNTH=tmp >> 16;
          RTC_CRL.CNF=0;
          btn1s=0;
          }
      }
    }
  }
}

void Set_RTC(){
int s;
/* Enable the PWR clock */
 RCC_APB1ENR.PWREN = 1;
 RCC_APB1ENR.BKPEN = 1;
/* Allow access to RTC */
 PWR_CR.DBP = 1;
 RCC_BDCR.RTCSEL0 = 1;
 RCC_BDCR.RTCSEL1 = 0;
 RCC_BDCR.RTCEN = 1;
 RCC_BDCR.LSeoN = 1;   //Включение внутреннего часового генератора
 /* Wait till LSE is ready */
 s=1;
 do{ delay_us(10); s++;
   } while((s<50)||(!RCC_BDCR.LSERDY));
 RTC_CRL.CNF=1;
 RTC_PRLH=0;
 RTC_PRLL=0x7FFF;
 RTC_CRL.CNF=0;
 RTC_CRL.RSF=1;
 PWR_CR.DBP = 0;
}

void main() {
  GPIO_Alternate_Function_Enable(&_GPIO_MODULE_SWJ_JTAGDISABLE); //Включение RB4 как GPIO

  GPIO_Config(&GPIOB_BASE,
            _GPIO_PINMASK_4,
            _GPIO_CFG_MODE_OUTPUT |_GPIO_CFG_SPEED_MAX | _GPIO_CFG_OTYPE_PP);
            
  GPIO_Digital_Output(&GPIOB_BASE,
                _GPIO_PINMASK_0|_GPIO_PINMASK_1|_GPIO_PINMASK_4|_GPIO_PINMASK_5|_GPIO_PINMASK_8|_GPIO_PINMASK_9|_GPIO_PINMASK_10
                 |_GPIO_PINMASK_11|_GPIO_PINMASK_12|_GPIO_PINMASK_13|_GPIO_PINMASK_14|_GPIO_PINMASK_15);
                
  GPIO_Digital_Output(&GPIOC_BASE, _GPIO_PINMASK_8|_GPIO_PINMASK_9|_GPIO_PINMASK_10|_GPIO_PINMASK_11|_GPIO_PINMASK_12);
  GPIO_Digital_Input(&GPIOC_BASE, _GPIO_PINMASK_0|_GPIO_PINMASK_1);

  Dig_show=1;
  GPIOB_ODR=0;
  GPIOC_ODR.B8=1;
  EnableInterrupts();
 
  //Настройка таймера переключения цифр
  RCC_APB1ENR.TIM2EN = 1;
  delay_ms(100);
  TIM2_CR1.CEN = 0;             // Disable timer
  TIM2_CNT = 1;
  TIM2_PSC = 0;               // Set timer prescaler.
  TIM2_ARR = 10000;
  TIM2_DIER.UIE = 1;            // Update interrupt enable
  TIM2_CR1.CEN = 1;             // Enable timer
  NVIC_IntEnable(IVT_INT_TIM2); // Enable timer interrupt
 
  //Настройка таймера выхода из режима установки
  RCC_APB1ENR.TIM3EN = 1;
  delay_ms(100);
  TIM3_CR1.CEN = 0;             // Disable timer
  TIM3_CNT = 1;
  TIM3_PSC = 1000;               // Set timer prescaler.
  TIM3_ARR = 50000;
  TIM3_DIER.UIE = 1;            // Update interrupt enable
  NVIC_IntEnable(IVT_INT_TIM3); // Enable timer interrupt
 
  Dig1=3;
  Dig2=1;
  Dig3=7;
  Dig4=0;
  rezim=0;
 
  Set_RTC(); 

  while(1){
    //Опрос кнопки настройки
    cnt_btn0=0;
    do{cnt_btn0++;}while(GPIOC_IDR.B0&&(cnt_btn0<10000));
    if(cnt_btn0==10000){rezim=1; Set_Param();}    //Переход в режим настройки
    Delay_ms(200);
    //Опрос часов
    Read_RTC();
    Set_DIG12();
    Set_DIG34();
  }
}


Тэги: mikroc, stm32, проект
Постоянная ссылка


LPC810 -ARM в DIP и SO

2013-10-10 10:41:00 (читать в оригинале)



Ситуация долгого одновременного существования на рынке 8-ми и 32-разрядных микроконтроллеров создавала некоторое недоумение. Если найти 8-ми разрядный классический процессор можно только в музее, то такие микроконтроллеры используются сплошь и рядом. И это притом, что за такую же цену можно найти более высокопроизводительный 32-разрядный контроллер. Причин подобному можно назвать несколько. В их число, конечно же, войдут инерционность сообщества разработчиков, сложность новых моделей, необходимость пересмотра некоторых подходов к разработке и т.д. Но самый весомый довод был в отсутствии доступных корпусов. Развести плату под LQFP, в котором сегодня выпускаются большинство ARM-микроконтроллеров, а уж тем более распаять на нее микросхему сможет решиться далеко не каждый любитель. Альтернативой могли бы стать готовые платы – аналоги стандартных корпусов DIP, но их выбор ограничен, да и стоят они уже в десятки раз больше самого процессора.
Ситуация кардинальным образом поменялась примерно год назад, когда компания NXPанонсировала новую линейку микроконтроллеров под общим названием LPX800. Данная линейка углубляет решение производителя вытеснить с рынка 8-ми разрядные микроконтроллеры. Для этого в ее состав включены микросхемы в корпусах DIP-8 и SO-20. Также имеются варианты TSSOP-16 и TSSOP-20, но они уже менее интересны в любительских масштабах. Все микроконтроллеры выполнены на основе ядра Cortex-M0+, и имеют множество интересных особенностей. Несколько портит впечатление только малый объем памяти программ, не превышающий 16кБ. Для модели в 8-ми выводном корпусе он вообще равен 4кБ. И если 4кБ, для младшей модели еще как-то оправданы, то для процессоров с большим количеством выводов этого уже может оказаться мало. В общем, для серьезных проектов  лучше подобрать что-то другое.
Пока в линейке LPC800 3 модели процессоров. LPC810M выпускается в корпусе DIP8, LPC811M в TSSOP16, LPC812M в корпусах TSSOP16, TSSOP20, SO20. Для корпуса DIP8 есть еще одна проблема. Распиновка выводов питания выполнена собственным способом, не совпадающим с вариантами Microchipили Atmel. Конечно для новых проектов это не самое страшное, но была идея использовать этот процессор в старых разработках.
Среди других интересных решений NXP следует отметить конфигурируемый таймер и матрицу переключений выводов. Конфигурируемый таймер состоит из двух отдельных таймеров-счетчиков разрядностью 16 бит, которые могут работать совместно, создавая один общий таймер на 32 бита. Модуль позволяет использовать 4 входа и 4 выхода, и поддерживает функции ШИМ.
Матрица переключений выводов позволяет изменять назначение линий ввода/вывода, необходимым для работы образом. Фактически каждая альтернативная функция может быть подключена к любому выводу микроконтроллера. Столь революционное решение резко упрощает разводку печатной платы и делает ее некритичным к ошибкам. Пожалуй, это самое интересное и полезное новшество микроконтроллеров LPC.
К сожалению, пока не удалось приобрести данный процессор, так как во всех интерент-магазинах его ждут в конце октября/ноября. Придется немного подождать с экспериментами. Но похоже эра 8-ми битных процессоров прошла, и необходимо срочно избавиться от небольшого запаса микросхем. Также подождем, чем ответит STMicroelectronics.


Тэги: lpc, nxp
Постоянная ссылка


Прищепка для программирования

2013-08-30 18:18:00 (читать в оригинале)


Производители микроконтроллеров все больше уходят от старинных корпусов штыревого монтажа типа DIP. Связано это и с удешевлением производства и с увеличением количества входов/выходов. Также при автоматическом монтаже тип корпуса не играет особого значения. В любительской практике также в некоторых случаях выгодно использовать элементы поверхностного монтажа. При этом уменьшаются габариты готового изделия, и отпадает необходимость в сверлении печатной платы. Главным недостатком такого варианта становится невозможность использования панелек под микросхемы. Запрограммировать впаянный микроконтроллер можно только с помощью специально предусмотренного разъема внутрисхемного программирования (ICSP). Но такой разъем усложняет разводку платы и часто нарушает первоначальную идею устройства. Также он может иметь и значительные габариты.
Сравнительно недавно стал доступен еще один вариант, отлично подходящий для корпусов типа SOIC. Представляет он прищепку, оснащенную контактными пластинами. Установленная  на распаянную микросхему, прищепка обеспечивает электрический контакт. В итоге ее можно использовать как для  программирования, так и для измерения сигналов с выводов.
Прищепка SOIC-8
Приобретались прищепки в китайском интерент-магазине с целью программирования PICов. Взяты были две модели под корпуса SOIC-8 и SOIC-16. Первая из них пришла с распаянным кабелем и переходником под DIP8. Данный переходник отлично вписался в панельку на программаторе, соответственно не понадобилось никаких дополнительных устройств. Результат оказался выше всяких ожиданий. Если конструкция аналогичного назначения, но временной реализации постоянно теряла электрический контакт и программатор отказывался работать, то с прищепкой никаких проблем выявлено не было, во всяком случае, пока.
Прищепки SOIC-8 и SOIC-16
Вторая прищепка SOIC-16 имеет аналогичную конструкцию, но оказалась не востребованной. Используемые микроконтроллеры имеют все необходимые линии с одной стороны микросхемы, и запрограммировать, например, PIC16F676 в корпусе SOICможно с помощью прищепки SOIC-8.
В целом оказалась очень удобная вещь. Теперь не надо дополнительно отвлекаться на разводку разъема ICSP и можно целиком сконцентрироваться на уменьшении габаритов конструкции. Теперь бы еще такую штуку для LQFP и было бы счастье J.


Тэги: разный
Постоянная ссылка


Проба платы OPEN407

2013-02-15 16:58:00 (читать в оригинале)


Одним из самых интересных вариантов использования платы OPEN407 можно считать возможность подключения графического дисплея и камеры. Что бы посмотреть эту возможность, в комплекте были заказаны модули трехдюймового дисплея HY32C и камеры OV7670. Естественно что сразу после возникло желание проверить их в работе. Благо для установки на плату не потребовалось практически никаких усилий. Дисплей встал сразу, а с камерой пришлось уточнить распиновку, так как ее разъем меньше, чем предусмотрен на плате  – носителе. В программы  был использован пример, поставляемый в комплекте. Написан он под Keil, дистрибутив которого также есть на диске.
Компиляция и загрузка прошла без проблем и чудо свершилось. На дисплее возникло изображение. Так как камера имеет фокусную линзу, то ее пришлось настроить. Для этого верхняя часть кожуха вращается на резьбе. После этого качество изображения даже слегка удивило. Дешевые вещи показали картинку ничуть не хуже чем камера телефона Samsung. Конечно, есть вопросы по цветам, но еще раз повторюсь – для столь дешевых элементов с низким разрешением, считаю полученную картинку неплохой.

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



Тэги: stm32, плата
Постоянная ссылка


Плата Open407V-D для STM32F4Discovery.

2013-02-09 11:18:00 (читать в оригинале)



Долгое ожидание посылки из Гонконга с платой для  STM32F4Discovery наконец-то закончилось. Вся доставка в сумме заняла 53 дня. При этом традиционных претензий к Почте России нет. После появления отметки о выдачи посылки таможней, до ее получения прошла всего неделя. Учитывая столь долгий срок, попытался даже открыть диспут на Aliexpress, но поставщик убедительно попросил его снять. В итоге, если бы не продление срока доставки с его стороны, то диспут пришлось бы открывать повторно. Хотя виноват не продавец, а работа почтовых служб.

В комплекте с платой положено несколько кабелей. Все они оснащены разъемами USBразных типов и предназначены для подключения плат к ПК. Кроме кабелей, присутствуют два комплекта перемычек на 2 и 4 провода. Использовать их совместно с Open407 можно только для подачи питания на внешние устройства. Также к плате прилагается диск с документацией и программным обеспечением. Все примеры программ реализованы для Keil.

Плата и модули пришли упакованными в антистатические пакеты. Все вместе было сложено в стандартную картонную почтовую коробку. Создается впечатление, что китайцы экономят на упаковке, хотя дисплей дополнительно завернут в пупырчатый пакет. Качество изготовления, на первый взгляд вполне достойное. В общем, весьма неплохая игрушка для начинающих. Включить пока еще не успел, но это будет уже отдельная тема.



Тэги: stm32, плата
Постоянная ссылка


Страницы: 1 2 3 4 5 6 7 

 


BlogRider сегодня
Сообществ
1311
Самый-самый блог
Блогер ЖЖ все стерпит
ЖЖ все стерпит
по количеству голосов (152) в категории «Истории»
Изменения рейтинга
Категория «Кино»
Взлеты Топ 5
+363
414
Информационный колодец
+341
345
Yurenzo
+339
343
CAPTAIN
+331
341
Alta1r
+322
361
Vindigo
Падения Топ 5
-2
48
Illusory_doll
-3
237

-3
252
Soft Hedgehog's Journal
-5
264
Смотреть онлайн индийские фильмы.
-5
27
warner four
Главные темы
Популярные за сутки

300ye 500ye all believable blog bts cake cardboard charm coat cosmetic currency disclaimer energy finance furniture house imperial important love lucky made money mood myfxbook poetry potatoes publish rules salad seo size trance video vumbilding wardrobe weal zulutrade агрегаторы блог блоги богатство браузерные валюта видео вумбилдинг выводом гаджеты главная денег деньги звёзды игр. игры императорский календарь картинка картон картошка клиентские косметика летящий любить любовь магия мебель мир настроение невероятный новость обзор онлайн партнерские партнерских пирожный программ программы публикация размер реальных рубрика рука сайт салат своми событий стих страница талисман тонкий удача фен феншуй финансы форекс цитата шкаф шуба шуй энергия юмор 2009


Загрузка...Загрузка...
BlogRider.ru не имеет отношения к публикуемым в записях блогов материалам. Все записи
взяты из открытых общедоступных источников и являются собственностью их авторов.