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

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

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

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

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

} 
Контактная информация:
Реклама
Закрыто

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