Обсуждаем электронику на колесах. Нужен увлажнитель воздуха для Камаза? Вам сюда.
Ответить

Re: "Умный" выключатель ДХО и ПТФ для мотоцикла

Чт ноя 21, 2019 15:40:32

написал программу, исполняющую твой алгоритм, для реализации задержек применен таймер Т0
фильтрация нажатий происходит в макросе (чтобы не писать руками одинаковый код для каждой кнопки)
для экономии питания настроил спящий режим (между опросами кнопок мк спит), и на всякий случай завел "собаку"...
________
сейчас твой алгоритм скачаю... :)

Добавлено after 12 minutes 5 seconds:
думаю мой алгоритм ты сможешь поправить при необходимости...
____
расследую поведение ламп... если ДХО включена маслом, а фара кнопкой, то хай_бим уже ничего не меняет... может при включении фары ДХО следует гасить?

Добавлено after 2 hours 15 minutes 10 seconds:
параметры в функцию можно передавать через регистр или через программный стек...
в случае стека выделяется переменная с постоянным адресом (обычно регистр Y), хранящая указатель стека
при записи в стек, её значение уменьшается (т.е. она уже указывает на соседнюю ячейку), при извлечении — увеличивается... тут важно сколько положил, столько (причем соблюдая обратный порядок) взял... иначе всё собьётся
(не путай с аппаратным стеком - он для другого)...

Добавлено after 7 minutes 20 seconds:
С компиляторы поступают также, но от программиста это скрыто...
Вложения
ДХО.zip
(69.05 KiB) Скачиваний: 258

Re: "Умный" выключатель ДХО и ПТФ для мотоцикла

Чт ноя 21, 2019 19:35:18

Круто! Вот реально. Я даже половины пока не понял, как работает. Но, работает быстрее, и занимает меньше места в памяти.

Re: "Умный" выключатель ДХО и ПТФ для мотоцикла

Пт дек 06, 2019 13:22:22

Почти финальная (вторая уже) версия выглядит так. Потом, были некоторые правки по печатной плате, уже исходя из опыта этой. Но я, ещё одну делать не буду.
Изображение Изображение
Плата под заливку компаундом, в корпус 40х40х20мм из чипидипа
Собрано, проверено, работает. В прошивке, небольшие правки (переназначение выводов, и ещё что-то). За саму прошивку, спасибо Ivanoff-iv
Вложения
BMWdrl_last.zip
(49.88 KiB) Скачиваний: 235

Re: "Умный" выключатель ДХО и ПТФ для мотоцикла

Сб янв 30, 2021 23:10:50

Добрый вечер уважаемые коты. Вопрос. Как сделать так, что бы микроконтроллер перевести в режим сна. А потом, по нажатию кнопки, вывести его из сна и выполнить определенный код. После завершения вновь установить режим сна. Тут на досуге накопипастил код. Дополнительный стоп-сигнал (для авто/мото) с разбегающимися при включении огоньками и сбегающимися при выключении. Просто долго пыхтел над тем как правильно спать. Побродил по разным форумам и получилось такое.. Вроде как и вопрос - не вопрос.
main.cpp
Спойлер
Код:
/* ATtiny85 hardware SPI master + 74HC595 */
#define F_CPU 128000UL // 128/8  kHz clock speed
#include <avr/io.h>
#include <avr/sleep.h>
#include <avr/interrupt.h>
#include "tinySPI.h"

#define BUTTON  PB4   

const uint16_t inhibitor1(3);
const uint16_t inhibitor2(4);

const uint8_t led_pattern[9] = {
   0b00000000,
   0b10000000,
   0b11000000,
   0b11100000,
   0b11110000,
   0b11111000,
   0b11111100,
   0b11111110,
   0b11111111 };

ISR( PCINT0_vect ){
   sleep_disable();// Проснуться
   
if( !(PINB & (1<<BUTTON)) ){// Кнопка нажата
for(int8_t i=0; i<9; i++){
    PORTB &= ~(1<<DI_DD_PIN);
   for(uint16_t n=0; n<inhibitor2; n++){ SPI.transfer(led_pattern[i]); }
   PORTB |= (1<<DI_DD_PIN); }   
}

if( PINB & (1<<BUTTON) ){// Кнопка отпущена
for(int8_t i=8; i!=-1; i--){
    PORTB &= ~(1<<DI_DD_PIN);
    for(uint16_t n=0; n<inhibitor1; n++){ SPI.transfer(led_pattern[i]); }
    PORTB |= (1<<DI_DD_PIN); }   
}
    sleep_cpu();// Спать!
}

int main(void){
   
PORTB|=  (1 << BUTTON); //Устанавливаем pull-up режим ножки BUTTON
DDRB &= ~(1 << BUTTON); //Настраиваем ножку BUTTON в режим входа

/* Не настраиваемое прерывание PCINT0 по любому фронту */
GIMSK |= (1<<PCIE);   // Разрешаем внешние прерывания PCINT0.
PCMSK |= (1<<BUTTON); // Разрешаем по маске прерывания.

    SPI.begin();  // запустить аппаратный SPI (библиотека настраивает контакты часов и данных)

    DDRB |= (1<<DI_DD_PIN); // OUTPUT LATCH_PIN
    PORTB |= (1<<DI_DD_PIN); //Устанавливаем pull-up режим ножки LATCH_PIN
   
/* Подготовка ко сну */
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Set Sleep Mode: Power Down
sleep_enable();

sei(); // разрешаем прерывания

sleep_cpu();// Спать!

    while (1) {/* гараж пустой, делать нечего */}
   
}
tinySPI.cpp
Спойлер
Код:
// Arduino tinySPI Library Copyright (C) 2018 by Jack Christensen and
// licensed under GNU GPL v3.0, https://www.gnu.org/licenses/gpl.html
//
// Arduino hardware SPI master library for
// ATtiny24/44/84, ATtiny25/45/85, ATtiny261/461/861, ATtiny2313/4313.
//
// https://github.com/JChristensen/tinySPI
// Jack Christensen 24Oct2013

#include "tinySPI.h"

void tinySPI::begin() {
   
    USICR &= ~(1<<(USISIE) | (1<<USIOIE) | (1<<USIWM1));
    USICR |=  (1<<(USIWM0) | (1<<USICS1) | (1<<USICLK));
   
    SPI_DDR_PORT |=  (1<<USCK_DD_PIN);   // set the USCK pin as output
    SPI_DDR_PORT |=  (1<<DO_DD_PIN);     // set the DO pin as output
    SPI_DDR_PORT &= ~(1<<DI_DD_PIN);     // set the DI pin as input
}

void tinySPI::setDataMode(uint8_t spiDataMode) {
if (spiDataMode == SPI_MODE1){ USICR |=  (1<<USICS0); }
                         else{ USICR &= ~(1<<USICS0); }
}

uint8_t tinySPI::transfer(uint8_t spiData) {
    USIDR = spiData;
    USISR = (1<<USIOIF);                // clear counter and counter overflow interrupt flag
    ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { // ensure a consistent clock period
    while ( !(USISR & (1<<USIOIF)) ) { USICR |= (1<<USITC); }
    }
    return USIDR;
}

void tinySPI::end() {
    USICR &= ~((1<<USIWM1) | (1<<USIWM0));
}

tinySPI SPI;
tinySPI.h
Спойлер
Код:
// Arduino tinySPI Library Copyright (C) 2018 by Jack Christensen and
// licensed under GNU GPL v3.0, https://www.gnu.org/licenses/gpl.html
//
// Arduino hardware SPI master library for
// ATtiny24/44/84, ATtiny25/45/85, ATtiny261/461/861, ATtiny2313/4313.
//
// https://github.com/JChristensen/tinySPI
// Jack Christensen 24Oct2013

#ifndef TINYSPI_H_INCLUDED
#define TINYSPI_H_INCLUDED

#include <util/atomic.h>

// USI ports and pins
// (Thanks to nopnop2002 for adding the definitions for ATtiny461/861 and 2313/4313.)
#if defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
  #define SPI_DDR_PORT DDRA
  #define USCK_DD_PIN  DDA4
  #define DO_DD_PIN    DDA5
  #define DI_DD_PIN    DDA6
#elif defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
  #define SPI_DDR_PORT DDRB
  #define USCK_DD_PIN  DDB2    // //PB2
  #define DO_DD_PIN    DDB1    // //PB1
  #define DI_DD_PIN    DDB0    // //PB0
#elif defined(__AVR_ATtiny261__) || defined(__AVR_ATtiny461__) || defined(__AVR_ATtiny861__)
  #define SPI_DDR_PORT DDRB
  #define USCK_DD_PIN  DDB2
  #define DO_DD_PIN    DDB1
  #define DI_DD_PIN    DDB0
#elif defined(__AVR_ATtiny2313__) || defined(__AVR_ATtiny4313__)
  #define SPI_DDR_PORT DDRB
  #define USCK_DD_PIN  DDB7
  #define DO_DD_PIN    DDB6
  #define DI_DD_PIN    DDB5
#else
  #error "tinySPI does not support this microcontroller."
#endif

// SPI data modes
#define SPI_MODE0 0   //0x00
#define SPI_MODE1 4   //0x04

class tinySPI {
    public:
        static void begin();
        static void setDataMode(uint8_t spiDataMode);//
        static uint8_t transfer(uint8_t spiData);//
        static void end();
};

extern tinySPI SPI;

#endif
Планирую приделать это дело на мотоцикл, только на регистре TPIC6C595N. Код взял здесь. Отвязал код от ардуины и покоцал лишнее.
Вложения
hardware_SPI.gif
Модель дополнительного стоп-сигнала в протеусе. Аппаратная реализация SPI со сдвиговым регистром.
(171.5 KiB) Скачиваний: 94

Re: "Умный" выключатель ДХО и ПТФ для мотоцикла

Сб янв 30, 2021 23:53:57

Вот дожили, уже и без МК ничего сделать не можете? :dont_know:
А то вся идея реализуется на паре транзисторов и светодиодах, ну или на одной-двух простых МСках.

Re: "Умный" выключатель ДХО и ПТФ для мотоцикла

Вс янв 31, 2021 00:50:48

Согласен. Этого всего как тараканов за баней. И схемок всяких и разных много.

Re: "Умный" выключатель ДХО и ПТФ для мотоцикла

Пн фев 01, 2021 23:48:09

Сорри, а тогда зачем так усложнять. Я прагматик и мне такое не понять. :(
Ссылка на готовое, а без :solder: настоящим "радиокотам" совсем не интересно. :))
А сваять (китаицам на зло) образно говоря, из каких-нибудь простых "трёх элементов" тоже самое и с той же логикой исполнения - вот это Да и это по нашему!
Ответить