Jump to content
Сергей Фомин

Расчёт таймера на attiny13

Recommended Posts

Изучаю прерывания на attiny13. Пока остановился на прерываниях по переполнению. Сделал тестовый код в Atmel Studio и сразу через программатор заливаю на тиньку со светодиодом. Проблема в том что гореть он должен 10 секунд и выключаться, а горит примерно 20-23 секунды. Прошу помощи в правильном расчёте. Код ниже (пока учусь сильно не ругайтесь) :

#define F_CPU 1000000
#define LED PB2
#include <avr/io.h>
//#include <util/delay.h>
#include <avr/interrupt.h>
unsigned char work_time =384;    //  1000000/1024/256=3.8  (0.026 сек)    10/0.026=384
volatile unsigned char temp =0;


ISR (TIM0_OVF_vect)
{ 
    TCNT0=0x00;
    temp ++;
    if (temp>=work_time)
    {
        PORTB &=~(1<<LED);  //Инвертируем состояние
        TCCR0B=0x00    // остановка таймера
        cli (); //общее запрещение прерываний
    }
}

int main (void)
{

    init();
    
    
    while (1)
    {
        
    }
}


void init ()
{
    
    DDRB |= (1<<LED); // выход
    PORTB =(1<<LED); //включен
    TCCR0B =0x05; // установка делителя на 1024
    TIMSK0 |= _BV(TOIE0);
    sei();   // Либо SREG |= (1<<SREG_I); //Разрешаем прерывания глобально
    TCNT0 = 0X00;        //Обнулить счётный регистр

}

 

Edited by admin
Тэг CODE для кого?

Share this post


Link to post
Share on other sites
16 hours ago, Сергей Фомин said:

в правильном расчёте

Во-первых

unsigned char work_time =384;

в переменную типа unsigned char нельзя положить значение более 255, величина 384 там просто не поместится и обрежется до 384 - 256 = 128. То есть  у Вас получается work_time =128;

Во-вторых, при расчёте времени переполнения  1000000/1024/256=3.8 допущена ошибка:

1/3.8 = 0.26 сек, а не 0.026 сек

Поэтому  work_time = 10 / 0.26 = 38;

Тут, кстати, значение 38 уже легко поместится в unsigned char.

Share this post


Link to post
Share on other sites

Изготовление 2-х слойных плат от 2$, а 4-х слойных от 5$!

Быстрое изготовление прототипа платы всего за 24 часа! Прямая доставка с нашей фабрики!

Смотрите видео о фабрике JLCPCB: https://youtu.be/_XCznQFV-Mw

Посетите первую электронную выставку JLCPCB https://jlcpcb.com/E-exhibition чтобы получить купоны и выиграть iPhone 12, 3D-принтер и так далее...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

    • как и этого недоделанного "советчика" .... размажу по теме за такие "советы" .... начну с возюканья мордой и пока до пяток не сотрется .... А потом говорят нужно краба убрать .... так кто же останется? подобное ламерье неотесанное?
    • они ничего не потеряют .... судя по прочитанному .... спасибо за комплимент .... но я это и сам знаю ... скорее в парилке .... за засерание неокрепших мозгов начинающих ....
    • Они полупроводники с отрицательным ТКН и при питании от источника напряжения их ждет смерть, медленная и мучительная.
    • заставить бы их СОСАТЬ на эти недостающие ватты ротАми ....
    • двойка .... лучше купи чуп-чупс и соси в теме .....    
    • Убирал а гараже и пошел вынести мусор. Смотрю а контейнере у стенки лежит бедняга пылесос. Взял его с собой. Если мои убитый- использую на запчасти. Если живой- верну беднягу к жизни, пусть послужит сколько сможет.  Сегодня дошли руки и до задохлика Magnit rmv1636. Визуальный осмотр показывает, что тело долго находилось в сыром помещении. Ржа на головках саморезов, гайке улитки и два пятна на корпусе мота. Внутри воздуховода песочек и чутка мусора. Всё будет почищено и обработано соответствующими реактивами. Мульт сказал мот жив. Ротор тяжеловато но крутится. Люфта нет. Вердикт ясен- пациент будет жить. Ну и как обычно производитель преувеличил возможности агрегата. Надпись на корпусе гласит большими цифрами 1800W.  Но шильдик мота это значение опровергает.  Китайцы прибавили 400вт, которых в реале нет и быть не может. Лет 5назад попался возле баков разобранный Самсунг с надписью на корпусе 2000вт. Там делов то было в отгоревшем проводке статора прям у самого контакта. Увидеть место обрыва нереально если не дёрнуть за провод. Так у него и мот имел маркировку 2000вт мэйд ин корея  В данном случае без приписок, всё честно.   

  • Выжигатель с регулировкой температура и набором жал

  • Similar Content

    • By Nosi Usi
      Добрый день. Подскажите пожалуйста, как бы мне реализовать схему автоотключения (забытого включенного света). 
      Что есть: 12v аккумулятор, LED-лента, выключатель. Хочу собрать схему, при которой питание на LED-ленту будет подаваться не более чем N-минут. 
      Всё что находил - это схемы через мосфет и конденсатор но с тач-кнопкой, это не совсем то, т.к. необходимо срабатывание "таймера" при замыкании цепи и отключение таймера и света при размыкании цепи. Желательно, что бы потребление схемы было минимальным, а в идеале - размыкание всей цепи по таймеру.
       
    • By Prozac
      Здравствуйте, уважаемые форумчане! Вообще говоря, не имею такой привычки - донимать людей вопросами, и до всего стараюсь доходить самостоятельно. Но в данном случае без "помощи зала" совсем никак: перепробовал уже все, что только смог придумать - а "воз и ныне там! Поэтому и обращаюсь сюда - возможно, кто-то уже сталкивался с чем-то подобным, и сумел найти решение...
      Суть проблемы в следующем: решил построить ШИМ-контроллер для автомобильного вентилятора охлаждения ("карлсона"), но никак не могу заставить его работать - как только открываются VT2 и VT3, подключая нагрузку, МК уходит в резет или виснет (чаше - первое)!.. Сбросившись, опять пытается подключить нагрузку, и опять резетится, и так - без конца! Причем, изначально решил испытать схему не на индуктивной нагрузке (электромоторе), а на вполне себе пассивной 60Вт (около 3A по току) лампочке из фары - и та же фигня: МК пытается запуститься, сбрасывается, лампа моргает, дергается... Даже не ШИМ, а обычное мигание лампой с частотой 1Гц через несколько вспышек или вешает МК, или резетит его (что видно по сбою ритма моргания). При этом без нагрузки - по осциллографу, подключенному к ноге 5 МК или к нижнему (по схеме) выводу R7 - все отлично: наблюдается ровный и чистенький ШИМ-сигнал, изменяющийся согласно тестовой программе! Однако, стоит подать нагрузку, как осциллограмма начинает прыгать: появляются ШИМ-импульсы, затем ровная линия, затем снова импульсы с тем заполнением, которое должно быть в самом начале программы... Собственно, это наблюдение и позволило сделать вывод о том, что МК перезагружается.
      Естественно, первая мысль - слабый лабораторник (он у меня импульсный, самодельный, где-то на 3А - действительно слабый; но та же петрушка наблюдалась и при попытках питать устройство от трансформаторного ЗУ на 10А). Ну, пригнал машину, снял с нее аккум (100% свежий и не дающий просадок!), запитал от него - однако проблема повторилась... Значит, дело не в питании!.. Пробовал много различных танцев с бубном: отключал внешнюю цепочку сброса R2-C2 (результат - ноль), включал BOD микроконтроллера (стало еще хуже), подвешивал вместо C4 и C6 электролиты большей емкости (не помогло)... Думал, что, возможно, кондеи C4 и C6 разряжаются через R7 - экспериментировал с его сопротивлением (от 100 до 960 Ом), перекидывал его верхний вывод на анод VD1 (чтобы отсечь резистор от фильтрующих C4 и C6) - тщетно... Грешил даже на то, что какие-то проблемы вносит емкость затворов VT2 и VT3 - уменьшал сопротивление R10 и R12, дабы затвор быстрее "разряжался" - безрезультатно...
      Игрался с частотой МК и ШИМ - перебрал частоты ШИМ от 18 до 4687 Гц; пытался запускать нагрузку с разным заполнением ШИМ, от 10 до 40% - как глючило, так и глючит... Т.е., перелопатил, практически, всю схему!
      Удалось заставить устройство нормально работать на лампу, и даже на пару спаралеленных электродвигателей МЭ218 (от "печки") следующим образом: R8 был исключен (вместо него - перемычка), а C7 (изначально - К73-17В всего на 0,47мкФ) был заменен на пару электролитов по 1500мкФ, включенных плюс к плюсу последовательно (для устранения полярности кондеев). Нагрузка стала нормально подключаться, отрабатывать как на повышение, так и на убывание заполнения ШИМ. Двигатели отлично работали как при ступенчатом изменении ШИМ-заполнения, так и при плавном. Единственное, что при попытке подать на двигатели ШИМ с заполнением менее 20%, МК опять начинал дергаться и резетить, а так же резетил при резком отключении движков: если раскрутить их до 100%, а потом снять сигнал, то МК перезагружался; однако, если после 100% плавно понижать обороты где-то до 40%, и лишь потом снимать сигнал, то схема работала нормально. Плюс, очень сильно нагревались электролиты C7...
      Однако, когда принес схему в машину - для отладки непосредственно в "боевых условиях", и подключил мощный двигатель вентилятора, началась старая песня с резетами...
      Сейчас, вроде бы, "осенило" - поменял VD2 на Шоттки 1N5822 - лампочка запустилась на "ура" даже без С7; так же отлично и мягко стартовала спарка из МЭ218 - радостный побежал к машине... Но с "карлсоном" - опять мимо: МК вновь ушел в перезагрузку... Все: я не знаю, что тут делать - каждую деталь уже перелопатил, и кучу вариантов испробовал!!! Но ничего не понятно(( Вот и прошу помочь: может быть, кто-то уже был в такой ситуации, и как-то решил подобную проблему?
      VT2 и VT3 стоят "фирменные", IR-овские (не Китай) - из "Чип и Дипа". ATtiny13 - с Алиэкспресс; чтобы исключить возможность брака конкретной микросхемы, пробовал ставить в схему несколько разных экземпляров МК (из одной посылки). DS18B20 пока еще не подключал (нужно разобраться с ШИМ!). IRF3205 каскадированны для уменьшения нагрева (хотя его и так практически нет), и для дополнительной надежности (чтобы в случае выхода из строя одного транзистора не перегреть машину). Тестовую программу специально написал "китайским стилем", без циклов и т.п. - чтобы она была максимально простой, наглядной и линейной - для уверенности, что не в ней дело.
      Подскажите пожалуйста - откуда эти резеты, и как с ними бороться? Как заставить схему отрабатывать на мощную нагрузку? Заранее благодарю!!!
       
       
      ;*************ТЕСТОВАЯ ПРОГРАММА************* ;============ДИРЕКТИВЫ ТРАНСЛЯТОРУ=========== .device ATtiny13 .include "tn13def.inc" .list ;Обзывательство регистров .def Temp = R16 .cseg .org 0x00 ;=========ТАБЛИЦА ВЕКТОРОВ ПРЕРЫВАНИЙ======== rjmp Begin //Начальный сброс reti //Внешнее прерывание INT0 reti //Изменение состояния любой линии reti //Переполнение T0 reti //Готовность EEPROM reti //Срабатывание компаратора reti //Совпадение в канале A таймера T0 reti //Совпадение в канале B таймера T0 reti //Переполнение сторожевого таймера reti //Завершение преобразования в АЦП ;============МОДУЛЬ ИНИЦИАЛИЗАЦИИ============ Begin: ;-----Инициализация стека ldi Temp, RAMEND out SPL, Temp ;-----Отключение компаратора ldi Temp, 0x80 out ACSR, Temp ;-----Настройка портов ldi Temp, 0b00000111 out DDRB, Temp //PB0 - на вывод ;-----Настройка ШИМ ldi Temp, 0b11000001 out TCCR0A, Temp //Режим - быстрый ШИМ с инверсией ldi Temp, 0b00000010 out TCCR0B, Temp //Делим тактирование таймера на 8 rjmp Start //При старте пропускаем 5-секундную задержку ;===============ТЕСТОВЫЙ ЦИКЛ================ PWM: ldi Temp, 0b00000000 out OCR0A, Temp //ШИМ=0% rcall Delay5sec //Ждем 5 сек ;-----Повышаем скорость Start: ldi Temp, 77 out OCR0A, Temp //ШИМ=30% rcall Delay2sec ldi Temp, 102 out OCR0A, Temp //ШИМ=40% rcall Delay2sec ldi Temp, 128 out OCR0A, Temp //ШИМ=50% rcall Delay2sec ldi Temp, 154 out OCR0A, Temp //ШИМ=60% rcall Delay2sec ldi Temp, 179 out OCR0A, Temp //ШИМ=70% rcall Delay2sec ldi Temp, 205 out OCR0A, Temp //ШИМ=80% rcall Delay2sec ldi Temp, 230 out OCR0A, Temp //ШИМ=90% rcall Delay2sec ldi Temp, 255 out OCR0A, Temp //ШИМ=100% rcall Delay2sec ;-----Понижаем скорость ldi Temp, 230 out OCR0A, Temp //ШИМ=90% rcall Delay2sec ldi Temp, 205 out OCR0A, Temp //ШИМ=80% rcall Delay2sec ldi Temp, 179 out OCR0A, Temp //ШИМ=70% rcall Delay2sec ldi Temp, 154 out OCR0A, Temp //ШИМ=60% rcall Delay2sec ldi Temp, 128 out OCR0A, Temp //ШИМ=50% rcall Delay2sec ldi Temp, 102 out OCR0A, Temp //ШИМ=40% rcall Delay2sec ldi Temp, 77 out OCR0A, Temp //ШИМ=30% rcall Delay2sec rjmp PWM //Возвращаемся, и начинаем с 5 сек "молчания" ;===========ПОДПРОГРАММЫ ЗАДЕРЖКИ============ ;-----Задержка в 2 секунды Delay2sec: ldi R17, 253 ldi R18, 75 ldi R19, 29 L1: subi R17, 1 sbci R18, 0 sbci R19, 0 brcc L1 nop ret ;-----Задержка в 5 секунд Delay5sec: ldi R17, 253 ldi R18, 61 ldi R19, 73 L2: subi R17, 1 sbci R18, 0 sbci R19, 0 brcc L2 nop ret  

    • Guest vit2700
      By Guest vit2700
      Доброго дня всем гуру  программирования в BASCOM AVR !  В программировании я также как и в космической отрасли ... Увлекаюсь рыбалкой, использую электронные сигнализаторы поклевки (китайские). У меня их с приказавшим долго жить микроконтроллером уже больше десятка. Появилась идея , в корпуса изготовить свою плату на МК attiny13, соответственно без полного набора функций как у оригинала. Здесь на сайте нашел  статью "Музыкальный звонок на МК Attiny13". В готовую схему в колхозил светодиод. По факту кнопку планирую заменить на геркон. 
       Не могу разобраться как сделать чтоб при нажатии  кнопки, контролер выполнил программу один раз и остановил цикл даже с нажатой кнопкой(это тот случай когда магнит на ролике остановился возле геркон и замкнул контакт ) ? Отпустил,нажал еще раз  все повторилось.
      Есть вторая проблема, во время цикла контролер  не реагирует на кнопку .Как сделать чтоб при повторном нажатии происходил сброс программы (уже действующего цикла) и запускалась новая программа (цикл)? 
      $regfile = "attiny13.dat"
      $crystal = 1200000
      $hwstack = 16
      $swstack = 16
      $framesize = 16
      $noramclear
      Config PINB.1 = Input
      Config PORTB.2 = Output
      Toch Alias PINB.1
      Led Alias PORTB.2
      Config INT0 = Low Level
      On INT0 Button:
      Enable Interrupts
      Enable INT0
      Declare Sub Melodi1()
      Dim Melcount As Byte
      Do
      Powerdown
      Loop
      End
      Sub Melodi1()
      Do
      Sound , PORTB.0 , 30 , 100
      Waitms 10
      Sound , PORTB.0 , 30 , 150
      Waitms 10
      Melcount = Melcount + 1
      Loop Until Melcount = 5
      Melcount = 0
      if Toch = 1 Then Led = 0
      if Toch = 0 Then Led = 1
      Led = 1
      Waitms 200
      Led = 0
      Waitms 200
      Led = 1
      Waitms 200
      Led = 0
      Waitms 200
      Led = 1
      Waitms 200
      Led = 0
      Waitms 200
      Led = 1
      Waitms 200
      Led = 0
      Waitms 200
      Led = 1
      Waitms 200
      Led = 0
      Waitms 200
      End Sub
      Button:
      Call Melodi1()
      GIFR = 64
      Return
      Спасибо всем кто откликнется! Буду рад любой помощи.
       

      ver 1.1.0.bas
    • By psinetron
      Здравствуйте. Решил попробовать в деле ATTiny13. Решил начать с самого простого - поморгать светодиодами. ОК, запустил platformIO, скопировал пример - вроде все работает. Светодиод моргает. Но. как только решил поменять значение _delay_ms, то понял, что что-то пошло не так.
      Дело в том, что светодиод моргает вообще игнорируя этот самый delay. Не важно сколько бы ms задержки я там не выставил - получается эпилептическое моргание. 
      Прошиваю через Arduino Uno. AtTiny опробовал пару разных - на второй микрухе тот же самый эффект. Причем если не прописывать включать светодиод - он не горит. Примеры пробовал разные, эффект везде один. Уже и не знаю на что думать
      Пример моего кода:
       
      #define F_CPU 120000UL // Указываем тактовую частоту МК #define LED PB2 // Используем светодиод, подключенный к PB2 (7 пин) #include <avr/io.h> // Подключаем определения ввода/вывода #include <util/delay.h> // Подключаем библиотеку функций задержки int main(void) { // Светодиод DDRB |= (1<<LED); // конфигурируем пин как выход while (1) { PORTB |= (1<<LED); _delay_us(1000L); PORTB &= ~(1<<LED); _delay_ms(10000L); } }  
      На всякий случай конфигурация platformIo:
      [env:attiny13a] platform = atmelavr board = attiny13 ; change microcontroller board_build.mcu = attiny13 ; change MCU frequency board_build.f_cpu = 1200000L upload_protocol = stk500v1 ; each flag in a new line upload_flags = -P$UPLOAD_PORT -b$UPLOAD_SPEED ; edit these lines upload_port = COM3 upload_speed = 19200  
    • By mal333
      Всем привет.
      Есть задачка на 2 пина контроллера посадить 4 кнопки и распознавать их состояние, а так же состояние "ни одна не нажата". Есть схемы подключения их в матрицу R2R и последующее аналоговое измерение, но я почему-то думаю, что можно считывать и чисто цифровым методом. Пораскинув мозгами, получилась эта схема.В ней опрос будет такой- сначала читаем состояние выводов, потом переключаем пины попеременно в 1 и смотрим состояние другого вывода. Может есть схемы проще, но вот что-то не нашел.

×
×
  • Create New...