Максим Окатов

ATmega8a не работает if

2 сообщения в этой теме

 

Товарищи, помогите пожалуйста. Данная програмулина при нажатии на кнопку входит в функцию MinU() в которой инициализирует таймер для задержки(ждем отпустит пользователь кнопку или нет) если кнопка не отпущена то уменьшаем скважность ШИМ.

проблема в выделенной красным строчке! когда count больше 3 уменьшаем скважность, но в отладчике AVR studio, Proteus и в железе не робит.

Перепрыгивает действие в {} так будь-то условие не выполнено...

#define F_CPU 1000000L
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
unsigned char count = 0;
unsigned char a=5,s=3,b=0;

    //===================================Насройка таймера====================
void Timer_ini(void){
   TCCR1B = (1<<CS12)|(0<<CS11)|(0<<CS10);
   TCNT1 = 65535-976;
   TIMSK |= (1<<TOIE1);
   count = 0;
  }

    //===========================настройка шим===========================
void PWM_ini(void){
   ASSR=0x00;
   TCCR2=0b01101110; //На выводе OC1A единица, когда OCR1A==TCNT1, восьмибитный ШИМ
   OCR2=200;
}

//===============

void MinU(){
    unsigned char i=0;
    Timer_ini();
    while (!(PINB&0b00000010)){
        if(count>2){        //Если таймер считал более двух раз
          _delay_ms(100); // ждем 100 мс
          OCR2--; // Уменьшаем скважность
          i=1;        // были в плавном уменьшении
      }
      
   }
   if (i!=1) // если не были в плавном уменьшении
   {
       OCR2=OCR2-50;
       i=0;
   }
}

        //=======================================================
int main(void)
    {
       
        // Настраиваем порт D на выход
        DDRB = 0b00001000;
        PWM_ini();
        //Timer_ini();
        sei();
        
        
        while(1)
        {
            b=a-s;
            if (!(PINB&0b00000010))
            {
                MinU();
            }/*
            //if (!(PINB&0b00000100))
            //{
                //PlsU();
            //}*/
        }
        return 0;
    }
    
    ISR (TIMER1_OVF_vect)
    {
        count++;
        TCNT1 = 65535-976;
            }

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ARV    377

Все переменные, обрабатываемые и в прерывании и в основном цикле, должны быть объявлены volatile.

 

Поделиться сообщением


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

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Похожие публикации

    • Автор: Stratix
      Здравствуйте, у меня проблема с прошивкой разных устройств из-за программаторов. Дело в том что у меня есть некоторое количество китайских и самодельных программаторов для разных производителей, с ними постоянно какие-то проблемы, некоторые отказываются нормально работать на windows 10(другие версии ПО не устраивают), другие не работают с последними версиями сред разработки и т.д. Так же нужно прошивать схемы памяти. Хочу прошивать устройства без постоянной сборки программаторов и неудобств. Думаю о двух вариантах: взять оригинальные программаторы для всех производителей: altera, xlinx, arm, pic, avr(некоторые найти сложно, например оригинальный usb-blaster и высокая стоимость в сумме), второй вариант: взять универсальный программатор, который бы поддерживал все новые микросхемы, а вот с этим проблема, большинство универсальных программаторов не шьют stm, плис. Есть ли вообще реально универсальные программаторы? Мне было бы намного удобнее если на столе б лежал один программатор, а не куча. Смотрел список микросхем chipprog-48, пока что самый большой, к сожалению не поддерживает новые fpga, например: cyclone IV. Связывался, сказали что поддержки не будет и в будущем. Стоит ли взять chipprog-48 в 2018 году или есть программаторы лучше, с большим списком микросхем?
    • Автор: DimonRX
      Всем доброго времени суток!
      В AVR-ках я новичёк и очень нуждаюсь в вашей помощи.
      Задача у меня следующая. Есть драйвер управления серводвигателем на ATmega88. Помимо основной задачи ATmega88 через 74HC164D выводит на сдвоенный 7-ми сегментный индикатор направление вращения мотора в виде анимации (вращает сегмент по или против часовой стрелки). Рядом есть некая поделка на ATmega8, одной из задач которой является определение направления вращения мотора и, в зависимости от направления, выполнение различных действий. Как мне это сделать? Как подружить две меги? Всем заранее спасибо.
    • Автор: Kirill Lubinets
      Дано: отладочная плата STM32F303VC, индукционный датчик.

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

      Информация по датчику.
      Индукционный датчик удара, шок сенсор, Arduino может использоваться в проектах на микроконтроллерах (в т.ч. Arduino), в которых нужно следить за уровнем вибрации или подобных механических возмущений. Принцип действия датчика основан на электромагнитной индукции. Движущийся стальной, ферритовый или магнитный сердечник относительно катушки создает в катушке ЭДС, подходящую по амплитуде ударного воздействия на систему. Чувствительный элемент датчика установлен в прозрачный пластиковый параллелепипед для защиты от действий внешней среды.
      Для использования датчика нужно подключить его к Arduino контроллеру или другому микропроцессорному управляющему устройству, подать питание, создать программу для работы с датчиком или использовать готовое решение. На корпусе датчика есть два отверстия, с помощью которых можно жестко закрепить датчик на плоской поверхности. В состоянии покоя напряжение на выходе из датчика около 5 В, при возмущении напряжение на датчике падает пропорционально силе возмущения.
      Индукционный датчик удара, шок сенсор, Arduino имеет один 3-контактный разъем для подключения к контроллеру и питания:
      контакт обозначенный «–» – общий контакт;
      средний контакт – напряжение питания;
      контакт S – аналоговый выходной сигнал датчика.
      Датчик может питаться как от Arduino контроллера (другого микропроцессорного управляющего устройства), так и от внешнего источника питания. Напряжение питания 3,3 – 5 вольт постоянного тока.
      Характеристики:
      принцип действия: индукционный;
      выходной сигнал: аналоговый;
      напряжение питания: 3,3 – 5 вольт постоянного тока;
      размеры: 30 х 18 х 11;
      вес: 2 г.
      Shock.7z
    • Автор: Петр Серёгин
      Здравствуйте, у меня проблема.
      Не программируется ATmega2561-8AU. Программатор USBASP. Микроконтроллер 100% рабочий. Питание и контакты программатора припаяны правильно.
      Что можете посоветовать? 
    • Автор: RIMUS1989i
      Всем здравствуйте! Есть необходимость метирить переменное напряжение от трех источников 220v. И питание получать от них же. (1.) Набросал схемку, будет ли она мерить и с какой точностью? измерять думаю в диапазоне от 150 до 250в. по идее точность будет 0.1 вольт. (2.) Но какие подводные камни я могу поймать? (3.) Или придется еще и операционный усилитель лепить на каждый вход АЦП?

  • Сообщения

    • Там ломаться не чему. Вы точно определились что индикатор. Если нет внутри ваккума, то можно и спеца поискать чтобы он там был (стеклодув). В лабораториях по пробиркам они там есть.
    • можно попробовать только отслеживать состояние буфере по счетчику и отправлять байт только если счетчик нулевой и регистр данных пуст. Тогда гарантированно отправится только один байт. Но могут быть перерывы в передаче, а SPI шина жесткая. Поэтому и буферизированная И вообще она не очень подходит для обмена данными между контроллерами, да еще и с неопределенным протоколом. Там все должно быть четко и по правилам. Если так не получается, то используются другие шины.
    • Для того чтоб я меньше  сидел за пояльником и не тратил время в пустую. Купили мне родители  муз-центр LG DM5360K  вот как здесь https://www.dns-shop.ru/product/557a29f35aa43330/domasnaa-audiosistema-lg-dm5360k/ Приподнял я сам муз-центр и он оказался легкий . Ну мне конечно интересно стало что внутри. Вскрыл крышку и смотрю ИИП однотактник с стабилизированным однополярным 27вольт . Под ИИПом экран металлический ,и под экраном УНЧ класса-д построен  на каких то чипах, радиатор снимать не стал. В общем там два мостовых класса-д питаются стабилизированным однополярным 27вольт. Есть Bluetooth и USB для флешки ,  удобно В тех-характеристиках не указано какой там класс унч. Я думаю полную мощность 2х90ватт смело отдает, очень мощно даже пьяному. Акустика 4ом Кстати мне уже не первый муз-центр поподаеться LG основаны на классах-д с ИИП однотактниками. Это я к тому , то что не где не чего не известно из чего реализованы эти центры  
    • Так я и не понял, как лучше поставить для стабилизации режима работы светодиодов. Что поставить лучше? L7812CV L7812 KA7812 MC7812 Напряжение регулятор 12 В 1.5A,  или MP1584EN 3A Регулируемый понижающий. Светодиод будет для салона прилагается, поясните "темному"
    • тут такое дело, что если бы подготовился лучше перед покупкой, то разница в цене вообще ничего не играет. про усиление дорожки встречал инфу. после выходных займусь. так это готовое решение или надо реализовывать самому, имея атмегу+обвязку?
    • Я уже скинул 2 ссылки. Там полно математики и физики. На форум могу скинуть, но лучше создать новую тему. Что я там перевернул? Сразу пишите конкретно: что именно. Тогда будет понятно. Кеша не тупой. Он подкованный технарь, плюс изобретатель. В соционике -  Дон Кихот. Это определённый (довольно не глупый )  тип людей, которые генерируют идеи. Так, Эйнштейн тоже относился к Дон Кихотам. Я в соционике - Де Карт,  или Робеспьер. То есть, "учёный", а не изобретатель. Но к изобретателям отношусь благосклонно, потому как понимаю их роль в обществе.
    • С 10 000 мкф сильно не разбирался, измерение вниз падает, но это и понятно, заранее ждал. Нормально, там 1 Ом резистора разряда на этом конденсаторе, как 10 Ом на 1000 мкф, примерно одинаково, что как бы намекает.