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

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;
            }

 

 

 

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


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

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
ARV    306

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

 

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

    • Автор: Хангусейн
      ВЫВОД РАЗНЫХ ПЕРЕМЕННЫХ ТО ИСТ 2 ПЕРЕМЕННЫХ НА 4 РАЗРЯДНЫЙ 7 СЕГМЕНТНЫЙ ИНДИКАТОР ПРИ ДИНАМИЧЕСКОМ ИНДИКАЦИИ ПЛИЗ ЕСЛИ МОЖНО  ИЗМЕНИТ МОЙ КОД  ПРИКЛЕЕННЫЙ ФАЙЛЕ ЗАДАВАТЬ 2 РАЗНЫХ ПЕРЕМЕННЫХ ДОПУСТИМ i,r  
      динам индикация.txt
    • Автор: admin
      Сайт Паяльник открывает обучающий видеокурс по AVR-микроконтроллерам.
      В этой теме "обратной связи" будем постепенно добавлять новые видеоролики с нашего канала. Здесь можно задавать вопросы, давать рекомендации, критиковать, оставлять отзывы и пожелания, а также запросы на тему будущих видеоуроков.
      Ведет видеокурс наш форумчанин kobzar.
      Профиль пользователя на сайте cxem.net. Там же финансовые реквизиты для тех, кто пожелает финансово отблагодарить автора данного видеокурса
      Подписка на YouTube канал
      Краткий обзор сред разработки для различных микроконтроллеров на сайте: http://cxem.net/software/soft_mcu.php
      Внимание начинающим! Перед тем, как задавать вопросы не по теме видеоуроков, прочитать:
      Статьи по МК для начинающих
      Книга по программированию микроконтроллеров AVR
      Также, здесь же на форуме рядом с этой темой смотрите прикрепленные темы: для начинающих, по языку Си и т.д. Все вопросы не по видеокурсу задавайте только там. С этой темы подобные вопросы удаляются
      Кракозябры вместо русских букв
      Ребята - спешу сообщить что найден метод борьбы с кракозябрами вместо русских символов, при работе с ЖК. Дело в том, что у некоторых из вас, проект создается в кодировке UTF-8, а наша библиотека работает только с ср1251
      Фикс:
      1.Открываем проект
      2. File - Advanced Save Options
      3. Вместо кодировки UTF-8 выбираем Cyrillic(Windows) - cp1251
      Сохраняем, сохраняем проект - компилируем!
      Добавлено 12.01.16 :
      Изменённые версии библиотеки lcd_5110 :
      От COKPOWEHEU - Ссылка на пост , Ссылка на github
       
    • Автор: polych
      Здравствуйте.
      У меня возникла проблема в прошивке микроконтроллера Atmega8.
      Задача заключается в том чтобы сравнивалось опорное на напряжение АЦП с подаваемым на вход АЦП напряжением и далее результат выводился на дисплей. У меня возникли сложности с настройкой АЦП, как я думаю оно находится в спящем режим так как когда я загружаю hex файл в Proteus и запускаю пошаговую отладку, то мои условия не выполняются и в переменной в которую я прописываю значение подаваемого напряжения постоянно находится значение опорного напряжения.
      Код пишу в Atmel Studio 6 на С
      Симуляцию делаю в Proteus
      Очень нужна помощь
      Спасибо!
      Примерный код в Atmel,не судите строго только начинаю изучать микроконтроллеры
      #define F_CPU 1000000UL
      #include <avr/io.h>
      #include <avr/interrupt.h>
      #include <util/delay.h>
      static volatile int u = 0;
      static volatile float v;
      int main(void)
      {
       DDRB=0xFF;
       PORTB=0x00;
       DDRC=0x00;
       PORTC=0xFF;
       
       //настройка АЦП//
       ADCSRA |=(1<<ADEN)//включение ацп
       |(1<<ADPS1)|(1<<ADPS0)|(1<<ADFR);//ADPS2-ADPS0-тактовая частота АЦП???
       //ADCRA=0x83
       ADMUX |= (0<<REFS1)|(1<<REFS0)//внешний ИОН
       |(0<<MUX0)|(0<<MUX1)|(0<<MUX2)|(0<<MUX3); //вход PC0
       //ADMUX=0x00
          while(1)
          {ADCSRA |=(1<<ADSC);//начинаем преобразование
           while ((ADCSRA&(1<<ADIF))==0);//ждём флага окончание преобразование
          _delay_ms(5);
           u=ADCW;// считываем ADC
          
           v = (float) u*0.0048828;
           if (v>=2.1){
            PORTB=0x01;
           }
           else{
            PORTB=0xFF;
           }
           _delay_ms(5);
      Также начальный проект в протеус, опять же не судите строго)
      micro.pdsprj
    • Автор: paulb
      Есть задумка собрать вольтметр постоянного напряжения (до 1000В) на ГРИ, использовав за основу популярную схему часов. Либо на базе микросхемы ICL7107, если это возможно. Знающих прошу помочь.
    • Автор: ruhi
      Меня тут порадовали задачкой для АВР (я когда то очень много таких порешал, на практике - напомнили молодость ):
      http://cxem.net/mc/mc446.php
      сформулирована так: Нужно два быстрых элемента "И" и одновибратор. Можно использовать серию 155 у которой время срабатывания даже меньше получается, но не подходит по энергопотреблению. Хотелось бы сделать это на Attiny13.
      Остановимся пока на 
      Я, соответственно, предложил реализацию:
      Можожно сделать так:
      loop1:
      in reg1, pina; 1-tick
      in reg2, pinb; 1-tick
      and reg1, reg2; 1-tick
      LSR reg1; 1-tick
      out portB, reg1; 1-tick
      rjmp loop1; 2-tick

      Это код на ассемблере , который реализует два «элемента И» на АВР со временем срабатывания около 1мкс, в зависимости от тактовой частоты МК.
      На частоте 16 MHz это 7/16 мк-секунды(7 ticks, на самом деле +4 = 11тиков максимум время срабатывания, позже поясню), входы элемента-И должны быть на одинаковых пинах условных портов A and B, а выходы следующие по старшинству биты-пины. Вообще говоря перед выводом в порт, скорее всего, нужно будет еще маску добавить это еще +1 тик!

      Цикл можно переделать на использование только одного порта. Мой вариант в закодированном архиве приатачен, ключ выложу через неделю!
      Мне интересно можно ли сделать быстрее чем у меня получилось! Сможет кто нибудь предложить вариант решения?
      В общем, похоже что, на ассемблере можно написать «два элемента И» со временем срабатывания около 1.5мкс даже на 10МГц при произвольном расположении ног на одном порту.
      bestAvrCodeForAnd.7z