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

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


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

Вообще-то, у вас взаимоисключающие условия... второй if надо бы пустить по ветке else первого IF-а.

А то что получается, условие d_Read() == 1  и last_button == 0 устанавливаете last_button = 1, и тут же проверяете на "1" оно снова срабатывает...

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

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

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

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

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

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

 

12 часа назад, Плёновщик сказал:

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

 

как-то так:

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

 


 volatile struct flag_type {
  unsigned BUTTON_ON        : 1;
  unsigned BUTTON_ON_old    : 1;
  unsigned POWER_ON         : 1;
  unsigned                  : 1;
  unsigned                  : 1;
  unsigned                  : 1;
  unsigned                  : 1;
  unsigned                  : 1;
} flag;

//******************************************************
// инициализация МК
//******************************************************
void init(void)
{

} // end init


//****************************************************
// опрос кнопки... 
//******************************************************
void button_test(void)
{   static unsigned int count;
    const int count_const = 200;
     flag.BUTTON_ON = 0;                      // считывание состояния кнопки
     if(!(PINC&(1<<PC0))flag.BUTTON_ON = 1;   // 
 
     if( flag.BUTTON_ON && flag.BUTTON_ON_old) // подавление дребезга контактов
        {                     
           if(count==count_const)  { flag.POWER_ON = !flag.POWER_ON; }
           if(count<count_const+1) { count++; }
        }  
        else
        {
           count=0;   
        }        
       flag.BUTTON_ON_old=flag.BUTTON_ON;
   
}// end button_test
//*********************************************
// основная программа 
//*********************************************

void main(void)
{
   init();
   while(1)
     {
      button_test();  
      if (flag.POWER_ON)
         {   
          // включаем устройство 
             
         }
       else
         {
         
          // выключаем устройство
         }
     }  
}
// end main

 

 

 

 

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

  • 4 недели спустя...

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

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

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

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

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

Вопрос от чайника! про АЦП
Здравствуйте всем!

вопрос нерешаемый (пока) появился...

пишу програмулину, в которой задействован АЦП (мега8)

необходимо измерение температуры...

прога вроде простая - все по книжке , везде описана...

я её написал и решил протестить.. писано и тестино в атмел 7

для тестирования проги (т.к. в ней нет реальных напряжений) вставил конфигурацию АЦП, при которой опорник - внутренний (2,56 или 5 вольт(битами кодируется), а напряжениеизмерение тоже внутреннее (1,22в,- тож битами кодируется)

при тестировании в отладчике (атмел7) на выходе в регистрах пустые значения...

не пойму в чем дело: то-ли отладчик тупит, то-ли сам дурак...

перепробовал все (что придумал) - конфигурации менял - толку ноль...

мож кто сталкивался.... или отладчик такой...

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

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

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

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

да...

извините ...ща срисую кусок проги...

это кусок конфигурации АЦП

.....; конфигурируем АЦП0
    ldi r21,$8E ;ацп-вкл, режим одиночный, прерывание разрешено,частота 8/64=125кгц
    out adcsr,  r21 ;конфигурируем
    ldi r21, 0 ;опорник внешний, выравнивание вправо, канал 0
    out admux, r21
    ldi r21, $90 ; режим снижения шумов АЦП
    out mcucr, r21 ;конфигурируем
    clr r21
    sei
    ;конец конфиг ацп ....

далее кусок для запуска...

.....iztem:;подпрограмма обработки измерения температуры
    push r16
    push r17
    ; начало процедуры измерения темп
    sbi adcsr, adsc ;начинаем измерение
    sleep
    mov r24, r16 ;младший байт
    mov r25, r17 ;старший байт темп
    sbi adcsr, adsc
    sleep
    add r24, r16 ;складываем оба значения
    adc r25, r17.....

Далее идет обработка значений...

ну и обработка прер...

...aadc:;подпрограмма обработки прерывания АЦП
    in r16,adcl ;чтение младшего байта
    in r17, adch
    reti....

теперь действия...

на этапе конфигурации или перед запуском АЦП вручную устанавливаю биты в атмел студио 7 refs - 11 или 01 (5В или 2,56В)

биты mux - 1110 - вход напряжения1,22В

на выходе регистры ADC в атмел всегда нули...

 

 

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

Выложите лучше весь текст программы с использованием опции <Код>. 

И расскажите как отлаживаете.

Да, и тип процессора озвучьте.

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

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

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

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

Да, студия работу АЦП не симулирует. Поэтому и нули. Для отладки либо заглушку ставить, либо на реальном железе отлаживать когда остальное уже отлажено.

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

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

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

соответствующий пин по идее должен при симуляции находится в высоком состоянии

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

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

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

1 час назад, Григорий Т. сказал:

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

Я имел ввиду внутренний подтягивающий резистор , он внутри МК , но для студии он снаружи , как и ацп .PUr.jpg

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

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

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

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

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

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

VMLAB прекрасно симулирует и резистор, и работу АЦП. Попробуйте в ней отладить.
 

На сайте последняя версия VMLAB 3.15 от 2009 года, она нормально работает с новыми авр-ками с приставкой А?
Ссылка на комментарий
Поделиться на другие сайты

Проект остановился, к сожалению. Однако наиболее распространенные среди любителей поддерживает. Какой МК интересует?
 

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

14 часа назад, Григорий Т. сказал:

Выложите лучше весь текст программы с использованием опции <Код>. 

И расскажите как отлаживаете.

Да, и тип процессора озвучьте.

весь текст оч.  длинный .... около 3кб да и не доделан еще .... это куски проги, где ацп применяется

проц -  мега8

пробовал по разному:

1 при инициализации ацп ставил сразу как надо для проверки (5В и 1,22В)

далее перед измерением контрольная точка останова, затем запуск процедуры и контрольная точка останова по прерыванию от АЦП

другие варианты, но суть та-же - контрольные точки останова  (ADC посмотреть)

...попробую че-нибудь короткое сочинить на эту тему и опробовать в разных атладчиках

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

Проект остановился, к сожалению. Однако наиболее распространенные среди любителей поддерживает. Какой МК интересует?
 

Интересуют обычные, такие как тини 13(VMLAB его не поддерживает), 2313, меги 8, 16. Последние два поддерживает, без литер А. В поддерживаемых указан AT90S2313, будет ли работать с ATtiny2313A? У них прямая совместимость, по идее должно.
Ссылка на комментарий
Поделиться на другие сайты

Есть отличия в периферии (у Attiny2313 она более "продвинутая"). На Attiny13, похоже, есть заплатка (надо разобраться, самому интересно стало).

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

Здравствуйте. 

Недавно сделал ночник, на основе RGB-светодиодов, который плавно меняет цвета. На днях, придя домой, после тяжелого трудового дня, решил (больше для саморазвития) добавить запоминание текущих цветов, чтобы при выключении-включении цвета не менялись. Сразу не подумав, просто в eeprom-переменные каждый проход цикла записывал текущий float. То что программа странно работала - это одно (например, почему-то 2 цвета всегда вместе менялись, один только отдельно был, хотя по логике - у каждого цвета своя синусоида, со своей частотой). Но утром проснувшись, я подумал, "а не имеет ли ограничений на количество записей eeprom?".

Вот такой вопрос, если МК (1-мегагерц) ночь проработал в режиме "каждые 6 тыс. тактов записывать 3 float-значения" - на сколько большая вероятность порчи eeprom? Правильно ли я вообще понимаю этот процесс?

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

Ресурс у EEPROM около 100000 циклов, и каждые 6000 тактов ты записывать не сможешь, скорей всего у тебя банально программа работает неправильно! Запись ОДНОЙ ячейки в EEPROM - порядка 1...10мс, и если ты игнорируешь готовность модуля к записи, чтобы обеспечить цикл в 6000 тактов то вероятно нифига ты не записываешь. Либо не обеспечиваешь цикл в 6000 тактов, находясь в ожидании окончания процесса записи.

Причем запись происходит ПОБАЙТНО, записывать параллельно не выйдет. А только одно твоё FLOAT-значение, скорей всего занимает 4 байта, либо и тут алгоритм даёт сбой - сохраняешь только первый байт по ссылке.

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

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

  • 3 недели спустя...

Всем привет. напомните плиз такую вот вещ.

есть у меня например несколько переменных с именами типа

data_1;
data_2;
data_3;
и т.д.

и есть у меня цикл for в теле которого я хочу производить какие либо действия над переменными что выше и мне нужно выбирать переменные по порядку

я в цикле for веду декримент переменной i.

так вот забыл как правильно подставить эту i вместо цифры в имени переменной.

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

Не знаеш как? Спроси у Google'а !!!

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

6 минут назад, Viktor26 сказал:

так вот забыл как правильно подставить эту i вместо цифры в имени переменной.

Никак. Имя - это константа для компилятора.
Как вариант - массив с указателями и инициализируем его по именам переменных.


 

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

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

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

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

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

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

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

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

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

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

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

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