Перейти к содержанию

Помогите С Таймером Tiny 13A Code Vision


tygaimaks

Рекомендуемые сообщения

Уважаемые знатоки, помогите мне разобраться с таймером на мк attiny 13A.

Ну ни как он нехочет работать.

Хочу сделать задержку дворников в машину.

Вот исходный код в Code vision

#include <tiny13.h>

#include <delay.h>

int i =0;

interrupt [TIM0_COMPA] void timer0_compa_isr(void)

{

PORTB=0b000111;

TCNT0=0x00;

}

void main(void)

{

DDRB=0xff;

PORTB=0x00;

TCCR0A=0x00;

TCCR0B=0x05;

TCNT0=0x00;

OCR0A=0x12;

OCR0B=0x50;

GIMSK=0x00;

MCUCR=0x00;

TIMSK0= 0b110;

#asm("sei")

//***

while (1)

{

go:

goto go;

};

}

Мк тактируется 4,8 Мгц.

Вот как я расчитывал счетчик на 1 секунду :

4800000/1024 =4688

4688 в шестнадцатеричной системе равно 1250

TIMSK настроен на прерывания от кампаратора А и В по даташиту.

Проблема в том, что прерывание происходит раньше секунды. Испытывал в Протеусе.

Прикладываю программу + протеус

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

SOFT_AvrCalc.exe

44 кб

http://www.ugolok-ma...OFT_AvrCalc.zip

при таком предделителе нельзя получить 1 сек точно

удобно выбрать предделитель 256

4179052.jpg

Изменено пользователем Гость
Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

SOFT_AvrCalc.exe

44 кб

http://www.ugolok-ma...OFT_AvrCalc.zip

при таком предделителе нельзя получить 1 сек точно

удобно выбрать предделитель 256

4179052.jpg

Александр, спасибо, но в tiny13 счетчик 8 битный, TCNT1L и H там нету.Надо для восьмибитного расчитать.Вообще количество секунд ну критично.Нужно чтобы прерывания происходили через равные промежутки времени.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Таймер у вас работает с частотой 4688 Hz

Разрядность счетчика Timer/Counter один байт, значения он может принимать от 0 до 255.

Получить задержку в секунду, так как вы хотите не получиться, так как CompareA и CompareB это не общий регистр, а два отдельные одно байтовые регистры.

(когда счетчик досчитает до значения OCR0A произойдет прерывание interrupt [TIM0_COMPA] void timer0_compa_isr(void),

"после" достижения счетчиком значения OCR0В произойдет прерывание interrupt [TIM0_COMPВ] void timer0_compв_isr(void))

Чтобы решить вашу задачу, вам необходимо создать глобальную переменную (не забудьте volatile)

присваиваете ей значение 4688/255 = 18 и в прерывании при переполнении таймера уменьшаете ее на единицу, когда она достигнет ноль выполняете то, что вам нужно.

Изменено пользователем codenamehawk
Ссылка на комментарий
Поделиться на другие сайты

Мк тактируется 4,8 Мгц.

Вот как я расчитывал счетчик на 1 секунду :

4800000/1024 =4688

4688 в шестнадцатеричной системе равно 1250

Что у вас обозначает число 1024 ?

Когда ответите на этот вопрос, поймете почему задержка не секунда, а лишь 1/1024 секунды.

1024 это предделитель

я уже вообще запутался,

TCCR0A=0x00;

TCCR0B=0b00000011;

TCNT0=0x00;

OCR0A=0xef;

OCR0B=0x00;

GIMSK=0x00;

MCUCR=0x00;

TIMSK0= 0b110;

при частоте 128 кгц прерывание происходит через 0,996314 секунды. если поставить число f0 то получается чуть больше секунды.А надо точно секунду.Помогите пожалуйста.

Изменено пользователем tygaimaks
Ссылка на комментарий
Поделиться на другие сайты

Чтобы было точно секунда, то (читайте поправленное сообщение) при достижении переменной нуля, меняете работу таймера на работу по прерыванию по совпадению и досчитываете недостающие такты.

Необходимо насчитать 4688 тактов таймера.

18 переполнений по 255 дает 4590 тактов. (Ваших файлов программы и протеуса не вижу, так что сами проверьте может необходимо заменить 255 на 256 и пересчитать значения)

4688 - 4590 = 98 вот это значение и присваиваете OCR0A=98;

p.s. и нафига дворникам такая точность?

Изменено пользователем codenamehawk
Ссылка на комментарий
Поделиться на другие сайты

Опять чуть больше секунды, вот я файлы прикрепил, попробуйте пожалуйста сделать чтобы ровно секунда была.Буду очень очень благодарен.Второй день с этим мучаюсь.

counter tn13.zip

Ссылка на комментарий
Поделиться на другие сайты

Без таймера просто, CLKDIV8 ставите UNprogrammed

и простой код

#include <tiny13.h>
#include <delay.h>
void main(void)
{
DDRB=0xff;
PORTB=0x00;
while (1)
{
   PORTB=0b010011;
   delay_ms(1000);
   PORTB=0b000011; 
   delay_ms(1000);
};  

}

Ссылка на комментарий
Поделиться на другие сайты

Да, но тогда возникает другая проблема.Мне нужно менять время задержки. А пока идёт задержка ( delay_ms(1000) ) то я не смогу опрашивать кнопки. С прерываниями тоже не понятно. В даташите толкько про int 0 сказано.Если разобраться с прерываниями, то конечно я бы такой код использовал.

Ссылка на комментарий
Поделиться на другие сайты

То, что я вам советовал про таймер, вы пропустили.

CLKDIV8 ставите Unprogrammed

Повесил на кнопку + пощелкайте :yes:

#include <tiny13.h>
#define podschitannoje_kol_perepolnenij 18
#define korekcija_taktov			 79
volatile unsigned int vypvypolnit_perepolnenij = podschitannoje_kol_perepolnenij;
volatile unsigned char vkluchenno=0; //dla proverki zapushchen li taimer
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Place your code here
if (--vypvypolnit_perepolnenij==0)
{
// Timer/Counter 0 Interrupt(s) initialization
OCR0A = korekcija_taktov;

TIFR0 |= (1<<OCF0A); //chistoj vody shamanstvo

TIMSK0=0x04; //Разрешить Timer 0 output compare A
}
}
// Timer 0 output compare A interrupt service routine
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
// Place your code here
PORTB.4 = 0;
// Timer/Counter 0 Interrupt(s) initialization

TCCR0A=0x00;
TCCR0B=0x00; //Ostanovit Timer 0
TIMSK0=0x02; //Разрешить Timer 0 overflow
TCNT0=0x00; //sbrosit v nol
vkluchenno = 0; //taimer ostanovlen
}
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=In
// State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
DDRB.4=1; //port na vyhod
PORTB.1=1; //vklucit podtagivajushij rezistor na knopke +
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 4.688 kHz
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
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=0x02; //Timer 0 overflow
// Timer/Counter 0 Interrupt(s) initialization
//TIMSK0=0x04; //Timer 0 output compare A

// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;
DIDR0=0x00;
// ADC initialization
// ADC disabled
ADCSRA=0x00;
// Global enable interrupts
#asm("sei")
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x02; //Разрешить Timer 0 overflow
TIFR0 |= (1<<OCF0A) |(1<<TOV0); //chistoj vody shamanstvo
while (1)
 {
 // Place your code here
 if ((PINB.1 == 0) && (vkluchenno ==0))
 {	
 vypvypolnit_perepolnenij = podschitannoje_kol_perepolnenij;
 PORTB.4 = 1; //vkl svetodiod
 TCCR0A=0x00;
 TCCR0B=0x05; //Запустить Timer 0
 vkluchenno = 1; //taimer zapushchen
 }
 }
}

Поправленный проект.counter tn13.rar

p.s.Первая задержка отличается от секунды, это скорее особенность протеуса.

С прерываниями тоже не понятно. В даташите толкько про int 0 сказано.Если разобраться с прерываниями, то конечно я бы такой код использовал.

В даташите про все прерывания написано.

Почитайте Interrupts , External interrupts, Register description, в регистре GIMSK BIT 5 разрешает, запрещает прерывания с любой ноги проца.

Изменено пользователем codenamehawk
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • У меня больше всего вопросов вызвала необычная схема обеспечения отрицательного питания. Автор этой обстоятельной заметки пишет: For this supply to work correctly, the transformer must have a secondary voltage of at least 18V RMS.  Почему? Что будет не так с отрицательным питанием, если напряжение на трансформаторе будет меньше 18В?   https://tinyurl.com/23mlwxtt - я в простейшей эмуляции ставлю 12В пикового напряжения для трансформатора и на стабилитроне все как положено: -5.6В.
    • Согласен, очень криво объяснил. Это работа трёх вольтовой линии, просто на диод шотки сдвоенный, на один анод приходит сигнал напрямую с трансформатора, а на второй через дроссель. Вольт/деление 5 вольт в клетке, тайминг по моему 10 МС. Третья фотография это сигнал на катодах уровень земли ровно по центру экрана. Но все линии по итогу в порядке 3.3 в, 5, в, 12 в и -12 в. Нагрузить все линии не могу сразу ,так как тут же выгорают транзисторы (имеется нагрузка 250 ватт по 10 ампер на каждую линию за исключением-12в), поэтому нагружаю 3.3 вольтовую линию на 10 ампер,  подключаю переменный резистор 50 ватт на 15 ом на 5 вольтовую линию и постепенно довожу до той той картины с перекосом (это гдето  50 ватт общее). По поводу микросхемы, вверху имеется скрин где между импульсами проскакивает мини импульс, если так можно сказать, он проскакивает и на одной  и на второй ноге (7,8). Микросхема не tl 494, а lw4933/abx942.1/c9421646. Далее они приходят на базы транзисторов 945g  коллекторы этих транзисторов соединены с  выводами трансформатора. Просто схема типовая, легче мне кажется просто привести фото самого блока, для тех кто разбирается будет гораздо информативне.  Диод шотки по 12 вольтовой линии был подгоревший, заменил на донора. Приводить скрины не буду что бы не захламлять тему. В итоге, пока все так же, при достижении определенной нагрузки суммарно где-то 50 ватт, появляется этот "выброс и перекос". По этому имеются мысли на два варианта, это микросхема , этот мини импульс между периодами, на низкой нагрузке особо не влияет, но при достижении определенной приводит с самовозбуждению входной цепи и непроизвольному открытию транзистора нижнего плеча. Либо дело в "горячей части", плавающий дефект в обвязке силовых ключей.  Спасибо за ответ.
    • @Gomerchik а вы контролировали как меняется уровень сигнала на А1 ардуины?
    • Спасибо за совет. Автором данного проекта я не являюсь, мне нужно было воссоздать уличный датчик для метеостанции взамен пропавшего(( Из разного найденного в интернете этот проект работает с моей станцией Орегон (спасибо автору). В понедельник попробую последовать Вашему совету. Но все равно куча непоняток  как блин это работает)) Если дело в неправильной отправки команды, то как на это влияет подключение датчика температуры? Если совсем не подключать таймер, то передача идет один раз (как и прописано в программе), станция принимает и отображает, но минут через сколько-то естественно станция уже ни чего не показывает, но с таймером питание полностью не пропадает с ардуинки, но передача сигнала каким-то образом работает по таймеру.  В моем понимании данная команда подается один раз потому, что таймер должен отключать питание МК после передачи сигнала и каждые 43 сек снова подавать питание (так того требует станция).  Ардуино передает показания температуры отключается полностью и 43 секунды мк не работает.  Сейчас у меня питание пока сделано на подпитке от солнечной батареи, но пару пасмурных дней и аккумулятор съедается до отключения(
    • thickman Так и сделаю. Вытащу из бу БП.  Буду знать, как отличить. Благодарю. Заменил транзисторы на IRFB20N50K. Картина стала, совсем другой.  Похоже трудность не в драйвере, на момент подвозбуда, переходные процессы, в нем, завершены. Увеличил затворные резисторы до 50ом, стало немного лучше.  Не понятно, почему верхний ключ греется несколько сильнее. Возможно, стоит посмотреть ток в коллекторе.  Снабберные емкости временно удалил, изменений не произошло.  Замена ТГР на другой, на кольце MSTN-16A-TH, так же, результата не принесла.   irfb20n50k.pdf
    • А что нить из ассортимента активных щупов производства СССР..))
×
×
  • Создать...