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

Задержки Attiny13A


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

Здравствуйте, я начинающий в данной тематике ...написал код для включения портов на attiny13a, писал в Atmel Studio 7 (простое реле времени - каждые 25 часов включает 5 порт на 5 минут, остальные порты индикация) и конечно глядел в протеус, ну и собрал странную реальную конструкцию (uln2003, настенные часы, светодиоды, резисторы.).

После не хитрых действий выяснил что 1 секунда равна примерно _delay_ms(135) (наверняка из-за фьзов), но суть в другом, а именно - 5-тый порт работает как нужно 5 минут + - 20 секунд ,НО весь цикл проходит за 5 часов - увеличение задержки не приносит результатов _delay_ms(2430000) менял на _delay_ms(222430000) ...но весь цикл проходит за 5 часов....

Хочется все таки узнать - где ошибки или как нужно сделать это правильно?!

код

#define F_CPU 800000

#include <avr/io.h>

#include <util/delay.h>

// #define F_CPU 8000000L

// #include <util/delay.h>

int main(void)

{

DDRB = 0xFF;

PORTB = 0x00;

while (1)

{

_delay_ms(2430000); //5 часов

PORTB |= (1<<0); //1 лампа

_delay_ms(2430000); //5 часов

PORTB |= (1<<1); //2 лампа

_delay_ms(2430000); //5 часов

PORTB |= (1<<2); //3 лампа

_delay_ms(2430000); //5 часов

PORTB |= (1<<3); //4 лампа

_delay_ms(2430000); //5 часов

PORTB |= (1<<4); //нагрузка

_delay_ms(40500); //5мин

PORTB &= ~(1<<4);

PORTB &= ~(1<<3);

PORTB &= ~(1<<2);

PORTB &= ~(1<<1);

PORTB &= ~(1<<0);

// 1 сек = _delay_ms(135)

post-196385-0-18844600-1462115020_thumb.png

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

рабочий придел тут не причем, на такие интервалы нужно пользовать таймер.

и вообще, сегодня пасха, работать нельзя, поэтому не получается

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

Не знаеш как? Спроси у Google'а !!!

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

Сравнительное тестирование аккумуляторов 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

Не парьтесь про таймер. Можно несколько раз подряд вызвать _delay_ms(N).

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

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

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

Почему сразу убил? Скорее всего прошили на "с кварцем". Припаивайте.

Кварц на attiny13a интересно... А так уже присмотрел интересную схему для восстановления фьюзов attiny13a, но уже как сказал *Жду почту...

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

Упс. На автомате. Имел ввиду, конечно, что не так страшен чёрт, как его малюют.

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

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

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

ATtiny13 может тактироваться от внешнего генератора, и этому режиму соотвутствеют как раз CKSEL = 00. Вторая крайность CKSEL = 11 соответствует ненамного менее неудобному режиму - 128 кГц, с которым программаторы обычно не дружат, но попробовать снизить частоту программатора попробовать можно.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

  • 3 недели спустя...

В скобках много мусора, читать не обязательно!!!

{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((

И снова прошу о помоще, про копаясь в своем же.... из за которых пытаюсь делать выводы, как я понял библиотека deley в atmel studio имеет предел по числу ... прописал несколько раз

delay(10000);

delay(10000);

delay(10000);

delay(10000);

он дает мне предел и все равно выполняет код как и раньше (то есть, несколько раз вызвать таймер нет возможности)

но если прописать

delay(10000);

PORTB |= (1<<0);

delay(1); //какое нибудь ненужное действие чтобы просто ткнуть в промежуток

PORTB &= ~(1<<0); //вырубить свое ненужное действие

Так конечно прокатывает, но памяти для такой простой задачи и цикла в 24 часа мне нужно в 20 раз больше чем имеет attiny13.

Почитал про таймеры ...делитель ...положение таймера.. Есть множество всяческих ресурсов чтобы это подтянуть и естественно читаю на досуге, но вот c примерами в atmel studio, да и ещё для attiny13 скудно... так как нахожусь в самом начале пути даже не представляю как это написать в atmel studio ...пытался искать для atmel studio задержку на таймере в несколько минут для attiny13 на всяческих сайтах, форумах: подобных примеров не нашел.

))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}

Буду рад увидеть код для камня attiny13 в atmel studio на языке С, где расписана задержка на таймере больше одной минуты.

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

в чем проблема по прерыванию от таймера инкрементировать переменную? таймер можно использовать от собаки. хоть часы можно сделать....

#include <avr/interrupt.h>
unsigned char s,m,ch;//сек, мин, часы
ISR (WDT_vect)
{
//это прерывание, срабатывает каждую сек.
uint8_t s++;// в s секунды
if (s>59)
{
s=0;
m++;
if(m>59)
{
m=0;
ch++;
}
}
}
void Init_Dog(void)
{
MCUSR &= ~(1<<WDRF);
WDTCR |= (1<<WDCE) | (1<<WDTIE);
WDTCR |= (1<<1) | (1<<2); // 0-2,5 бит предделитель. (1sec)
sei();
}

этот таймер тактируется от дополнительного внутреннего генератора.

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

в чем проблема по прерыванию от таймера инкрементировать переменную? таймер можно использовать от собаки. хоть часы можно сделать....

#include <avr/interrupt.h>
unsigned char s,m,ch;//сек, мин, часы
ISR (WDT_vect)
{
//это прерывание, срабатывает каждую сек.
uint8_t s++;// в s секунды
if (s>59)
{
s=0;
m++;
if(m>59)
{
m=0;
ch++;
}
}
}
void Init_Dog(void)
{
MCUSR &= ~(1<<WDRF);
WDTCR |= (1<<WDCE) | (1<<WDTIE);
WDTCR |= (1<<1) | (1<<2); // 0-2,5 бит предделитель. (1sec)
sei();
}

этот таймер тактируется от дополнительного внутреннего генератора.

На данном этапе дальше функций delay PIN PORT DDR остальные надписи у меня вызывает непонимание ...вот я и хочу увидеть *НАПИСАННЫЙ РАБОЧИЙ КОД* ...вообщем разобраться так сказать на пальцах - что куда и почему.

Пытаясь самостоятельно подогнать код от других камней, чтобы все таки увидеть - как это нужно писать ....Загниваю в ошибках

Кстати ваш код тоже не комплитится! (да и про дополнительный внутренний генератор для attiny13 в гугле тоже не нашел)

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

я пример привел, это не есть вся программа, только две функции, которые надо вставить в основную программу.

про доп генератор это есть сабака Watchdog Timer. неужели про него в даташите ничего не написано?

думаю надо начать с изучения структуры программы, где что надо писать и в каком порядке....

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

таймер можно использовать от собаки. хоть часы можно сделать....

Ну, точность собаки оставляет желать лучшего, так что часы на ней делать не стоит.
думаю надо начать с изучения структуры программы, где что надо писать и в каком порядке....
Надеюсь, boogoo развеет мои опасения. Есть ли опыт в "компьютерном", или хотя бы каком-нибудь, Си и "контроллерном" ассемблере?

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

таймер можно использовать от собаки. хоть часы можно сделать....

Ну, точность собаки оставляет желать лучшего, так что часы на ней делать не стоит.
думаю надо начать с изучения структуры программы, где что надо писать и в каком порядке....
Надеюсь, boogoo развеет мои опасения. Есть ли опыт в "компьютерном", или хотя бы каком-нибудь, Си и "контроллерном" ассемблере?

Не развею ...я 0 в программировании

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

  • 4 недели спустя...

Из первого поста видно что процессор работает на частоте 1,2МГц а компилятору сказано что 8МГц. Поэтому 135 мСек длятся 1 секунду. Чтобы небыло рассогласования нужно указать компилятору реальную частоту работы процессора. В функциях задержки используются значения типа int а это 65535 максимум дальше опять 0(при инкременте). Рекомендую для задержки использовать цикл "for" в теле которого находится delay();

unsigned int t; //Переменная для минут

for(t = 1500; t > 0; t--) //1500 минут = 25 часов

{delay_ms(60000); //Задержка на 1 минуту

}

Да и точность любого внутреннего RC генератора всегда оставляет желать лучшего, на таких длительных интервалах ваше время может отклонятся от номинала в зависимости температуры окружающей среды.

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

  • 2 недели спустя...

Из первого поста видно что процессор работает на частоте 1,2МГц а компилятору сказано что 8МГц. Поэтому 135 мСек длятся 1 секунду. Чтобы небыло рассогласования нужно указать компилятору реальную частоту работы процессора. В функциях задержки используются значения типа int а это 65535 максимум дальше опять 0(при инкременте). Рекомендую для задержки использовать цикл "for" в теле которого находится delay();

unsigned int t; //Переменная для минут

for(t = 1500; t > 0; t--) //1500 минут = 25 часов

{delay_ms(60000); //Задержка на 1 минуту

}

Да и точность любого внутреннего RC генератора всегда оставляет желать лучшего, на таких длительных интервалах ваше время может отклонятся от номинала в зависимости температуры окружающей среды.

Спасибо, хотел сделать устройство которое включается раз в сутки на пару минут (насос для растений) и уже сделал - вот код (частоту поставил 9600000 для более точного хода attiny13).

При включении через 288 минут (4,8 часа) включается нога (светодиод) через 4.8 ещё одна нога и т.д. спустя 24 часа (+-5%) включается порт соединенный с реле на 2 минуты, после все в ноль и заново.

Просто не знал про for... Читаю досуге....

#define F_CPU 9600000L

#include <avr/io.h>

#include <util/delay.h>

unsigned int i;

#define min (_delay_ms(60000))

int main(void)

{

DDRB = 0xFF;

PORTB = 0x00;

while (1)

{

for(int i = 0; i < 288; i++)

{

min;

}

PORTB |= (1<<0); //1 лампа

for(int i = 0; i < 288; i++)

{

min;

}

PORTB |= (1<<1); //1 лампа

for(int i = 0; i < 288; i++)

{

min;

}

PORTB |= (1<<2); //1 лампа

for(int i = 0; i < 288; i++)

{

min;

}

PORTB |= (1<<3); //1 лампа

for(int i = 0; i < 288; i++)

{

min;

}

PORTB |= (1<<4); //нагрузка

for(int i = 0; i < 2; i++)

{

min;

}

PORTB &= ~(1<<4);

PORTB &= ~(1<<3);

PORTB &= ~(1<<2);

PORTB &= ~(1<<1);

PORTB &= ~(1<<0);

}

}

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

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

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

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

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

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

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

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

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

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

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