Котуинко

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15558
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Ну у нанки/про-мини/уно базовая частота таки 16 МГц... И такое же в "родной" NG применяется...
Чуток полегше - а под 8/8а со встроенным RC явно не то будет.
Флажок конечно хорошо, но его ведь в общем цикле опрашивать надо - а то уже или очередь задач или простое ожидание "пока все подряд не перещелкают"... Это при максимальной длине "кадра" в 4 миллисекунды (развертка 62Гц)...
Так что независимо вертящееся с моего взгляду получше... ОТНОСИТЕЛЬНО...
Да и сам процесс обслуживания дисплея достаточно простенько-коротенький - погасить аноды, скинуть из ОЗУ код в порт байта, зажечь по анодам да считать возвратный с клавиатуры.
Ну и в конце цикла при необходимости скопировать 4 байта из одного массива в другой.
Не слишком то и долго (даже под Си).
:roll:
Главное на моей "паутинной монтаЖОПе" вполне себе красивенько циферки гоняет. Без мерцаний/подсветов и прочей гадости.
И кнопы на нажатие аккуратненько отзываются (несмотря на всего два опроса на каждом знакоместе).
Следовательно и покрасивше упакованная будет еще лучше работать.
Жаль только до....на лапок зазря израсходовалось... уж много удобнее хотя бы 595й под сегменты выставить...
:(
Зато хоть "теорию" на практике прокрутил.
:hunger:
Кыстати... я пока только заголовочник сыскал - arduino.h (их там натыкано во многих местах, но вроде все одинаковые)...
А вот где исходники *.с/*.срр к ним искать? Тем более, что у каждой платформы возможны различия...
:dont_know:

Миллис можно б и без выключения прерываний... но то на таком таймере, где "захват на лету" возможно выполнить...
А ежли уже изначально заложена"огрешность" - так и останется в данном случае.
Ну да то не столь уж и плачевно...
:roll:
Реклама
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Котуинко

Сообщение oleg110592 »

осталось попробовать
// ИНИЦИАЛИЗАЦИЯ ТАЙМЕРА (режим совпадения по OCR0A)
OCR0A = 254
- мож кому с такой частотой индикацию регенерировать надо, таймер на другой пределитель низя - милисы и пр. сдуются.
про 595 изначально предлагалось.
а исходники на гитхабе вестимо
https://github.com/arduino/ArduinoCore- ... es/arduino
Ну у нанки/про-мини/уно базовая частота таки 16 МГц... И такое же в "родной" NG применяется...
Чуток полегше - а под 8/8а со встроенным RC явно не то будет.
у MsTimer2 усё продумано и мега8 и частоты разные:
Спойлер

Код: Выделить всё

#elif defined (__AVR_ATmega8__)
	TIMSK &= ~(1<<TOIE2);
	TCCR2 &= ~((1<<WGM21) | (1<<WGM20));
	TIMSK &= ~(1<<OCIE2);
	ASSR &= ~(1<<AS2);
	
	if ((F_CPU >= 1000000UL) && (F_CPU <= 16000000UL)) {	// prescaler set to 64
		TCCR2 |= (1<<CS22);
		TCCR2 &= ~((1<<CS21) | (1<<CS20));
		prescaler = 64.0;
	} else if (F_CPU < 1000000UL) {	// prescaler set to 8
		TCCR2 |= (1<<CS21);
		TCCR2 &= ~((1<<CS22) | (1<<CS20));
		prescaler = 8.0;
	} else { // F_CPU > 16Mhz, prescaler set to 128
		TCCR2 |= ((1<<CS22) && (1<<CS20));
		TCCR2 &= ~(1<<CS21);
		prescaler = 128.0;
	}
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15558
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Я изначально ни Т1 ни Т2 трогать не собирался - интересовало или вписаться в пару
tone() -> attachInterrupt()...
или попробовать, чего из того книжна совета насчет Т0 получится.
Оное то получилось, но вывести результат в отдельный файл/класс при tone() -> attachInterrupt() оказалось муторно...
"Добавка" к Т0 дает только дублирующую генерацию миллисекунды для какого-то собственного процесса.
Причем независимо от того, что в OCR0A записано результирующий интервал прерывания будет та же 1миллисекунда, а вот ее смещение от "родимой"системной от содержимого OCR0A явно зависит.
Однако для дисплейного модуля с х4 остается всего-то 4 "тика" на каждую позицию (62,5 Гц)...
Для более высокочастотной развертки такой вариант проблематичен, но для примитива - вполне достаточно.
Собственно заменить прямой вывод на сброс в последовательный регистр за 0,002 секунды вполне можно....
Вобщем то, что было интересно я таки посмотрел в реал-макете и "в заметки" закинул.
8)
Насчет запрета на прерывания у миллисов...
У нас же 4х байтовое длинное целое - а организация ОЗУ 1-байтовая.
Причем запрос асинхронен по отношению к генератору системной частоты.
Вот и запрет прерываний... Насчет SREG - то уже как программа пересылки данных устроена - ежли на счетчиках, то необходимо - ежли как иначе...
В принципе там чтение с последующей записью - достаточно команд, чтоб вклинившееся прерывание данные успело испортить.
РУТИНА обычная в подобных случаях...
:roll:
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Котуинко

Сообщение oleg110592 »

[uquote="BOB51",url="/forum/viewtopic.php?p=3918303#p3918303"]Я изначально ни Т1 ни Т2 трогать не собирался ...
или попробовать, чего из того книжна совета насчет Т0 получится[/uquote]
странные советы для true ардуинщиков - милисы ж это согласно "референсу" для индикации и ничего большего не нужно
спокойно в loop() считывай милис типа:

Код: Выделить всё

unsigned long temp_millis;

loop(){
   
  if(temp_milis != millis())
  {
    temp_millis = millis());
    ПодпрограмммаИндикации();
    ПодпрограммаКлавиатурыi();
  }
  ... тут еще много полезного можно сделать();
  ... а тут еще();
  ... и т.д.();
}
и можно много писанины поупрощать - и количество digitalWrite резко уменьшится :
Спойлер

Код: Выделить всё

// список выводов Arduino для подключения к разрядам a-g
// семисегментного индикатора
int pins[8]={9,13,4,6,7,10,3,5};
//список выводов Arduino для подключения к катодам.анодам
// семисегментного индикатора
int pindigits[4]={2,8,11,12};

// Сконфигурировать контакты как выходы
for(int i=0;i<8;i++)
  pinMode(pins[i],OUTPUT);
for(int i=0;i<4;i++)
{
  pinMode(pindigits[i],OUTPUT);
  digitalWrite(pindigits[i],HIGH);
}

// функция вывода цифры на семисегментный индикатор
void showNumber(int num)
{
  for(int i=0;i<7;i++)
  {
    if(bitRead(numbers[num],7-i)==HIGH) // зажечь сегмент
    digitalWrite(pins[i],HIGH);
   else // потушить сегмент
   digitalWrite(pins[i],LOW);
   }
}
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15558
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Любой опрос в цикле - хорош только для тех случаев, где размер цикла явно меньше интервала индикации.
В ином случае будут сдвиги в произвольные моменты времени. Мы же не знаем, чего еще помимо обслуживания дисплея прожка делать будет, а те задачки могут бысть весьма громоздкими.
Независимый процесс на прерывании заметно стабильнее работает.
Относительно вывода - при "байтовой" структуре порта там вообще проблем не имеется. Только вот таких МК на сегодня не так уж много да и раскладка выводов у адуриньи УЖЕ сделана без учета линейной "байтовости".
А в моем примере вообще "чехардень" из выводов, относящихся к разным портам МК (так уж ранее разводка выполнялась - влом менять для "поиграться").
Цикл на счетчике в таком случае заметно хуже, чем перебор восьми комбинаций пересылки бита по фиксированным значениям.
Касательно переброса через массивы - смотрится неплохо, только нерационально - минимум два массива, да сопровождение.
В принципе под ассемблером там всего-то биты перегоняются, а вот под Си или аж 12 байт с содержимым 1/0 или еще чего (структура с битовыми полями)...
Как бы общий размер используемых ресурсов заметно больше не оказался.
Добавить последующие "рожки" кои повылазят при выводе фрагмента в отдельный файл/библиотеку...
То уже можно вылизывать лишь в готовом тексте, который работает.
8)
Реклама
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Котуинко

Сообщение oleg110592 »

Любой опрос в цикле - хорош только для тех случаев, где размер цикла явно меньше интервала индикации.
а чего там еще в часах да и других задачах делать в цикле больше миллисекунды - например между миллисекундой прекрасно опрашивается DS18B20 (добавить в часы термометр самое то). Даже термопарный полином быстрее считается. Цель то каковая была:
Главное на моей "паутинной монтаЖОПе" вполне себе красивенько циферки гоняет...
Цикл на счетчике в таком случае заметно хуже, чем перебор восьми комбинаций пересылки бита по фиксированным значениям.
все тоже самое, только проще - в массиве те же фиксированные значения. И "чехардень" очень красиво причесывается.
только нерационально - минимум два массива, да сопровождение.
шо так константы, шо так, а сопровождать удобнее - вжух и в масиве в одной строчке нужное поменял.
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15558
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Массив это рядок данных(переменных) в ОЗУ, а их считать ещё надо.
А константа входит в состав команды.
Хотя... Как там компилятор все перекручивает - смотреть при обеих вариантах результат надо...
8)
Мне более интерес к "выноске" полученного в библиотечку.
А там уже и "причесать" можно будет.
:roll:
Касательно возможных нюансов прикладной программы - это вопрос довольно сложный - лучше сразу на максимум проблем рассчитывать - потом легче будет.
:beer:
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Котуинко

Сообщение oleg110592 »

Это ж массив стандартных пинов ардуино - что там считать то. Впервые слышу про какой-то счет массивов.
Почитал - согласно ардуиновому референсу для констант во флэши используем PROGMEM:
https://www.arduino.cc/reference/en/lan ... s/progmem/
Как перекручивает, проведем упрощенный тест - тут перечислены родные ардуиновые пины, опять строго согласно референсу:

Код: Выделить всё

#include "Arduino.h"
// список выводов Arduino для подключения к разрядам a-g
// семисегментного индикатора
const uint8_t pins[8] PROGMEM = {9, 13, 4, 6, 7, 10, 3, 5};

int main()
{
    while (1)
    {
        // зажечь сегмент
        for (int i = 0; i < 7; i++)
            digitalWrite(pins[i], HIGH);
    }
}
Смотрим листинг, и видно, как красивенько берет из флэша (2 команды загрузка адреса и 3 команды в цикле):

Код: Выделить всё

- это наш масив, во флэши конечно
00000076 <_ZL4pins>:
  76:	09 0d 04 06 07 0a 03 05 

- это загрузка адреса  
   46c:	c6 e7       	ldi	r28, 0x76	; 118
 46e:	d0 e0       	ldi	r29, 0x00	; 0
 
- это просто цикл
    while (1)
    {
        // зажечь сегмент
        for (int i = 0; i < 7; i++)
            digitalWrite(pins[i], HIGH);
 470:	61 e0       	ldi	r22, 0x01	; 1
 472:	89 91       	ld	r24, Y+
 474:	15 de       	rcall	.-982    	; 0xa0 <digitalWrite>
 
по расходам у нас получилось:
AVR Memory Usage
----------------
Device: atmega8

Program: 266 bytes (3.2% Full)
(.text + .data + .bootloader)

Data: 0 bytes (0.0% Full)
(.data + .bss + .noinit)

ROM = 266, ОЗУ = 0
з.ы. с опцией компилятору -flto - еще меньше

Насчет возможных "нюансов прикладной программы" - опрос флагов или засыпание в основном цикле с пробуждением от прерывания таймера/ацп/ватчдога/усарта/кнопки и пр. это стандартная практика в программировании микроконтроллеров и при правильном применении - никаких нюансов.
см. тут Важные замечания:
https://arduinomaster.ru/program/preryv ... interrupt/
В обработчике вы можете лишь устанавливать флаг события, а в loop – проверять флаг и обрабатывать его
а тут как ардуинисто спать:
https://tsibrov.blogspot.com/2018/02/ar ... -down.html

"выноска" полученного в библиотечку - лучше сразу на максимум проблем рассчитывать - потом легче будет.(с)
насчет как правильно использовать таймер0 и прерывание по совпадению оного написано тут:
https://voltiq.ru/wiki/interruptions-in-arduino/
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Котуинко

Сообщение ARV »

oleg110592 по сути является версией Google "с доставкой на дом" :))) по любому вопросу 100500 ссылок на то, что уже есть готовенького. я даже удивляюсь: вот я, например, больше 20 лет программирую, а 99,999% этих ссылок ни разу даже не видел! когда программировать-то, если все читать?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Котуинко

Сообщение oleg110592 »

тож этих ссылок раньше не видел - просто типа как в песне "русский матрос всегда задать умеет правильный вопрос"(с) гуглу
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15558
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Меня варианты "вылизывания" в данном случае не столь уж и волновали.
Для начала хотя бы "черновик" работоспособный сделать при условии, что функция обработки прерывания слопает кусманчик или в виде объекта метода внешнего класса или в лучшем случае удастся ее упаковать вместе с файлами того класса...
Т.е. содержимое функции обработчика прерывания находится во внешних файлах проекта, а функция вызова прерывания - в основном (или посложнее - в тех же "внешних" файлах).
Примерно воть так первый примитив выглядит:
Спойлер

Код: Выделить всё

void setup() 
{
  // put your setup code here, to run once:
// Serial.begin(9600); // для сообщений тест-контроля

test_ksd.init_csd4(); // инициализация ККД

}
//------------------------------------------------
void loop() 
{
  // put your main code here, to run repeatedly:

  //..........
}


//***************************************************
//              ПОДВАЛ С ФУНКЦЯМИ
//***************************************************

//------------------------------------------------
// ОБРАБОТЧИК ПРЕРЫВАНИЯ (режим совпадения по OCR0A)
// (по факту дублер системной миллисекунды)
// в качестве функции выполняется метод sdr_prog()
// объекта test_ksd класса ksd4

SIGNAL(TIMER0_COMPA_vect)
{
  test_ksd.sdr_prog();
}

// область функционала ККД завершена
а вот упрятать

Код: Выделить всё

SIGNAL(TIMER0_COMPA_vect)
{
  test_ksd.sdr_prog();
}
во внутренность файлика ksd4.cpp поока не удалось...
:(
Когда все в одном главном файле - это всегда без проблем работает, но уж больно гормоздко.
8)
Вроде первый вариант кой-как получился...
ksd4_rtl.zip
(8.91 КБ) 165 скачиваний
Корявенько... но таки работает...
:wink:
УФФ...
Малость надо дать мозгам и компу отдых...
:sleep:
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Котуинко

Сообщение oleg110592 »

с нетерпеньем жду продолжения - согласно начальной схеме в программе вроде еще не задействована DS1307 и еще 2 шт. MOC3063 (наверное по будильникам что-то включают). Очень интересно - не будут ли мешать проведенные манипуляции с тамером0 работе часовой микросхемы по и2цэ.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15558
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Была бы какая-то польза от того....
:sleep:
А I2C (для ведущего шины) у меня ПРОГРАММНЫЙ (лаподрыгом выполнен) на любые лапки выводится.
Там никакой разницы где, чего и как может быть "приторможено" - собственно сам протокол из тех, где ведущий может остановить обмен на неопределенное время, без вреда для данных.
mxiic.zip
(4.38 КБ) 157 скачиваний
Баловался как-то с 1307 и адуринкой.
Кстати тогда и обратил внимание на имевшую место ранее ошибку алгоритма, которую устранил в данной библиотечке.
8)
И... таким же образом - через SIGNAL(name_vector){} можно и прерывания по INT0/INT1 для платформ на AVRках обрабатывать...
А где б те правильные имена векторов сыскать..? Неумудренному АВРкиным Си...
:roll:
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Котуинко

Сообщение oleg110592 »

польза - проверить ардуино на вшивость. А часики с гибким фунционалом, ну например с 485 интерфейсом, возможно нашли бы применение в народном хозяйстве и даже промышленности. У меня, например спрашивали производственники часы большие, с показом температуры произведенных блоков поролона - возможны возгорания без контроля. Сейчас втыкают китайские термометры для духовки и ходят, ходят, каждый осматривают. Индикаторы большие можно сделать на ws2812 (библиотека ардуиновая есть) как тут:
https://www.radiokot.ru/forum/viewtopic ... 2&t=153087
з.ы. созрела идея - в часы работы часы светят красным, за 15 минут до окончания работы - желтым, в конце работы - зеленым :)))
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15558
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Я проверяю или действующей схемой ( если устройство для домашней прикладного использования) или имеющимся набором макет-заготовок.
Этот "примитив" (х4 с совмещённый кноподавой) хорошо компонуется с простейшими конструкциями с МК имеющими "рядную" разводка портов - в частности с at89cX051 или аттини2313. Но там уже давно все под ассемблером перекручено. А для адуринки такое решение экономически неэффективно (по многим причинам).
Большой дисплей на основе чего угодно - от ламп накаливания до светодиодных лент размерами в ковырнадцать метров тоже скучновато...
Творческое спадо однако.... Осеннее...
:(
Подразжится парой динамичков да приемничек замутить...
:roll:
Может ещё последовательный обмен по 232му асинхроннику покручу...
:dont_know:
:sleep:
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Котуинко

Сообщение oleg110592 »

[uquote="BOB51",url="/forum/viewtopic.php?p=3919688#p3919688"]Подразжится парой динамичков да приемничек замутить...[/uquote]
дык у ардуиновым часам, ардуиновый приемник прикрутить и на радиокоте будут часы с будильнико-приемником, там все просто:

Код: Выделить всё

#include "Wire.h"
#include "TEA5767Radio.h"

TEA5767Radio radio = TEA5767Radio();
void setup()
{
Wire.begin();
radio.setFrequency(105.0); //Здесь укажите частоту вещания
принимаемой радиостанции в МГц
}
void loop()
{
}
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15558
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

НЕ...
В наличии лишь RDA5807 (уже порядком подзалежалась)...
За силабьи... только помечтамс...
:sleep:
Да и прожку предпочтительно самому нашкарябать - там ничего особого нету, чтоб чужие библиотеки ставить.
Обычный I2C да немножко мутноватое описание и питание от 3 вольтей...
:roll:
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Котуинко

Сообщение oleg110592 »

глянул в интернет-киоске возле мясного - "TEA5767-MODUL" 1.5$, "Модуль RDA5807M FM радиоприемник Arduino" 30 центов, а писать уж точно - самому там нечего

Код: Выделить всё

void TEA5767Radio::setFrequency(float frequency)
{
  	unsigned int frequencyB = 4 * (frequency * 1000000 + 225000) / 32768; 
	byte frequencyH = frequencyB >> 8;
	byte frequencyL = frequencyB & 0XFF;
	Wire.beginTransmission(_address); 
	Wire.write(frequencyH);
	Wire.write(frequencyL);
	Wire.write(0xB0);
	Wire.write(0x10);
	Wire.write(0x00);
	Wire.endTransmission();
	delay(100);  
}
https://github.com/kelubo/MyHome/blob/m ... 7Radio.cpp
OKF
Это не хвост, это антенна
Сообщения: 1392
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: Котуинко

Сообщение OKF »

[uquote="ARV",url="/forum/viewtopic.php?p=3918968#p3918968"]oleg110592 по сути является версией Google "с доставкой на дом" :))) по любому вопросу 100500 ссылок на то, что уже есть готовенького. я даже удивляюсь: вот я, например, больше 20 лет программирую, а 99,999% этих ссылок ни разу даже не видел! когда программировать-то, если все читать?![/uquote]
Ну как же! Сначала посмотрел как у людей, а затем написал по своему, может даже лучше.)
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15558
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Без "подсмотрел" на сегодня никак не обходится - те же книжи как по компиляторам, так и по железу. Крайне редко попадаются пошагово "разжеванные" примеры описаные на понятном языке (у каждого ведь свой уровень понимания - зависит и от опыта и от привычной подачи материала с неизменно присутствующим компонентом "а Вы это уже знаете")...
Правда есть некоторая разница - или "на побыстрее" соорудить на основе чужих библиотек (о стандартном минимуме, входящем в набор компилятора или адуринкина референса речь не идет) или научиться самому делать собственные софтинки на основе "стандартного минимума" входящих в состав компилятора(референса) средств да документации на железко - но то заметно дольше да и сложнее.
Зато результат для себя приятнее и в дальнейшем с софтинкой можно чего захочется сотворить (изменить/доработать). Плюс понимание работы того, чего нашкарябал.
8)
Ответить

Вернуться в «Разные вопросы по МК»