Мигать светодиодом. ARM или не-ARM?

Флейм в чистом виде - все что угодно...
Но - в рамках закона :)
linuxdude
Нашел транзистор. Понюхал.
Сообщения: 196
Зарегистрирован: Пн фев 05, 2018 18:03:00

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение linuxdude »

[uquote="oleg110592",url="/forum/viewtopic.php?p=3365804#p3365804"]з.ы. в Виндовсе тоже можно собрать - создал простенький cmd файлик:

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

c:\SysGCC\arm-eabi\bin\arm-eabi-as -o bootstrap.o bootstrap.s
c:\SysGCC\arm-eabi\bin\arm-eabi-ld -o main.elf -T stm32f103.ld bootstrap.o
c:\SysGCC\arm-eabi\bin\arm-eabi-objcopy main.elf main.bin -O binary
pause
использовал toolchain ARM от SysProgs:
http://gnutoolchains.com/download/[/uquote]
Я как-то так с STM32 и дружусь, а меня dosikus за это полил что я дескать не использую какие там еще дебагеры, и вообще проприетарных тулсов делающих неизвестно что и за кучу денег не понакупил. Только я make-файл сделал, с несколькими targets: make clean - стирает хлам, make firmware - билдит прошивку, make flash - шьет через STшный бут. Если прошивки нет - make flash ее сперва сбилдует. А .s файлов у меня нет - все на си. В случае cortex M3 после power up нет системных действий, которые бы реально ассемблер потребовали. Таблицу векторов можно оформить и заполнить на си, обработчик reset - тоже на си. Как максимум немного asm может захотеться для включения-выключения прерываний, но помигать светодиодом можно и без этого.
Реклама
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение oleg110592 »

[uquote="Lublu_megy",url="/forum/viewtopic.php?p=3372319#p3372319"]Тыкните пожалуйста в косяк[/uquote]
может "#define Arduino_UNO" в файлик config.h перенести:

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

#ifndef CONFIG_H
	#define CONFIG_H

  #define F_CPU 16000000UL	//CPU frequency for all 8-bit arduino
  #define Arduino_UNO
...
[uquote="linuxdude",url="/forum/viewtopic.php?p=3372378#p3372378"]А .s файлов у меня нет - все на си[/uquote]
дык там ассеблерный проект, состоящий из одного s файла и одной инструкции. Ассемблерные стартапы находятся в стандартной поставке CMSIS. Тот же SysProgs выпускает плагин VisualGDB, который создает ARMовые проекты с сишным стартапом.
Реклама
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение Reflector »

[uquote="linuxdude",url="/forum/viewtopic.php?p=3372378#p3372378"]Как максимум немного asm может захотеться для включения-выключения прерываний, но помигать светодиодом можно и без этого.[/uquote]
Для таких простых вещей ассм не нужен, есть же готовые __enable_irq() и т.п....
Lublu_megy
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Вт дек 12, 2017 16:52:57
Откуда: Вам широту и долготу скинуть?

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение Lublu_megy »

[uquote="oleg110592",url="/forum/viewtopic.php?p=3372397#p3372397"][uquote="Lublu_megy",url="/forum/viewtopic.php?p=3372319#p3372319"]Тыкните пожалуйста в косяк[/uquote]
может "#define Arduino_UNO" в файлик config.h перенести:

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

#ifndef CONFIG_H
	#define CONFIG_H

  #define F_CPU 16000000UL	//CPU frequency for all 8-bit arduino
  #define Arduino_UNO
...
[/uquote]
Неее, тогда работоспособность библиотеки потеряется. Там работает так: Если задефайнино Arduino_UNO, то дефайним адреса портов. Если сразу задефайнить всё, то тогда потеряется переносимость библиотеки - она будет работать только с Arduino_Uno (точнее только с платами на atmega328P),а я хочу, чтобы работало со всеми 8-битными платами.

ааааааааааааааааааааааааа็аааааааааааааааааааааааа็аааааааааааааааааааааааа, I love this.ааааааааааааааааааааааааа็аааааааааааааааааааааааа็аааааааааааааааааааааааа

Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3384
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение Мурик »

Тогда #define Arduino_UNO должно быть перед #include "config.h".
Реклама
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение oleg110592 »

Если не зватает микроконтроллерных портов (например для подключения кучки мигающих светодиодов :) ) давно используют спец микросхемы расширетелей портов. Китайцы, например, используют PCF8574 для индикаторов 1602. Понадобилось тоже "расширить" порты для STM32 - добавить индикатор. I2C ноги заняты, но SPI свободен, SPI спец микросжемы-расширетели тоже есть, но вспомнил про 74HC595, есть кучка в наличии - как расширитель имхо пойдет. На всякий надо проверить (пока плата изготавливается) - паять макет лень, а Протеус в прошлой реинкарнации этой темы напрямую таким индикатором управлял. Попробуем Протеусом через регистр индикатором поуправлять.
Протеус 8.7 SP3 "научился" сам создавать Keil проекты для STM32 (без запуска среды Keil) - "видит" кейловский ARM компилятор, создает make файл, правда почти все прячет в дебрях файловой системы Виндовс, но найти можно. Для проверки пойдет.
Создаем проект для STM32F103C4. Используем аппаратный SPI, настраивается довольно просто. SPI тут 16-и битный - на шару подключаем второй 74HC595, можно еще 8 светодиодов или типа реле подключить. Для индикатора хватит 6 ног, оставшиеся от регистра 2 ноги используем для светодиодов - один из них, например, это включение подсветки индикатора.
проверочный говнокодик:
Спойлер

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

#include <stm32f103x6.h>
#include "lcd.h"

#define CS_LOW GPIOA->BSRR = GPIO_BSRR_BR0;
#define CS_HIGH GPIOA->BSRR = GPIO_BSRR_BS0;

uint8_t dataRele = 0; 
uint8_t dataLCD = 0; 

const char MENUTXT[2][20] = 
{
	{"\x50\x61\x63\xC1\xB8\x70\x65\xBD\xB8\x65\x20\xBE\x6F\x70\xBF\x6F\xB3"}, // Расширение портов
	{"\xBE\x70\xB8\xB3\x65\xBF\x20\x50\x61\xE3\xB8\x6F\xBA\x6F\xBF\x20"}  // привет Радиокот 
};

extern void SpiWriteData(uint16_t data);

void SpiInit(void)
{
    //включаем тактирование порта A и альтернативных функций
    RCC->APB2ENR |= (RCC_APB2ENR_IOPAEN | RCC_APB2ENR_AFIOEN);

    //5(SCK) и 7(MOSI)- альтернативная функция  push pull, 4(CS) вывод вывод- выход, push-pull
    GPIOA->CRL &= ~(GPIO_CRL_CNF4_0 | GPIO_CRL_CNF5_0 | GPIO_CRL_CNF7_0);
    GPIOA->CRL |= GPIO_CRL_CNF5_1 | GPIO_CRL_CNF7_1;
    GPIOA->CRL |= GPIO_CRL_MODE0_1 | GPIO_CRL_MODE5_1 | GPIO_CRL_MODE7_1;

    //включаем тактирование SPI1
    RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;

    SPI1->CR1 |= SPI_CR1_BR;		//Baud rate = Fpclk/256
    SPI1->CR1 |= SPI_CR1_DFF;		//16 bit data
    SPI1->CR1 |= SPI_CR1_MSTR;		//Mode Master
    SPI1->CR1 |= SPI_CR1_SPE;		//Enable SPI`
}

void SpiWriteData(uint16_t data)
{
    //отправляем данные
    SPI1->DR = data;
    //ждём пока опустошится Tx буфер
    while (!(SPI1->SR & SPI_SR_TXE));
    CS_HIGH;
    CS_LOW;
}

int main(void)
{
    SpiInit();
    LCD_SetUp();
    LCD_Init(2, 20);
    LCD_Clear();
  	dataRele = 0xAA; // 
    dataLCD |= (1<<7) | (1<<6); // зажигаем LED1 LED2
    LCD_DisplayString(MENUTXT[0]);
	LCD_GoToLine(1);
    LCD_DisplayString(MENUTXT[1]);
    while (1)
    {
    }
} 
результат:
Изображение
Реклама
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение oleg110592 »

Arduino представляет две новых платы IoT — MKR WiFi 1010 (ESP32) и MKR NB 1500 (NB-IoT + eMTC)
СпойлерИзображение
MKR WIFI 1010 — это усовершенствованная плата MKR1000, оснащенная модулем U-Blox ESP32.
Характеристики:
Спойлер* MCU — Microchip SAMD21 Cortex-M0 + MCU @ 48 МГц с 32 Кб SRAM, флэш-память 256 Кб
* Беспроводное подключение — 2,4 ГГц 802.11 b/g/n WiFi и Bluetooth 4.2 LE через U-blox модуль NINA-W10 Series на базе процессора ESP32.
* I/O
-- 8х цифровых вводов-выводов
-- 12x PWM контактов
-- 1x UART, 1x SPI, 1x I2C
-- 7x аналоговых входа на контакт
-- 1x аналоговый вывод на контакт
-- 8х внешних прерываниq
-- Рабочее напряжение — 3,3 В
-- Постоянный ток на контакт ввода/вывода — 7 мА
* USB — порт micro USB для питания и программирования
* Безопасность — устройство CryptoAuthentication ECC508
* Разное — RTC, светодиоды питания и заряда
* Источник питания
-- 5 В только через разъем USB или VIN
-- Li-Po, 3.7 В, 700 мАч минимум
* Размеры — 61,5 мм x 25 мм
Вторая плата является первой официальной платой Arduino, поддерживающей стандарты сотовой IoT стандарта NB-IoT или eMTC.
Характеристики:
Спойлер* MCU — Microchip SAMD21 Cortex-M0 + MCU @ 48 МГц с 32 Кб SRAM, флэш-память 256 Кб
* Беспроводное подключение — NB-Iot и LTE Cat M1 (eMTC) через модуль U-blox SARA-R410M, разъем Nano SIM-карты
* I / O
-- 22x цифровых ввода-вывода, включая 12x PWM контактов
-- 1x UART, 1x SPI, 1x I2C
-- 7x аналоговых входа на контакт
-- 1x аналоговых выхода на контакт
-- 8х внешних прерываний
-- 1x I2S
-- Рабочее напряжение — 3,3 В
-- Постоянный ток на контакт ввода/вывода — 7 мА
* USB — порт micro USB для питания и программирования
* Разное — RTC, светодиоды питания и заряда
* Источник питания
-- 5В только через разъем USB или VIN
-- Li-Po, 3.7В, 700 мАч минимум
* Размеры — 61,5 мм x 25 мм
Аватара пользователя
ART_ME
Друг Кота
Сообщения: 3011
Зарегистрирован: Вс окт 02, 2016 07:34:45

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение ART_ME »

Я правильно понял, что присутствующие на этой странице мигают светодиодом исключительно ради того, чтобы он мигал?
То есть если он, светодиод этот, вдруг замигает, то вы будете счастливы? А если не замигает, то соответственно впадете в депрессию?
Или на самом деле все гораздо круче - у кого замигал, тот папка, а у кого нет, тот чайник, лох, дно, чмо и т.д. и т.п. ?
Оранжевые штаны местного рОзлива? :)))
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение Reflector »

Давайте и я что ли помигаю. Естественно на плюсах под STM32, при помощи таймера и DMA, причем оформлю это все в виде универсального класса, который можно запрятать где-то очень глубоко и чтобы им воспользоваться нужно лишь передать нужный пин, таймер и канал DMA.

Сам шаблонный класс:
Спойлер

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

template<typename Pin, typename Tim, typename Dma>
class LedBlink
{
public:
	static void init(uint32_t delay)
	{
		Pin::init(PinMode::PushPull);

		Dma::enablePeriphClock();
		Dma::initMemToPeriph((void*)buf, DmaDataSize::_32, true, (void*)&Pin::base()->BSRR, DmaDataSize::_32, std::size(buf), DmaPrio::Low, true);

		Tim::enablePeriphClock();
		Tim::init(Tim::getFreq() / 1'000 - 1, delay - 1);
		Tim::template enableDmaRequest<TimDmaReq::Update>();

		Dma::enable();
		Tim::enable();
	}

private:
	static inline const uint32_t buf[] = { Pin::pinMask, Pin::pinMask << 16 };
};
Теперь мигаем двумя светодиодами с разной частотой:

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

LedBlink<PinB<1>, Timer1, Dma1Ch5> ledBlink1;
LedBlink<PinA<7>, Timer2, Dma1Ch2> ledBlink2;

int main()
{
	Periph::enableClock(AhbPeriph::GpioA | AhbPeriph::GpioB);

	ledBlink1.init(500);
	ledBlink2.init(250);

	while(true) {}
}
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3384
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение Мурик »

Reflector, это не весь код. :dont_know: Нужно было проект выложить со всеми зависимостями. :)
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение dosikus »

Reflector, очевидно же, с поправкой Мурика, код на "регистрах" будет понятней, более читаем , короче и эффективней . И никаких плюсов ...
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение arkhnchul »

[uquote="dosikus",url="/forum/viewtopic.php?p=3379855#p3379855"]код на "регистрах" будет понятней, более читаем , короче и эффективней[/uquote]
не, не очевидно)
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение Reflector »

[uquote="Мурик",url="/forum/viewtopic.php?p=3379837#p3379837"]Reflector, это не весь код. :dont_know: Нужно было проект выложить со всеми зависимостями. :)[/uquote]
Что еще нужно было сделать? :) Весь код есть только у меня и парочки моих товарищей, остальные могут оценить сам подход, хотя скомпилировать такой код все равно мало кто смог бы, для этого нужен gcc 7. Но я могу, опять же для примера, показать в упрощенном виде что находится внутри класса DMA:
Спойлер

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

template<uint32_t ch>
class DmaChannel
{
public:
    static constexpr auto dma() { return (DMA_TypeDef*)dmaBase; }
    static constexpr auto channel() { return (DMA_Channel_TypeDef*)ch; }

    static void initMemToPeriph(void* memoryAddr, DmaDataSize memSize, bool memoryInc, volatile void* periphAddr, DmaDataSize periphSize,
          uint16_t bufSize, DmaPrio prio = DmaPrio::VeryHigh, bool circular = false)
    {
        channel()->CPAR = uint32_t(periphAddr);
        channel()->CMAR = uint32_t(memoryAddr);
        channel()->CNDTR = bufSize;
        channel()->CCR = DMA_CCR_DIR | uint32_t(prio) | (uint32_t(periphSize) << 8) | (uint32_t(memSize) << 10) | (circular << 5) | (memoryInc << 7);
    }

    static void enable() { channel()->CCR |= DMA_CCR_EN; }

       .........
};

using Dma1Ch1 = DmaChannel<DMA1_Channel1_BASE>;
using Dma1Ch2 = DmaChannel<DMA1_Channel2_BASE>;
.........
Также можно сравнить разницу в генерируемом коде с чистыми регистрами. Если заменить эту строку

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

Dma::initMemToPeriph((void*)buf, DmaDataSize::_32, true, (void*)&Pin::base()->BSRR, DmaDataSize::_32, std::size(buf), DmaPrio::Low, true);
на ее содержимое

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

DMA1_Channel5->CPAR = uint32_t(buf);
DMA1_Channel5->CMAR = uint32_t(GPIOB->BSRR);
DMA1_Channel5->CNDTR = std::size(buf);
DMA1_Channel5->CCR = DMA_CCR_DIR | uint32_t(DmaPrio::Low) | (uint32_t(DmaDataSize::_32) << 8) | (uint32_t(DmaDataSize::_32) << 10) | DMA_CCR_PL_0 | DMA_CCR_MINC;
то в релизе разницы никакой, в дебаге шаблонная функция тяжелее на 4 байта, это собственно и есть та цена, которую мы платим за простоту и универсальность.
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3384
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение Мурик »

Reflector писал(а):Что еще нужно было сделать?
Просто тогда нет смысла в выложенном коде. :dont_know: :)
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение dosikus »

Мурик, да ну ? Ты не можешь читать писанину. Reflector'a?
Вот-те раз...
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3384
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение Мурик »

Почему же, могу. Хотелось бы взглянуть на весь код.
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение arkhnchul »

[uquote="Reflector",url="/forum/viewtopic.php?p=3379884#p3379884"]мало кто смог бы, для этого нужен gcc 7[/uquote]
а то такая сложность достать gcc7, ага)
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение oleg110592 »

Не удержался, в пиковой теме увидел - человеку надо типа термостат на PIC и DS18B20. Мигаем светодиодом с пользой. Потом может на ARM сделаю.
Создал проект XC8 прямо в Протеусе.
Велосипед не изобретал - 1-вире скопипастил из своего древнего пиковского проекта:
Спойлер

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

#include <xc.h>

#pragma config MCLRE=OFF
#pragma config CP=ON
#pragma config CPD=OFF
#pragma config BOREN=ON
#pragma config WDTE=OFF
#pragma config PWRTE=ON
#pragma config FOSC=INTRCIO

#ifndef _XTAL_FREQ
// Unless already defined assume 4MHz system frequency
// This definition is required to calibrate __delay_us() and __delay_ms()
#define _XTAL_FREQ 4000000U
#endif
#define ONE_WIRE_PORTIN		GP1
#define ONE_WIRE_PORT		GP1
#define ONE_WIRE_DDR		TRISIO1
#define CONVERT_TEMP        0x44 
#define WRITE_SCRATCHPAD    0x4E 
#define READ_SCRATCHPAD     0xBE 
#define COPY_SCRATCHPAD     0x48 
#define RECALL_E2           0xB8 
#define READ_POWER_SUPPLY   0xB4 
#define SKIP_ROM		    0xCC 

int temperature;
unsigned char ds18b20[9];

void OneWire_Init()
{
	ONE_WIRE_DDR = 0; //Low LINE
    ONE_WIRE_PORT = 0;
    __delay_us(485);
    ONE_WIRE_DDR = 1; //Hi LINE
    __delay_us(70);
    if (ONE_WIRE_PORTIN == 0) 
        __delay_us(440);
} 

void OneWire_WriteByte(unsigned char data)
{
    unsigned char i;
    unsigned char data_bit; 

    for (i = 0; i < 8; i++) 
    {
        data_bit = data; 
        data_bit = (data >> i) & 1; 
        ONE_WIRE_DDR = 0; //Low LINE
        ONE_WIRE_PORT = 0; 
  
        if (data_bit == 1) 
            __delay_us(1); 
        else
            __delay_us(90); 

        ONE_WIRE_DDR = 1; 

        if (data_bit == 1) 
            __delay_us(90);
        else 
            __delay_us(1);

        ONE_WIRE_DDR = 1;
  
        __delay_us(1); 
    }
}

unsigned char OneWire_ReadByte(void)
{
    char i;
    unsigned char data = 0;

    for (i = 0; i < 8; i++)
    {
        __delay_us(1);
        ONE_WIRE_DDR = 0; //Low LINE
        ONE_WIRE_PORT = 0; 
        __delay_us(5);
        ONE_WIRE_DDR = 1;
        __delay_us(15); 
        if (ONE_WIRE_PORTIN == 1) 
            data |= (1 << i); 
        __delay_us(55);
    }
    return data; 
}

void main(void)
 {
	GPIO	= 0x00;
	CMCON	= 0x07;
	TRISIO	= 0x00; 
	while (1)
	{
		OneWire_Init();
		OneWire_WriteByte(SKIP_ROM);
		OneWire_WriteByte(CONVERT_TEMP);
		__delay_ms(1000);
		OneWire_Init();
		OneWire_WriteByte(SKIP_ROM);
		OneWire_WriteByte(READ_SCRATCHPAD);
		ds18b20[0] = OneWire_ReadByte();
		ds18b20[1] = OneWire_ReadByte();
		ds18b20[2] = OneWire_ReadByte();
		ds18b20[3] = OneWire_ReadByte();
		ds18b20[4] = OneWire_ReadByte();
		temperature = ((unsigned int)ds18b20[1] << 8 | (unsigned int)ds18b20[0]);
		if((ds18b20[1] & (1<<7))==0) 
		{
			temperature*=5;
			temperature>>=3;
		}
		else
		{
			temperature=-temperature;
			temperature*=5;
			temperature>>=3;
			temperature=-temperature;
		}
		if(temperature >= 40) GP2=0;
		if(temperature <= 20) GP2=1;
	}
}
вроде как работает:
Изображение
PIC12F629.zip
(760 байт) 281 скачивание
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение Reflector »

[uquote="arkhnchul",url="/forum/viewtopic.php?p=3380047#p3380047"]а то такая сложность достать gcc7, ага)[/uquote]
Вопрос не в том насколько сложно достать gcc 7, а в том, сколько людей бросится его искать и интегрировать в свои IDE, чтобы запустить мой код :)
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Мигать светодиодом. ARM или не-ARM?

Сообщение oleg110592 »

Мож кому надо - на сахаре klen gcc 9 для ARM выложил
http://caxapa.ru/840498.html
Ответить

Вернуться в «МЯЯЯУ!»