Jump to content
Sign in to follow this  
boogoo

Задержки Attiny13A

Recommended Posts

Здравствуйте, я начинающий в данной тематике ...написал код для включения портов на 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

Share this post


Link to post
Share on other sites

Ваше значение заходит за рабочий предел. Прочтите даташит внимательно.

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-принтер и так далее...

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

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

Edited by Viktor26

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

Share this post


Link to post
Share on other sites

Вебинар «Практическое использование TrustZone в STM32L5»(10.12.2020)

Приглашаем на вебинар, посвященный экосистеме безопасности и возможностях, которые появились у разработчиков благодаря новой технологии TrustZone в микроконтроллерах STM32L5. Программа рассчитана на технических специалистов и тех, кто уже знаком с основами защиты ПО в STM32.

Подробнее

Снижена цена на AC/DC и DC/DC преобразователи Mornsun в Компэл!

Компэл и компания Mornsun снизили цены на преобразователи AC/DC-преобразователи семейств LS и LDE. По привлекательной цене также предлагаются DC/DC-преобразователи изолированных семейств поколений R2 и R3 различного конструктивного исполнения.

Подробнее

Всем спасибо, из выше сказанного интуитивно понятно что с функцией delay я нащупал предел задержки ..поищу про таймер

Share this post


Link to post
Share on other sites

Материалы вебинара: «Силовые компоненты Wolfspeed на основе карбида кремния (SiC)»

Вы можете посмотреть видеозапись вебинара «Силовые компоненты Wolfspeed на основе карбида кремния (SiC)», ознакомиться с ответами на вопросы и презентацией, в которой вы найдете много полезных ссылок, в том числе подробнее раскрывающих ответы на вопросы.

Подробнее

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

Edited by солар

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

Share this post


Link to post
Share on other sites
void delay_ms(unsigned int val){
 while(val--) _delay_ms(1);
}

void delay_s(unsigned int val){
 while(val--) delay_ms(1000);
}

void delay_m(unsigned int val){
 while(val--) delay_s(60);
}

void delay_h(unsigned int val){
 while(val--) delay_m(60);
}

Share this post


Link to post
Share on other sites

Как обычно игрался с фьюзами и убил последний 5 микроконтроллер ...как приедет другие обязательно буду продолжать...

Share this post


Link to post
Share on other sites

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


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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Edited by солар

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

Share this post


Link to post
Share on other sites

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


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

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

Share this post


Link to post
Share on other sites

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

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

И снова прошу о помоще, про копаясь в своем же.... из за которых пытаюсь делать выводы, как я понял библиотека 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 на языке С, где расписана задержка на таймере больше одной минуты.

Edited by boogoo

Share this post


Link to post
Share on other sites

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

#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();
}

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

Edited by Mishany

Share this post


Link to post
Share on other sites

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

#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 в гугле тоже не нашел)

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

Из первого поста видно что процессор работает на частоте 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 генератора всегда оставляет желать лучшего, на таких длительных интервалах ваше время может отклонятся от номинала в зависимости температуры окружающей среды.

Edited by Ittido

Share this post


Link to post
Share on other sites

Из первого поста видно что процессор работает на частоте 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);

}

}

Edited by boogoo

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...
Sign in to follow this  

  • Сообщения


  • Программатор ST-Link V2 для STM32

  • Similar Content

    • By Артур Измаилов
      1.Создать схему в которой два светодиоды загораются в следующей последовательности:  1 и 2, 2 и 3, 3 и 4, …, 15 и 16, 1 и 2 и т.д. (т.е. создается эффект движения двух светодиодов).
      Дано условие выше. Решение задачи нужно представить в Proteus. Код для программирования пишу в AtmelStudio 7. Схему собрал в Proteus. Вывел 16 светодиодов через 2 порта (Порт B и Порт D). МК использовал ATMEGA 8 вариации в корпусе DIP с 28 ножками (SPDIL28). 
      До этого смог написать схему, чтобы работали светодиоды в последовательности 1.2.3.4.5....16.1.2.3.4 и тд. Делал через оператор FOR. Однако с этим кодом начались проблемы. Помогите пожалуйста. 
      Нижу представил изображение кода. 
      Заранее спасибо!
       

    • By Lisitsin
      Собираем компьютер ZX Spectrum на микроконтроллерах AVR своими руками!
      Проект открытый, все исходники и информация проекта по ссылке
      https://yadi.sk/d/9S2S0ZmNqsLykQ
      Проект печатной платы выполнен в PCAD-2006, программное обеспечение разработано в AVRStudio  4b401
      Здесь отвечу на все возникающие вопросы и помогу со сборкой и запуском
    • By O5-14
      По поводу этого https://cxem.net/mc/mc220.php девайса. Как напоминалка паролей думал сделать, только в моих краях 1604 нету( Под wg12864 нет случаем модификации ? 
      И что такое значит "Текстовые файлы должны быть в обычном txt формате и без форматирования" - первая часть понятна. А без форматирования ? Одна длинная строка ? Пробелы-то хоть можно ?
    • By Karl-Ieronim
      Коллеги, всем привет. 
      Увидел вот такой проект. 
      Несмотря на явную привлекательность что-то совсем мало повторивших. 
      Может кто-то из завсегдатаев форума делал этот проект? 
      Интересует ваше мнение: хочу повторить, но не силен в программировании, поэтому беспокоюсь на счёт подводных камней с которыми не смогу справиться. 
    • By 3цераптор
      Аутомотив Солюшенз Груп, (ASG) входящая в группу компаний VK Electronics, открывает вакансию программиста микроконтроллеров. На данный момент компания ведет свою деятельность по трем направлениям:
      Разработка автомобильной электроники (блоки управления для сбора данных);
      Системы управления автопарком;
      Промышленная электроника (система "умный дом" SOHO)
      Сотрудничая с нами, Вы будете находиться на острие новых технологий, заниматься исследованием и креативной разработкой, а не банальным написанием кода в жестких условиях ТЗ. Мы позволим Вам самостоятельно принимать решение и находить новые технологии реализации Ваших идей.
      Вы заинтересованы в собственном развитии и Вам интересны новые технологии, а так же Вы желаете стать частью команды современной компании?Ждем Ваших откликов!
      Что нужно делать:
      разрабатывать прошивки для микроконтроллеров;
      участвовать в составлении ТЗ в составе рабочей группы проекта.
      Мы хотим видеть специалиста с...
      Профильным образованием, рассматриваем выпускников ВУЗов;
      Знанием языков программирования;
      Знанием ОС FreeRTOS, Linux;
      Умением программировать чисто, без мусора в коде и стандартных библиотек;
      Умением самостоятельно, а главное быстро разбираться и искать пути решения интересных и трудных задач;
      Знанием архитектур на ядре ARM7,Contex-M3, Contex-M4;
      Опытом работы с процессорами STM 32F1/2/3/4, NXP, Texas industries;
      Знанием протоколов CAN, CANOpen, RS232, RS485;
      Опытом работы с беспроводными модулями GSM,GPS,WiFi и их аппаратными реализациями;
      Опытом разработки ПО для серийных изделий.
      Мы предлагаем:
      ЗП по итогам собеседования, от 80 000 руб.
      Адекватную мотивацию как по ЗП, так и по бонусам;
      Комфортный офис, расположенный в самом центре г. Воронежа;
      Необходимое оборудование для продуктивной работы;
      Пятидневная рабочая неделя, с 9 до 18 часов ( возможно смещение времени работы);
      Работа в молодой команде профессионалов;
      Возможность работать с реальными проектами, видеть результаты креативной работы;
      Сладости для питания мозга :).
×
×
  • Create New...