Страница 1 из 1

Помогиет с аппаратным шим на Tiny13

Добавлено: Пт окт 02, 2009 09:08:16
m1sh
кнопка подключена к выводу INT0
выход ШИМ PB0(OCOA)...

грубо по нажатию на кнопку (прерывание)
должна плавно расти яркость...
схема примерно выглядит так

Изображение

набросок программы - пока без кнопки...

Код: Выделить всё


#include <avr>       
#include <util>             
#include <avr>

volatile int tim1,cnt=0;
volatile int tim=0;
volatile int inp=0;
char Step=0xFF;


ISR(TIM0_OVF_vect){

TCNT0=0xFE; 

 cnt++; 
 //Каждый 80-й заход в прерывание 
 if (cnt==79){ 
  cnt=0;   
  //254 шага увеличения ширины импульса 
  if (Step !=0xFE ) { 
   Step--; 
   OCR0A=Step;     
  } 
 } 
}


ISR(INT0_vect){
   
 //inpu=1;
 //tim1++;
 }


int main(void)                           // майн прог
{

DDRB = (1<<PB1); //
PORTB = (1<<PB1) ; // подтяжка
MCUCR= (1<<ISC01)|(0<<ISC00); // (прерывание по low level)
TIMSK0 = (1<<TOIE0); //по переполнению таймера
GIMSK = (1<<INT0);
TCCR0A=0b10100011; // Fast PWM
TCCR0B=0b00000001; // без предделителя
OCR0A=0x00; 
OCR0B=0x00;
TCNT0=0x10;

sei();

while(1) { } //end while

}

 симулируя в протеусе - ШИМ почемуто работает на PB1... и то как-то странно.. не могу разобратся что где не так...


Re: Помогиет с аппаратным шим на Tiny13

Добавлено: Пт окт 02, 2009 21:22:43
Neekeetos
m1sh писал(а):кнопка подключена к выводу INT0
выход ШИМ PB0(OCOA)...

грубо по нажатию на кнопку (прерывание)
должна плавно расти яркость...
схема примерно выглядит так

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

Так работает:

Код: Выделить всё

volatile int tim1,cnt=0;
volatile int tim=0;
volatile int inp=0;
volatile char Step=0xFF;


ISR(TIM0_OVF_vect){

//TCNT0=0xFE;

 cnt++;
 //Каждый 80-й заход в прерывание
 if (cnt==79){
  cnt=0;   
  //254 шага увеличения ширины импульса
  {
   Step--;
   OCR0A=Step;     
  }
 }
}


ISR(INT0_vect){
   
 //inpu=1;
 //tim1++;
 }


int main(void)                           // майн прог
{

DDRB = (1<<PB0); //
PORTB = (1<<PB1) ; // подтяжка
//MCUCR= (1<<ISC01)|(0<<ISC00); // (прерывание по low level)
TIMSK0 = (1<<TOIE0); //по переполнению таймера
//GIMSK = (1<<INT0);
TCCR0A=0b10100011; // Fast PWM
TCCR0B=0b00000001; // без предделителя
OCR0A=0x00;
OCR0B=0x00;
TCNT0=0x10;

sei();
volatile  char ee;
while(1) {ee++; } //end while

}