Обсуждаем контроллеры компании Atmel.
Ответить

Re: Attiny13 и серво. Помогите найти ошибку в коде.

Пт мар 09, 2018 12:42:11

Да и в конфиге надо включить RC-генератор на 9,6МГц, и делитель на 8.
tytar писал(а):Вы поменяли значения
TCCR0A = 0x81;
TCCR0B = 0x03;
На какую частоту они сейчас настроены?
Код:
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 18,750 kHz
// Mode: Phase correct PWM top=0xFF
// OC0A output: Non-Inverted PWM
// OC0B output: Disconnected
// Timer Period: 27,2 ms
// Output Pulse(s):
// OC0A Period: 27,2 ms Width: 0 us

Re: Attiny13 и серво. Помогите найти ошибку в коде.

Пт мар 09, 2018 12:58:13

В Конфиге на плату ?
Сори за глупый вопрос я только начал с этим разбираться? я шью через ардуино иде там докинута папка для тини13 там есть вроде конфиг это в нем?

Re: Attiny13 и серво. Помогите найти ошибку в коде.

Пт мар 09, 2018 13:50:16

Да Frequency 1.2MHz, будем надеяться что конвиг он то же шьет.

Re: Attiny13 и серво. Помогите найти ошибку в коде.

Пт мар 09, 2018 15:00:43

Вопрос по TCCR0B = 0x03;
Тут делитель на 64 выходит
Для делителя на 8 нужно 0х02, как мне кажется
Или Нужен делитель на 64 именно ?

Re: Attiny13 и серво. Помогите найти ошибку в коде.

Пт мар 09, 2018 18:24:01

Нужен период импульса в 20миллисекунд.
В моем примере Timer Period: 27,2 ms.
Может вообще не работать, у Attiny13 нет 16 битного таймера, нет регистров ICR, что бы выдержать четко период импульса в 20миллисекунд.
Можно попробовать только программный ШИМ использовать.

Добавлено after 1 hour 37 minutes 33 seconds:
Держи, я тебе замутил программный ШИМ, 20миллисекунд, для Frequency 1.2MHz.
Спойлер
Код:
#include <avr/io.h>         // инициализация портов ввода-вывода МК
#include <avr/sleep.h>      // здесь описаны режимы сна
#include <avr/interrupt.h>   // работа с прерываниями
#include <util/delay.h>      // описание программных задержек
#define F_CPU 1200000UL

#define SERVO PB0

volatile unsigned char counter=0;
volatile unsigned char lev_ch1 =1; //длительности ШИМ;
volatile unsigned char buf_lev_ch1;

volatile unsigned char start =0;



ISR (TIM0_OVF_vect)  //обработка прерывания по переполнению таймера
{
  TCNT0=0xB6;
  if (++counter==0) //счетчик перехода таймера через ноль
  {
    buf_lev_ch1=lev_ch1; //значения длительности ШИМ

    PORTB |=(1<<PB0); //подаем 1 на все каналы
  }
  if (counter==buf_lev_ch1) PORTB&=~(1<<PB0); //подаем 0 на канал
}


// Обработчик прерываний
ISR(INT0_vect)  // Прерывание по низкому уровню на PB1
{           
   while ((PINB & (1 << PB1)) == 0) {}
start=1;





int main(void) {
             
   PORTB = 0b11101111;  // Выставить на PB4 - "0"
   DDRB = 0b00010000;  // Указатель пина

   DDRB |= (1 << SERVO);// выходы = 1
   PORTB &= ~(1 << SERVO); // по умолчанию отключены = 0
   
   // Инициализация прерываний по INT0   
   GIMSK = 0b01000000; // Разрешение прерываний INT0 на входе PB1
   MCUCR = 0b00000000; // при перепаде низком уровне на PB1
   sei(); // Общее разрешение прерываний
     
   // Инициализация режима сна
   set_sleep_mode (SLEEP_MODE_PWR_DOWN);
   while(1)
   {
   
   if (start) {
 TIMSK0 = 0b00000010; // включить прерывание по переполнению таймера
  TCCR0B = 0b00000001; // настройка таймера, делитель выкл
  TCNT0=0xB6;

PORTB |= (1<<PB4);   // Выставить на PB4 - "1"
_delay_ms(50);
   do // Нарастание яркости
    {
     lev_ch1++;
      _delay_ms(100);
    }
    while(lev_ch1!=30);

    do // Затухание
    {

     lev_ch1--;
      _delay_ms(100);
    }
    while(lev_ch1!=1);

   _delay_ms(50);
   
   TIMSK0 = 0b00000000; // выключить прерывание по переполнению таймера
   TCCR0B = 0b00000000; //
 
   PORTB &= ~(1<<PB4); // Выставить на PB4 - "0"   
   
   start=0;
   
   }
   
   
   
      sleep_enable();   // разрешение режима сна
      sleep_cpu();   // активация режима сна
   }
   
   
}
Ответить