Первый коммит

This commit is contained in:
MultiMote 2023-01-01 18:21:01 +03:00
commit 4f39002534
230 changed files with 5964 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
.vscode
resources/_gen

0
.hugo_build.lock Normal file
View File

13
archetypes/default.md Normal file
View File

@ -0,0 +1,13 @@
---
title: "{{ replace .Name "-" " " | title }}"
date: {{ .Date }}
draft: true
categories: ["misc"]
<!-- featured_image: miniature.jpg -->
---
Описание
<!--more-->
Текст

15
config.toml Normal file
View File

@ -0,0 +1,15 @@
baseURL = 'https://mmote.ru/'
title = 'Здесь был MultiMote'
theme = 'mmotium'
languageCode = 'ru'
[params]
author = 'MultiMote'
[permalinks]
posts = "/:slugorfilename"
other = "/:slugorfilename"
[markup]
[markup.highlight]
style = 'monokailight'

View File

@ -0,0 +1,4 @@
---
title: "Архив"
description: "Это было давно и неправда"
---

View File

@ -0,0 +1,3 @@
---
title: "Программирование на C/C++"
---

View File

@ -0,0 +1,3 @@
---
title: "Дендрофекальное проектирование"
---

View File

@ -0,0 +1,3 @@
---
title: "Микроконтроллеры"
---

View File

@ -0,0 +1,3 @@
---
title: "Разное"
---

View File

@ -0,0 +1,3 @@
---
title: "Новости"
---

View File

@ -0,0 +1,4 @@
---
title: "Закреплено"
description: "Информация особой важности"
---

View File

@ -0,0 +1,18 @@
---
title: "Astyle"
categories: ["cpp", "archive"]
date: 2018-08-31T00:00:00+03:00
draft: false
---
<!--more-->
```
--style=java
--pad-oper
--pad-header
--convert-tabs
--align-pointer=name
--align-reference=name
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 378 KiB

View File

@ -0,0 +1,68 @@
---
title: "Бегущая строка"
categories: ["mcu", "archive"]
date: 2016-02-19T00:00:00+03:00
draft: false
featured_image: miniature.jpg
---
<!--more-->
```c
#include <avr/io.h>
#include <string.h>
#include <util/delay.h>
#include "lcd_lib.h"
#define LINE 16
char *str = "Postapokaliptichesky1232323123";
char *pstr;
char buf[LINE + 1];
void lcd_clear() {
LCDsendCommand(0x01);
}
void lcd_zero_coord() {
char y = 0;
char x = 0;
LCDsendCommand(0x80 | ((0x40 * y) + x));
}
void lcd_data(char byte) {
LCDsendChar(byte);
}
void lcd_str(char *s) {
while (*s != '\0') lcd_data(*(s++));
}
int main(void) {
LCDinit();
lcd_clear();
while (1) {
int len = strlen(str) + LINE;
for (int i = 0; i < len; ++i) {
lcd_clear();
lcd_zero_coord();
strcpy(buf, str);
int spaces = LINE - i;
buf[i] = '\0';
pstr = buf;
if (spaces > 0) for (int s = 0; s < spaces; ++s) lcd_data(' ');
else pstr += i - LINE;
lcd_str(pstr);
_delay_ms(100);
}
}
}
```
![|](anim.gif)

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

@ -0,0 +1,107 @@
---
title: "Полезности"
categories: ["cpp", "archive"]
date: 2015-12-01T00:00:00+03:00
draft: false
featured_image: miniature.jpg
---
На этой страничке я собираю все полезные кусочки кодов, которые мне пригождаются.
<!--more-->
# С/С++:
## Вывод списка файлов в папке, dirent:
```c
DIR *dir;
struct dirent *ent;
if (dir = opendir ("mydir")) {
while (ent = readdir (dir)) {
printf ("%s\n", ent->d_name);
}
closedir (dir);
}
```
## Удаление элементов вектора во время итерации:
```cpp
vector< string >::iterator it = curFiles.begin();
while(it != curFiles.end()) {
if(something) {
it = curFiles.erase(it);
} else ++it;
}
```
## Освобождение памяти вектора:
```cpp
struct delete_ptr {
template <typename P>
void operator () (P p) {
delete p;
}
};
std::for_each(myvector.begin(), myvector.end(), delete_ptr());
myvector.clear();
```
## Построковое чтение файла:
```c
const char filename[] = "file.txt";
FILE *file = fopen(filename, "r");
if (file != NULL) {
char line[128];
while (fgets(line, sizeof line, file) != NULL)
{
fputs(line, stdout);
}
fclose(file);
}
```
## OpenGL, рисование цветных прямоугольников:
```cpp
void drawRect(int x1, int y1, int x2, int y2, int color) {
float alpha = (float) (color >> 24 & 255) / 255.0F;
float red = (float) (color >> 16 & 255) / 255.0F;
float green = (float) (color >> 8 & 255) / 255.0F;
float blue = (float) (color & 255) / 255.0F;
glColor4f(red, green, blue, alpha);
glBegin(GL_QUADS);
glVertex3f(x1, y2, 0.0F);
glVertex3f(x2, y2, 0.0F);
glVertex3f(x2, y1, 0.0F);
glVertex3f(x1, y1, 0.0F);
glEnd();
}
void drawRectAt(int x, int y, int width, int height, int color) {
drawRect(x, y, x + width, x + height, color);
}
void drawPixel(int x, int y, int color) {
drawRect(x, y, x + 1, y + 1, color);
}
```
## Количество дней в месяце (с учётом високостного года):
```c
int get_month_days(int year, int month){
if (month == 4 || month == 6 || month == 9 || month == 11){
return 30;
} else if (month == 2) {
return ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) ? 29 : 28;
} else return 31;
}
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

@ -0,0 +1,12 @@
---
title: "Удаление программ из меню "
categories: ["misc", "archive"]
date: 2018-07-03T00:00:00+03:00
draft: false
---
<!--more-->
1. regedit.exe -> __HKEY\_CLASSES\_ROOT/Applications__
2. Удалить лишнее

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

View File

@ -0,0 +1,17 @@
---
title: "Инструкции от устройств"
categories: ["misc", "archive"]
date: 2020-08-19T00:00:00+03:00
draft: false
featured_image: miniature.jpg
---
Отсканированные инструкции от различных устройств.
<!--more-->
### Универсальный пульт Maxmedia Сameron URC-4020
![Cameron_URC-4020](Cameron_URC-4020.jpg)
[Cameron_URC-4020.pdf](Cameron_URC-4020.pdf)

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 MiB

Binary file not shown.

View File

@ -0,0 +1,37 @@
---
title: "Дампы"
categories: ["misc", "archive"]
date: 2019-12-03T00:00:00+03:00
draft: false
featured_image: miniature.jpg
---
Различные дампы микросхем энергонезависимой памяти, снятые с рабочей техники
<!--more-->
## Телевизоры
### Samsung bn41-01795a
Чип 25Q40
[bn41-01795a-25q40.zip](bn41-01795a-25q40.zip)
### SUNNY SN049DLD
Чип памяти 25Q64
Плата:
![|300](16AT004_F.jpg) ![|300](16AT004_B.jpg)
[MX25L6405@Sunny_pnl_LC490DUY.zip](MX25L6405@Sunny_pnl_LC490DUY.zip)
Дамп взят [отсюда](https://www.amwajsat.net/showthread.php?t=5098). Успешно протестирован, язык французский.
## BIOS
...

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 B

View File

@ -0,0 +1,190 @@
---
title: "Современные логические элементы"
categories: ["misc", "archive"]
date: 2016-06-30T00:00:00+03:00
draft: true
featured_image: miniature.jpg
---
Сборки логических элементов, которые можно найти практически в любом радиомагазине.<!--more-->
> :warning: Статья не закончена. Когда-нибудь она будет доработана.
**Vss** - катод <span style="color: #3366ff;">**(-)**</span>
**Vdd** - анод <span style="color: #ff0000;">**(+)**</span>
<h3 style="text-align: center;">НЕ (NOT)</h3>
<h3 style="text-align: center;">![nodeco:НЕ|](not.png)</h3>
<table border="1" cellpadding="5" style="border-color: #000000; border-width: 1px;">
<tbody>
<tr>
<td style="text-align: center;">Название</td>
<td style="text-align: center;">Описание</td>
<td style="text-align: center;">Структура</td>
<td style="text-align: center;">Распиновка</td>
</tr>
<tr>
<td>
<p style="text-align: center;"><strong>4069</strong></p>
</td>
<td style="text-align: center;">6 логических элементов НЕ</td>
<td>
<p>![|100](4069_s.png)</p>
<p>![|100](4069_single.png)</p>
</td>
<td>![|200](4069.png)</td>
</tr>
<tr>
<td style="text-align: center;"><strong>4049</strong></td>
<td style="text-align: center;">6 логических элементов НЕ</td>
<td style="text-align: center;">
<p>![|100](4049_s.png)</p>
<p>![|100](4049_single.png)</p>
</td>
<td style="text-align: center;">![|200](4049.png)</td>
</tr>
<tr>
<td style="text-align: center;">
<p><strong>4502</strong></p>
</td>
<td style="text-align: center;"><span>6 логических элементов НЕ с блокировкой и запретом</span></td>
<td style="text-align: center;">
<p>![|100](4502_s.png)</p>
<p>![|100](4502_single.png)</p>
</td>
<td style="text-align: center;">![|200](4502.png)</td>
</tr>
</tbody>
</table>
<p style="text-align: center;"></p>
<p style="text-align: center;"></p>
<h3 style="text-align: center;">ИЛИ (OR)</h3>
<p style="text-align: center;">![nodeco:ИЛИ|](or.png)</p>
<p style="text-align: center;"></p>
<table border="1" cellpadding="5" style="border-color: #000000; border-width: 1px;">
<tbody>
<tr>
<td style="text-align: center;"><span style="color: #ff0000;">Название</span></td>
<td style="text-align: center;">Описание</td>
<td style="text-align: center;">Структура</td>
<td style="text-align: center;">Распиновка</td>
<td style="text-align: center;">Схема ячейки</td>
</tr>
<tr>
<td>
<p style="text-align: center;"><strong>4069</strong></p>
</td>
<td style="text-align: center;">6 логических элементов НЕ</td>
<td>
<p>![|100](4069_s.png)</p>
<p>![|100](4049_single.png)</p>
</td>
<td>![|200](4069.png)</td>
<td></td>
</tr>
<tr>
<td></td>
<td style="text-align: center;"></td>
<td style="text-align: center;"></td>
<td style="text-align: center;"></td>
<td style="text-align: center;"></td>
</tr>
</tbody>
</table>
<p style="text-align: center;"></p>
<h3 style="text-align: center;">ИЛИ-НЕ (NOR)</h3>
<p style="text-align: center;">![nodeco:ИЛИ-НЕ|](nor.png)</p>
<p style="text-align: center;"></p>
<table border="1" cellpadding="5" style="border-color: #000000; border-width: 1px;">
<tbody>
<tr>
<td>Название</td>
<td style="text-align: center;">Описание</td>
<td style="text-align: center;">Структура</td>
<td style="text-align: center;">Распиновка</td>
</tr>
<tr>
<td>
<p style="text-align: center;"><strong>4001</strong></p>
</td>
<td style="text-align: center;">
<p align="center">4 логических элемента ИЛИ-НЕ</p>
</td>
<td>![|100](4001_s.png)
<p>![|100](4001_single.png)</p>
</td>
<td>![|200](4001.png)</td>
</tr>
<tr>
<td></td>
<td style="text-align: center;"></td>
<td style="text-align: center;"></td>
<td style="text-align: center;"></td>
</tr>
</tbody>
</table>
<p style="text-align: center;"></p>
<h3 style="text-align: center;">И (AND)</h3>
<p style="text-align: center;">![nodeco:И|](and.png)</p>
<p style="text-align: center;"></p>
<table border="1" cellpadding="5" style="border-color: #000000; border-width: 1px;">
<tbody>
<tr>
<td style="text-align: center;"><span style="color: #ff0000;">Название</span></td>
<td style="text-align: center;">Описание</td>
<td style="text-align: center;">Структура</td>
<td style="text-align: center;">Распиновка</td>
</tr>
<tr>
<td>
<p style="text-align: center;"><strong>4069</strong></p>
</td>
<td style="text-align: center;">6 логических элементов НЕ</td>
<td>![|100](4069_s.png)
<p>![|100](4049_single.png)</p>
</td>
<td>![|200](4069.png)</td>
</tr>
<tr>
<td></td>
<td style="text-align: center;"></td>
<td style="text-align: center;"></td>
<td style="text-align: center;"></td>
</tr>
</tbody>
</table>
<p style="text-align: center;"></p>
<h3 style="text-align: center;">И-НЕ (NAND)</h3>
<p style="text-align: center;">![nodeco:И-НЕ|](nand.png)</p>
<p style="text-align: center;"></p>
| Название | Описание | Структура | Распиновка |
|----------|---------------------------|----------------------------------------------|-------------------|
| 4069 | 6 логических элементов НЕ | ![100](4069_s.png) ![100](4049_single.png) | ![|200](4069.png) |

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 311 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 B

View File

@ -0,0 +1,256 @@
---
title: "Markdown test"
date: 2022-12-24T14:16:25+03:00
draft: false
categories: ["misc"]
---
Тут проверка
<!--more-->
---
__Advertisement :)__
- __[pica](https://nodeca.github.io/pica/demo/)__ - high quality and fast image
resize in browser.
- __[babelfish](https://github.com/nodeca/babelfish/)__ - developer friendly
i18n with plurals support and easy syntax.
You will like those projects!
---
# h1 Heading 8-)
## h2 Heading
### h3 Heading
#### h4 Heading
##### h5 Heading
###### h6 Heading
## Horizontal Rules
___
---
***
## Typographic replacements
Enable typographer option to see result.
(c) (C) (r) (R) (tm) (TM) (p) (P) +-
test.. test... test..... test?..... test!....
!!!!!! ???? ,, -- ---
"Smartypants, double quotes" and 'single quotes'
## Emphasis
**This is bold text**
__This is bold text__
*This is italic text*
_This is italic text_
~~Strikethrough~~
## Blockquotes
> Blockquotes can also be nested...
>> ...by using additional greater-than signs right next to each other...
> > > ...or with spaces between arrows.
## Lists
Unordered
+ Create a list by starting a line with `+`, `-`, or `*`
+ Sub-lists are made by indenting 2 spaces:
- Marker character change forces new list start:
* Ac tristique libero volutpat at
+ Facilisis in pretium nisl aliquet
- Nulla volutpat aliquam velit
+ Very easy!
Ordered
1. Lorem ipsum dolor sit amet
2. Consectetur adipiscing elit
3. Integer molestie lorem at massa
1. You can use sequential numbers...
1. ...or keep all the numbers as `1.`
Start numbering with offset:
57. foo
1. bar
## Code
Inline `code`
Indented code
// Some comments
line 1 of code
line 2 of code
line 3 of code
Block code "fences"
```
Sample text here...
```
Syntax highlighting
``` js
var foo = function (bar) {
return bar++;
};
console.log(foo(5));
```
## Tables
| Option | Description |
| ------ | ----------- |
| data | path to data files to supply the data that will be passed into templates. |
| engine | engine to be used for processing templates. Handlebars is the default. |
| ext | extension to be used for dest files. |
Right aligned columns
| Option | Description |
| ------:| -----------:|
| data | path to data files to supply the data that will be passed into templates. |
| engine | engine to be used for processing templates. Handlebars is the default. |
| ext | extension to be used for dest files. |
## Links
[link text](http://dev.nodeca.com)
[link with title](http://nodeca.github.io/pica/demo/ "title text!")
Autoconverted link https://github.com/nodeca/pica (enable linkify to see)
## Images
![Minion](https://octodex.github.com/images/minion.png)
![Stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg "The Stormtroopocat")
Like links, Images also have a footnote style syntax
![Alt text][id]
With a reference later in the document defining the URL location:
[id]: https://octodex.github.com/images/dojocat.jpg "The Dojocat"
## Plugins
The killer feature of `markdown-it` is very effective support of
[syntax plugins](https://www.npmjs.org/browse/keyword/markdown-it-plugin).
### [Emojies](https://github.com/markdown-it/markdown-it-emoji)
> Classic markup: :wink: :crush: :cry: :tear: :laughing: :yum:
>
> Shortcuts (emoticons): :-) :-( 8-) ;)
see [how to change output](https://github.com/markdown-it/markdown-it-emoji#change-output) with twemoji.
### [Subscript](https://github.com/markdown-it/markdown-it-sub) / [Superscript](https://github.com/markdown-it/markdown-it-sup)
- 19^th^
- H~2~O
### [\<ins>](https://github.com/markdown-it/markdown-it-ins)
++Inserted text++
### [\<mark>](https://github.com/markdown-it/markdown-it-mark)
==Marked text==
### [Footnotes](https://github.com/markdown-it/markdown-it-footnote)
Footnote 1 link[^first].
Footnote 2 link[^second].
Inline footnote^[Text of inline footnote] definition.
Duplicated footnote reference[^second].
[^first]: Footnote **can have markup**
and multiple paragraphs.
[^second]: Footnote text.
### [Definition lists](https://github.com/markdown-it/markdown-it-deflist)
Term 1
: Definition 1
with lazy continuation.
Term 2 with *inline markup*
: Definition 2
{ some code, part of Definition 2 }
Third paragraph of definition 2.
_Compact style:_
Term 1
~ Definition 1
Term 2
~ Definition 2a
~ Definition 2b
### [Abbreviations](https://github.com/markdown-it/markdown-it-abbr)
This is HTML abbreviation example.
It converts "HTML", but keep intact partial entries like "xxxHTMLyyy" and so on.
*[HTML]: Hyper Text Markup Language
### [Custom containers](https://github.com/markdown-it/markdown-it-container)
::: warning
*here be dragons*
:::

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,37 @@
---
title: "Бибилотеки MinGW"
categories: ["cpp", "archive"]
date: 2016-02-19T00:00:00+03:00
draft: false
featured_image: miniature.jpg
---
Тут находятся некоторые, уже откомпилированные мной, библиотеки для MinGW.
<!--more-->
### PNG
[png1621.7z](png1621.7z)
### SSL
[ssl.7z](ssl.7z)
### FLTK
[fltk.zip](fltk.zip)
### Zlib
[zlib128.7z](zlib128.7z)
### Curl
[curl.7z](curl.7z)
### SQLite
[sqlite.7z](sqlite.7z)

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 197 KiB

View File

@ -0,0 +1,21 @@
---
title: "Распиновки"
categories: ["misc", "archive"]
date: 2018-09-07T00:00:00+03:00
draft: false
---
Разнообразные найденные или выясненные распиновки
<!--more-->
Распиновка модуля i2c - LCD
i2c LCD adapter pinout
(PCF8574T)
![|547](i2c_lcd_pinout.jpg)

Binary file not shown.

BIN
content/other/soft/ftdi.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@ -0,0 +1,33 @@
---
title: "Софт"
categories: ["misc", "archive"]
date: 2015-08-13T00:00:00+03:00
draft: false
featured_image: miniature.jpg
---
Различный софт.
<!--more-->
---
### LCDPict
![lcd](lcd.png)
Редактор изображений и символов для LCD экранов
[lcdpict.zip](lcdpict.zip)
---
### Драйвер FTDI FT232 2.8.14
![ftdi](ftdi.png)
Подходит для китайских копий FT232
[ft232_2814.zip](ft232_2814.zip)

BIN
content/other/soft/lcd.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@ -0,0 +1,217 @@
---
title: "Makefile для STM32F103"
categories: ["mcu", "archive"]
date: 2017-02-26T00:00:00+03:00
draft: false
featured_image: miniature.jpg
---
Почти что в первый раз писал. Прошу простить за убогость и SPL. Всё это убирается. Под linux не проверялось.
<!--more-->
Рабочий проект: [stm32f103make.zip](stm32f103make.zip)
```makefile
CXX = arm-none-eabi-g++
CC = arm-none-eabi-gcc
LD = arm-none-eabi-gcc
OBJCOPY = arm-none-eabi-objcopy
SIZE = arm-none-eabi-size
STFLASH = st-flash
OPENOCD = openocd
STUTIL = st-flash
OUTPUT_DIR = bin
OBJ_DIR = obj
TARGET_NAME = led
TARGET_BINARY = $(TARGET_NAME).elf
TARGET_HEX = $(TARGET_NAME).hex
vpath %.c ./src
SOURCES = \
main.c
LDFLAGS_DEBUG =
CDFLAGS_DEBUG = -g3 -O0
LDFLAGS_RELEASE =
CDFLAGS_RELEASE = -O2
CFLAGS = -Wall \
-mcpu=cortex-m3 \
-mthumb \
-D__HEAP_SIZE=0x0000 \
-D__STACK_SIZE=0x0100 \
-mfloat-abi=soft \
-fno-strict-aliasing \
-fdata-sections \
-ffunction-sections \
-DSTM32F103C8 \
-DSTM32F10X_MD \
-DUSE_STDPERIPH_DRIVER
TARGET = $(OUTPUT_DIR)/$(TARGET_BINARY)
LIBS = -lm
LDFLAGS = \
--specs=nosys.specs \
--specs=nano.specs \
-mcpu=cortex-m3 \
-mthumb \
-Wl,--defsym=__HEAP_SIZE=0x0000 \
-Wl,--defsym=__STACK_SIZE=0x0100 \
-mfloat-abi=soft \
-fno-strict-aliasing \
-fdata-sections \
-ffunction-sections \
-Wl,--gc-sections \
-Wl,-script="./hardware/stm32f103c8_flash.ld" \
-Wl,-Map=$(TARGET).map
#-u _printf_float
INCLUDES = \
-I. \
-I./include \
-I./hardware/include \
-I./hardware/include/cmsis \
-I./hardware/SPL/include
STARUPFILE = hardware/src/startup_stm32f10x_md.S
SOURCES_SPL = \
stm32f10x_rcc.c \
stm32f10x_gpio.c \
stm32f10x_dma.c
#stm32f10x_crc.c \
#stm32f10x_flash.c \
#stm32f10x_pwr.c \
#stm32f10x_tim.c \
#stm32f10x_adc.c \
#stm32f10x_dac.c \
#stm32f10x_fsmc.c \
#stm32f10x_usart.c \
#stm32f10x_bkp.c \
#stm32f10x_dbgmcu.c \
#stm32f10x_rtc.c \
#stm32f10x_wwdg.c \
#stm32f10x_can.c \
#stm32f10x_i2c.c \
#stm32f10x_sdio.c \
#stm32f10x_cec.c \
#stm32f10x_exti.c \
#stm32f10x_iwdg.c \
#stm32f10x_spi.c \
#misc.c
################################################################
SOURCES += $(addprefix hardware/SPL/src/, $(SOURCES_SPL))
SOURCES += hardware/src/system_stm32f10x.c
HEX = $(OUTPUT_DIR)/$(TARGET_HEX)
STARTUPOBJ = $(notdir $(STARUPFILE))
STARTUPOBJ := $(patsubst %.S, $(OBJ_DIR)/%.S.o, $(STARTUPOBJ))
OBJECTS = $(patsubst %, $(OBJ_DIR)/%.o, $(SOURCES))
OBJECTS += $(STARTUPOBJ)
DEPS = $(OBJECTS:.o=.d)
all: release
release: LDFLAGS+=$(LDFLAGS_RELEASE)
release: CFLAGS+=$(CDFLAGS_RELEASE)
release: _firmware
debug: LDFLAGS+=$(LDFLAGS_DEBUG)
debug: CFLAGS+=$(CDFLAGS_DEBUG)
debug: _firmware
_firmware: $(TARGET) $(HEX)
$(TARGET): $(OBJECTS) | $(OUTPUT_DIR) $(OBJ_DIR)
$(LD) $(LDFLAGS) -o $@ $(OBJECTS) $(LIBS)
$(SIZE) --format=berkeley $(TARGET)
obj/%.cpp.o: %.cpp
ifeq ($(OS), Windows_NT)
$(eval dirname=$(subst /,\\,$(dir $@)))
@ if NOT EXIST $(dirname) mkdir $(dirname)
else
@mkdir -p $(dir $@) $(TO_NULL)
endif
$(CXX) -c -MMD -MP $(CFLAGS) $(INCLUDES) $< -o $@
obj/%.c.o: %.c
ifeq ($(OS), Windows_NT)
$(eval dirname=$(subst /,\\,$(dir $@)))
@ if NOT EXIST $(dirname) mkdir $(dirname)
else
@mkdir -p $(dir $@) $(TO_NULL)
endif
$(CC) -c -MMD -MP $(CFLAGS) $(INCLUDES) $< -o $@
$(STARTUPOBJ):
$(CC) -c -MMD -MP $(CFLAGS) $(INCLUDES) $(STARUPFILE) -o $(STARTUPOBJ)
$(HEX): $(TARGET)
$(OBJCOPY) -O ihex $(TARGET) $(HEX)
$(OUTPUT_DIR):
@mkdir $(OUTPUT_DIR)
$(OBJ_DIR):
@mkdir $(OBJ_DIR)
_size: $(TARGET)
$(SIZE) --format=berkeley $(TARGET)
flash: flash-ocd
flash-stutil:
$(STFLASH) --format ihex write $(HEX)
flash-ocd:
$(OPENOCD) -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c "program $(TARGET) verify reset exit"
srclist:
@echo $(SOURCES)
objlist:
@echo $(OBJECTS)
clean:
ifeq ($(OS), Windows_NT)
-del $(subst /,\\,$(OBJECTS))
-del $(subst /,\\,$(DEPS))
-rmdir /S /Q $(OBJ_DIR)
-del /Q /F $(OUTPUT_DIR)\\$(TARGET_BINARY)
-del /Q /F $(OUTPUT_DIR)\\$(TARGET_BINARY).map
-del /Q /F $(OUTPUT_DIR)\\$(TARGET_HEX)
else
-rm -f $(OBJECTS)
-rm -f $(DEPS)
-rm -rf $(OBJ_DIR)
-rm -f $(OUTPUT_DIR)/$(TARGET_BINARY)
-rm -f $(OUTPUT_DIR)/$(TARGET_BINARY).map
-rm -f $(OUTPUT_DIR)/$(TARGET_HEX)
endif
-include $(DEPS)
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

View File

@ -0,0 +1,18 @@
---
title: "Спасибы"
categories: ["misc", "pinned"]
date: 2016-05-14T00:00:00+03:00
draft: false
featured_image: miniature.jpg
---
Нечеловеческое спасибо за всё следующим людям:
* Иван Истомин ([Istom1n](https://vk.com/id9920588))
* Кирилл Иванов
* Игорь Окунский ([Clarity](https://vk.com/sundayclarity))
* Игорь Водка ([Uhehesh](https://vk.com/id171249225))
* Дмитрий Тычинин ([iMityan](https://vk.com/id88536880))
* Даня Соломыкин ([CrazyClown](https://vk.com/id23105063))
* Алексей Шалпегин (15432)
* Валерия ([Mithriss](https://vk.com/id244743608))

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 KiB

View File

@ -0,0 +1,239 @@
---
title: "Простой частотомер на AVR - курсовая работа"
categories: ["mcu", "archive"]
date: 2015-08-16T00:00:00+03:00
draft: true
featured_image: miniature.jpg
---
Итак, пришло время время делать курсовые работы. Мне попалась тема "Частотомер с передачей данных по последовательному порту и динамической индикацией". Значит, будем использовать таймер, внешние прерывания и динамическую индикацию. Использовал семисегментный индикатор с четырьмя разрядами и общим анодом. Микроконтроллер выберем Atmega16. Именно с ним я не чувствовал дефицита ножек. Приступим.
<!--more-->
> :warning: Этот текст древний стыд. Не нужно принимать его всерьёз. Сейчас бы такой бред не сделал.
Работа заключается в следующем: нужно спроектировать схему устройства, развести печатку, а также изготовить корпус для готового устройства. В КОМПАС 3D, разумеется.
Для начала нам нужно определиться как именно считать частоту. Я решил использовать таймер, тактированный часовым кварцем и засекать количество внешних прерываний за секунду. Прерывания использовал по нарастающему фронту. Возможно, я не прав, но, во благо, на железе собирать ничего не требуется.
Делаем всё в протеусе. Схема получилась такая:
![Схема|786](freq_sch.png)
Пишем программу. Микроконтроллер должен считать импульсы в секунду и выводить их на семисегментный индикатор. А также отдавать данные по UART.
main.h:
```c
#ifndef __MAIN_H_
#define __MAIN_H_
#include <stdint.h>
#include <stdbool.h>
typedef uint8_t byte;
byte buf[16];
uint32_t freq;
uint32_t freq_max;
uint32_t measure_buf;
// порт для сегментов
#define SEGMENTS_DDR DDRA
#define SEGMENTS_PORT PORTA
// порт для разрядов
#define DIGITS_DDR DDRC
#define DIGITS_PORT PORTC
#define SWITCH_TIME 45 // время между переключениями разрядов; чем меньше, тем меньше мерцает
#define INPUT 0x00
#define OUTPUT 0xFF
#define SYMBOLS_SIZE 11 // количество символов в таблице
byte symbols[SYMBOLS_SIZE] = //состояния пинов для символов
{
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111, // 9
0b10000000 // .
};
int main(void);
void switchDigit(byte digit); // показать нужный разряд, остальные погасить; значения от 0 до 3
void showDigit(byte number, bool dot); // вывести символ на разряд, с точкой или без; значения от 0 до SYMBOLS_SIZE
void initTimer(); // инициализация таймера (для нас - часового)
void initInterrupts(); //инициализация прерываний
void initUART(); //инициализация последовательного порта
void sendByte(byte b); //отправка байта по UART
void sendString(byte *str); //отправка строки по UART
#endif //__MAIN_H_
```
main.c:
```c
#include "main.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdio.h>
int main(void) {
SEGMENTS_DDR = OUTPUT; // настраиваем порты ввода-вывода
DIGITS_DDR = OUTPUT;
DIGITS_PORT = 0xFF;
initTimer();
initInterrupts();
initUART();
byte i;
uint32_t num;
sprintf(buf, "? Stabilization...\r\n");
sendString(buf);
_delay_ms(100); // ожидаем стабилизации таймера
sprintf(buf, "? Init finished!\r\n");
sendString(buf);
while (1) {
num = freq > 9999 ? 9999 : freq;
for (i = 0; i < 4; ++i) { // перебираем все разряды, разбираем частоту на цифры
switchDigit(i);
switch (i) {
case 0:
showDigit((byte) ((num / 1000) % 10), false);
break;
case 1:
showDigit((byte) ((num / 100) % 10), false);
break;
case 2:
showDigit((byte) ((num / 10) % 10), false);
break;
case 3:
showDigit(num % 10, false);
break;
default:
break;
}
_delay_ms(SWITCH_TIME);
}
}
}
ISR(TIMER2_OVF_vect) { // прерывание таймера при переполнении
freq = measure_buf;
if( freq > freq_max) freq_max = freq;
measure_buf = 0;
sprintf(buf, "> Freq: %dHz, ", freq); // отправляем данные
sendString(buf);
sprintf(buf, "Max: %dHz\r\n", freq_max);
sendString(buf);
}
ISR(INT0_vect) { //внешнее прерывание
measure_buf++;
}
void showDigit(byte digit, bool dot) {
SEGMENTS_PORT = ~symbols[digit > SYMBOLS_SIZE - 1 ? 10 : digit] | (dot ? symbols[10] : 0);
}
void switchDigit(byte number) {
DIGITS_PORT = number < 4 ? (byte) (1 << number) : 0x00;
}
void initTimer() {
ASSR |= _BV(AS2); // асинхронный режим, тактируемся от часового кварца
TCCR2 = _BV(CS20) | _BV(CS22); //предделитель 128, одна секунда
TIMSK |= _BV(TOIE2); // включаем таймер
}
void initInterrupts() {
MCUCR = (1 << ISC01) | (1 << ISC00); //прерывание по растущему форонту
GICR = (1 << INT0); //включаем прерывание на INT0
sei(); // разрешаем прерывания
}
void initUART() {
// выставляем скорость: 9600 при частоте 8МГц
// UBRR=8000000/(16*9600)-1=51.0833, округляем = 51 (0x33)
UBRRH = 0x00;
UBRRL = 0x33;
// Разрешаем приём и передачу
UCSRB = (1 << RXEN) | (1 << TXEN);
UCSRB |= (1 << RXCIE);
// устанавливаем формат: 8 бит данных, 2 стоп бита
UCSRC = (1 << URSEL) | (1 << USBS) | (3 << UCSZ0);
}
void sendByte(byte b) {
while ( !(UCSRA & (1<<UDRE)) ); // ожидаем завершения передачи
UDR = b; // записываем байт в буфер
}
void sendString(byte * str) {
while (*str != 0) sendByte(*str++); // побайтно отправляем строку
}
```
Разводим печатку:
![|300](pcb.png)
Вот такую красоту можно понаблюдать:
![|300](3d1.png)
Результат:
![|226](pcb1.png)
Теперь самое главное - сделать корпус. Отталкиваться нужно от размера самой печатки. Делаем чертежи каждой части корпуса, потом варганим из них модели. Затем собираем всё воедино.
![|300](draft.png) ![|300](compas1.png)![|300](compas2.png) ![|300](compas3.png)
Три отверстия сзади для проводов: вход для сигнала, питание и UART. В прямоугольный вырез спереди вставляется семисегментный индикатор и шлейфом соединяется с печатной платой. Сама плата прикручивается маленькими саморезами/болтами. Крышка тоже.
##### Ссылки:
[Чертежи и модели в КОМПАС-3D](freq-meter-KOMPAS.zip)
[Чертежи в Corel Draw](7seg-freq-corel.zip)
[Сама курсовая работа (docx)](avr-7seg-freq-curse.docx)
[Внешние прерывания МК AVR (samou4ka.net)](http://samou4ka.net/page/vneshnie-preryvanija-mk-avr)
[Таймеры МК AVR (samou4ka.net)](http://samou4ka.net/page/tajmer-schetchik-mikrokontrollerov-avr)
[Асинхронный режим таймера AVR (easyelectronics.ru)](http://easyelectronics.ru/avr-uchebnyj-kurs-asinxronnyj-rezhim-tajmera.html)
[Самые простые часы на AVR (easyelectronics.ru)](http://we.easyelectronics.ru/antonluba/samye-prostye-chasy-na-avr.html)
[Работа с UART на примере ATmega16 (alex-exe.ru)](http://alex-exe.ru/radio/avr/avr-uart/)

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

View File

@ -0,0 +1,70 @@
---
title: "Управление портами как в CodeVisionAvr"
categories: ["mcu", "archive"]
date: 2016-06-03T00:00:00+03:00
draft: false
featured_image: miniature.jpg
---
Наверное, многие, как и я, начинали обучение миру микроконтроллеров в такой замечательной среде программирования как CodeVisionAvr. И не спроста компилятор предоставляет возможности, несколько упрощающие жизнь программисту. Одна из таких возможностей - обращение к конкретным ножкам определённого порта в явном виде.
<!--more-->
Например, мы хотим включить ножку 5 порта C. В CVAvr это делается так:
```c
PORTC.5 = 1;
```
А в WinAvr (avr-gcc) это делается так (что более правильно, я не спорю, но менее комфортно):
```c
PORTC |= _BV(5);
```
И выключаем ту же ножку. CVAvr:
```c
PORTC.5 = 0;
```
А в WinAvr:
```c
PORTC &= ~_BV(5);
```
Не так наглядно, согласитесь? Так что попробуем добиться такого же вида обращения к портам как и в CVAvr.
Для этого нужно создать восьмибитную структуру:
```c
struct port_byte {
bool P0 : 1;
bool P1 : 1;
bool P2 : 1;
bool P3 : 1;
bool P4 : 1;
bool P5 : 1;
bool P6 : 1;
bool P7 : 1;
};
```
Дабы компилятор не ругался на bool нужно подключить заголовок stdbool.h
Теперь самое интересное. Нужно создать переменную-указатель для нужного порта и присвоить ей начальный адрес. В данном случае используем PORTC:
```c
struct port_byte *CVPORTC = (struct port_byte *) &(PORTC);
```
Готово! Теперь можно обращаться к ножкам порта через эту переменную:
```c
CVPORTC->P5 = 1;
_delay_ms(500);
CVPORTC->P5 = 0;
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@ -0,0 +1,91 @@
---
title: "Вывод иконок на дисплей Nokia 3310/5110 (переходим на avr-gcc)"
categories: ["mcu", "archive"]
date: 2015-08-13T00:00:00+03:00
draft: false
featured_image: miniature.jpg
---
Наконец-то переехал с CVAvr на AVR-GCC. От нечего делать начал собирать барометр. Купил nokia3310, выдрал дисплей. Библиотеку использовал [вот эту](https://github.com/gresolio/N3310Lib). Всё отлично, но библиотека умеет рисовать круги, линии, прямоугольники, выводить полноэкранные изображения, НО. Что должен уметь электронный барометр?
<!--more-->
Правильно, определять погоду по давлению. И выводить картинку с облачком или солнышком. А с полноэкранным изображением это делать не вариант - занимает кучу памяти да и с обновлением дисплея будет беда. Так что, я взялся за дело. Просидев весь вечер, написал программку-рисовалку картинок с конвертацией в массив и функцию-дополнение к библиотеке. Вот так выглядит программа:
![LCDPict|](lcdpict.png)
Прямая ссылка, по традиции, в конце статьи.
Функция выглядит следующим образом:
```c
byte LCDIcon(const byte *pic, byte x, byte y, byte arrayRows, byte arrayColumns, byte progMem) {
byte iterCol;
byte iterRow;
byte iterByte;
byte picX = x;
byte picY = y;
byte symbolChar;
for (iterCol = 0; iterCol < arrayColumns; iterCol++) {
for (iterRow = 0; iterRow < arrayRows; iterRow++) {
if (progMem) {
symbolChar = (byte) pgm_read_byte(&pic[iterCol + iterRow * arrayColumns]);
} else {
symbolChar = pic[iterCol + iterRow * arrayColumns];
}
for (iterByte = 0; iterByte < 8; iterByte++) {
if ((symbolChar >> iterByte) & 1) {
LcdPixel(picX, picY, PIXEL_ON);
}
picY++;
}
}
picY = y;
picX++;
}
UpdateLcd = TRUE;
return OK;
}
```
В качестве первого аргумента скармливаем **указатель на первый элемент массива**, второй и третий - координаты картинки,предпоследние аргументы - размер **массива, не картинки**. Не путать. Последний аргумент определяет откуда читать данные: из памяти МК (атрибут **PROGMEM**) или же из оперативной памяти. Пример:
```c
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include "n3310.h"
const byte out[2][24] = {
{0x0, 0x0, 0x0, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0, 0xc, 0x6, 0x86, 0xc6, 0xec, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
{0x0, 0x0, 0x0, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x0, 0x18, 0x10, 0x10, 0x10, 0x19, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0}
};
int main(void) {
LcdInit();
while (1) {
LcdClear();
LCDIcon(&out[0][0], 0, 0, 2, 24, false);
LcdUpdate();
_delay_ms(5000);
}
}
```
UPD: Только сейчас заметил, что в программе неверно написан тип данных. Вместо **const <span style="text-decoration: underline; color: #993366;">char</span> out** нужно использовать **const <span style="text-decoration: underline; color: #008000;">unsigned char</span> out.** Исходник я давно потерял, поэтому исправить не могу.
**Ссылки:**
[LCDPict](lcdpict.zip)
[Библиотека для дисплея nokia3310](https://github.com/gresolio/N3310Lib)
[Форк библиотеки с программным SPI](https://github.com/MultiMote/N3310Lib)

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Some files were not shown because too many files have changed in this diff Show More