Attiny13 и формирование задержки

Обсуждаем контроллеры компании Atmel.
Ответить
xcoma
Родился
Сообщения: 11
Зарегистрирован: Ср янв 22, 2014 20:26:04

Attiny13 и формирование задержки

Сообщение xcoma »

Всем привет! Изучать МК начал недавно, появилась задача сделать простой таймер от 1 мин до нескольких часов, который включает и отключает нагрузку по заданным интервалам.
Попробовал с помощью циклов с delay_ms(), но оказалось, что точность "хода" вообще никакая, отстает даже за 1 мин на несколько сек. Следовательно надо тактировать прерывания внешним генератором и уже в процедуре обработки прерываний сделать RTC. У attiny13 нет возможности подключить кварц напрямую, подскажите как наиболее просто организовать внешние прерывания с частотой 32678 гц?
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Attiny13 и формирование задержки

Сообщение pyzhman »

Не обязательно 32768. Можно любой частоты. Любой внешний генератор. А самим мк уже пересчитать.
Docendo discimus
xcoma
Родился
Сообщения: 11
Зарегистрирован: Ср янв 22, 2014 20:26:04

Re: Attiny13 и формирование задержки

Сообщение xcoma »

Вот бы посоветовали наиболее простой и стабильный генератор для МК
Аватара пользователя
Baasil
Говорящий с текстолитом
Сообщения: 1641
Зарегистрирован: Пн авг 25, 2014 21:52:26
Откуда: Ленинград

Re: Attiny13 и формирование задержки

Сообщение Baasil »

На делеях у вас и с кварцевым генератором ничего толкового не выйдет) Там точность плюс-минус километр.
Делайте на прерываниях по переполнению таймера - даже на внутреннем RC генераторе за час пара-тройка секунд уход будет.
Аватара пользователя
Mishany
Электрический кот
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Re: Attiny13 и формирование задержки

Сообщение Mishany »

Если нужна точность, используйте спец микросхему PCF8583 или подобные.
Если точность +-5% то можно и в мк все сделать
Аватара пользователя
НАПАЛМ
Это не хвост, это антенна
Сообщения: 1314
Зарегистрирован: Пт ноя 27, 2009 19:47:13
Откуда: Казань

Re: Attiny13 и формирование задержки

Сообщение НАПАЛМ »

Сделайте так, чтобы у вас срабатывало прерывание таймера каждые Х мс, а в прерывании декремируйте какую-нибудь переменную Y. Тогда у вас получится делей длительностью X*Y мс. Кроме того, такой делей не будет мешать работе основной программы.
xcoma
Родился
Сообщения: 11
Зарегистрирован: Ср янв 22, 2014 20:26:04

Re: Attiny13 и формирование задержки

Сообщение xcoma »

Ок, буду пробовать на прерываниях по переполнению таймера на внутреннем RC генераторе, если уход будет небольшим, то подойдет.
Спасибо всем за оперативную помощь
xcoma
Родился
Сообщения: 11
Зарегистрирован: Ср янв 22, 2014 20:26:04

Re: Attiny13 и формирование задержки

Сообщение xcoma »

Всем Hi.
Попробовал разобраться с прерываниями от таймера/счетчика, с помощью мастера CodeVision, сделал пограммку, которая меняет состояние 0-го пина порта B на противоположное (к нему подключен светодиод) как только таймер достиг значения #FF 15 раз (это должно соответствовать интервалу 1 с.)

Спойлер#include <tiny13a.h>
int perepoln=0;

// Timer 0 output compare A interrupt service routine
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
if (perepoln>15)
{perepoln=0;
PINB.0=~PINB.0;}
else {perepoln++;}


}

// Declare your global variables here

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: 3,906 kHz
// Mode: CTC top=OCR0A
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x02;
TCCR0B=0x05;
TCNT0=0x00;
OCR0A=0xFF;
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=0x04;

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

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// Global enable interrupts
#asm("sei")

while (1)
{
// Place your code here

}
}


собственно возник трабл: возникает прерывание, состояни светодиода меняется 1 раз и все! как-будто второе прерывание не возникает. Прошу помощи, укажите что не так?
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: Attiny13 и формирование задержки

Сообщение ibiza11 »

У вас ошибка. В регистр PORTx выводим, из регистра PINx читаем.
Ставим плюсы: )
xcoma
Родился
Сообщения: 11
Зарегистрирован: Ср янв 22, 2014 20:26:04

Re: Attiny13 и формирование задержки

Сообщение xcoma »

Уррра!! Заработало! Спасибо
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Attiny13 и формирование задержки

Сообщение pyzhman »

Вместо

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

if (perepoln>15)
 {perepoln=0;
 ...}
 else {perepoln++;}

пишите сразу

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

if (++perepoln>15)
 {perepoln=0;
 ...}
Docendo discimus
Ответить

Вернуться в «AVR»