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

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    472

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

 

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

    • Автор: Kudich
      Всех приветствую!
      Сам я программирую на стандартной среде ардуинки, и в одном проекте потребовалось увеличить частоту ШИМ на портах 5,6,9,10,11,13 Arduino Micro. На этой ардуино стоит Atmega32u4, есть тут знатоки avr? Как повысить частоту на этих пинах?
    • Автор: Evg69
      добрый день. Вернулся к микроконтроллерам после длительного перерыва. Сижу туплю и даже гугл не помог.
      Два вопроса по Atmel Studio 7. Режим отладки. Симуляция.
      1. Как включить окно в котором можно посмотреть что контроллер выплевывает
      в UART? Не содержимое регистра, а типа терминала.
      2. Как подсунуть студии файлик с содержимым EEPROM?
    • Гость Keil
      Автор: Гость Keil
      Добрый день, ситуация такая - попались мне под руку куча рассыпухи в числе которых достаточное количетво тинек и прочей лабуды - пытась хеловродить, попробовал взять готовый пример работы тиньки и лсдишника здесь также имею ардуинку как  Айсипи и чудесно мигаю светодиодом на мк прошитом ею же  так вот при попытке залить код который по ссылке чуда не произошло.
      курение мануалов лсдишника дало понять лиш одно что старший и младший биты одинаковы с лсдишником со статьи - лсдишник рабочий (игрался контрастом одной строки через V0  и потенциометр ) - как в прочем и мк, было задумано ковырнуть все это в протеусе и атмельстудии, но результатом не увенчалось. Пожалуйста тыкните носом что да где не так.
      fail.zip
    • Автор: Static
      Доброго дня всем!
      Не так давно решил опробовать использовать в схемах ATmega в корпусе TQFP и возник такой вопрос. На ней имеется аж три ноги на "-" и две под "VCC". Подсоединять нужно все или можно только по одной любой?
      Заранее благодарен за помощь.
    • Автор: Doublman
      Всем доброго времени суток.
      Развел платки - коммутаторы на основные МК.
      Платы коммутационные для HV PROG (параллельного программирования).
      Питание 5в оставил для перемычки (видно на фото).
      Комплект из 3-х плат ATMEGA 8, 16, 32, 48(P), 88, 164P, 168, 324P, 664P, 1284P, 8535, ATTINY 48, 2313.
      https://radikal.ru/fp/4f4203a9b1d54f9fbb92318c2234e576
      Имею 5 комплектов. Цена 450 за все 3 платки ("лист" на этой фотографии) Имею 5 комплектов. https://radikal.ru/fp/73ce63f7f99b4f7d9b744b2563204c1b
      Платки находится в Самаре, если почтой то +50р почте.