Jump to content
Guest Neit

Как Выдать Импульс Раз В Минуту

Recommended Posts

Guest Neit

Помогите с небольшой проблемой. Хочу запрограммировать Attiny 26L так, чтобы порт B0 менял свое состояние раз в минуту. (минута - единица, минута - ноль) Пробовал поставить

_delay_ms(60000);

но порт свое состояние не изменяет, видимо для этой функции есть максимальное значение или она зависит от тактов? Пишу на Си, подскажите пожалуйста, как можно это реализовать.

Share this post


Link to post
Share on other sites

Как варианты:

Вложенные циклы с задержками.

Прерывание по аппаратному таймеру.

Share this post


Link to post
Share on other sites

Технология Maxim Integrated nanoPower: когда малый IQ имеет преимущества

При разработке устройств с батарейным питанием важно выбирать компоненты не просто с малым потреблением, но и с предельно малым током покоя. При этом следует обратить внимание на линейку nanoPower производства компании Maxim Integrated. В статье рассмотрено их применение на примере системы датчиков беспроводной оконной сигнализации.

Подробнее

Надеюсь порт на выход настроил! без кода это гадание на кофейной гуще!

Share this post


Link to post
Share on other sites
                     

Материалы вебинара STM32G0 – новый лидер бюджетных 32-битных микроконтроллеров от STMicroelectronics

На вебинаре были продемонстрированы современные методы тестирования производительности микроконтроллеров на примере самых бюджетных 32-битных семейств общего назначения STM32G0 и STM32F0, проведено их подробное сравнение. Мы подготовили для вас материалы. Вы можете посмотреть видеозапись вебинара, ознакомиться с ответами на вопросы, загрузить код для тестирования, прочитать статьи по теме

Подробнее...

Guest Neit

Вот так выглядит код

#define F_CPU 8000000UL

#include <avr/io.h>

#include <util/delay.h>

int main(void)

{

DDRB |= _BV(PB0); // назначить ножку PB0 ВЫХОДОМ для 5в

while(1)

{

PORTB |= _BV(PB0); // "1"

_delay_ms(60000);

PORTB &= ~_BV(PB0); //"0"

_delay_ms(60000);

}

}

Буду пытаться делать через таймер, но вопрос остается - где предел у _delay_ms()?

Share this post


Link to post
Share on other sites

но вопрос остается - где предел у _delay_ms()?

Вот объвление функции

void _delay_ms(double __ms)

{

...

}

Не нужно стрелять по воробьям из пушки, эт к вопросу о таймерах, нужно всего лишь малость подумать

Вы и так для такой задачи взяли, ОЧЕНЬ чрезмерное решение

Edited by hasl

Share this post


Link to post
Share on other sites

void pause (uint8_t sec)
{
for(uint8_t time=0; time<=sec;time++)_delay_ms(1000);
}

там где нужно вызываем pause, указываем сколько секунд нужно и все.

Edited by Rhime

Share this post


Link to post
Share on other sites

http://easyelectronics.ru/avr-uchebnyj-kurs-programmirovanie-na-si-chast-2.html

Так какая же максиальная выдержка у этой фунции? А стоит порыться в том же delay.h чтобы найти ответ:

The maximal possible delay is 262.14 ms / F_CPU in MHz.

When the user request delay which exceed the maximum possible one,

_delay_ms() provides a decreased resolution functionality. In this

mode _delay_ms() will work with a resolution of 1/10 ms, providing

delays up to 6.5535 seconds (independent from CPU frequency). The

user will not be informed about decreased resolution.

А по русски — 262.14 миллисекунд/частоту в мегагерцах. Это если в точном режиме, а если надо больше, то идет уменьшение дискретности, в итоге на точности 1/10 миллисекунды мы можем выжать из нее максимум 6.5535 секунды вне зависимости от частоты кварца.

Share this post


Link to post
Share on other sites

If the avr-gcc toolchain has __builtin_avr_delay_cycles(unsigned long)

support, maximal possible delay is 4294967.295 ms/ F_CPU in MHz. For

values greater than the maximal possible delay, overflows results in

no delay i.e., 0ms.

:rake:

Share this post


Link to post
Share on other sites

О, мнения разделились. Причём абалдеть как. На порядки.

Edited by солар

Share this post


Link to post
Share on other sites

Спасибо за информацию! Отдельная благодарность Rhime!

Итоговый код получился следующий, но я так и не понял почему, но вышло что минутный интервал работает при значении pause(6); а не при pause(60); хотя вроде размерности не перепутаны? 1000ms=1s

#define F_CPU  8000000UL
#include <avr/io.h>
#include <util/delay.h>
void pause (uint8_t sec)
{
   for(uint8_t time=0; time<=sec;time++)_delay_ms(1000);
}
int main(void)
{
 DDRB |= _BV(PB0);  // назначить ножку PB0 ВЫХОДОМ для 5в


   while(1)
   {
    PORTB |= _BV(PB0);  // "1"
   pause(6);
    PORTB &= ~_BV(PB0); //"0"
    pause(6);
   }
}

UPD Вернее интервал получается не ровно минута, а какой-то плавающий, попробую замерить точнее

Edited by Neit

Share this post


Link to post
Share on other sites

Написал на arduino программку подсчета времени импульсов, она показала что Тинька считает 56 секунд вместо 60.

const int PortPin = 2;	 // Подключаем к порту Attiny
volatile unsigned long time = 0;	 //Время положительного импульса
volatile unsigned long time1 = 0;	 //Время отсутствия импульса
volatile unsigned long time_old = 0;	 //Предыдущее время

int minutes = 0; //Количество минут
int Error=0; //Ошибка в одной минуте
int average_Error=0; //Средняя ошибка в минуту
void setup() {
Serial.begin(9600);
Serial.println("Start");
pinMode(PortPin, INPUT);
attachInterrupt(0, impuls, CHANGE); //Включаем обработчик по изменению состояния порта
}
void impuls(){
time =millis()-time_old;
time_old = millis(); //Считаем время между изменениями состояния порта
Serial.print("Time of one condition, sec:");
Serial.println(time/1000);
minutes++;
}
void loop(){
}

Попробовал добавить _delay_ms(4000); после каждого вызова pause() - вроде как 4 секунды, но время увеличилось на 32. По простейшим прикидкам поправил на _delay_ms(500); и получил желаемую минуту на выходе. Буду очень признателен, если кто-нибудь объяснит, почему _delay_ms(500)=4 сек, _delay_ms(6000);=56 сек, что это за чудеса такие? Видимо это как то связано с тактовой частотой?

Share this post


Link to post
Share on other sites
Видимо это как то связано с тактовой частотой?

Мысль верная! А какая частота генератора, прямо указана компилятору?

Share this post


Link to post
Share on other sites

1. Куда ? чо добавил?

2. Код приведите. В упор не вижу в вашем коде вызов _delay_ms()

3. Вы нафига в прерывание напихали, столько и еще удивляетесь от куда задержка. Отправка только одного байта на скорости 9600 дает задержку порядка 1мс, в придачу там еще функция print

P.S. Дуино портит образ мышления, начните лучше разбираться с нормальным программирование на С :rake:

Edited by hasl

Share this post


Link to post
Share on other sites

Хотите просчитать сколько нужно выставить в delay нужно подсчитать количество тактов выполняемых контроллеров до вызова задержки+сама функция задержки. Перевести это во временные интервалы и записать разницу между нужными задержками и теми что получились, в функцию, вот тогда вы получите достаточно точный отрезок времени который будет зависеть от характеристик кварца.

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. 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...

  • Similar Content

    • By shuks
      Добрый день!
      От товарища поступила просьба собрать на ардуино (либо изготовить плату на avr) детектор короткого замыкания.
      Есть у него на производстве ряд БП 12в 2квт и десяток потребителей на каждом, таких блоков порядка сотни, и поступила "хотелка" навесить на каждый БП ардуину (питание будет отдельное независимое) которая будет посылать по wifi уведомление когда будет возникать КЗ в блоке/потребителе (важна возможность определения именно КЗ).
      Опыта нет, первое что пришло в голову это:
      1) мониторить потерю напряжения 12в на БП (при КЗ блок уходит в защиту)
      2) при потере напряжения 12в подавать напряжение 3.3в от питания МК с управлением через ключ от ножки МК на "+" питания БП и переход на пп.3
      3) ноль от БП подключить к АЦП МК и замерять: если 0в то все норм и КЗ нет (поломка блока без КЗ либо отключение от сети 220в), если на АЦП будет 3.3в то имеем КЗ и отправляем уведомление.
      Т.к. опыта схемотехники почти нет, прошу помощи по схеме в даже в мелочах
       
    • By Ilgam Talipov
      Задача: Написать скетч управления 9 светодиодами аналог WS2812 (из библиотек FastLed и NeoPixel рулятся ). Режим работы - стробы, длительность вспышки 0.1 - 0,2 сек, после того как каждый светодиод моргнул 1 раз, цикл повторяется, длительность цикла 4,5 сек (время примерное, точность не важна). Помочь настроить Arduino IDE для прошивки тинек. Если у вас железа нет, не проблема - мы можем тестить ваш код на нашем железе.
      Стоимость 5 000 руб
      мой скайп ilgamt
      почта talipov@me.com
      Спасибо
    • By Doublman
      Всем доброго времени суток.
      Развел платки - коммутаторы на основные МК.
      Платы коммутационные для HV PROG (параллельного программирования).
      Питание 5в оставил для перемычки (видно на фото).
      Комплект из 3-х плат ATMEGA 8, 16, 32, 48(P), 88, 164P, 168, 324P, 664P, 1284P, 8535, ATTINY 48, 2313.
      https://radikal.ru/fp/4f4203a9b1d54f9fbb92318c2234e576
      Имею 5 комплектов. Цена 450 за все 3 платки ("лист" на этой фотографии) Имею 5 комплектов. https://radikal.ru/fp/73ce63f7f99b4f7d9b744b2563204c1b
      Платки находится в Самаре, если почтой то +50р почте.
    • By Sysoew
      FUSEBit Doctor – устройство, которое возвращает к «жизни» микроконтроллеры с неправильно установленными фьюзами (например, неверно выбран задающий генератор – CKSEL, запрещено последовательное программирование – SPIEN, использование ножки сброса в качестве линии ввода-вывода RSTDISBL, LOCK-биты и другие подобные, которые могут помешать последовательному программированию микроконтроллера).
      Пользоваться достаточно просто: подключил 12 В, в панельку (или через переходник) вставил «мертвый» микроконтроллер, жмешь на кнопку «START» и через пару секунд получаем результат – «живой» микроконтроллер.
      Продаю:
      1. Набор плат (плата FUSEBit Doctor + 4 платы переходника). Стоимость – 250 руб. + почта

      2. Набор плат + набор компонентов для сборки. Стоимость – 650 руб. + почта

      3. Собранное и готовое к использованию устройство. Стоимость – 1000 руб. + почта

       
       
       
       
    • By Flash6300
      Приветствую всех. 
      Как на 2313 рассчитать значение для записи в эти регистры, если я хочу получить задержку в 6 секунд?
      OCR1AH
      OCR1AL
      TCCR1B
       
  • Сообщения

    • Дальнейший разговор неуместен. Сдать в ремонт; отослать туда, где покупался и т.п.
    • В предыдущем посте вместо НЧ надо поставить ВЧ.
    • предлагаю двинуться в сторону гибрида @Simpl.K. Я убрал эмитт. резисторы Q1, Q2 (ДК) искажения ms показал на 0,004% меньше (0,007% против  0,003 %). ТП высокий - 224 мВ ( 0,75 А).  Придерживаюсь совета с форумов - электролиты включаю в схему при крайней необходимости, а по скольку питание в мультисиме можно считать идеальным, то тут они ни к чему. Меньше вылетает ошибка. Схемой заинтересовался после видео на You tube Stalker 29218 - усилитель для наушников, усилитель из Китая, срисовали у японцев, а те яко- бы дифкаскад с советской "Радиотехники". RMAA у staker-a показал отличные результаты усилителя. Заманчиво при малых фин.затратах получить отличный УМ, основная цена здесь БП и выходные транзисторы. Мой замысел использовать данный ум в двух-полосном, сима для средне-высокочастотного звена, а низ другой мощный. Удручает тот факт - корячишся в УМ за тысячные доли % искажений, а потом подключаешь его к трехполосной АС с пассивными фильтрами и искажениями 3 - 5 % !!!
    • Сделать поиск и изготовить новоё устройство,минимум как говорили выше.но думаю это вам сложно,купи готовое
    • это девушка. Ну лично мне так кажется
    • если товар физически не пересекает границу, то куплен он в России
    • корпус покрасил. сделал фото усилителя 6н7с+6п6с. тор силовой.два дроселя железних. напряжение под нагрузкой 260в. в холосту +330і. два канала по -40в и один -17в.  +12в +9в +5в. и отдельно один +-15в для предунч.+ темброблок. режим обход темброблок на реле. релейний селектор на 3 входа на галентнике.все реле takamisawa.  стрелочн. индикатори сподсветкой.виход на 4 и 8 ом. релейний регулятор никитина+ управления с пульта, функция mute. красиво поет. виходники под заказ сделани. большой апарат вишел. 
×
×
  • Create New...