Jump to content
karomag

Динамическая индикация STM32

Recommended Posts

Помогите! Не пойму, почему не работает код. Хотя он был рабочий, пока я что-то не "оптимизировал"...

// Общие выводы индикатора
#define D0 GPIO_Pin_14
#define D1 GPIO_Pin_13
#define D2 GPIO_Pin_12
#define ALL_CATOD ( D0 | D1 | D2 )

// К какой ноге какой сегмент подключен
#define SEG_A GPIO_Pin_0
#define SEG_B GPIO_Pin_1
#define SEG_C GPIO_Pin_2
#define SEG_D GPIO_Pin_3
#define SEG_E GPIO_Pin_4
#define SEG_F GPIO_Pin_5
#define SEG_G GPIO_Pin_6

//Собираем цифры из сегментов
#define DIG0 ( SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F )
#define DIG1 ( SEG_B | SEG_C )
#define DIG2 ( SEG_A | SEG_B | SEG_G | SEG_E | SEG_D )
#define DIG3 ( SEG_A | SEG_B | SEG_G | SEG_C | SEG_D )
#define DIG4 ( SEG_F | SEG_G | SEG_B | SEG_C)
#define DIG5 ( SEG_A | SEG_F | SEG_G | SEG_C | SEG_D )
#define DIG6 ( SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G )
#define DIG7 ( SEG_A | SEG_B | SEG_C )
#define DIG8 ( SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
#define DIG9 ( SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G)
#define ALL_SEG (DIG8 )

void GPIO_Configuration(void)
{
   GPIO_InitTypeDef GPIO_InitStructure;
   /* GPIOA Configuration:TIM3 Channel1, 2, 3 and 4 as alternate function push-pull */
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOB, &GPIO_InitStructure);

   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
   GPIO_InitStructure.GPIO_Pin = ALL_SEG | ALL_CATOD;
   GPIO_Init(GPIOA, &GPIO_InitStructure);

}

void show_temp(void) {

   u16 tmp; // Содержит копию counter (из него по очереди исключаются последние цифры)
   u8 digit; // В эту переменную поочередно записываются цифры из которых состоит число counter
   u16 catods[] = { D0, D1, D2 };
   u8 digitsp[] = { DIG0, DIG1, DIG2, DIG3, DIG4, DIG5, DIG6, DIG7, DIG8,   DIG9 };
   u8 i;

   tmp = measureT;

   for (i = 0; i < 3; i++) {
      if (tmp > 0) {
         //Вытаскиваем первую справа цифру из числа counter
         digit = tmp % 10;
         tmp = tmp / 10;
         //Выключаем все разряды. 1 на катоды
         GPIOA->ODR |= ALL_CATOD;
         //Включаем i разряд индикатора
         GPIOA->ODR &= ~catods[i];
         //Выводим цифру в i разряд
         GPIOA->ODR &= ~DIG8; //Выключаем все сегменты
         GPIOA->ODR |= digitsp[digit]; //Зажигаем нужные
         //Небольшая задержка. Пусть цифра погорит некоторое время
         delay_ms(1000);
      }
   }
}

Большую задержку поставил, чтобы глазом было видно результат. Число 123 отображается: сначало 33, потом 22, потом 111. Почему загорается несколько разрядов, хотя GPIOA->ODR &= ~catods;?

Share this post


Link to post
Share on other sites
2 минуты назад, karomag сказал:

пока я что-то не "оптимизировал"...

А что это "что-то" ? Или мы должны догадаться ?

Share this post


Link to post
Share on other sites
Только что, Alex сказал:

А что это "что-то" ? Или мы должны догадаться ?

Да, я не пойму сам. Был проект, в котором я учился выводить на индикатор произвольные числа - работал. Перенес код в другой проект не работает, загружаю предыдущий тоже нет...

Share this post


Link to post
Share on other sites

Технология Maxim Integrated nanoPower: когда малый IQ имеет преимущества

При разработке устройств с батарейным питанием важно выбирать компоненты не просто с малым потреблением, но и с предельно малым током покоя. При этом следует обратить внимание на линейку nanoPower производства компании Maxim Integrated. В статье рассмотрено их применение на примере системы датчиков беспроводной оконной сигнализации.

Подробнее

Я наверное, никогда в своей жизни не узнаю почему я потратил пол дня на эту проблему... Сейчас, в порыве отчаяние "перекинул" общие катода с того же порта А на порт С:

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin = ALL_SEG;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = ALL_CATOD;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

И о чудо ЗАРАБОТАЛО! Но как такое может происходить... Может быть это связано с какими-то альтернативными функциями ног? Хотя ШИМ и АЦП у меня запущен на порте В.

Share this post


Link to post
Share on other sites

Схема? Катоды управляются полевиками? Может, порт работает только в одну сторону, отключаясь оставляет заряд на полевике и тот держит ток...

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

Share this post


Link to post
Share on other sites
                     

Платы Nucleo на базе STM32G0: чего можно добиться с помощью связки Nucleo и Arduino

Платы Nucleo и платы расширения X-NUCLEO от STMicroelectronics можно интегрировать в платформу Arduino с помощью библиотеки STM32duino. Связка плат Nucleo и платформы Arduino, и наличие готовых библиотек – представляет удобный инструмент для создания прототипов и конечных приложений в условиях ограниченного времени. Статья содержит пошаговые инструкции по установке библиотек и запуску примеров для Nucleo.

Подробнее...

Только что, Alexeyslav сказал:

Схема? Катоды управляются полевиками? Может, порт работает только в одну сторону, отключаясь оставляет заряд на полевике и тот держит ток...

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

Плата STM32VLDiscovery, общие катоды подключены напрямую к выводам платы, а аноды через резистор.

Не понял, что вы называете "кратким описание логических преобразований", я в программировании МК еще совсем в начале пути и не очень понимаю, как должно быть по "нормальному"? Пишу где-то методом тыка, где то подглядываю у других)

Share this post


Link to post
Share on other sites
Только что, snn_krs сказал:

А тактирование порта А включено ?

RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );

Да, конечно. Аноды на порте А.

Методом "перетыкивания ножек" удалось сузить круг подозреваемых до 13 и 14 ног порта А, на остальных ногах нормально все.

Ох, ты еж! Кажется, я понял где "собака зарыта".

image.png.3f6e5be8c3774196e6860790a14d648b.png

на 13 и 14 ногах сидит ST-Link!

Я правильно понял?

Share this post


Link to post
Share on other sites

Напрямую? Мне всегда казалось что у STM32 слишком слабые выходы чтобы подключать к ним светодиодные индикаторы. Ну, какой-то ток они выдержат... но он значительно меньше чем у других контроллеров.

Под краткой записью я имею ввиду выражения вроде "ODR &= ~catods" - настоящая головоломка когда начинаешь читать и пытаться вникнуть в суть выполняемой функции. Символов вроде меньше, но очевидность стремится к нулю. Такое ощущение что эти выражения придумали программисты-машинисты которым побыстрей бы выдать код на скорости 200 симв/мин. Не понимаю, чем неугодна оказалась классическая математическая запись выражений?

Share this post


Link to post
Share on other sites
11 час назад, Alexeyslav сказал:

Напрямую? Мне всегда казалось что у STM32 слишком слабые выходы чтобы подключать к ним светодиодные индикаторы. Ну, какой-то ток они выдержат... но он значительно меньше чем у других контроллеров.

Под краткой записью я имею ввиду выражения вроде "ODR &= ~catods" - настоящая головоломка когда начинаешь читать и пытаться вникнуть в суть выполняемой функции. Символов вроде меньше, но очевидность стремится к нулю. Такое ощущение что эти выражения придумали программисты-машинисты которым побыстрей бы выдать код на скорости 200 симв/мин. Не понимаю, чем неугодна оказалась классическая математическая запись выражений?

Да, тема подключения индикатора уже обсуждалась в другой ветке. Я по незнанию сначала подключил - все работало. Потом начал читать теорию и был удивлен: должно все сгореть)))) Но я упустил момент динамической индикации: разряды вкл поочередно на короткое время - в итоге ток получается не большой. Плюс современные индикаторы(светодиоды) требуют все меньший ток. Хотя, теперь бы сделал на "ключах".

Я в институте учил Delphi. Работаю "программистом" 1С - для меня битовые операции вообще сложная тема))) Но везде применяется именно сокращенный вид присваивания. Вот и пытаюсь привыкнуть.

Edited by karomag

Share this post


Link to post
Share on other sites

Импульсный ток так и остаётся высоким. То что средний ток будет меньше практически ничего не значит - это отодвинет лишь тепловой пробой, а превышение максимальных параметров выхода всё ещё остаётся. Сейчас оно работает, а через 500 часов наработки сгорит к чертям порт и делов-то. А, кстати, а что будет с током если выведешь все 8-ки на индикатор?

Ну, сами по себе битовые операции то остаются только такая краткая их форма записи не очевидна и сбивает с толку. Где-то она уместна, но зачем пихать её во все щели, даже на линейный участок алгоритма где должна быть очевидность а не краткость записи(хотя вот не уверен что в нынешнем С вообще ещё можно использовать математическую запись). Это что-то вроде моды, очень заразно но не значит что так надо делать всегда и везде... Но это дело такое.

Edited by Alexeyslav

Share this post


Link to post
Share on other sites
В 14.11.2017 в 01:23, Alexeyslav сказал:

Сейчас оно работает, а через 500 часов наработки сгорит к чертям порт и делов-то. А, кстати, а что будет с током если выведешь все 8-ки на индикатор?

Гипотетически все 8 не будут выводится. Но вы имеете, ввиду что ток будет слишком большим для всего МК?

Это первый проект на STM32. Были сомнения, что я вообще смогу его реализовать, поэтому сильно в дебри не лез... Вообще в планах, сделать индикацию на двух 74HC495. Слышал, что есть какие-то спец драйверы для семисегментников. Но мне кажется это гораздо сложнее.

Share this post


Link to post
Share on other sites
В 14.11.2017 в 01:23, Alexeyslav сказал:

Импульсный ток так и остаётся высоким. То что средний ток будет меньше практически ничего не значит - это отодвинет лишь тепловой пробой, а превышение максимальных параметров выхода всё ещё остаётся. Сейчас оно работает, а через 500 часов наработки сгорит к чертям порт и делов-то. А, кстати, а что будет с током если выведешь все 8-ки на индикатор?

Я на АТмеле-АВРах пробовал - если ток превышает предельный, падает напряжение которое нога выдает для единицы, для 5-вольтной логики у меня падало до 3,5 вольт. То есть начинает сказываться сопротивление транзистора (грубо говоря) ноги (пина)! Но все работало ни чего не сгорело!!!

Edited by ruhi

Share this post


Link to post
Share on other sites

Ну да... и 60мВт тепла выделяется на выходном транзисторе порта, один может и ничего но если несколько нагрузить до предела уже может выйти из строя что-то. А вообще работа в предельном режиме сильно сокращает ресурс элемента, вплоть до нескольких минут работы. Забавно было смотреть как советский светодиод АЛ307 работает при 100мА... но он работал же! Недолго...

Цитата

Но вы имеете, ввиду что ток будет слишком большим для всего МК?

В даташите указан ток максимальный для одного пина, ограничен для группы(весь порт или по 8 бит) и для выводов питания всего контроллера отдельно. Причем надо смотреть какой именно ток ограничен - импульсный или в целом. Ну и обращать внимание на абсолютные ограничения - их нельзя превышать НИ В КОЕМ СЛУЧАЕ. Полупроводники конечно имеют запас, но работа в околопредельном режиме всегда сокращает ресурс полупроводника.

Ну вот у вас получилось 25мА, это ток который при "8" будет течь через один общий пин, вроде же это больше чем разрешённый? А если он на том же порту что и сегменты... как-то не очень выходит.

Share this post


Link to post
Share on other sites
14 часа назад, Alexeyslav сказал:

Ну вот у вас получилось 25мА, это ток который при "8" будет течь через один общий пин, вроде же это больше чем разрешённый? А если он на том же порту что и сегменты... как-то не очень выходит.

Это максимальный, насколько я понял из datasheet на МК на пин. Да общий пин на том же порте...

Share this post


Link to post
Share on other sites

Вот это как раз плохо. Может и поработает так какое-то время, а потом внезапно порт перестанет работать... При нагреве чипа(летом?) всё станет ещё хуже - нагрузочная способность порта уменьшится.

Share this post


Link to post
Share on other sites
В 12.11.2017 в 22:01, karomag сказал:

#define SEG_G GPIO_Pin_6

//Собираем цифры из сегментов

#define DIG0 ( SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F )

Вы сегменты с разрядами не перепутали часом? Сегмент это часть одной цифры, а разряд - номер цифры.

Share this post


Link to post
Share on other sites
В 21.11.2017 в 18:36, COKPOWEHEU сказал:

Вы сегменты с разрядами не перепутали часом? Сегмент это часть одной цифры, а разряд - номер цифры.

А с чего такой вопрос? Все так и есть.

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By Стальной
      Здравствуйте!
      Интересует мнение коллег по правильному питанию мощных МК. Имеется STM32F722VCT6. Делаю для себя новый отладочный стенд. На нем будут обкатываться различные задачи, поставлю плюсом к МК всякую периферию, обязательно i2c память (из серии AT24Cxx), MAX3485, возможно какой-то дисплей, SD-карту, может быть SIM900 и NAND. Первичный источник - думаю, USB хватит.
      Вопрос - как организовать питание МК? Имеет ли смысл цифровую часть (а мб и часть периферийного зоопарка) питать импульсной системой, а аналоговую часть кренкой? Или всё кренкой запитать? Какие идеи?
      Спасибо)
      ЗЫ Сейчас использую стенд на STM32F407VET6, сделанный на коленках, все кренкой питается. Но там периферия изготавливается по мере необходимости и надевается отдельно на гребенки.
    • By befrikpa
      Добрый день товарищи!
      У меня такая проблема:
      Я хочу сделать штуку которая будет замыкать реле через определённое время(после подачи питания на него), реле времени так сказать. В принципе устройство работает, но у меня не получается сделать так, что бы светодиод (HL_4) мигал каждые пол секунды пока не включено реле, а после включения соответственно  светодиод горел постоянно.
      Сейчас у меня условие находится в бесконечном цикле, и при включении устройства, светодиод просто горит постоянно и всё.
      Скажу честно, я в программировании пока что зелёный, так что не судите строго за код))
      Прикрепил код:

       
    • By Alextiger62
      Отладочный набор на базе микроконтроллера STM32F746IGT6. Модульная конструкция и открытый дизайн делают плату идеальным решением для начала быстрой разработки устройств. В комплект поставки входят все необходимые модули расширения, для оценки всех возможностей микроконтроллера. 

      Комплектация: 
      1 х Материнская плата (Open746I-C development board); 
      1 х Процессорный модуль (Core746I); 
      1 х Кабель (USB type A plug to micro B plug cable);   - отсутствует
      1 х Кабель (USB type A receptacle to micro B plug cable);   - отсутствует
      1 х Соединительные провода (4-pin 2-pin wires pack);   - отсутствует 
      1 х Блок питания (Power adapter US standard 5V/1A);   - отсутствует
      1 х Дисплей (7inch Capacitive Touch LCD (F)); 
      1 х Плата (DP83848 Ethernet Board); 
      1 х Плата (USB3300 USB HS Board); 
      1 х Плата (UDA1380 Board); 
      1 х Плата (Micro SD Storage Board); 
      1 х Плата (OV2640 Camera Board); 
      1 х Плата (W25QXX DataFlash Board); 
      1 х Плата (10 DOF IMU Sensor (B)); 
      2 х Плата (SN65HVD230 CAN Board); 
      1 х Плата (Analog Test Board); 
      1 х Кабель (USB type A plug to mini-B plug cable);  - отсутствует
      1 х Кабель (USB type A receptacle to mini-B plug cable);   - отсутствует
      1 х Кабель (Ethernet Cable); 
      1 х Шлейф (40-pin FFC);  - отсутствует
      1 х Крепеж (7inch LCD screws pack).
    • By Денис216
      Не могу опросить магнитометр по I2C. На линиях какие-то сигналы проскакивают, но никакого результата не могу достичь. Кто-то что-то знает по этому поводу? Как заставить работать его.


       
      #include "stm32f30x.h"              int a1=0, j=0; int main(void) { RCC->AHBENR|=RCC_AHBENR_GPIOBEN;// тактирование портa B включено RCC->AHBENR|=RCC_AHBENR_GPIOEEN;//21 тактирование портa Е включено RCC->APB1ENR|=RCC_APB1ENR_I2C1EN;// тактирование I2C1 включено GPIOB->MODER|=0x0000A000; // альтернативная функция линий PB7,PB6 GPIOB->OTYPER|=(1<<6);  //настройка линии PB7 на выход открытый сток GPIOB->OTYPER|=(1<<7);  //настройка линии PB6 на выход открытый сток GPIOB->OSPEEDR=0xFFFFFFFF; GPIOB->AFR[0] |= 0x44000000;  //настройка линий PB7,PB6 на функцию AF4 GPIOE->MODER=0x55555555; //настройка порта Е на выход EXTI->EMR=1<<23; EXTI->IMR=1<<23; NVIC_EnableIRQ(I2C1_EV_IRQn); //инициализация I2C мастер I2C1->CR1=(0<<0); //PE=0 I2C1->TIMINGR=(0x4<<28);//PRESC[3:0]: Timing prescaler I2C1->TIMINGR=(0x8<<20);//SCLDEL[3:0]: Data setup time I2C1->TIMINGR=(0x8<<16);//SDADEL[3:0]: Data hold time I2C1->TIMINGR=(0xC3<<8);//SCLH[7:0]: SCL high period (master mode) I2C1->TIMINGR=(0xC7<<0);//SCLL[7:0]: SCL low period (master mode) I2C1->CR1=(0<<17);//для мастера = 0 NOSTRETCH: Clock stretching disable I2C1->CR1=(1<<6);//TCIE: Transfer Complete interrupt enable I2C1->CR1=(1<<2);//RXIE: RX Interrupt enable(RXNE) I2C1->CR1=(1<<1);//TXIE: TX Interrupt enable(TXIS) I2C1->CR2=(0<<11);//ADD10=0 -7 bits I2C1->CR2=(0<<10);//RD_WRN=0 передача I2C1->CR2=(1<<25);//AUTOEND I2C1->CR1|=(1<<0); //PE=1 I2C1->CR2 = 0x03<<1;//adress  I2C1->CR2|=1<<13;//start ?????? a1=I2C1->RXDR;     while (1){     //    I2C1->CR2|=1<<13;//start         if((a1&0x1)>0)    GPIOE->ODR =1<<9;         else            GPIOE->ODR =(0<<9);         if((a1 & 0x2)>0)    GPIOE->ODR |=1<<10;         else            GPIOE->ODR &= ~(1<<10);         if((a1 & 0x4)>0)    GPIOE->ODR |=1<<11;         else            GPIOE->ODR &= ~(1<<11);         if((a1 & 0x8)>0)    GPIOE->ODR |=1<<12;         else            GPIOE->ODR &= ~(1<<12);         if((a1 & 0x10)>0)    GPIOE->ODR |=1<<13;         else            GPIOE->ODR &= ~(1<<13);         if((a1 & 0x20)>0)    GPIOE->ODR |=1<<14;         else            GPIOE->ODR &= ~(1<<14);         if((a1 & 0x40)>0)    GPIOE->ODR |=1<<15;         else            GPIOE->ODR &= ~(1<<15);         if((a1 & 0x80)>0)    GPIOE->ODR |=1<<8;         else            GPIOE->ODR &= ~(1<<8); }} void I2C1_EV_EXTI23_IRQHandler () {a1=2;}  
  • Сообщения

    • @Boris U это по ходу радио любитель попытался переделать свй старый SDR чик на нечто другое, но там и прошивку менять и конструктивные изменения необходимы, на прямую использовать не получится. Там на входе приемника стоит АЦП в общем а остальное программа делает. Да  и ещё использование устройства совместно с программой может накапливать показания по магнитной активности.
    • Если Вы об этом железе, и диаметр 0,3 измерен по изоляции, то влезет.
    • Ваша фраза о компьютерной туфте, это реакция на публикацию мной снятых осциллограмм и графика, построенного по результатам измерений. Именно это было названо компьютерной туфтой. Фото установки выложил, просто как ещё одно подтверждение подлинности  моей информации. Первой была фраза Преподаватели в институте научили меня, что всё сказанное может быть подвергнуто сомнению. Или, как минимум, вызвать вопросы. Поэтому, стоит заранее продумать, что сказать и как реагировать на возможные вопросы. Кроме того, очень желательно сказанное аргументировать. Здесь и сейчас. Вас не устроило упоминание осциллографа, как измерительного инструмента? Мне не привыкать. Василичь, тот вообще договорился, что и паяльника у меня нет. Выложил фото установки. Но, дело не в этом. Дело в Ваших амбициях и самооценке, мешающей Вам услышать других. Почитайте, хотя бы, пару своих постов. Ни понимания физики явлений, ни уважения к собеседнику. Плюс, самолюбование. "Эверест" фотографий - отличное тому подтверждение. Напоминает статусы в соцсетях. А обида.... Не льстите себе. Поверьте, я слишком давно вылез из песочницы. Замечательно. Сделайте свой вариант разводки и выложите. Раз, уж, сказали, что можно лучше.  И одна беда, в отсутствии исходника. Он есть у Вас. Суть, как я понимаю, не в соревнованиях на скорость сборки электросхемы. Были такие. Тем более, SamVal брался реализовать Вашу разводку в "металле". Я, как бы, показал класс в измерении магнитных свойств сердечника. С фотками. За что и "отгрёб". Теперь Ваша очередь, Alex-007!
    • Смотрю , Модуль вцелом , всё же пригодился !
    • Предложение актуально. Цены: Минимальный заказ - 1 катушка. Цена - 950грн. Цена от 2х катушек - 900грн/катушка. Возможна отмотка от 100гр. Цена 100гр. - 130грн.
    • Я думаю, что ДМА счетчик не сдвинул как раз. Пропустил запрос от ADC.  Следующий запрос от ADC к DMA:  DMA принял, но данные поместил уже не во второй элемент массива, а в первый. Затем ADC шлет еще и еще запросы и некоторые из них DMA вновь пропускает. И количество пропусков *считай смещений) может составлять от 1 до 6.  Вот это и объясняет, что сдвиг данных всегда на разную величину происходит.
    • Придется делать свои платы. В КИТ Михаила "Аксикомы" не станут, да и резисторы будут выводные.   Это правильная мысль. Я изначально компоновался с БуЛочками и они встали на радиаторах вплотную ко входу УМЗЧ   Это нечто!! Видеть еще пол беды, а вот взять в руки... Сразу приходит осознание - вещь!  
×
×
  • Create New...