Форум ModelldepO  

Вернуться   Форум ModelldepO > Моделизм > Электрика и DCC
Электрика и DCC Обсуждение цифрового и аналогового управления

Ответ
 
Опции темы Опции просмотра
Старый 09.09.2021, 12:29   #26
Rebel
Местный
 
Аватар для Rebel
 
Регистрация: 22.11.2010
Адрес: Москва
Сообщений: 1,239
Сказал(а) 'не согласен(а)'!: 2
Сказали 'не согласен'! 16 раз(а) в 9 сообщениях
Сказал(а) спасибо: 742
Поблагодарили 672 раз(а) в 302 сообщениях
Репутация: - просто великолепная личность (687)
По умолчанию

Цитата:
Сообщение от osmanpasha Посмотреть сообщение
Вы randomSeed и random используете? После randomSeed(5) первый вызов random у меня возвращает 84035, а после randomSeed(11) - 184877. Если использовать srand и rand, то числа 18499 и 21037. Может быть, код неверный?
до ардуинки доберусь еще раз попробую тк мог накосячить и использовать randomSeed -> rand вместо randomSeed -> random


Цитата:
Сообщение от osmanpasha Посмотреть сообщение
оставить подключенными землю и, скажем
не) я ее целиком отрывал от юсб и секунд 10-30 вся плата без единого подключения была
__________________
Мой ➡️ макет ➡️ привод стрелки ➡️ декодер ➡️ и канал в телеграм 🎉
Rebel вне форума   Вверх
Старый 09.09.2021, 18:55   #27
osmanpasha
Заглянувший
 
Регистрация: 16.07.2019
Адрес: Новосибирск
Сообщений: 40
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 12
Поблагодарили 85 раз(а) в 22 сообщениях
Репутация: скоро придёт к известности (85)
По умолчанию

Потыкал в вочдог таймер у Attiny13. Он там есть и отлично работает, только биты регистра по-другому называются. Поэтому библиотека работать не будет, и пример с сайта придется слегка поменять.

Но есть один нюанс (еще один). В ядре microCore функция millis реализована через WDT, поэтому код, портированный напрямую из библиотеки, не будет компилироваться. Однако можно реализовать эту же идею сравнения таймера, используя готовый millis, даже не надо прерывания заводить.

Минимальный код для ATtiny13, который у меня получился для демонстрации:
оффтопик

Так при старте получается каждый раз разный seed. Частота была 9.6 МГц, но, думаю, особой разницы нет.

Вообще, конечно, вариант с analogRead на ноге, к которой подключен светодиод - самый простой в плане кода.
osmanpasha вне форума   Вверх
Пользователь сказал cпасибо:
Старый 11.09.2021, 01:39   #28
Rebel
Местный
 
Аватар для Rebel
 
Регистрация: 22.11.2010
Адрес: Москва
Сообщений: 1,239
Сказал(а) 'не согласен(а)'!: 2
Сказали 'не согласен'! 16 раз(а) в 9 сообщениях
Сказал(а) спасибо: 742
Поблагодарили 672 раз(а) в 302 сообщениях
Репутация: - просто великолепная личность (687)
По умолчанию

итак попробовал антипруф

скетч
Скрытый текст
Arduino код:
int bootrandom __attribute__ ((section (".noinit"))); ///< random at power up

void setup() {
  
Serial.begin(115200);  
  
delay(1000);
  
Serial.print("Bootrandom: ");
  
Serial.println(bootrandomDEC);
  
randomSeed(bootrandom);
  
bootrandom random(255); // get new seed at next boot
  
Serial.print("New bootrandom: ");
  
Serial.println(bootrandomDEC);
}

void loop() {
  
int myrandom random(255);
  
Serial.print("Random: ");
  
Serial.println(myrandomDEC);
  
delay(1000);



вывод в консоль
Скрытый текст

⸮Random: 212
Random: 232
Random: 18
Random: 191
Random: 173
Random: 123
Random: 97
Random: 24
Random: 220
⸮Random: 212
Random: 232
Random: 18
Random: 191
Random: 173
Random: 123
Bootrandom: -18017
New bootrandom: 143
Random: 232
Random: 212
Random: 232
Random: 18
Random: 191
Random: 173
Random: 123
Random: 97
Bootrandom: -18017
New bootrandom: 143
Random: 232
Random: 212
Random: 232
Random: 18
Random: 191
Random: 173
Random: 123



где две перезагрузки с короткими перерывами по питанию это
Код:
⸮Random: 212
Random: 232
затем еще две с более длинными перерывами
Код:
Bootrandom: -18017
New bootrandom: 143
поведение явно странное... но факт того что после перезагрузки значение не случайное на лицо
__________________
Мой ➡️ макет ➡️ привод стрелки ➡️ декодер ➡️ и канал в телеграм 🎉
Rebel вне форума   Вверх
Старый 11.09.2021, 10:16   #29
osmanpasha
Заглянувший
 
Регистрация: 16.07.2019
Адрес: Новосибирск
Сообщений: 40
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 12
Поблагодарили 85 раз(а) в 22 сообщениях
Репутация: скоро придёт к известности (85)
По умолчанию

Ага, действительно. Впрочем, гуглу, кажись, известна эта проблема. Вы же Nano используете? Старый загрузчик в Nano использовал больше памяти, чем новый, и эта переменная попадает в область инициализированной загрузчиком памяти. С новым загрузчиком, а также в Uno (и в Attiny, где нет никакого загрузчика), должно работать. Я в Uno проверял, там норм)

https://forum.arduino.cc/t/cant-get-...-nano/574921/3
osmanpasha вне форума   Вверх
Пользователь сказал cпасибо:
Старый 11.09.2021, 15:24   #30
Rebel
Местный
 
Аватар для Rebel
 
Регистрация: 22.11.2010
Адрес: Москва
Сообщений: 1,239
Сказал(а) 'не согласен(а)'!: 2
Сказали 'не согласен'! 16 раз(а) в 9 сообщениях
Сказал(а) спасибо: 742
Поблагодарили 672 раз(а) в 302 сообщениях
Репутация: - просто великолепная личность (687)
По умолчанию

Цитата:
Сообщение от osmanpasha Посмотреть сообщение
Старый загрузчик в Nano
да похоже так и есть.
на тини, конечно будет сложнее отлаживаться, да и ресет, висящий в воздухе так и просится быть использованным)
__________________
Мой ➡️ макет ➡️ привод стрелки ➡️ декодер ➡️ и канал в телеграм 🎉
Rebel вне форума   Вверх
Старый 13.09.2021, 22:54   #31
Rebel
Местный
 
Аватар для Rebel
 
Регистрация: 22.11.2010
Адрес: Москва
Сообщений: 1,239
Сказал(а) 'не согласен(а)'!: 2
Сказали 'не согласен'! 16 раз(а) в 9 сообщениях
Сказал(а) спасибо: 742
Поблагодарили 672 раз(а) в 302 сообщениях
Репутация: - просто великолепная личность (687)
По умолчанию

Цитата:
Сообщение от osmanpasha Посмотреть сообщение
int*bootrandom*__attribute__*((section*(".noinit") ));
проверил на тини, работает!

при этом, если после запуска не перезаписывать bootrandom случайным числом, то разнообразия в состоянии 4 диодов больше, чем при перезаписи, понятно что это призрачные умозаключения на основе малого количества испытаний, но тем не менее.

итак готовый скетч, не использующий чтение с ножки (но имеющий такую возможность)
Скрытый текст
Arduino код:
// ATtiny13 LED blinker
// Copyright (c) 2021 Aleksandr.ru
// @see http://aleksandr.ru

// #define RANDOM_PIN A0 // reset pin
#define LED1_PIN PB0
#define LED2_PIN PB1
#define LED3_PIN PB2
#define LED4_PIN PB4
#define MODE_PIN PB3

#define MAX_LAMP 4
#define MAX_MINUTES 60
#define LONG_DELAY 60
#define SHORT_DELAY 15

struct Lamp
{
    
uint8_t pin;
    
uint8_t minute;
    
boolean state;
};

Lamp lamps [] = {
    {
LED1_PIN0false},
    {
LED2_PIN0false},
    {
LED3_PIN0false},
    {
LED4_PIN0false}
};

uint8_t old_minute MAX_MINUTES;

#ifndef RANDOM_PIN
uint32_t bootrandom __attribute__ ((section (".noinit")));
#endif

void setup() 
{
    
#ifdef RANDOM_PIN
    
uint16_t bootrandom analogRead(RANDOM_PIN);
    
#endif
    
    
randomSeed(bootrandom);
    
    
pinMode(MODE_PININPUT_PULLUP);

    for (
uint8_t i 0MAX_LAMPi++) {
        
pinMode(lamps[i].pinOUTPUT);
        
lamps[i].state = !random(3); // 2/3 off     
    
}
}

void loop() 
{
    
// uint8_t minute = (millis() / 1000) % MAX_MINUTES;
    
uint8_t minute = (millis() / 1000 60) % MAX_MINUTES;
 
    if (
minute != old_minute) {
        
old_minute minute;

        for (
uint8_t i 0MAX_LAMPi++) {
            if (
lamps[i].minute == minute) {
                
change(lamps[i]);
            }
        }
    }
}

void change(Lamp &lamp)
{
    
lamp.state = !lamp.state;
    
digitalWrite(lamp.pinlamp.state HIGH LOW);
    
uint8_t max_delay = !digitalRead(MODE_PIN) ? LONG_DELAY SHORT_DELAY;    
    
uint8_t new_delay random(1max_delay);
    if (!
lamp.statenew_delay new_delay 2// short off interval
    
if (!new_delaynew_delay 1;
    
lamp.minute += new_delay;
    if (
lamp.minute >= MAX_MINUTESlamp.minute -= MAX_MINUTES;

__________________
Мой ➡️ макет ➡️ привод стрелки ➡️ декодер ➡️ и канал в телеграм 🎉

Последний раз редактировалось Rebel; 16.09.2021 в 00:22.
Rebel вне форума   Вверх
Старый 13.09.2021, 23:55   #32
Rebel
Местный
 
Аватар для Rebel
 
Регистрация: 22.11.2010
Адрес: Москва
Сообщений: 1,239
Сказал(а) 'не согласен(а)'!: 2
Сказали 'не согласен'! 16 раз(а) в 9 сообщениях
Сказал(а) спасибо: 742
Поблагодарили 672 раз(а) в 302 сообщениях
Репутация: - просто великолепная личность (687)
По умолчанию

если ресет всегда подтянут к питанию через резистор, то и analogRead будет давать с него всегда (примерно)одинаковое значение?
таким образом можно будет в коде выбрать какой механизм получения случайного числа использовать без define и получить немного универсальности, вопрос только с какой погрешностью нужно анализировать полученное через analogRead значение...
__________________
Мой ➡️ макет ➡️ привод стрелки ➡️ декодер ➡️ и канал в телеграм 🎉
Rebel вне форума   Вверх
Старый 14.09.2021, 09:06   #33
osmanpasha
Заглянувший
 
Регистрация: 16.07.2019
Адрес: Новосибирск
Сообщений: 40
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 12
Поблагодарили 85 раз(а) в 22 сообщениях
Репутация: скоро придёт к известности (85)
По умолчанию

analogRead при постоянном напряжении обычно скачет на 2-3 попугая.

Не совсем понятно - вы хотите величиной резистора задавать режим работы? Тогда надо делать делитель напряжения из двух резисторов, одного недостаточно (иначе на ресете всегда будет +5В, независимо от величины резистора).

А точно есть необходимость "в продакшене" выбирать один из нескольких типов случайных чисел? Для отладки-то можно просто перезалить пяток раз прошивку и посмотреть, что лучше работает. Для удобства в MicroCore даже программный Serial присутствует (это только на время отладки, конечно, потому что занимает две ноги)
osmanpasha вне форума   Вверх
Старый 14.09.2021, 11:50   #34
Rebel
Местный
 
Аватар для Rebel
 
Регистрация: 22.11.2010
Адрес: Москва
Сообщений: 1,239
Сказал(а) 'не согласен(а)'!: 2
Сказали 'не согласен'! 16 раз(а) в 9 сообщениях
Сказал(а) спасибо: 742
Поблагодарили 672 раз(а) в 302 сообщениях
Репутация: - просто великолепная личность (687)
По умолчанию

Цитата:
Сообщение от osmanpasha Посмотреть сообщение
вы хотите величиной резистора задавать режим работы?
нет, не величиной, а его наличием или отсутствием (т.е. висит ресет в воздухе или подтянут к питанию)


Цитата:
Сообщение от osmanpasha Посмотреть сообщение
А точно есть необходимость "в продакшене" выбирать один из нескольких типов случайных чисел?
безусловно это избыточно и мне больше нравится вариант с ресетом в воздухе, и на стенде все хорошо, а вот если после установки под макет пойдут постоянные перезагрузки, то хочется немного обезопаситься, заложить на плату сопростивление, которое пока не ставить, а в софте проверку его наличия, чтоб потом не пришлось перешивать через прещепку впаянный чип...
оффтопик
__________________
Мой ➡️ макет ➡️ привод стрелки ➡️ декодер ➡️ и канал в телеграм 🎉
Rebel вне форума   Вверх
Старый 14.09.2021, 14:44   #35
osmanpasha
Заглянувший
 
Регистрация: 16.07.2019
Адрес: Новосибирск
Сообщений: 40
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 12
Поблагодарили 85 раз(а) в 22 сообщениях
Репутация: скоро придёт к известности (85)
По умолчанию

Цитата:
Сообщение от Rebel Посмотреть сообщение
безусловно это избыточно и мне больше нравится вариант с ресетом в воздухе, и на стенде все хорошо, а вот если после установки под макет пойдут постоянные перезагрузки, то хочется немного обезопаситься, заложить на плату сопростивление, которое пока не ставить, а в софте проверку его наличия, чтоб потом не пришлось перешивать через прещепку впаянный чип
По даташиту этот пин имеет внутреннюю слабую подтяжку к питанию, поэтому он все равно не является совсем уж висящим в воздухе (и поэтому все работает на стенде, и скорее всего, будет работать под макетом). Тем не менее, подтяжка слабая, поэтому для серьезных устройств все всегда ставят внешнюю подтяжку посильнее. В той же ардуине, например, она есть. Хотя вот в Digispark на Attiny85 - нет.

В общем, перезагружаться плата, скорее всего, не будет и так, а вот напряжение при подключенном внешнем резисторе, и отключенном, будет почти одинаковое. Чтобы существенно отличалось, надо ставить резисторный делитель, и подобрать значения так, чтобы при их запайке было где-то 4.5В (ну или что угодно от 4.5 до 5). Меньшее напряжение, формально, уже может привести к перезагрузке, но это самый наихудший случай.

А что не так с прищепкой? По-моему, нормальный способ перепрошивки на запаянной плате) Я свой экспериментальный оптический датчик забыл прошить перед запайкой, и прошивал на плате прищепкой.
osmanpasha вне форума   Вверх
Пользователь сказал cпасибо:
Старый 14.09.2021, 16:39   #36
Rebel
Местный
 
Аватар для Rebel
 
Регистрация: 22.11.2010
Адрес: Москва
Сообщений: 1,239
Сказал(а) 'не согласен(а)'!: 2
Сказали 'не согласен'! 16 раз(а) в 9 сообщениях
Сказал(а) спасибо: 742
Поблагодарили 672 раз(а) в 302 сообщениях
Репутация: - просто великолепная личность (687)
По умолчанию

Цитата:
Сообщение от osmanpasha Посмотреть сообщение
этот пин имеет внутреннюю слабую подтяжку к питанию, поэтому он все равно не является совсем уж висящим в воздухе
тогда я не понимаю почему analogRead с него дает разные значения? там же ничего не меняется и не наводится из-за подтяжки, или я ошибаюсь?
__________________
Мой ➡️ макет ➡️ привод стрелки ➡️ декодер ➡️ и канал в телеграм 🎉
Rebel вне форума   Вверх
Старый 14.09.2021, 21:57   #37
osmanpasha
Заглянувший
 
Регистрация: 16.07.2019
Адрес: Новосибирск
Сообщений: 40
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 12
Поблагодарили 85 раз(а) в 22 сообщениях
Репутация: скоро придёт к известности (85)
По умолчанию

Цитата:
Сообщение от Rebel Посмотреть сообщение
там же ничего не меняется и не наводится из-за подтяжки
Я бы сказал, что наводки вполне возможны.

Вот я попробовал сэмулировать слабую подтяжку на ардуине - подтянул ногу А0 к 5В через резистор 68К.



Первая треть графика - в довесок к подтяжке к ноге подключен проводок 5см, висящий в воздухе (редкие отклонения от 1023 я бы отнес к шумам АЦП, а не к наводкам - эти скачки есть, даже если напрямую подключить ногу к питанию). Вторая треть графика - я взял этот проводок в руки (за изоляцию), третья треть - подключил еще полметра провода, висящего другим концом в воздухе.
osmanpasha вне форума   Вверх
Пользователь сказал cпасибо:
Старый 14.09.2021, 23:02   #38
Rebel
Местный
 
Аватар для Rebel
 
Регистрация: 22.11.2010
Адрес: Москва
Сообщений: 1,239
Сказал(а) 'не согласен(а)'!: 2
Сказали 'не согласен'! 16 раз(а) в 9 сообщениях
Сказал(а) спасибо: 742
Поблагодарили 672 раз(а) в 302 сообщениях
Репутация: - просто великолепная личность (687)
По умолчанию

замечательный опыт вы проделали, спасибо!
исходя из него можно полагать, что если значение более 1000, то надежно подтянуто к питанию, а если менее - то ближе к висящему в воздухе.
можно даже делать подряд 10 контрольных чтений и смотреть среднее...
__________________
Мой ➡️ макет ➡️ привод стрелки ➡️ декодер ➡️ и канал в телеграм 🎉
Rebel вне форума   Вверх
Пользователь сказал cпасибо:
Старый 15.09.2021, 12:40   #39
osmanpasha
Заглянувший
 
Регистрация: 16.07.2019
Адрес: Новосибирск
Сообщений: 40
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 12
Поблагодарили 85 раз(а) в 22 сообщениях
Репутация: скоро придёт к известности (85)
По умолчанию

Обратите внимание на шкалу - из-за автомасштабирования всё выглядит очень внушительно, но на самом деле ниже 1013 значения не опускаются. Когда я трогал пальцем контакт, значения заходили и за 900 (на графике не представлено).

В общем, мне кажется, невозможно отличить с помощью analogRead слабую встроенную подтяжку от внешней сильной, чтобы надежно работало без подключения антенны и троганья пальцем контактов. Без подключенного висящего провода (у вас же, скорее всего не будет длинного провода или висящей дорожки на плате, подключенных к резету?) АЦП через слабую подтяжку показывал те же значения, что и при прямом подключении к 5В без всякого резистора.

Все-таки надежнее предусмотреть два резистора и делителем установить отличное от 5В напряжение)


Кстати! Глядя на этот график, можно придумать еще один способ получения случайных чисел из аналоговой ноги, которая не висит в воздухе, а подтянута к чему-нибудь (как резет). Принимая за аксиому, что АЦП всегда шумит, можно замерить число тактов до того, как он изменит свое значение, и оно будет случайным.
osmanpasha вне форума   Вверх
Старый 15.09.2021, 14:09   #40
Rebel
Местный
 
Аватар для Rebel
 
Регистрация: 22.11.2010
Адрес: Москва
Сообщений: 1,239
Сказал(а) 'не согласен(а)'!: 2
Сказали 'не согласен'! 16 раз(а) в 9 сообщениях
Сказал(а) спасибо: 742
Поблагодарили 672 раз(а) в 302 сообщениях
Репутация: - просто великолепная личность (687)
По умолчанию

Цитата:
Сообщение от osmanpasha Посмотреть сообщение
Обратите внимание на шкалу - из-за автомасштабирования всё выглядит очень внушительно, но на самом деле ниже 1013 значения не опускаются.
да, но ведь у вас и подтяжка при этом к питанию, ровно из графика у меня цифра 1000 и родилась.

Цитата:
Сообщение от osmanpasha Посмотреть сообщение
В общем, мне кажется, невозможно отличить с помощью analogRead слабую встроенную подтяжку от внешней сильной
дело конечно в эксперименте с конкретной железкой (тини осложняет этот процесс), в ближайшее время постараюсь еще зашить прошивку берущую данные с ноги ресета и ускоренным циклом, чтоб понаблюдать что будет со включением лампочек и их переключением... тк на прошлом эксперименте с analogRead использовал не ресет а соседнюю ногу, на которой джампер режима работы
__________________
Мой ➡️ макет ➡️ привод стрелки ➡️ декодер ➡️ и канал в телеграм 🎉
Rebel вне форума   Вверх
Старый 15.09.2021, 14:39   #41
osmanpasha
Заглянувший
 
Регистрация: 16.07.2019
Адрес: Новосибирск
Сообщений: 40
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 12
Поблагодарили 85 раз(а) в 22 сообщениях
Репутация: скоро придёт к известности (85)
По умолчанию

Цитата:
Сообщение от Rebel Посмотреть сообщение
да, но ведь у вас и подтяжка при этом к питанию, ровно из графика у меня цифра 1000 и родилась.
Ваш метод сработает с любой ногой, кроме резета. Все проблема в том, что на ноге резет (и только на ней) встроенная слабая подтяжка есть ВСЕГДА (ее и симулирует эксперимент на графике). Она не управляется с помощью pinMode(pin, INPUT или INPUT_PULLUP). Если бы она включалась программно, как на других пинах, МК не стартовал бы никогда без внешней подтяжки. Её можно выключить, только выключив фьюзами функцию резет.

То есть ваш метод проверки наличия резистора на ноге резет должен будет отличать встроенную слабую подтяжку от сильной внешней, а не внешнюю подтяжку от висящей в воздухе ноги. Последнее, безусловно, можно было бы сделать так, как вы предлагаете.
osmanpasha вне форума   Вверх
Пользователь сказал cпасибо:
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Освещения в вагоне djluna1627800 ЧАВО 29 15.12.2019 17:08
мощный стационарный декодер как pwm (ШИМ) - контроллер. vspider Электрика и DCC 11 14.04.2014 11:54
сопутствующие проблема с китом освещения Alex_S Личный опыт 11 15.08.2012 16:47
Столбы освещения Jevgen ЧАВО 3 14.04.2012 16:21
подключение освещения malder Электрика и DCC 5 18.09.2008 20:56


Текущее время: 01:44. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2021, vBulletin Solutions, Inc. Перевод: zCarot
Copyright © ModelldepO.ru 2006 -