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

Attiny13 - Сон и ШИМ


Юра Махович

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

Доброго времени суток!
Друг попросил сделать эму некий аппарат: пищалку, которая издает звук с определенным периодом.
Пример работы: сигнал 2 секунды, тишина 1 минуту, потом опять по новой.


Так вот, программу написал, и вроде как даже работает, но как-то не стабильно..
Иногда пропустит один цикл, иногда (почти всегда) после нескольких минут вообще перестает работать.
Использую сон ради экономии батареи, т.к. устройство автономно.

Генерирую ШИМ на ноге PB0. переключатели подсоединены к PB3 PB4.

Скрытый текст

 


#define F_CPU 128000UL
#include <avr/io.h>
#include <avr/wdt.h> // здесь организована работа с ватчдогом
#include <avr/sleep.h> // здесь описаны режимы сна
#include <avr/interrupt.h> // работа с прерываниями
#include <util/delay.h>

volatile unsigned int count = 0;
//volatile bool flag = false;
unsigned int dil = 7;

void sleep();
void beep();

ISR (WDT_vect) {

      // if (++count>=dil) {
      //   count=0;
      //   flag=true;
      //   beep();
      // }

      WDTCR |= _BV(WDTIE); // разрешаем прерывания по ватчдогу. Иначе будет резет.
}

 // запускаем ШИМ, издаем звук, останавливаем ШИМ
void beep(){
        PORTB &= ~(1 << PB0);
        TCCR0A = 0b11000011; //10 11 00 11 режим ШИМ, неинверсный сигнал на выходе OC0A, инверсный - на выходе OC0B
        TCCR0B = 2; //00000010 предделитель тактовой частоты CLK/8
       
        OCR0A=1;

        _delay_ms(20000);

        OCR0A=0;
        TCCR0A = 0; 
        TCCR0B = 0; 
        PORTB &= ~(1 << PB0);
}

void sleep(){
        //инициализация ватчдога
        wdt_reset(); // сбрасываем
        wdt_enable(WDTO_2S); // разрешаем ватчдог 1 сек
        WDTCR |= _BV(WDTIE); // разрешаем прерывания по ватчдогу. Иначе будет резет.
        sei(); // разрешаем прерывания
        
        set_sleep_mode(SLEEP_MODE_PWR_DOWN); // если спать - то на полную
}

int main() {

  	// в зависимости от конфигурации переключателей, изменяем период.
      switch ((PINB & 1100)>>2)
      {
        case 0b00:
          dil=6; //кажые 12 секнуд
          break;

        case 0b10:
          dil= 450;  // 15хв
          break;

        case 0b11:
          dil= 600;  // 20хв
          break;

        case 0b01:
          dil= 750;  // 25хв
          break;

        default:
          break;
      }


      DDRB |= (1 << PB0)|(1 << PB3)|(1 << PB4);//DDRB = _BV(PB0);
      PORTB &= ~(1 << PB0);

      TCNT0=0; // начальное значение счётчика
      OCR0A=0; // регистр совпадения A
      OCR0B=0; // регистр совпадения B

      sleep();
      
      while(1) {
                sleep_enable(); // разрешаем сон
                sleep_cpu(); // спать!
                if (++count>=dil) {
                  beep();
                  //flag=false;
                  count=0;
                }
        }
}

 

Прошу помогите найти ошибку, а то я уже не знаю что тут не так..

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

4 часа назад, Юра Махович сказал:

разрешаем прерывания по ватчдогу. Иначе будет резет.

а вотчдог то тут зачем??? совершенно непонятно!!! И кто у тебя процессор будит ото сна можно пояснить?

Думаю развернутые ответы на эти два вопроса решат ваши проблемы.

Можно сделать все! Но чем больше можно, тем больше нельзя!

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

3 часа назад, Юра Махович сказал:

_delay_ms(20000);

Это 20 секунд

3 часа назад, Юра Махович сказал:

сигнал 2 секунды

 

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества. Подробнее>>

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

7 минут назад, ruhi сказал:

а вотчдог то тут зачем??? совершенно непонятно!!! И кто у тебя процессор будит ото сна можно пояснить?

Собака и будит.

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

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

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

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

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

20 минут назад, Геннадий сказал:

Собака и будит.

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

Потом, слип и ватчдог могут состояние ног как то поменять - там очень внимательно надо пдф-ки читать, и даже то что кажется понятным проверять практическими экспериментами.

Поэтому их надо по отдельности отлаживать, а лучше вообще будить таймером, например.

Можно сделать все! Но чем больше можно, тем больше нельзя!

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

Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока (материалы вебинара)

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

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

Когда-то делал подобную хрень - просто вел подсчет сбросов от WDT, так и отсчитывал долгие интервалы. С прерываниями от WDT и не заморачивался никогда.

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

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

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

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

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

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

2 часа назад, ARV сказал:

Когда-то делал подобную хрень - просто вел подсчет сбросов от WDT, так и отсчитывал долгие интервалы. С прерываниями от WDT и не заморачивался никогда.

Как вы так сделали? У меня по сути тоже идёт подщет, в прерывании по сути ничего и не происходит. Но проблема в том, что оно как-то не стабильно работает, пропускает период время от времени, иногда вообще зависает...  Думаю может после успешного генерирования сигнала делать резет, чтоб оно хоть как-то работало .

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

Только что, Юра Махович сказал:

Как вы так сделали?

Элементарно, Ватсон!.mp3

Проект, где я это делал, можно скачать здесь: https://radiokot.ru/circuit/digital/game/14/

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

28 минут назад, ARV сказал:

Проект, где я это делал, можно скачать здесь: https://radiokot.ru/circuit/digital/game/14/

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

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

Только что, Юра Махович сказал:

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

Ну как-то так, да.

Только что, BARS_ сказал:

Смысл использования собаки в данном проекте?

Экономия электроэнергии

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

Тогда надо проверить отдельно собаку. Взять сделать простую прошивку, которая будет просто мигать диодом при пробуждении МК. И почему в цикле условие стоит после отправки МК в спячку?

 

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

20 минут назад, BARS_ сказал:

Тогда надо проверить отдельно собаку.

Пример с морганием светодиода работает как надо, в этом и нюанс..

20 минут назад, BARS_ сказал:

И почему в цикле условие стоит после отправки МК в спячку?

МК засыпает, собака его будит, он прибавляет единицу в переменную, и когда она станет больше или равно необходимой, происходит beep(); и обнуляется счётчик. Собственно. ничего бы не изменилось если условия было до сна, т.к. оно находиться в бесконечном цикле.

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

beep у вас по коду 20 секунд, а вы пишите 2. Что-то тут не так.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

Только что, BARS_ сказал:

Да. Но ведь логичнее это делать в прерывании по собаке

Я и делал,  еще остались закоментированные строки.

 

3 минуты назад, ARV сказал:

20 секунд, а вы пишите 2

Меня тоже это смутило, но пищит оно 2 секунды, я сам до конца не понимаю как так.
Период поставил 3 секунды, собаку завел на 500мс.

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

Скрытый текст

IMG_20190403_145801.thumb.jpg.c905d1bc45ea3a62be5161bcf86ad021.jpgIMG_20190403_145704.thumb.jpg.f29cd6c52d2763c0a55892b8738b82c6.jpg

 

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

3 минуты назад, Юра Махович сказал:

Меня тоже это смутило, но пищит оно 2 секунды

Все просто. В настройках проекта неправильно задана частота ядра, вот он и считает криво задержку.

 

5 минут назад, Юра Махович сказал:

Как мне кажеться прерывания срабатывают во время задержки на генерацию звука

Ну так надо собаку отключать перед началом генерации и включать после окончания.

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

3 минуты назад, BARS_ сказал:

Ну так надо собаку отключать перед началом генерации и включать после окончания.

А как правильно ее выключать? А то я пробовал, и оно вообще не работает...

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

Переписал программу, взяв за основу проект @ARV `а, и все так-же, некоторое время работает нормально, потом опять.. Поставил период 10сек. 

Код:

Скрытый текст

#define F_CPU 600000UL
#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <avr/sleep.h>

static uint16_t	__attribute__((section(".noinit"))) next_timeout;

static void __attribute__((naked, used, section(".init2"))) on_reset(void){
	if(MCUSR & _BV(PORF)){
		// переменные инициализируются только при включении питания!!!
		next_timeout = 1;

	}
	// действия при любом сбросе:
	MCUSR = 0;					// подавление флагов
					// холостой вызов генератора случайных чисел
	wdt_enable(WDTO_1S);		// запуск WDT
}

/** БИП
 * Функция издает писк заданной длительности.
 * @param ms10 длительность звука в десятках миллисекунд
 */
static void beep(uint8_t ms10){
	// запуск таймера на генерацию меандра
	DDRB = _BV(PB0);
	// TCCR0A = _BV(COM0A1) | _BV(COM0B0) | _BV(COM0B1) | _BV(WGM01) | _BV(WGM00);
	// TCCR0B = _BV(CS01);

  PORTB &= ~(1 << PB0);
  TCCR0A = 0b10000011; //10 11 00 11 режим ШИМ, неинверсный сигнал на выходе OC0A, инверсный - на выходе OC0B
  TCCR0B = 2;


	// требуемая задержка
	for(; ms10; ms10--){
		_delay_ms(10);
		wdt_reset();
	}
	// выключение таймера

	TCCR0B = 0;
	TCCR0A = 0;
	DDRB = 0;
	PORTB = 0;

}

/// главная функция программы
int __attribute__((OS_main)) main(void){
	// инициализация периферии

	OCR0A = 127;
	// OCR0B = 127;

	// обработка СБРОСА
	if(next_timeout){
		// пока очередной интервал не истек - не делается ничего
		next_timeout--;
	} else {
		// когда интервал истек - воспроизводится один из 8 возможных сигналов
		
    beep(200);
    
    // int dil = 0;
    //  switch ((PINB & 1100)>>2)
    //   {
    //     case 0b00:          
    //       beep(100);
    //       dil=8; //кожні 2 секнуди
    //       break;

    //     case 0b10:
    //       dil= 450;  // 15хв
    //       break;

    //     case 0b11:
    //       dil= 600;  // 20хв
    //       break;

    //     case 0b01:
    //       dil= 750;  // 25хв
    //       break;

    //     default:
    //       break;
    //   }



		next_timeout = 10;//dil;
	}
	// отработав событие сброса, МК усыпляется в самый экономичный режим
	set_sleep_mode(SLEEP_MODE_PWR_DOWN);
	sleep_mode();
}

 

Осциллограмма:

Скрытый текст

IMG_20190403_183804.thumb.jpg.615f68a0d621cf3570fb05646305df2d.jpg

 

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

И питается схема как? Ощущение такое, что питание пропадает или проваливается.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

28 минут назад, Геннадий сказал:

В Вашей схеме вывод Reset подтянут к +Uпит.

Нет, она не подключена. (Во время теста, была подключена к usbASP свистку, как и все остальное).

Питается схема все от того же свистка (во время теста).

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

P.S. Какие значение нужно указать в DDRB чтобы PB3 PB4 стали входами ?

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

16 минут назад, Юра Махович сказал:

Какие значение нужно указать в DDRB чтобы PB3 PB4 стали входами ?

Нули в соответствующих битах сделают пины входами. После сброса они все входы.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

Поставил период на 15 минут (900 секунд), а по факту получил 17 с половиной минут. Есть ли какой-то способ повысить точность отсчета ?

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

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

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

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

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

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

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

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

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

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

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