Обявления

Для полноценной работы рекомендуется пройти регистрацию.

Рекламные сообщения будут удаляться вместе с пользователем. Что есть реклама - буду решать я.

Ппрошу помощи с кодом ATtiny13a

Здесь только проекты на ATtiny

Ппрошу помощи с кодом ATtiny13a

Сообщение SMDT » 31 май 2018 20:40

Здравствуйте. Откровенно говоря, хотел сам разобраться, но зашел в тупик. Не хватает знаний. Может поможете, или пнете в нужное направление !?
Суть программки - В основном цикле таймер остановлен. При нажатии на кнопку (лог.0), срабатывает внешнее прерывании INT0 и в нем запускается плавно ШИМ от нуля до определенной величины. При отпускании кнопки - уходим опять в вечный цикл. Вроде все работает, но скважность ШИМ постоянно увеличивается и потом уменьшается. И так беcконечно, пока не отпустить кнопку. Как можно исправить этот момент? Подскажите пожалуйста.
Код: Выделить всё
#define F_CPU 1200000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
unsigned int i=0;

void init_pwm()
{
   
   TCCR0A |=(1<<WGM00); // Режим Phase correct PWM, в этом режиме счет идет до 255, а потом обратно до 0
   TCCR0A |=(1<<COM0A1) | (0<<COM0A0); // 0 при 1-м равенстве регистров TCNT0 и OCROA и 1 при 2-м равенстве. (инвертированный ШИМ-сигнал)
   TCCR0B |= (1<<CS01);  // делитель 8
   OCR0A =0;// регистр сравнения
   
   
}
//--------------------------------------------------------------------------
void start_pwm()
{
   
   while(i<95)
   {
      i=i+1;
      OCR0A=i;
      _delay_ms(25);
   }
   
}
//--------------------------------------------------------------------------
void stop_pwm()
{
   TCCR0B= 0x00;
   TCCR0A= 0x00;

   
}
//------------------------------------------------------------------------------
ISR (INT0_vect) /* Объявление функции прерывания INT0 (порт PB1) */

{


    init_pwm();
    start_pwm();
    asm("sei"); // глобальное разрешение  прерываний//

}


//------------------------------------------------------------------------------


int main(void)
{

   
   DDRB|=(0<<PB1)|(1<<PB0)|(0<<PB4)|(1<<PB2);
   PORTB=0b00010010;
   MCUCR |= (0<<ISC01)|(0<<ISC00); // Низкий уровень на INT0 генерирует запрос прерывание//
   GIMSK |= (1<<INT0); //Разрешение работы прерывания INT0 на выводе PB1//
   GIFR= 0x00; // Флаг прерываний//
   TIMSK0|=(1<<OCIE0B);
      
   init_pwm();
   asm("sei"); //глобальное разрешение  прерываний//
   
   while(1)
   {
      stop_pwm();
   }
   
   
   

}

SMDT
Пробегал мимо
 
Сообщения: 1
Зарегистрирован: 31 май 2018 20:21
Откуда: Москва

Вернуться в ATtiny



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11

cron