433 МГЦ ПРИЕМНИК НА ATTINY13

Обсуждаем контроллеры компании Atmel.
Ответить
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Чт дек 16, 2021 14:02:26

Сообщение Emil1 »

Добрый вечер друзья! Нужна помощь по слиянию двух программ на аттины13. Здесь приемник 433мгц и простая мигалка светодиодом.Задумка такая,для снижения потребления приемника я назначил PB4 как выход 3.6В ,приемник будет питаться именно в момент мигания светодиода то есть будет обесточен 2 секунды потом включаться на 2 секунды. Весь мозг сломал не получается объеденить это дело. делей сильно тормозит по этому отказался от этого. По отдельности все прекрасно работает.

#define F_CPU 1200000UL // Clock speed 1.2 MHz (-Ulfuse:w:0x6A:m)
#define TRF_RX_PIN PB0 // Receiver on Pin 0
#define TRF_DATA_SIZE 2 // Command size 2 bytes
#define TRF_TX_DISABLED // Exclude transmitter code to preserve space
#define TX_VCC_PIN PB4 // Контакт приемника
#define LED_1_PIN PB3 // Pin definitions for 1 LED
#include "tinyrf.h"
#include <util/delay.h>
// LED pins control macro
#define init_led_pins() DDRB |= (1 << LED_1_PIN)
#define set_led_pin(pin, state) state ? PORTB |= (1 << pin) : PORTB &= ~(1 << pin)

int main(void)
{
// Initialize timer and ports
trf_init();
init_led_pins();

while (1)
{
// If a new command is available
if (trf_has_received_data()) {

// Get received data
uint8_t data_buffer[TRF_DATA_SIZE];
trf_get_received_data(data_buffer);

// Check data integrity (second byte must have inverted value of the first)
if (data_buffer[0] == (uint8_t)(~data_buffer[1])) {
switch (data_buffer[0]) {
case 11:
set_led_pin(LED_1_PIN, 1); // Turn on LED1

_delay_ms (2500);
set_led_pin(LED_1_PIN, 0); // Turn off LED1

}
}

// Reset state to listen for new messages
trf_reset_received();
}
}
}
================

const int ledPin = PB4; // переменная с номером пина светодиода
const long ledInterval = 200; // интервал мигания светодиодом, мсек.

int ledState = LOW; // начальное состояние светодиода
unsigned long previousMillis = 0; // храним время предыдущего срабатывания светодиода

void setup() {
pinMode(ledPin, OUTPUT); // задаём пин PB4 как выход.
}

void loop() {

// Мигание светодиодом:
// время с момента включения Arduino, мсек:
unsigned long currentMillis = millis();
// Если время мигать пришло,
if (currentMillis - previousMillis >= ledInterval) {
previousMillis = currentMillis; // то запоминаем текущее время
if (ledState == LOW) { // и инвертируем состояние светодиода
ledState = HIGH;
} else {
ledState = LOW;
}
digitalWrite(ledPin, ledState); // переключаем состояние светодиода
}
}
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 135
Зарегистрирован: Вт фев 21, 2012 20:42:26
Откуда: Санкт-Петербург, Россия, Земля

Сообщение U235 »

Пожалуйста, отформатируйте сообщение, код в таком виде неудобно читать.
Реклама
VNS
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1633
Зарегистрирован: Пт дек 10, 2021 12:48:46
Откуда: Тюмень

Сообщение VNS »

Где здесь? :) Приёмник реализован в программном коде? Что такое выход 3,6 В? Или в коде написан просто циклический таймер, который зажигает светодиод через каждые 2 сек, на 2 сек? Если так, то и делей справится, если МК более ничего не делает. А если есть у него по мимо этого ещё другие задачи, то используйте не делей, а таймер-счётчик0, по прерыванию которого будете вести подсчёт нужного интервала.
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Что вы так на него накинулись? Где он вам найдет ответы на ваши вопросы?
Emil1 писал(а):приемник 433мгц
возможно китайский с i2c интерфейсом?
Emil1 писал(а):// Initialize timer and ports
trf_init();
видимо инициализация какого-то таймера?
Emil1 писал(а):delay_ms (2500);
а это, наверное, специально так сделано?
Emil1 писал(а):// Get received data
uint8_t data_buffer[TRF_DATA_SIZE];
видимо, куда-то передает, интересно, куда?

Одним словом, по этому куску кода больше вопросов, чем ответов.
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Чт дек 16, 2021 14:02:26

Сообщение Emil1 »

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

#define F_CPU 1200000UL // Clock speed 1.2 MHz (-Ulfuse:w:0x6A:m)
#define TRF_RX_PIN PB0 // Receiver on Pin 0
#define TRF_DATA_SIZE 2 // Command size 2 bytes
#define TRF_TX_DISABLED // Exclude transmitter code to preserve space
#define TX_VCC_PIN PB4 // Контакт приемника
#define LED_1_PIN PB3 // Pin definitions for 1 LED
#include "tinyrf.h"
#include <util/delay.h>
// LED pins control macro
#define init_led_pins() DDRB |= (1 << LED_1_PIN)
#define set_led_pin(pin, state) state ? PORTB |= (1 << pin) : PORTB &= ~(1 << pin)

int main(void)
{
// Initialize timer and ports
trf_init();
init_led_pins();

while (1)
{
// If a new command is available
if (trf_has_received_data()) {

// Get received data
uint8_t data_buffer[TRF_DATA_SIZE];
trf_get_received_data(data_buffer);

// Check data integrity (second byte must have inverted value of the first)
if (data_buffer[0] == (uint8_t)(~data_buffer[1])) {
switch (data_buffer[0]) {
case 11:
set_led_pin(LED_1_PIN, 1); // Turn on LED1

_delay_ms (2500);
set_led_pin(LED_1_PIN, 0); // Turn off LED1

}
}

// Reset state to listen for new messages
trf_reset_received();
}
}
}

Добавлено after 1 minute 34 seconds:
но мне нужно перевести его в режим энергосбережения. 2 секунды сон 2 секунды прием.

Добавлено after 8 minutes 7 seconds:
[uquote="VNS",url="/forum/viewtopic.php?p=4142711#p4142711"]Где здесь? :) Приёмник реализован в программном коде? Что такое выход 3,6 В? Или в коде написан просто циклический таймер, который зажигает светодиод через каждые 2 сек, на 2 сек? Если так, то и делей справится, если МК более ничего не делает. А если есть у него по мимо этого ещё другие задачи, то используйте не делей, а таймер-счётчик0, по прерыванию которого будете вести подсчёт нужного интервала.[/uquote]

Да приемник реализован в программном коде. 3.6В это третьея нога микросхемы куда через каждые 2 секунды подается напряжение питания на 2 секунды. Приемник берет питание от 3 ноги. сам модуль китайского приемника в ждущем режиме потребляет 5ма. Вот я и решил таким образом снизить потребленные до 2.5ма. функция Делай не подходит. приемник зависает.

Добавлено after 2 minutes 51 second:
[uquote="Dimon456",url="/forum/viewtopic.php?p=4142779#p4142779"]Что вы так на него накинулись? Где он вам найдет ответы на ваши вопросы?
Emil1 писал(а):приемник 433мгц
возможно китайский с i2c интерфейсом?
Emil1 писал(а):// Initialize timer and ports
trf_init();
видимо инициализация какого-то таймера?
Emil1 писал(а):delay_ms (2500);
а это, наверное, специально так сделано?
Emil1 писал(а):// Get received data
uint8_t data_buffer[TRF_DATA_SIZE];
видимо, куда-то передает, интересно, куда?

Одним словом, по этому куску кода больше вопросов, чем ответов.[/uquote]
нет он только принимает сигнал от передатчика.

Добавлено after 3 minutes 37 seconds:
Хочу заметить..у меня есть хекс файл передатчика. Если кому нужно пишите ,могу отправить. все прекрасно работает.
Реклама
VNS
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1633
Зарегистрирован: Пт дек 10, 2021 12:48:46
Откуда: Тюмень

Сообщение VNS »

Вы меня совсем запутали
[uquote="Emil1",url="/forum/viewtopic.php?p=4142830#p4142830"]Да приемник реализован в программном коде.[/uquote]
Если приёмник реализован в программном коде, тогда как понять это:
Приемник берет питание от 3 ноги. сам модуль китайского приемника в ждущем режиме потребляет 5ма.
Видимо МК управляет лишь питанием модуля приёмника? Так? Допустим… а что ещё делает МК? Кстати, а какой ток максимальный у этого китайского модуля (приёмника)? Ногу МК не перегрузите?
Emil1 писал(а):Вот я и решил таким образом снизить потребленные до 2.5ма. функция Делай не подходит. приемник зависает.
Если приёмник (модуль) потребляет в ждущем режиме 5 мА, то как можно снизить потребление его до 2,5 мА? Или Вы пишите одно, а предполагаете совсем другое? Ведь так не бывает… если модуль потребляет 5 мА, то он так и будет потреблять 5 мА когда находится в ждущем режиме. А зависает он по другой причине… во-первых нужно было бы хоть ссылку на модуль дать, чтобы понимать о каком модуле идёт речь… возможно Вы и сами не особо понимаете работу данного модуля в полном объёме, от того и пляски с бубном. :)
Реклама
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Emil1 писал(а):это третьея нога микросхемы
какой микросхемы?
Emil1 писал(а):функция Делай не подходит. приемник зависает.
а куда это делай влепили?
Emil1 писал(а):у меня есть хекс файл передатчика
на кой нам хекс, код давай.
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Сообщение neid »

Emil1, в интернете есть рабочая библиотека с alexgyver таких поделок с 433 и тинькой 13... и снижение потребления энергии мк до 1uA - будет жить года два на одной батарейке, и всякие фичи, всякие датчики! Вообщем тебе туда!
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Чт дек 16, 2021 14:02:26

Сообщение Emil1 »

[uquote="VNS",url="/forum/viewtopic.php?p=4142855#p4142855"]Вы меня совсем запутали
[uquote="Emil1",url="/forum/viewtopic.php?p=4142830#p4142830"]Да приемник реализован в программном коде.[/uquote]
Если приёмник реализован в программном коде, тогда как понять это:
Приемник берет питание от 3 ноги. сам модуль китайского приемника в ждущем режиме потребляет 5ма.
Видимо МК управляет лишь питанием модуля приёмника? Так? Допустим… а что ещё делает МК? Кстати, а какой ток максимальный у этого китайского модуля (приёмника)? Ногу МК не перегрузите?
Emil1 писал(а):Вот я и решил таким образом снизить потребленные до 2.5ма. функция Делай не подходит. приемник зависает.
Если приёмник (модуль) потребляет в ждущем режиме 5 мА, то как можно снизить потребление его до 2,5 мА? Или Вы пишите одно, а предполагаете совсем другое? Ведь так не бывает… если модуль потребляет 5 мА, то он так и будет потреблять 5 мА когда находится в ждущем режиме. А зависает он по другой причине… во-первых нужно было бы хоть ссылку на модуль дать, чтобы понимать о каком модуле идёт речь… возможно Вы и сами не особо понимаете работу данного модуля в полном объёме, от того и пляски с бубном. :)[/uquote]

Вы не совсем правильно поняли меня да и я сам не правильно изложил мысли.
attiny13 принимает сигнал с приемника, декодирует его и включает нагрузку через транзисторный ключ. на данный момент все прекрасно работает,только китайский модуль жрет 5ма и это очень много для моего проекта. Я хочу чтоб attiny13 кроме докодирования сигнала еще и включал и отключал питание приемного модуля по таймеру или как то иначе по две секунды. Именно по этому я назначил вторую ногу тинки как питание для приемного модуля. А насчет 2.5ма это так и получается если приемник пол часа будет обесточен а пол часа работать. Надеюсь более менее внятно смог объяснить. вот и сам модуль. https://aliexpress.ru/item/32966646508. ... 1577695128

Добавлено after 1 minute 35 seconds:
[uquote="neid",url="/forum/viewtopic.php?p=4142943#p4142943"]Emil1, в интернете есть рабочая библиотека с alexgyver таких поделок с 433 и тинькой 13... и снижение потребления энергии мк до 1uA - будет жить года два на одной батарейке, и всякие фичи, всякие датчики! Вообщем тебе туда![/uquote]
Спасибо щас посмотрю
VNS
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1633
Зарегистрирован: Пт дек 10, 2021 12:48:46
Откуда: Тюмень

Сообщение VNS »

Теперь всё понятно… так в начале и нужно было написать. :)
Теперь о реализации работы вывода, который подаёт питание на модуль приёмника… уберите из алгоритма функцию делей, она при такой задаче нужна как корове седло. Вам для отсчёта интервалов в таком случае нужно задействовать таймер-счётчик. А так же определить переменную или рабочий регистр который будет отсчитывать интервалы. А так же необходимо выделить бит для флага в каком не будь из рабочих регистров (может у Вас уже есть регистр флагов, так вот там нудно выделить один бит для нового флага, назовём его к примеру F_ON_OFF). Так как у Вас тини тактируется на частоте 1,2 МГц, то при установке предделителя СК/1024 период переполнения таймер-счётчика составит 218,453 мс. Если в регистр TCNT0 записать десятичное число 21, то период переполнения составит примерно 200 мс. Данное число необходимо записывать и при наступлении прерывания. Таким образом, Вы получаете стабильный интервал времени при котором основной цикл программы идёт своим чередом. При каждом прерывании Вы увеличиваете счётный регистр (или счётную переменную – смотря что Вы выбрали. Далее я буду считать что выбран рабочий регистр к примеру R18) на единицу. А затем проверяете этот регистр (R18)… в Вашем случае нужен интервал 2 сек… значит когда в регистре R18 будет десятичное число 10, значит с момента отсчёта времени прошло 2 сек. И значит нужно выполнить то или иное действие. При этом счётный регистр R18 необходимо очистить для подсчёта очередного интервала времени. Допустим при подаче питания на МК, питание на модуль было отключено… После очистки счётного регистра R18, нужно посмотреть в каком состоянии флаг F_ON_OFF. Если он сброшен (лог 0), то поднять этот флаг, который будет означать необходимость подачи питания на модуль. В основном цикле программы Вы пропишите процедуру проверки этого флага, если он поднят (лог 1), значит на вывод 3 подайте лог 1. А если флаг сброшен (лог 0), то на вывод 3 нужно подать лог 0.
Вот примерно так можно организовать Ваш интервал времени в 4 сек. При котором 2 секунды будет модуль под питанием и 2 сек модуль будет обесточен. Такая реализация интервала не будет мешать работе основного алгоритма. Надеюсь и виснуть приёмник не будет, так как виснет не приёмник, а Ваш МК при таком неправильном алгоритме... :beer:
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

VNS писал(а):TCNT0 ... R18
:facepalm:
Начнем заново
Dimon456 писал(а):
Emil1 писал(а):// Initialize timer and ports
trf_init();
видимо инициализация какого-то таймер
Код, в студию.
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Чт дек 16, 2021 14:02:26

Сообщение Emil1 »

[uquote="VNS",url="/forum/viewtopic.php?p=4143071#p4143071"]Теперь всё понятно… так в начале и нужно было написать. :)
Теперь о реализации работы вывода, который подаёт питание на модуль приёмника… уберите из алгоритма функцию делей, она при такой задаче нужна как корове седло. Вам для отсчёта интервалов в таком случае нужно задействовать таймер-счётчик. А так же определить переменную или рабочий регистр который будет отсчитывать интервалы. А так же необходимо выделить бит для флага в каком не будь из рабочих регистров (может у Вас уже есть регистр флагов, так вот там нудно выделить один бит для нового флага, назовём его к примеру F_ON_OFF). Так как у Вас тини тактируется на частоте 1,2 МГц, то при установке предделителя СК/1024 период переполнения таймер-счётчика составит 218,453 мс. Если в регистр TCNT0 записать десятичное число 21, то период переполнения составит примерно 200 мс. Данное число необходимо записывать и при наступлении прерывания. Таким образом, Вы получаете стабильный интервал времени при котором основной цикл программы идёт своим чередом. При каждом прерывании Вы увеличиваете счётный регистр (или счётную переменную – смотря что Вы выбрали. Далее я буду считать что выбран рабочий регистр к примеру R18) на единицу. А затем проверяете этот регистр (R18)… в Вашем случае нужен интервал 2 сек… значит когда в регистре R18 будет десятичное число 10, значит с момента отсчёта времени прошло 2 сек. И значит нужно выполнить то или иное действие. При этом счётный регистр R18 необходимо очистить для подсчёта очередного интервала времени. Допустим при подаче питания на МК, питание на модуль было отключено… После очистки счётного регистра R18, нужно посмотреть в каком состоянии флаг F_ON_OFF. Если он сброшен (лог 0), то поднять этот флаг, который будет означать необходимость подачи питания на модуль. В основном цикле программы Вы пропишите процедуру проверки этого флага, если он поднят (лог 1), значит на вывод 3 подайте лог 1. А если флаг сброшен (лог 0), то на вывод 3 нужно подать лог 0.
Вот примерно так можно организовать Ваш интервал времени в 4 сек. При котором 2 секунды будет модуль под питанием и 2 сек модуль будет обесточен. Такая реализация интервала не будет мешать работе основного алгоритма. Надеюсь и виснуть приёмник не будет, так как виснет не приёмник, а Ваш МК при таком неправильном алгоритме... :beer:[/uquote]

Благодарю за подробный ответ! Я больше электроник чем кодер) и половину того что вы написали я не понял к сожалению. я только недавно начил изучать программирование. Здесь LED_1_PIN.. set_led_pin(LED_1_PIN, 1); // Turn on LED1
_delay_ms (2500);
set_led_pin(LED_1_PIN, 0); // Turn off LED1
Это нагрузка .его включение через делей мне какраз таки не мешает,потому что во время срабатывании нагрузки с удержанием 2.5 секунд приемник не должен реагировать на повторный сигнал.

Добавлено after 3 minutes 18 seconds:
[uquote="Dimon456",url="/forum/viewtopic.php?p=4143091#p4143091"]
VNS писал(а):TCNT0 ... R18
:facepalm:
Начнем заново
Dimon456 писал(а):
Emil1 писал(а):// Initialize timer and ports
trf_init();
видимо инициализация какого-то таймер
Код, в студию.[/uquote]

Добрый день! вот собственно и сам код.

#define F_CPU 1200000UL // Clock speed 1.2 MHz (-Ulfuse:w:0x6A:m)
#define TRF_RX_PIN PB0 // Receiver on Pin 0
#define TRF_DATA_SIZE 2 // Command size 2 bytes
#define TRF_TX_DISABLED // Exclude transmitter code to preserve space
#define TX_VCC_PIN PB4 // Контакт приемника
#define LED_1_PIN PB3 // Pin definitions for 1 LED
#include "tinyrf.h"
#include <util/delay.h>
// LED pins control macro
#define init_led_pins() DDRB |= (1 << LED_1_PIN)
#define set_led_pin(pin, state) state ? PORTB |= (1 << pin) : PORTB &= ~(1 << pin)

int main(void)
{
// Initialize timer and ports
trf_init();
init_led_pins();

while (1)
{
// If a new command is available
if (trf_has_received_data()) {

// Get received data
uint8_t data_buffer[TRF_DATA_SIZE];
trf_get_received_data(data_buffer);

// Check data integrity (second byte must have inverted value of the first)
if (data_buffer[0] == (uint8_t)(~data_buffer[1])) {
switch (data_buffer[0]) {
case 11:
set_led_pin(LED_1_PIN, 1); // Turn on LED1

_delay_ms (2500);
set_led_pin(LED_1_PIN, 0); // Turn off LED1

}
}

// Reset state to listen for new messages
trf_reset_received();
}
}
}
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Emil1 писал(а):#include "tinyrf.h"
где файлик?
Если код написан корректно, то кроме h файла и c файл будет.
Весь проект в архив zip (rar не все скачивают) и сюда.
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Чт дек 16, 2021 14:02:26

Сообщение Emil1 »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4143191#p4143191"]
Emil1 писал(а):#include "tinyrf.h"
где файлик?
Если код написан корректно, то кроме h файла и c файл будет.
Весь проект в архив zip (rar не все скачивают) и сюда.[/uquote]

Да я вас понял.
Вложения
examples.zip
(28.17 КБ) 105 скачиваний
tinyrf.h.txt
(61 байт) 94 скачивания
VNS
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1633
Зарегистрирован: Пт дек 10, 2021 12:48:46
Откуда: Тюмень

Сообщение VNS »

[uquote="Emil1",url="/forum/viewtopic.php?p=4143168#p4143168"]Это нагрузка .его включение через делей мне какраз таки не мешает,[/uquote]
Ещё как мешает… просто Вы об этом не догадываетесь. :) Когда происходит отсчёт паузы по делей, МК ничего более не может делать, то есть тупо отсчитывает данную паузу и всё. А это не есть хорошо. Но решать конечно Вам, что Вам подходит, а что нет.
Что именно Вы не поняли о чём я писал? Я писал про использования таймер-счётчика0… Вы его пробовали использовать или для Вас это в новинку?
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Чт дек 16, 2021 14:02:26

Сообщение Emil1 »

[uquote="VNS",url="/forum/viewtopic.php?p=4143269#p4143269"][uquote="Emil1",url="/forum/viewtopic.php?p=4143168#p4143168"]Это нагрузка .его включение через делей мне какраз таки не мешает,[/uquote]
Ещё как мешает… просто Вы об этом не догадываетесь. :) Когда происходит отсчёт паузы по делей, МК ничего более не может делать, то есть тупо отсчитывает данную паузу и всё. А это не есть хорошо. Но решать конечно Вам, что Вам подходит, а что нет.
Что именно Вы не поняли о чём я писал? Я писал про использования таймер-счётчика0… Вы его пробовали использовать или для Вас это в новинку?[/uquote]

Да вы правы,это пока мне трудно. Но по вотчдогу кое что получилось. в ждущем режиме 4.7ма ,вовремя сна 1ма. думаю тинка не полностью уходит в сон.

#define F_CPU 1200000UL // Clock speed 1.2 MHz (-Ulfuse:w:0x6A:m)
#define TRF_RX_PIN PB0 // Receiver on Pin 0
#define TRF_DATA_SIZE 2 // Command size 2 bytes
#define TRF_TX_DISABLED // Exclude transmitter code to preserve space
//#define TX_VCC_PIN PB4 // Выход 3.6V к приемнику
#define LED_1_PIN PB3 // Pin definitions for 1 LED
#include <util/delay.h>
#define init_led_pins() DDRB |= (1 << LED_1_PIN) // LED pins control macro
#define set_led_pin(pin, state) state ? PORTB |= (1 << pin) : PORTB &= ~(1 << pin)
#include <avr/wdt.h> // здесь организована работа с ватчдогом
#include <avr/sleep.h> // здесь описаны режимы сна
#include <avr/interrupt.h> // работа с прерываниями
#include "tinyrf.h"

ISR (WDT_vect) {
PORTB ^= _BV(PB4); // переключаем светодиод
WDTCR |= _BV(WDTIE); // разрешаем прерывания по ватчдогу. Иначе будет резет.
}

int main() {

// инициализация порта светодиода
DDRB = _BV(PB4); // на этом пине висит светодиод
PORTB = _BV(PB4); // зажгем его
// Initialize timer and ports
trf_init();
init_led_pins();
//инициализация ватчдога
wdt_reset(); // сбрасываем
wdt_enable(WDTO_4S); // разрешаем ватчдог 1 сек
WDTCR |= _BV(WDTIE); // разрешаем прерывания по ватчдогу. Иначе будет резет.
sei(); // разрешаем прерывания

set_sleep_mode(SLEEP_MODE_PWR_DOWN); // если спать - то на полную
//PORTB = 0; // Отключаем пины, заводим "будильник" на 4 секунд и выключаемся
sleep_mode();
while(1) {

// If a new command is available
if (trf_has_received_data()) {

// Get received data
uint8_t data_buffer[TRF_DATA_SIZE];
trf_get_received_data(data_buffer);

// Check data integrity (second byte must have inverted value of the first)
if (data_buffer[0] == (uint8_t)(~data_buffer[1])) {
switch (data_buffer[0]) {
case 11:
set_led_pin(LED_1_PIN, 1); // Turn on LED1
_delay_ms (2500);
set_led_pin(LED_1_PIN, 0); // Turn off LED1
}
}

// Reset state to listen for new messages
trf_reset_received();
sleep_enable();
sleep_cpu();
}
}
}
VNS
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1633
Зарегистрирован: Пт дек 10, 2021 12:48:46
Откуда: Тюмень

Сообщение VNS »

[uquote="Emil1",url="/forum/viewtopic.php?p=4143301#p4143301"]Но по вотчдогу кое что получилось. в ждущем режиме 4.7ма ,вовремя сна 1ма.[/uquote]
Если в режиме Power Down, то это много. Аналоговый компаратор не забыли выключить? По умолчанию он всегда включен. И к неиспользуемым портам подтяните внутренние резисторы. Это поможет уменьшить потребление.

ЗЫ. Если не секрет, чем управляет приёмник? При такой борьбе за экономию?

ЗЫ. ЗЫ. Кстати, если научились использовать сторожевой таймер, то можно его как раз использовать для пробуждения… а именно, алгоритм примерно такой: как сделали все нужные дела, перед уходом в сон включать сторожевой таймер (настроив его предварительно на 2 сек.). После пробуждения сторожевой таймер отключаете, делаете всё, что необходимо и затем опять в сон. Таким образом, сон будет составлять именно 2 сек. Ну а сколько потребуется для бодрствования, это уже другой вопрос. :)
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Сообщение neid »

Emil1, в PWR_DOWN режиме у меня тинька13 потребляет 4uA и то я считаю много... должно меньше быть - десятые микроампер! а у вас 1милиампер, это вообще перебор!
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Чт дек 16, 2021 14:02:26

Сообщение Emil1 »

Да много однозначно но я справился. Щас 25мка. подправил код в вотчдоге.

Добавлено after 12 minutes 42 seconds:
Спасибо VNS за советы..Вопрос решен.
VNS
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1633
Зарегистрирован: Пт дек 10, 2021 12:48:46
Откуда: Тюмень

Сообщение VNS »

Замечательно! :)
Ответить

Вернуться в «AVR»