Перейти к содержанию

Вопросы от начинающих по МК


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

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

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

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

  • Ответов
  • Создана
  • Последний ответ

Топ авторов темы

8 минут назад, mail_robot сказал:

проще поставить рядом любую маленькую епромку I2C и не парить мозг

Думал, но несколько ограничен в размерах ПП и еепром не влезет, да и ставить еепром ради записи одного значения, как-то не очень.

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

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

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

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

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

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

Так и EEPROM-ки маленькие бывают, в смысле объёма. на 128 байт, например. А ещё современней FRAM чип, с бесконечным числом циклов перезаписи.

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

Учение - изучение правил. Опыт - изучение исключений.

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

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

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

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

9 hours ago, Lopnul said:

НО у F030 вроде как 1'000 циклов на запись

а кто вам такую ерунду сказал?

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

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

а кто вам такую ерунду сказал?

В ДШ вроде так:

7.gif.a116ffd5ea813bbac8fd03cb97863e1d.gif

9 часов назад, Alexeyslav сказал:

Так и EEPROM-ки маленькие бывают, в смысле объёма. на 128 байт, например.

Самый миниатюрный eeprom, который мне попался в магазине это в корпусе SOT23-5L. А к нему потом потянется емкость по питанию, плюс 2 подтягивающих сопротивления.

9 часов назад, Alexeyslav сказал:

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

Была такая мысль, но сразу возник вопрос, а что если произойдет выбор режима и сразу выключат. Если опрос АЦП поставить на 1мс, то все отлично сохраняется с текущими номиналами емкостей на выходе лм-ки, но не знаю насколько это снизит ресурс самого МК.

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

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

В ДШ вроде так:

Дело тут не в ДШ. При эмуляции флеша данных (EEPROM) в программном флеше нужно учесть, что стирать по одной ячейке НЕ ВЫЙДЕТ. Стирание происходит довольно большими блоками. Деградация памяти происходит примерно в равной степени и от стирания и от записи. Поэтому необходима СКОЛЬЗЯЩАЯ запись данных в программный флеш. Для этого выделяют часть программного слова под эмуляцию адреса EEPROM и запись ведут все время на свежей области, НЕ СТИРАЯ БЛОК. Стирают, когда место в блоке закончилось ОДИН РАЗ  и начинают запись с начала. Каждое обращение в этот эмулированный EEPROM требует поиска последней записи (лучше это делать с конца блока). Чтобы ускорить процесс, целесообразно держать в ОЗУ копию содержимого такого EEPROM и эту копию обновлять лишь при включении. А запись делать, как уже сказали выше, через определенный таймаут после смены переменной.

Все это позволяет умножить 1000 циклов по ДШ на число записей в блоке. Если блок состоит из 1024 слов, а запись равна одному слову, то число циклов станет равно 1.000.000.

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

а что если произойдет выбор режима и сразу выключат.

Как правило, это ерунда. Можно снизить таймаут до 2...3 сек и сделать задержку выключения на такое же время. Если выключение делают путем жесткого выдергивания питания, то нужно ОГОВОРИТЬ эту ситуацию в эксплуатационных документах. В конце концов, мало ли что можно вытворять с устройствами...

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

戦う前に相手のベルトの色に注目

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

10 минут назад, my504 сказал:

Поэтому необходима СКОЛЬЗЯЩАЯ запись данных в программный флеш. Для этого выделяют часть программного слова под эмуляцию адреса EEPROM и запись ведут все время на свежей области, НЕ СТИРАЯ БЛОК.

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

15 минут назад, my504 сказал:

Все это позволяет умножить 1000 циклов по ДШ на число записей в блоке.

Данный вариант действительно интересен, т.к. далее можно (если надо будет) вести учет ресурса блока и со временем менять адресацию.

16 минут назад, my504 сказал:

Если выключение делают путем жесткого выдергивания питания

Как раз это именно данный вариант.

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

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

Это как школьная доска. Тряпкой стерли всю доску, а написали одно слово в углу. Остальная поверхность доски годится для записей, пока вся площадь не будет исписана. Вот тогда и новое стирание доски (блока :)).

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

@Геннадий действительно, только что попробовал и значения спокойно записываются в пустую ячейку (FFFFFFFF) без стирания всего блока, до этого думал, что необходимо ВСЕГДА стирать весь блок перед любой записью. А блок по сути надо стирать, только когда значения в конкретной ячейке необходимо перезаписать. В таком случае вопрос о 1'000 циклах можно снимать, как выше подсказал @my504 буду последовательно записывать значения в пустые ячейки и по достижению границы блока, стирать и начинать заново.

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

4 hours ago, Lopnul said:

А к нему потом потянется емкость по питанию, плюс 2 подтягивающих сопротивления.

емкость этой микрухе не нужна. У нее нет таких режимов, чтобы требовать обязательно блока на питании. А подтягивающие резисторы в 030-ых уже встроены в камень и могут включаться программно. Почитайте мануал. Это одна из удобных фишек F0хх

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

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

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

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

Как раз это именно данный вариант.

Надо сильно постараться, чтобы за 2 секунды изменить параметр и выдернуть питание. И чтобы это было критически важно для работы, к тому же...

Опишите устройство в части регулировка - потеря питания. К гадалке не ходи - это надуманная проблема.

戦う前に相手のベルトの色に注目

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

Программатор подключен по ISP к МК с обвязкой (внешний кварц и т.п.). Прошит. Питание на плату с МК НЕ  подано. Тем не менее, из AVR Studio "Device Information" - "Read"  успешно. Получается, что для чтения сигнатуры чипа этого достаточно? Всегда ли? Чистый голый новый МК  у меня таким же образом не читается почему-то..... Хотя подключены все те же 6 проводков.

Я вспомнил... соответствие фьюзов все же нужно. Т.е. если кварца нет, а фьюзы на внешний настроены, то даже сигнатура не прочитается. Правда непонятно, как читается чип без напряжения. Наверное, сигнатура где-то просто сохранено в проекте Авр студии. А реального чтения нет.

 

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

56 минут назад, my504 сказал:

Надо сильно постараться, чтобы за 2 секунды изменить параметр и выдернуть питание.

За 2 секунды, конечно, вряд ли, но 2 секунды маловато, т.к. человек может не успеть перебрать режимы, т.е. надо секунд хотя бы 10 (между выбором режима), а вот за 10 сек. возможно и успеет выдернуть. НО, это все уже не актуально, т.к. буду записывать по предложенному Вами варианту без всяких задержек, т.е. просто по нажатию кнопки последовательно в пустую ячейку и при достижении границ блока - стирание и опять по кругу. В таком случае получится не меньше 100'000 возможных циклов на перезапись, а этого с головой хватит.

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

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

Правда непонятно, как читается чип без напряжения.

Это называется паразитное питание. Если посмотрите на конструкцию выходных портов контроллера увидите там защитные диоды на шину питания, входные сигналы на портах через эти диоды ПИТАЮТ контроллер. И пока хотябы на одном из выводов будет лог.1 контроллер будет получать паразитное питание, если подключен конденсатор по питанию(в программаторе например есть!) то он даже кратковременные перерывы выдерживает.

Учение - изучение правил. Опыт - изучение исключений.

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

Здравствуйте, господа! 

Делаю мигалку сыну на велосипед на ATTINY13

Хочу сделать включение и выключение одной кнопкой. 

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

 

#define F_CPU 9600000UL
#include <avr/io.h>
#include <util/delay.h>


int main(void)
{   int i;
    DDRB&=~(1<<PB4); //Настраиваем ножку PB4 в режим входа
    PORTB|=(1<<PB4);
    DDRB|=(1<<PB0); //Настраиваем ножку PB0 в режим выхода
    PORTB&=~(1<<PB0);
    DDRB|=(1<<PB1); // Настраиваем ножку РВ1 в режим выхода
    PORTB&=~(1<<PB1);
    
    
    
    while(1)
    {
        while ((PINB&(1 << PB4)) == 0){} // Ждем пока на выводе PB1 лог. 0
            _delay_ms(20);
        
        if ((PINB&(1 << PB0)) == 0) // Если на выводе PB0 лог. 0
               
            {    while(1) //Моргаем мигалками
                {
            
                for (i=1;i<=3;i++)
            {
                PORTB|=(1<<PB1);
                _delay_ms(10);
                PORTB&=~(1<<PB1);
                _delay_ms(10);    
                
            }
            for (i=1;i<=3;i++)
            {
                PORTB|=(1<<PB0);
                _delay_ms(10);
                PORTB&=~(1<<PB0);
                _delay_ms(10);
                }
            
                }
                
        
            }
            
            
        else
        {
            PORTB &= ~(1 << PB0); // Лог. 0 на выводе PB0
        }
        while ((PINB&(1 << PB4)) == 1){} // Ждем пока на выводе PDO лог. 1
    _delay_ms(20);
 }
    }

 

 

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

Спасибо. Проверьте меня: нахожусь в AS, подменю... э.-э... "прошивка". Прошиваю и читаю успешно МК на плате. Не выходя из софта, переключаю кабель программатора на чистый кристалл МК, но такой же. Нажимаю "чтение девайса". Он должен прочитаться, потому что, фьюзы я его еще НЕ прошивал, но по умолчанию, он запустится = прочитается от внутренного генератора.  А то, что чуть ниже в меню прошивки у меня в проекте стоят настройки фьюзов от ПРЕЖНЕГО мк - это не важно пока. Так?  

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

Нет ничего проще, чем ничего не делать. Мигать гораздо сложнее, чем не мигать :)
Проблема не понятна. Просто не мигайте светодиодом и всё, мигалка будет выключена.

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

 

:D  При нажатии на кнопку, 2 светодиода начинают поочередно мигать, при след нажатии надо чтобы они отключились( выключились).

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

Вы не совсем поняли суть моих постов. Они хоть и были в шутливом стиле, но не ради шутки.
Мне хотелось вытащить из Вас больше информации о проблеме. А Вы повторяете свои, так сказать, "хотелки", о которых было понятно ещё с первого Вашего поста.
По сабжу, в общих чертах (ибо вопрос в таких же и предоставлен), - опрашиваем вывод кнопки и зацикливаем программу на "ничегонеделание".

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

Я бы делал эту программу как автомат состояний, с двумя состояниями - мигает и НЕ мигает.

состояние мигает, у вас уже реализовано. Осталось с него передать управление по нажатию кнопки на состояние "не мигает" путём выхода из бесконечного цикла.

Теперь осталось реализовать состояние не мигает в виде второго бесконечного цикла в котором будет вход в режим SLEEP(зачем батарейку тратить? я бы вообще и delay заменил бы на SLEEP с выходом по прерыванию от таймера но это уже чересчур сложно будет) с выходом по прерыванию на выводе кнопки. В этом цикле проверяете нажатие кнопки с подавлением дребезга и... выход из этого бесконечного цикла если кнопка и правда нажата. Теперь осталось зациклить в бесконечность эти два бесконечных цикла и состояния будут сами себя менять по нажатию кнопки.

п.с. "состояние" в данном случае это автономный кусок кода, в данном случае логично заключенный в бесконечный цикл. Не обязательно в виде процедур, главное чтобы отдельно. Хотя в виде процедур будет наглядней.

Учение - изучение правил. Опыт - изучение исключений.

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

В 29 Январь 2018 г. в 19:35, vasekiv сказал:

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

правильный вопрос: как  правильно организовать мигалку.

автомат состояний:

Скрытый текст

 #define F_CPU 9600000UL
#include <avr/io.h>
#include <util/delay.h>

unsigned char Task_Button(unsigned char reg);
void Blink_Led ( unsigned char caunt_delay);

int main(void)
{   unsigned char Power_LED=0;
    unsigned char caunt_delay=0;
    DDRB&=~(1<<PB4); //Настраиваем ножку PB4 в режим входа
    PORTB|=(1<<PB4);
    DDRB|=(1<<PB0); //Настраиваем ножку PB0 в режим выхода
    PORTB&=~(1<<PB0);
    DDRB|=(1<<PB1); // Настраиваем ножку РВ1 в режим выхода
    PORTB&=~(1<<PB1);
    
    
    
    while(1)
    { 
        _delay_ms(20); // системная задержка ("системный тик")

        Power_LED=Task_Button(Power_LED);
        switch (Power_LED) {
             case 0:
                    PORTB&=~((1<<PB1)|(1<<PB0));   
                    caunt_delay=0; 
                     break;

             case 1:   
                    if(caunt_delay>11) {caunt_delay=0;} // циклический счетчик
                      else {caunt_delay++;} 
                    Blink_Led ( caunt_delay);
                  break;
      
             default:
             PORTB&=~((1<<PB1)|(1<<PB0)); 
            } 
     }// end  while(1)
  }// end int main(void)


unsigned char Task_Button(unsigned char reg)
//******************************************************************
// в функцию принимаем режим работы
// читаем состояние кнопки, сравниваем с предыдушим 
// состоянием и если было нажатие изменяем режим работы
// возвращаем новый режим работы
//******************************************************************
{unsigned char pinNew=0;
 static unsigned char pinOld;
       
   if((PINB&(1 << PB4)) pinNew=1;                      
   if((pinNew==0)&&(pinOld==1)) reg^=(1<<0);    
   pinOld=pinNew;
 return reg;
}

void Blink_Led ( unsigned char caunt_delay)
//*******************************************************************
//* в главном цикле считаем циклически 12 "системных тиков" от 0 до 11
//* в процедуру принимаем номер "системного тика"
//* в зависимости от номера включаем/выключаем выходы
//*******************************************************************
{
     switch (caunt_delay) {
        case 0:
        case 2:
        case 4:
             PORTB|=(1<<PB1);
        break;

        case 6:
        case 8:
        case 10:    
             PORTB|=(1<<PB0);
        break;
      
       default:
            PORTB&=~((1<<PB1)|(1<<PB0)); 
       } 
        
}

 

 

 

 

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

Кнопка с фиксацией + 1 микросхема для мигания светика - всё решение проблемы.
Или, если кнопка без фиксации, +1 триггер.

Зачем тут микроконтроллер ?

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

Подскажите, а как оптимальнее всего сделать условие для выполнения команды по удержанию кнопки? Т.е. удерживаем кнопку 2 секунды (не меньше) и происходит выполнение нужной команды. Интересует вариант для стм32

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

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

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

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

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

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

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

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

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

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

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

×
×
  • Создать...