roboforum.ru

Технический форум по робототехнике.

Проблема с ATtiny13

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Проблема с ATtiny13

Сообщение simer » 29 янв 2008, 12:27

ATtiny13.
Генерация звука.
Таймер дергает ногой OC0A. При постоянном значении OCR0A полет нормальный.
Задача стоит в имитации звука сирены, т.е. частота должна плавно повышаться и понижаться.
Но при изменении в цикле

Код: Выделить всёРазвернуть
for (i=10; i>0; i--)
{
   OCR0A=3+i;
   delay_ms(20);
}

for (i=0; i<10; i++)
{
   OCR0A=3+i;
   delay_ms(20);
}


наблюдается нестабильность генерации (звук какими-то рывками), по истечении некоторого времени может (но не всегда) произойти "прорыв" на некоторое время, и звук становится нормальным, т.е. плавно понижается и повышается.

Что не так?
Аватара пользователя
simer
 
Сообщения: 12
Зарегистрирован: 19 янв 2008, 20:33

Re: Проблема с ATtiny13

Сообщение Master » 29 янв 2008, 13:40

Ты кажется противоречишь сам себе. С одной стороны ты управляешь звуком по прерыванию таймера, а изменения делаешь по ходу программ, да еще и в цикле да и еще используешь паузу. Запиши в прерывание таймера, изменение частоты звучания.
Аватара пользователя
Master
 
Сообщения: 4468
Зарегистрирован: 21 дек 2006, 19:56
Откуда: Украина, г.Одесса
прог. языки: Delphi и С

Re: Проблема с ATtiny13

Сообщение simer » 29 янв 2008, 14:23

Master писал(а):Ты кажется противоречишь сам себе. С одной стороны ты управляешь звуком по прерыванию таймера, а изменения делаешь по ходу программ, да еще и в цикле да и еще используешь паузу. Запиши в прерывание таймера, изменение частоты звучания.


Ну я вроде бы не использую прерывания :)

Код: Выделить всёРазвернуть
Chip type           : ATtiny13
Clock frequency     : 9,600000 MHz
Memory model        : Tiny
External SRAM size  : 0
Data Stack size     : 16
*****************************************************/

#include <tiny13.h>   
#include <delay.h>


// Declare your global variables here
int i;

void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Func5=In Func4=In Func3=In Func2=In Func1=In Func0=Out
// State5=T State4=T State3=T State2=T State1=T State0=0
PORTB=0x00;
DDRB=0x01;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 9,375 kHz
// Mode: CTC top=OCR0A
// OC0A output: Toggle on compare match
// OC0B output: Disconnected
TCCR0A=0x42;
TCCR0B=0x05;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;

while (1)
      {
      // Place your code here
       for (i=10; i>0; i--)
       {
         OCR0A=3+i;
         delay_ms(20);
       }

       for (i=0; i<10; i++)
       {
         OCR0A=3+i;
         delay_ms(20);
       }
     

      };
}


И как бы мне записать в прерывание таймера изменение частоты звучания, если таймер у меня один и я использую его для генерации частоты.
Аватара пользователя
simer
 
Сообщения: 12
Зарегистрирован: 19 янв 2008, 20:33

Re: Проблема с ATtiny13

Сообщение Master » 29 янв 2008, 15:17

Таймер дергает ногой OC0A.

Как же ты не используешь таймер? :) Сам же написал что используешь.

Но код какой-то странный ты не инициализируешь таймер, но зачем то дергаешь OCR0A
Я так слету нимагу сказать что куда, но это не верно, почитай в курсе там про таймер очень хорошо расписано.
Аватара пользователя
Master
 
Сообщения: 4468
Зарегистрирован: 21 дек 2006, 19:56
Откуда: Украина, г.Одесса
прог. языки: Delphi и С

Re: Проблема с ATtiny13

Сообщение simer » 31 янв 2008, 19:15

Проблема решилась.

Подсказали на electronix.ru
Дело в том, что я менял значение регистра OCR0A без отслеживания значения счетчика TCNT0.
А смена OCR0A может происходить только тогда, когда содержимое таймера равно 0 или 1.
Простое решение: перед изменением OCR0A добавить
Код: Выделить всёРазвернуть
while (TCNT0>2);
Аватара пользователя
simer
 
Сообщения: 12
Зарегистрирован: 19 янв 2008, 20:33


Вернуться в Микроконтроллеры

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

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