У мня уличный даччик на 85+SoftSerial+JDY40. Раз в минуту шлёт данные. На компе я их ловлю, и на рабочий стол ложу. Скорость 9600, стабильность - ну примерно один пакет из 20 приходит битый.
Спасибо. Еще вопрос вдогонку - как организовано питание? Напрямую от лития нельзя JDY40, хотя пишут опять разное.
Именно напрямую от лития. Я ее как-то по недосмотру и от 5В питал долгое время. Потом протрезвел, ужаснулся, переключил на 3.3В. Потом купил lm2950 на 3.3, да ставить лень, так от лития и питается. Отключаю CS - ом, тогда она в сон падает и не жрет ничо
Господа. Есть ли у кого реальный опыт использования ATtiny 13/45/85 + софтСериал + JDY-40?
у меня чуть другая связка - Тини85 + СофтСериал + HC-12. Трудится больше года, шлет данные датчика раз минуту. Питание от лития напрямую. Автономность 5 месяцев на батарейке емкостью 550мАч
новую тему не стал создавать, решил написать здесь. на этом форуме нашел скетч копировальщика домофонных ключей. на ардуино работает, проверял. решил его реализовать на аттини 85. прошивал через usbasp. вывода проверял через блинк, все работают, да и мк новый. но почему то на тиньке работать не хочет
новую тему не стал создавать, решил написать здесь. на этом форуме нашел скетч копировальщика домофонных ключей. на ардуино работает, проверял. решил его реализовать на аттини 85. прошивал через usbasp. вывода проверял через блинк, все работают, да и мк новый. но почему то на тиньке работать не хочет
Копируешь ссылку на json-файл в браузере. Потом заходишь в настройки Arduino IDE и вставляешь ссылку в строку "Дополнительные ссылки для менеджера плат".
Я тут появлялся года 2 назад с темой программирования Attiny13, спасибо помогли.
Теперь новая загвоздка: на тини13 реализовать схему цикличного таймера на 24 часа. На выводе Pin3 через сутки меняется уровень с 0 на 1 (уход +- 10 минут за сутки допускается). На выводе Pin4 уровень меняется с частотой 0,5Гц - для светодиода.
Код зашил в аттини. На малых режимах времени работает нормально, но при установке 12 часов переключение происходит с запаздыванием почти на 40-50 минут в течение суток. Я представляю какой будет разброс если введу 24 часа...
Местные Гуру, помогите советом!
Видимо так:
// Эти переменные хранят временной шаблон для интервалов мигания
// и текущее состояние светодиодов
int ledPin1 = 3; // номер пина со светодиодом
int ledState1 = LOW; // состояние светодиода
// последний момент времени, когда состояние светодиода изменялось
unsigned long previousMillis1 = 0;
long OnTime1 = 42408000; // длительность свечения светодиода (в миллисекундах)
long OffTime1 = 42408000; // светодиод не горит (в миллисекундах)
int ledPin2 = 4; // номер пина со светодиодом
int ledState2 = LOW; // состояние светодиода
// последний момент времени, когда состояние светодиода изменялось
unsigned long previousMillis2 = 0;
long OnTime2 = 500; // длительность свечения светодиода (в миллисекундах)
long OffTime2 = 500; // светодиод не горит (в миллисекундах)
void setup() {
// устанавливаем цифровой пин со светодиодом как ВЫХОД
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
}
void loop() {
// выясняем не настал ли момент сменить состояние светодиода
unsigned long currentMillis = millis(); // текущее время в миллисекундах
// конечный автомат для 1-го светодиода
if ((ledState1 == HIGH) && (currentMillis - previousMillis1 >= OnTime1))
{
ledState1 = LOW; // выключаем
previousMillis1 = previousMillis1 + OnTime1;
// previousMillis1 = currentMillis; // запоминаем момент времени
digitalWrite(ledPin1, ledState1); // реализуем новое состояние
}
else if ((ledState1 == LOW) && (currentMillis - previousMillis1 >= OffTime1))
{
ledState1 = HIGH; // выключаем
previousMillis1 = previousMillis1 + OffTime1;
// previousMillis1 = currentMillis ; // запоминаем момент времени
digitalWrite(ledPin1, ledState1); // реализуем новое состояние
}
// конечный автомат для 2-го светодиода
if ((ledState2 == HIGH) && (currentMillis - previousMillis2 >= OnTime2))
{
ledState2 = LOW; // выключаем
previousMillis2 = previousMillis2 + OnTime2;
//previousMillis2 = currentMillis; // запоминаем момент времени
digitalWrite(ledPin2, ledState2); // реализуем новое состояние
}
else if ((ledState2 == LOW) && (currentMillis - previousMillis2 >= OffTime2))
{
ledState2 = HIGH; // выключаем
previousMillis2 = previousMillis2 + OffTime2;
// previousMillis2 = currentMillis ; // запоминаем момент времени
digitalWrite(ledPin2, ledState2); // реализуем новое состояние
}
}
Хоть я и не местный гуру, но попробую предположить, что тактовый генератор у тиньки не самый точный. Как вариант попробовать считать время не через millis, а напрямую встроенным таймером и установить максимальную частоту работы. Хотя не факт, что это поможет.
З.Ы. Мне как автору темы, очень приятно видеть, что всё вот так разрослось, тема перешла порог в 1800 сообщений, и я очень рад, что я был на истоках этой движухи...
Добрый вечер друзья! Нужна помощь по слиянию двух программ на аттины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); // переключаем состояние светодиода
}
}
Есть вопросик, накидал код для управления фонарем. Вроде все работает, но имеется одно но - периодически фонарь зависает в режиме сна, причем хаотично, помогает только сброс. Может ли быть дело в коде, сам уже несколько раз перепроверил, ничего критичного вроде не обнаружил. Может глаз конечно "замылился", можете глянуть?
//#define F_CPU 9600000UL // для Arduino IDE можно не указывать (вибирается из списка в меню плат)
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define false 0 // ложь
#define true 1 // истина
volatile uint8_t sss1 = 0; // счетчик значений АЦП
volatile uint8_t lowBat = false; // батарея разряжена
volatile uint8_t flgClick = false; // флаг клика
volatile uint8_t beUnPress = false; // флаг отпускания
volatile uint8_t switchLED = false; // флаг переключения диодов
volatile uint8_t keyFalsePress = true; // флаг нажатия кнопки
volatile uint16_t tCounter = 0; // счетчик мкС
volatile uint16_t msCounter = 0; // счетчик кратно - 10мС
volatile uint16_t msCounterNow = 0; // счетчик кратно - 10мС текущий
volatile uint16_t voltVal = 0; // переменная для накопления значений АЦП
uint8_t PWM_MODE_LED[4] = {255, 0, 128, 235}; // режимы PWM (0% - 255, 100% - 0, 50% - 128, 25% - 192)
uint8_t PWM_MODE_COB[4] = {255, 0, 128, 192}; // режимы PWM (0% - 255, 100% - 0, 50% - 128, 25% - 192)
uint8_t butPressTime = 0; // счетчик времени нажатия
uint8_t pwmMode = 0; // режим работы PWM (0 - выкл, 1 - макс., 3 - мин.)
uint8_t flgPress = false; // признак кнопка в нажатом состоянии
uint8_t LedMode = false; // переключатель светодиодов
uint8_t flgLngPress = false; // признак удержания кнопки
//****************************************************************
// мигаем основным светодиодом при низком заряде
//
void BlinkLed(){
TCCR0A &= ~((1 << COM0B1) | (1 << COM0B0)); // отключаем ШИМ COB
TCCR0A |= (1 << COM0A1) | (1 << COM0A0); // включаем ШИМ PB0
for (uint8_t i = 0; i < 5 ; i++){
for (uint8_t j = 127; j < 255 ; j++){
_delay_ms(1); // отладка
OCR0A = j;
}// end for
for (uint8_t j = 255; j > 127 ; j--){
_delay_ms(1); // отладка
OCR0A = j;
}// end for
}// end for
}// end BlinkLed()
// переходим в режим сна
//
void RunSleep(){
LedMode = false;
flgLngPress = false; // сбрасываем флаги
flgPress = false; // сбрасываем флаги
TCCR0A &= ~((1 << COM0A1) | (1 << COM0A0)); // отключаем ШИМ LED
TCCR0A &= ~((1 << COM0B1) | (1 << COM0B0)); // отключаем ШИМ COB
PORTB &= ~((1 << PB4) | (1 << PB1) | (1 << PB0)); // низкий уровень на портах
ADCSRA &= ~(1 << ADEN); // выключаем АЦП
GIMSK |= (1 << PCIE); // включаем прерывания по кнопке
PCMSK |= (1 << PCINT2); // PCINT2 для возращения в нормальный режим из сна
MCUCR |= (1 << SE); // режим сна включен
asm("sleep"); // уходим в сон
asm("nop"); // пустой цикл (вроде после сна нужен)
}// end RunSleep()
// устанавливаем режим работы светодиодов
//
void Set_PWM() {
switch (LedMode) {
case 0:
TCCR0A &= ~((1<<COM0B1) | (1<<COM0B0)); // отключаем ШИМ PB1
OCR0A = PWM_MODE_LED[pwmMode];
TCCR0A |= (1<<COM0A1) | (1<<COM0A0); // включаем ШИМ PB0
break;
case 1:
TCCR0A &= ~((1<<COM0A1) | (1<<COM0A0)); // отключаем ШИМ PB0
OCR0B = PWM_MODE_COB[pwmMode];
TCCR0A |= (1<<COM0B1) | (1<<COM0B0); // включаем ШИМ PB1
break;
}// end switch
}// end Set_PWM()
// выходим из сна по изменению состояния кнопки (обработчик прерывания)
//
ISR(PCINT0_vect){
if (!(PINB & (1 << PB2))) { // если включились по отпусканию кнопки
beUnPress = true; // поднимаем флаг включения по отпусканию кнопки
}// end if
MCUCR &= ~(1 << SE); // режим сна выключен
GIMSK &= ~(1 << PCIE); // выключаем прерывания по пинам
PCMSK = 0x00; // выключаем прерывания по выводу кнопки
PORTB |= (1 << PB4); // открываем полевик, подтягиваем делитель в минусу
lowBat = false; // снимаем флаг низкого уровня АКБ
switchLED = false; // снимаем флаг переключение светодиодов
keyFalsePress = true; // поднимаем флаг случайного нажатия / помехи / дребезга
msCounterNow = msCounter; // запускаем счетчик после нажатия
ADCSRA |= (1 << ADEN)|(1 << ADSC); // включаем АЦП
}// ISR(INT0_vect)
// обработчик прерывания АЦП
//
ISR(ADC_vect){
uint16_t voltValTmp = 1024;
voltVal += ADCW; // добавляем текущее значение АЦП
sss1++; // инкрементируем счетчик
if (sss1 > 9) { // если количество отсчетов АЦП больше 10
voltValTmp = voltVal / (sss1); // находим среднее арифметичсекое АЦП
voltVal = 0;
sss1 = 0;
}// end if
// если напряжение меньше 3В - поднимаем флаг
if (voltValTmp < 665) lowBat = true; // ~3V
else lowBat = false;
}// end ISR (ADC_vect)
// обработчик прерывания по переполнению 0 таймера
//
ISR(TIM0_OVF_vect){
tCounter++;
if (tCounter > 375) { // ~10ms
tCounter = 0; // обнуляем счетчик
msCounter++; // счетчик 10мс
}// end if
}// ISR (TIM0_OVF_vect)
int main(void){
DDRB |= (1 << PB4) | (1 << PB1) | (1 << PB0); // порты 0, 1, 4 на выход
PORTB |= (1 << PB4); // открываем полевик, подтягиваем делитель к минусу
// Отключаем компаратор
ACSR = 0x00; // обнуляем регистр
ACSR |= (1 << ACD); // выключаем компаратор
// Инициализируем АЦП
ADMUX |= (1 << REFS0) | (1 << MUX1) | (1 << MUX0); // внутреннее опорное напряжение, выбран вход ADC3 (PB3)
ADCSRA |= (1 << ADEN) | (1 << ADSC) | (1 << ADATE) // АЦП включен, запуск преобразования, режим автоизмерения,
| (1 << ADIE) // прерывание по окончанию преобразования,
| (1 << ADPS2) | (1 << ADPS1)| (1 << ADPS0); // частота CLK/128
ADCSRB = 0x00; // режим автоизмерения: постоянно запущено
DIDR0 |= (1 << ADC3D); // запрещаем цифровой вход на ноге аналогового входа
// Режим Fast PWM, частота сигнала=F_CPU / делитель*256
OCR0A = 255; // регистр сравнения (инвертированный сигнал ШИМ 0)
OCR0B = 255; // регистр сравнения (инвертированный сигнал ШИМ 0)
TCCR0A |= (1<<WGM00) | (1<<WGM01) | // Режим Fast PWM, таймер считает до 255 и сбрасывается в 0
(1<<COM0A1) | (1<<COM0A0) | // 0 при равенстве регистров TCNT0 и OCROA. 1 при переполнении (инвертированный ШИМ-сигнал)
(1<<COM0B1) | (1<<COM0B0); // 1 при равенстве регистров TCNT0 и OCROB. 0 при переполнении (неинвертированный ШИМ-сигнал)
TCCR0B |= (1<<CS00); // делитель 1 (ШИМ ~37кГц)
TIMSK0 |= (1 << TOIE0); // вкл. прерывание по переполнению таймера
// настройка режима сна
MCUCR |= (1 << SM1); // power-down mode
sei(); // разрешаем глобально прерывания
//RunSleep(); // уходим в сон (в зашитой прошивке нет)
while(1) {
// если кнопка нажата
if ((PINB & (1 << PB2)) && !flgLngPress) {
_delay_ms(25); // время на дребезг
if (PINB & (1 << PB2)) { // если кнопка все еще нажата
keyFalsePress = false; // снимаем флаг случайного нажатия
butPressTime++; // начало отсчета времени нажатия кнопки
if (butPressTime >= 45){ // ~1 сек (15мс *(55 + обработка команд))
flgLngPress = true;
flgPress = false; // клик
butPressTime = 0; // обнуляем счетчик времени нажатия
}// end if
else{
flgPress = true; // клик
}// end else
}// end if
}// end if
// отпустили кнопку (клик)
if (flgPress && !(PINB & (1 << PB2))){
flgPress = false; // сбрасываем флаг нажатия
butPressTime = 0; // обнуляем счетчик времени нажатия
pwmMode++; // инкрементируем режим PWM
if (pwmMode > 3) pwmMode = 0; // сбрасываем режим PWM (у нас всего 4 режима: 0-3)
Set_PWM(); // устанавливаем режим светодиода
if (!pwmMode) RunSleep(); // если PWM выключен, уходим в сон
}// end if
// если длительное нажатие
if (flgLngPress && !switchLED){
LedMode = !LedMode; // переключаем на другой светодиод
pwmMode = 1;
Set_PWM(); // устанавливаем режим светодиода
switchLED = true; // поднимаем флаг, что переключили светодиоды (защита от многократно срабатывания)
}// end if
// если отпустили после длительного нажатия
if (flgLngPress && !(PINB & (1 << PB2))){
switchLED = false;
flgLngPress = false;
flgPress = false; // сбрасываем флаг нажатия
}// end if
// защита от помехи / случайного нажатия
// если нажатие было случайное или помеха, фонарь не включен и прошло больше 2с
if (keyFalsePress && !pwmMode && ((msCounter - msCounterNow) > 200)){
RunSleep(); // выключаемся (засыпаем)
}// end if
// если аккумулятор разрядился
if (lowBat){
if (!beUnPress) BlinkLed();
else beUnPress = false;
pwmMode = 0;
RunSleep();
}// end if
}// end while(1)
}// end main
Есть еще фонарь на 44 тиньке, код примерно такой же, тоже периодически зависает, примерно также.
Т.е. не выходит из сна.
Так и хочется сказать. Дядя, "ты ещё мал и глуп. И не видал больших ..." Не видал обычных фонарей!
В основном файле 315 строк, в основном хедере 380 и ещё 30(!) дополнительных файлов. Лень считать.
Обычный фонарь. Одна кнопка - один светодиод.
ничего критичного вроде не обнаружил. Может глаз конечно "замылился", можете глянуть?
void RunSleep(){
LedMode = false;
flgLngPress = false; // сбрасываем флаги
flgPress = false; // сбрасываем флаги
TCCR0A &= ~((1 << COM0A1) | (1 << COM0A0)); // отключаем ШИМ LED
TCCR0A &= ~((1 << COM0B1) | (1 << COM0B0)); // отключаем ШИМ COB
PORTB &= ~((1 << PB4) | (1 << PB1) | (1 << PB0)); // низкий уровень на портах
ADCSRA &= ~(1 << ADEN); // выключаем АЦП
GIMSK |= (1 << PCIE); // включаем прерывания по кнопке
PCMSK |= (1 << PCINT2); // PCINT2 для возращения в нормальный режим из сна
MCUCR |= (1 << SE); // режим сна включен
asm("sleep"); // уходим в сон
asm("nop"); // пустой цикл (вроде после сна нужен)
}// end RunSleep()
Может быть дело не в этом, но часто для исключения неопределенности, запрещают все прерывания перед началом установок для сна и разрешают последней командой перед sleep.
Из описания
When using the SEI instruction to enable interrupts, the instruction following SEI will be executed before any pending interrupts, as shown in this example.
83,55 руб. 40%СКИДКА | Высокоэффективный преобразователь питания, 500 мА, от 0,8-3,3 В до 3,3 В, PFM, повышающий преобразователь для ds18b20, dht22, STM32, FPGA, CPLD https://a.aliexpress.com/_AaZyIt
Всем доброго времени!
Пытаюсь сделать тахометр для шпинделя станка (по факту частотомер). Т.к. купить "из комплекта" зеленое земноводное не дает. Драйвер шпинделя выдает меандр, ну или почти (на низких) частотах от 0 до 400Гц 10В. Обороты, в теории, до 12000. Соответственно гдо-то 1/30 соотношение.
Накидал программку, но не уcтраивает точность - прыгают значения частоты порядка +-20 Гц. А это, сами понимаете, может вылезти в погрешность оборотов в минуту порядка 600. Что не приемлемо.
Сначала сделал в режиме FAST PWM. Из-за погрешности решил более точно подогнать измерение времени и переделал на режим CTC. Посчитал по формуле частоту из ДШ получилось, что для 100кГц нужно установить OCR0A = 47. Формула расчета из ДШ (fOCnx = fclk_I/O / (2 * N * (1 + OCRnx)). Но при таком значении не работает. Думал, что не запускается таймер - на дисплее нули. Но потом случайно изменил на 100 и все заработало, причем примерно на расчетной частоте. Где я накосячил? Пока оставил только счетчикс выводом на дисплей (MAX7219), чтобы таймер откалибровать.
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define T_IN PB1 // вход частотомера
#define DIN PB0 //
#define CS PB2 // выходы на индикатор (MAX7219)
#define CLK PB3 //
#define PER 250 // период времени измерения
volatile uint32_t tCounter; // счетчик времени (0.000001s)
volatile uint16_t sCounter; // счетчик времени (1s)
volatile uint16_t edgecounter; // ссчетчик импульсов на T_IN
volatile uint16_t freq; // частота на выходе драйвера
volatile uint8_t ssCount; // кол-во измерений для усреднения
volatile uint16_t rpm; // обороты в минуту
void WriteBit16(byte reg, byte data){
PORTB &= ~(1 << CLK);
PORTB &= ~(1 << CS);
for (int i = 7; i >= 0; i--){
if(((reg >> i) & 1) == 1){
PORTB |= (1 << DIN);
}//end if
else{
PORTB &= ~(1 << DIN);
}//end else
PORTB |=(1 << CLK);
PORTB &= ~(1 << CLK);
}//end for
for (int i = 7; i >= 0; i--){
if(((data >> i) & 1) == 1){
PORTB |= (1 << DIN);
}//end if
else{
PORTB &= ~(1 << DIN);
}//end else
PORTB |=(1 << CLK);
PORTB &= ~(1 << CLK);
}//end for
PORTB |=(1 << CS);
PORTB &= ~(1 << CLK);
PORTB &= ~(1 << DIN);
}//end void WriteBit16()
void dec(long decimal){
//WriteBit16(0x08,15);
//WriteBit16(0x07,15/*decimal/1000000%10*/); // 15 - пустой разряд (без свечения) 0x0F
//WriteBit16(0x06,15/*decimal/100000%10*/); // 15 - пустой разряд (без свечения)
WriteBit16(0x05,decimal/10000%10);
WriteBit16(0x04,decimal/1000%10/*+0x80 точка*/);
WriteBit16(0x03,decimal/100%10);
WriteBit16(0x02,decimal/10%10);
WriteBit16(0x01,decimal%10);
}//end void dec(long decimal)
ISR(TIM0_COMPA_vect){
tCounter++; //~1ms
if (tCounter > 99999){ // ~1с
tCounter = 0; // обнуляем счетчик
ssCount++; // секунда для отладки
/*
if (ssCount > 99){
freq += edgecounter; // частота - кол-во импульсов за промежуток времени...
edgecounter = 0; // обнуляем счетчик импульсов на входе PB1 (INT0) ~ каждую секунду
ssCount = 0;
sCounter++;
if (sCounter > 9){
rpm = freq;
freq = 0;
sCounter = 0;
}//end if
}//end if
*/
}//end if
}//end ISR(TIM0_COMPA_vect)
// Обработчик прерывания INT0
/*
ISR(INT0_vect){
edgecounter++;
}//end ISR(INT0_vect)
*/
void setup(){
//DDRB &= ~(1 << T_IN); // порт частотометра на вход (на всякий случай)
DDRB |= (1 << DIN) | (1 << CS) | (1 << CLK); // порты управления дисплеем на выход
PORTB |= (1 << CS); // на CS пин высокий уровень
PORTB &= ~(1 << CLK) | (1 << DIN); // на CLK и DIN - низкий
WriteBit16(0x0F,0x00); // Тест выкл.
WriteBit16(0x0C,0x01); // Вкл. индик.
WriteBit16(0x0B,0x04); // кол-во разрядов (5)
WriteBit16(0x09,0x1F); // Дешифраторы вкл. 5 разрядов
WriteBit16(0x0A,0x02); // яркость (0-15)
cli(); //отключаем прерывания глобально
// TIM0
TCNT0 = 0; // обнуляем счетный регистр
OCR0A = 99; // для частоты таймера 100 кГц (предделитель 96)
TCCR0A |= (1 << WGM01); // режим CTC (сброс по совпадению)
TCCR0B |= (1 << CS00); // предделитель 1 (частота для CTC: частота чипа /(2*делитель*(1+OCR0A))
TIMSK0 |= (1 << OCIE0A); // вкл. прерывание по совпадению таймера
//INT0
//MCUCR |= (1 << ISC01)/* | (1 << ISC00)*/; // прерывание по восходящему фронту
//GIMSK |= (1 << INT0); // включаем прерывание
sei(); //включаем прерывания глобально
}//end setup()
void loop(){
dec(ssCount);
_delay_ms(PER);
}//end loop()
У мня уличный даччик на 85+SoftSerial+JDY40. Раз в минуту шлёт данные. На компе я их ловлю, и на рабочий стол ложу. Скорость 9600, стабильность - ну примерно один пакет из 20 приходит битый.
Спасибо. Еще вопрос вдогонку - как организовано питание? Напрямую от лития нельзя JDY40, хотя пишут опять разное.
Именно напрямую от лития. Я ее как-то по недосмотру и от 5В питал долгое время. Потом протрезвел, ужаснулся, переключил на 3.3В. Потом купил lm2950 на 3.3, да ставить лень, так от лития и питается. Отключаю CS - ом, тогда она в сон падает и не жрет ничо
Господа. Есть ли у кого реальный опыт использования ATtiny 13/45/85 + софтСериал + JDY-40?
у меня чуть другая связка - Тини85 + СофтСериал + HC-12. Трудится больше года, шлет данные датчика раз минуту. Питание от лития напрямую. Автономность 5 месяцев на батарейке емкостью 550мАч
новую тему не стал создавать, решил написать здесь. на этом форуме нашел скетч копировальщика домофонных ключей. на ардуино работает, проверял. решил его реализовать на аттини 85. прошивал через usbasp. вывода проверял через блинк, все работают, да и мк новый. но почему то на тиньке работать не хочет
новую тему не стал создавать, решил написать здесь. на этом форуме нашел скетч копировальщика домофонных ключей. на ардуино работает, проверял. решил его реализовать на аттини 85. прошивал через usbasp. вывода проверял через блинк, все работают, да и мк новый. но почему то на тиньке работать не хочет
что-то с дисплеем накосячил
я дисплей закоментировал, я его не использую. тупо кнопка, диод и контакты под ibutton
ДА НУ?
строка 22, 83 далее не смотрел )))
было дело, компилятор ругался, все исправлено было.
может дело в таймерах? в прошлый раз мне подсказали таймер2 поменять на таймер0, но я так и не разобрался
Подскажите как работать с EEPROM ATTyni13. Программирую через Ардуино всё время выдаёт ошибки
compilation terminated.
Sok
1. ATTyni13 не существует !!!
2. Вы брали пакет поддержки Tiny там же где и автор видео ?
Вот тут под видео есть ссылки на пакет, который он использует -
https://www.youtube.com/watch?v=rzSS_lGbVpU&list=PLwj1S-y03QNhxqAKbr85ICK60GxnvVRx3
Там ссылка на текстовый код! Как его поместить в библиотеку?
Простите за опечатку
Там ссылка json на модуль поддержки плат Tiny.
Там ссылка json на модуль поддержки плат Tiny.
Я наверно торможу, ткните пальцем, или скопируйте мне ссылку пожалуйста.
Я наверно торможу
Наверно.
Копируешь ссылку на json-файл в браузере. Потом заходишь в настройки Arduino IDE и вставляешь ссылку в строку "Дополнительные ссылки для менеджера плат".
https://mcudude.github.io/MicroCore/package_MCUdude_MicroCore_index.json
https://mcudude.github.io/MicroCore/package_MCUdude_MicroCore_index.json
Громадное спасибо!!! Я просто не сталкивался с таким способом установки библиотек....
Доброго дня (вечера) Всем!
Я тут появлялся года 2 назад с темой программирования Attiny13, спасибо помогли.
Теперь новая загвоздка: на тини13 реализовать схему цикличного таймера на 24 часа. На выводе Pin3 через сутки меняется уровень с 0 на 1 (уход +- 10 минут за сутки допускается). На выводе Pin4 уровень меняется с частотой 0,5Гц - для светодиода.
Код зашил в аттини. На малых режимах времени работает нормально, но при установке 12 часов переключение происходит с запаздыванием почти на 40-50 минут в течение суток. Я представляю какой будет разброс если введу 24 часа...
Местные Гуру, помогите советом!
Видимо так:
Хоть я и не местный гуру, но попробую предположить, что тактовый генератор у тиньки не самый точный. Как вариант попробовать считать время не через millis, а напрямую встроенным таймером и установить максимальную частоту работы. Хотя не факт, что это поможет.
а миллис как, по вашему, считается? - через встроенный таймер :)
З.Ы. Мне как автору темы, очень приятно видеть, что всё вот так разрослось, тема перешла порог в 1800 сообщений, и я очень рад, что я был на истоках этой движухи...
Творите, ATtiny13 замечательный инструмент в умелых руках, я на нём даже ваттметр разворачивал:
https://www.youtube.com/watch?v=oXgvUM9U2ng
Добрый вечер друзья! Нужна помощь по слиянию двух программ на аттины13. Здесь приемник 433мгц и простая мигалка светодиодом.Задумка такая,для снижения потребления приемника я назначил PB4 как выход 3.6В ,приемник будет питаться именно в момент мигания светодиода то есть будет обесточен 2 секунды потом включаться на 2 секунды. Весь мозг сломал не получается объеденить это дело. делей сильно тормозит по этому отказался от этого. По отдельности все прекрасно работает.
Доброго времени!
Есть вопросик, накидал код для управления фонарем. Вроде все работает, но имеется одно но - периодически фонарь зависает в режиме сна, причем хаотично, помогает только сброс. Может ли быть дело в коде, сам уже несколько раз перепроверил, ничего критичного вроде не обнаружил. Может глаз конечно "замылился", можете глянуть?
Есть еще фонарь на 44 тиньке, код примерно такой же, тоже периодически зависает, примерно также.
Т.е. не выходит из сна.
232 строчки кода на фонарь. Но мы лёгких путей не ищем, так держать...
Так и хочется сказать. Дядя, "ты ещё мал и глуп. И не видал больших ..." Не видал обычных фонарей!
В основном файле 315 строк, в основном хедере 380 и ещё 30(!) дополнительных файлов. Лень считать.
Обычный фонарь. Одна кнопка - один светодиод.
ничего критичного вроде не обнаружил. Может глаз конечно "замылился", можете глянуть?
Может быть дело не в этом, но часто для исключения неопределенности, запрещают все прерывания перед началом установок для сна и разрешают последней командой перед sleep.
Из описания
Благодарю. Попробую так сделать - в даташнике не прочитал этого, видимо так внимательно читал...
Наконец то пришли правильные стабилизаторы с микроамперными токами потребления в покое,
10 мкА без нагрузки, 16 мкА в спящем режиме всей схемы.
Уличный термометр, каждые ~17 минут отправляющий данные, скетч:
вопрос? что за ядро такое и куда функцию - sleep_bod_disable() заныкал )))
Наконец то пришли правильные стабилизаторы с микроамперными токами потребления в покое,
10 мкА без нагрузки, 16 мкА в спящем режиме всей схемы.
Уличный термометр, каждые ~17 минут отправляющий данные, скетч:
вопрос? что за ядро такое и куда функцию - sleep_bod_disable() заныкал )))
Не очень понял вопрос про функцию, а ядро скачивал с сайта чип и дип, там примеры разработок.
Наконец то пришли правильные стабилизаторы с микроамперными токами потребления в покое,
10 мкА без нагрузки, 16 мкА в спящем режиме всей схемы.
Уличный термометр, каждые ~17 минут отправляющий данные, скетч:
вопрос? что за ядро такое и куда функцию - sleep_bod_disable() заныкал )))
разобрался! этот код под attiny25/45/85 )))
Второй вопрос, что за правильные стабилизаторы?
83,55 руб. 40%СКИДКА | Высокоэффективный преобразователь питания, 500 мА, от 0,8-3,3 В до 3,3 В, PFM, повышающий преобразователь для ds18b20, dht22, STM32, FPGA, CPLD
https://a.aliexpress.com/_AaZyIt
Не смог найти ссылку, но вроде оно.
Для ATtiny13 используется MicroCore, а для ATtiny2313A используется ATТinyCore. Что нужно настроить, что бы скетчи работали на ATtiny2313A?
Всем доброго времени!
Пытаюсь сделать тахометр для шпинделя станка (по факту частотомер). Т.к. купить "из комплекта" зеленое земноводное не дает. Драйвер шпинделя выдает меандр, ну или почти (на низких) частотах от 0 до 400Гц 10В. Обороты, в теории, до 12000. Соответственно гдо-то 1/30 соотношение.
Накидал программку, но не уcтраивает точность - прыгают значения частоты порядка +-20 Гц. А это, сами понимаете, может вылезти в погрешность оборотов в минуту порядка 600. Что не приемлемо.
Сначала сделал в режиме FAST PWM. Из-за погрешности решил более точно подогнать измерение времени и переделал на режим CTC. Посчитал по формуле частоту из ДШ получилось, что для 100кГц нужно установить OCR0A = 47. Формула расчета из ДШ (fOCnx = fclk_I/O / (2 * N * (1 + OCRnx)). Но при таком значении не работает. Думал, что не запускается таймер - на дисплее нули. Но потом случайно изменил на 100 и все заработало, причем примерно на расчетной частоте. Где я накосячил? Пока оставил только счетчикс выводом на дисплей (MAX7219), чтобы таймер откалибровать.