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

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
m1sh
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Пн янв 14, 2008 12:29:09
Откуда: Новомосковск

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

Сообщение 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... и то как-то странно.. не могу разобратся что где не так...

Я только учусь..
Аватара пользователя
Neekeetos
Держит паяльник хвостом
Сообщения: 993
Зарегистрирован: Пн сен 18, 2006 11:16:05
Откуда: Тула
Контактная информация:

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

Сообщение 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

}
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»