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

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


Гость Neit

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

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

_delay_ms(60000);

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

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

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

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

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

"Я не знаю какой там коэффициент, я просто паять умею. "

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

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

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

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

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

#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()?

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

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

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

void _delay_ms(double __ms)

{

...

}

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

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

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

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

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

Изменено пользователем Rhime

- А совесть в курсе? - А совесть в доле! :-D

Эксперт — это человек, который совершил все возможные ошибки в некотором узком поле.

Все грамматические ошибки являются авторским стилем изложения материала.

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

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 секунды вне зависимости от частоты кварца.

Я не раздаю удочки. Я продаю рыбу.

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

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

Изменено пользователем солар

Я не раздаю удочки. Я продаю рыбу.

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

Спасибо за информацию! Отдельная благодарность 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 Вернее интервал получается не ровно минута, а какой-то плавающий, попробую замерить точнее

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

Написал на 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 сек, что это за чудеса такие? Видимо это как то связано с тактовой частотой?

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

Видимо это как то связано с тактовой частотой?

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

Errare humanum est. Коли людЯм позволено, что же о нас то говорить!
 

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

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

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

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

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

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

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

- А совесть в курсе? - А совесть в доле! :-D

Эксперт — это человек, который совершил все возможные ошибки в некотором узком поле.

Все грамматические ошибки являются авторским стилем изложения материала.

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

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

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

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

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

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

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

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

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

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

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