Browse Source

Translate CP1251 to UTF8. Reorder.

Vladimir N. Shilov 2 years ago
parent
commit
2cad605dc6

+ 0 - 0
floatToString.h → Convert to string/floatToString.h


+ 6 - 6
Convert to string/itoa.c

@@ -1,9 +1,9 @@
 /**
- * Ïðåîáðàçóåì â ñòðîêó. ×àñòü 1. Öåëûå ÷èñëà.
+ * Преобразуем в �троку. Ча�ть 1. Целые чи�ла.
  * http://we.easyelectronics.ru/Soft/preobrazuem-v-stroku-chast-1-celye-chisla.html
  */
 
-/* 5. Äåëåíèå íà 10 ñäâèãàìè è ñëîæåíèÿìè. */
+/* 5. Деление на 10 �двигами и �ложени�ми. */
 struct divmod10_t {
     uint32_t quot;
     uint8_t rem;
@@ -11,18 +11,18 @@ struct divmod10_t {
 
 inline static divmod10_t divmodu10(uint32_t n) {
   divmod10_t res;
-// óìíîæàåì íà 0.8
+// умножаем на 0.8
   res.quot = n >> 1;
   res.quot += res.quot >> 1;
   res.quot += res.quot >> 4;
   res.quot += res.quot >> 8;
   res.quot += res.quot >> 16;
   uint32_t qq = res.quot;
-// äåëèì íà 8
+// делим на 8
   res.quot >>= 3;
-// âû÷èñëÿåì îñòàòîê
+// вычи�л�ем о�таток
   res.rem = uint8_t(n - ((res.quot << 1) + (qq & ~7ul)));
-// êîððåêòèðóåì îñòàòîê è ÷àñòíîå
+// корректируем о�таток и ча�тное
   if(res.rem > 9) {
     res.rem -= 10;
     res.quot++;

+ 0 - 0
printf/Printf.7z → Convert to string/printf/Printf.7z


+ 0 - 0
printf/printf.c → Convert to string/printf/printf.c


+ 0 - 0
printf/printf.h → Convert to string/printf/printf.h


+ 0 - 0
printf/urls.txt → Convert to string/printf/urls.txt


+ 0 - 0
rprintf/printf_.c → Convert to string/rprintf/printf_.c


+ 0 - 0
rprintf/printf_.h → Convert to string/rprintf/printf_.h


+ 0 - 0
rprintf/urls.txt → Convert to string/rprintf/urls.txt


+ 0 - 0
rprintf/usart1.c → Convert to string/rprintf/usart1.c


+ 0 - 0
rprintf/usart1.h → Convert to string/rprintf/usart1.h


+ 15 - 15
adc/adc_vref.txt

@@ -1,25 +1,25 @@
 http://we.easyelectronics.ru/GYUR22/stm32-adcdmaitcusrednenie.html#comment94893
 
- ADCout (uint) — уже откалиброваные данные (которые надо получить)
- ADCin (uint)- сырые данные
- ADCref (uint)- измеренный внутренний референс. Он на 17м канале сидит вроде бы.
+ ADCout (uint) — уже откалиброваные данные (которые надо получить)
+ ADCin (uint)- сырые данные
+ ADCref (uint)- измеренный внутренний референс. Он на 17м канале сидит вроде бы.
 
- А дальше следим за руками:
- 1. ADCin = (Vin/Vdd)*4095 (измерение относительно питания, 12 бит)
- 2. ADCref = (Vref/Vdd)*4095 (Vref смотрим в даташите, не помню сколько) (1489)
- 3. Выведем Vin:
+ А дальше следим за руками:
+ 1. ADCin = (Vin/Vdd)*4095 (измерение относительно питания, 12 бит)
+ 2. ADCref = (Vref/Vdd)*4095 (Vref смотрим в даташите, не помню сколько) (1489)
+ 3. Выведем Vin:
  Vin = Vref*ADCin/ADCref
- 4. Но это бесполезные в целочисленной арифметике вольты. А нам нужны попугаи:
- ADCout = (Vin/Vdd) * 4095 (эмулируем АЦП )))) )
+ 4. Но это бесполезные в целочисленной арифметике вольты. А нам нужны попугаи:
+ ADCout = (Vin/Vdd) * 4095 (эмулируем АЦП )))) )
  ADCout = (ADCin * (Vref*4095/Vdd) )/ ADCref
- 5. Обозначим K = Vref*4095/Vdd (коэффициент типа uint)
- 6. Итоговый вариант:
+ 5. Обозначим K = Vref*4095/Vdd (коэффициент типа uint)
+ 6. �тоговый вариант:
  ADCout = ((u32)ADCin * K)/ADCref;
- K — какой коэффициентугодно можно. Но для красоты и предсказуемости данных я его высчитываю относительно номинального напряжения питания.
+ K — какой коэффициентугодно можно. Но для красоты и предсказуемости данных я его высчитываю относительно номинального напряжения питания.
 
- Как уже было подмечено, калибровку делаем после каждого измерения. А потом хоть заусредняйтесь.
- Еще момент (было в сообществе кстати), на точность измерения очень сильно влияет сэмплинг тайм. На ваш вкус. Но для рефа мы делаем не менее 28.5 циклов тактирования АЦП.
- Как-то так
+ Как уже было подмечено, калибровку делаем после каждого измерения. А потом хоть заусредняйтесь.
+ Еще момент (было в сообществе кстати), на точность измерения очень сильно влияет сэмплинг тайм. На ваш вкус. Но для рефа мы делаем не менее 28.5 циклов тактирования АЦП.
+ Как-то так
 ---
 http://www.robobuild.ru/index.php?itid=4
 ---

+ 0 - 0
Array of arrays in PROGMEM for AVR MCUs.c → avr/Array of arrays in PROGMEM for AVR MCUs.c


+ 102 - 102
macros.h → avr/macros.h

@@ -1,13 +1,13 @@
 ////////////////////////////////////////////////////////////////////////////////////////////////////
-//	Ìàêðîîïðåäåëåíèÿ.
+//	Макроопределени�.
 //
-//  (C) Åâãåíèé Òðèôîíîâ, Äåíèñ Æåëåçíÿêîâ. 2001 - 2007 ã.
-//	Âåðñèÿ: 2.7.1 îò 18.12.2007
+//  (C) Евгений Трифонов, Дени� Железн�ков. 2001 - 2007 г.
+//	Вер�и�: 2.7.1 от 18.12.2007
 ////////////////////////////////////////////////////////////////////////////////////////////////////
 
-// Ïàðàìåòðû ãåíåðàòîðà (÷àñòîòà ãåíåðàòîðà óêàçûâàåòñÿ â Ãö.)
+// Параметры генератора (ча�тота генератора указывает�� в Гц.)
 #ifndef __MCU_Clock
-  #warning Òàêòîâàÿ ÷àñòîòà ïðîöåññîðà (__MCU_Clock) íå óêàçàíà! Èñïîëüçóåòñÿ çíà÷åíèå ïî-óìîë÷àíèþ: 9 216 000 Ãö
+  #warning Тактова� ча�тота проце��ора (__MCU_Clock) не указана! И�пользует�� значение по-умолчанию: 9 216 000 Гц
   #define __MCU_Clock   9216000
 #endif
 
@@ -24,7 +24,7 @@
 #include <ioavr.h>
 #include <ina90.h>
 
-// Öèêëû
+// Циклы
 #define Hz(Value)       ((1 / (float)(Value)) * __MCU_Clock)
 #define kHz(Value)      Hz((Value) * 0x000003E8)
 #define MHz(Value)      Hz((Value) * 0x000F4240)
@@ -36,7 +36,7 @@
 #define _cycle
 #define _cycles
 
-// Çàäåðæêà
+// Задержка
 #define Delay(Value)            __delay_cycles(Value)
 #define Delay_ns(Value) 	      Delay((Value)_ns)
 #define Delay_us(Value) 	      Delay((Value)_us)
@@ -49,25 +49,25 @@
 #define Delay_Cycle(Value)      Delay(Value)
 #define Delay_Cycles(Value)	    Delay(Value)
 
-// Òàéìåðû
+// Таймеры
 #define TC16_Compare(Div, Value)      (unsigned  int)((1 / (float)(Div)) * (Value))
 #define TC16_Overflow(Div, Value)     (unsigned  int)(0x10000 - TC16_Compare(Div, Value))
 #define TC8_Compare(Div, Value)       (unsigned char)TC16_Compare(Div, Value)
 #define TC8_Overflow(Div, Value)      (unsigned char)(0x00100 - TC8_Compare(Div, Value))
 
-// Áèòîâûå îïåðàöèè
+// Битовые операции
 #define Bit(Idx)                  		(1 << (Idx))
 #define _Bit(Idx)                 		Bit(Idx)
 
-// Èçìåíåíèå ñîñòîÿíèÿ îáíîãî áèòà â ïåðåìåííîé èëè ðåãèñòðå
+// Изменение �о�то�ни� обного бита в переменной или реги�тре
 //
-//  Ïðèìåðû:
-//      Set_Bit(TCCR1A, WGM10);       - óñòàíîâêà áèòà WGM10 â ðåãèñòðå TCCR1A
-//      Clear_Bit(TCCR1B, CS10);      - ñáðîñ áèòà CS10 â ðåãèñòðå TCCR1B
-//      Get_Bit(TCCR1A, WGM10);       - ïîëó÷åíèå çíà÷åíèÿ áèòà WGM10 â ðåãèñòðå TCCR1A
-//      Invert_Bit(TCCR1B, CS10);     - èíâåðòèðîâàíèå áèòà CS10 â ðåãèñòðå TCCR1B
-//      Is_Bit_Set(TCCR1A, WGM10);    - âîçâðàùàåò èñòèíó åñëè áèò WGM10 â ðåãèñòðå TCCR1A óñòàíîâëåí
-//      Is_Bit_Clear(TCCR1B, CS10);   - âîçâðàùàåò èñòèíó åñëè áèò CS10 â ðåãèñòðå TCCR1B ñáðîøåí
+//  Примеры:
+//      Set_Bit(TCCR1A, WGM10);       - у�тановка бита WGM10 в реги�тре TCCR1A
+//      Clear_Bit(TCCR1B, CS10);      - �бро� бита CS10 в реги�тре TCCR1B
+//      Get_Bit(TCCR1A, WGM10);       - получение значени� бита WGM10 в реги�тре TCCR1A
+//      Invert_Bit(TCCR1B, CS10);     - инвертирование бита CS10 в реги�тре TCCR1B
+//      Is_Bit_Set(TCCR1A, WGM10);    - возвращает и�тину е�ли бит WGM10 в реги�тре TCCR1A у�тановлен
+//      Is_Bit_Clear(TCCR1B, CS10);   - возвращает и�тину е�ли бит CS10 в реги�тре TCCR1B �брошен
 //
 #define Set_Bit(Var, BitIdx)          ((Var) |=  _Bit(BitIdx))
 #define Clear_Bit(Var, BitIdx)        ((Var) &= ~_Bit(BitIdx))
@@ -77,32 +77,32 @@
 #define Is_Bit_Set(Var, BitIdx)       (Get_Bit(Var, BitIdx) == _Bit(BitIdx))
 #define Is_Bit_Clear(Var, BitIdx)     (Get_Bit(Var, BitIdx) == 0x00)
 
-// Èçìåíåíèå ñîñòîÿíèÿ ïåðåìåííîé èëè ðåãèñòðà ïî óêàçàííîé ìàñêå
+// Изменение �о�то�ни� переменной или реги�тра по указанной ма�ке
 //
-//  Ïðèìåðû:
-//      Set_Bits(TCCR1A, _Bit(WGM10) | _Bit(COM1A1));      - óñòàíîâêà áèòîâ WGM10 è COM1A1 â ðåãèñòðå TCCR1A
-//      Set_Bits(TCCR1A, ~_Bit(WGM10) | _Bit(COM1A1));     - ñáðîñ áèòà WGM10 è óñòàíîâêà áèòà COM1A1 â ðåãèñòðå TCCR1A
-//      Clear_Bits(TCCR1A, ~_Bit(WGM10) | _Bit(COM1A1));   - óñòàíîâêà áèòà WGM10 è ñáðîñ áèòà COM1A1 â ðåãèñòðå TCCR1A
+//  Примеры:
+//      Set_Bits(TCCR1A, _Bit(WGM10) | _Bit(COM1A1));      - у�тановка битов WGM10 и COM1A1 в реги�тре TCCR1A
+//      Set_Bits(TCCR1A, ~_Bit(WGM10) | _Bit(COM1A1));     - �бро� бита WGM10 и у�тановка бита COM1A1 в реги�тре TCCR1A
+//      Clear_Bits(TCCR1A, ~_Bit(WGM10) | _Bit(COM1A1));   - у�тановка бита WGM10 и �бро� бита COM1A1 в реги�тре TCCR1A
 //
 #define Set_Bits(Var, Mask)           ((Var) |=  (Mask))
 #define Clear_Bits(Var, Mask)         ((Var) &= ~(Mask))
 #define Invert_Bits(Var, Mask)        ((Var) ^=  (Mask))
 #define Toggle_Bits(Var, Mask)        Invert_Bits(Var, (Mask))
 
-// Èçìåíåíèå ñîñòîÿíèÿ îáíîãî áèòà â ïåðåìåííîé èëè ðåãèñòðå ïîñðåäñòâîì îïðåäåë¸ííûõ ôëàãîâ (øàáëîíîâ)
+// Изменение �о�то�ни� обного бита в переменной или реги�тре по�ред�твом определённых флагов (шаблонов)
 //
-//  Ïðèìåðû:
-//      volatile Byte System_Status = 0x00;       - îáúÿâëåíèå ïåðåìåííîé, ãäå áóäóò ìåíÿòüñÿ ôëàãè
+//  Примеры:
+//      volatile Byte System_Status = 0x00;       - объ�вление переменной, где будут мен�ть�� флаги
 //
-//      #define Error_Flag    System_Status, 0    - îáúÿâëåíèå ôëàãà â ïåðåìåííîé System_Status â áèòå 0
-//      #define Ready_Flag    System_Status, 1    - îáúÿâëåíèå ôëàãà â ïåðåìåííîé System_Status â áèòå 1
-//      #define Delay_Flag    System_Status, 3    - îáúÿâëåíèå ôëàãà â ïåðåìåííîé System_Status â áèòå 3
-//      #define RX_Flag       System_Status, 6    - îáúÿâëåíèå ôëàãà â ïåðåìåííîé System_Status â áèòå 6
-//      #define TX_Flag       System_Status, 8    - îáúÿâëåíèå ôëàãà â ïåðåìåííîé System_Status â áèòå 8
+//      #define Error_Flag    System_Status, 0    - объ�вление флага в переменной System_Status в бите 0
+//      #define Ready_Flag    System_Status, 1    - объ�вление флага в переменной System_Status в бите 1
+//      #define Delay_Flag    System_Status, 3    - объ�вление флага в переменной System_Status в бите 3
+//      #define RX_Flag       System_Status, 6    - объ�вление флага в переменной System_Status в бите 6
+//      #define TX_Flag       System_Status, 8    - объ�вление флага в переменной System_Status в бите 8
 //
-//      Set_Flag(Ready_Flag);         - óñòàíîâêà áèòà 1 â ïåðåìåííîé System_Status
-//      Set_Flag(RX_Flag);            - óñòàíîâêà áèòà 6 â ïåðåìåííîé System_Status
-//      Clear_Flag(TX_Flag);          - ñáðîñ áèòà 8 â ïåðåìåííîé System_Status
+//      Set_Flag(Ready_Flag);         - у�тановка бита 1 в переменной System_Status
+//      Set_Flag(RX_Flag);            - у�тановка бита 6 в переменной System_Status
+//      Clear_Flag(TX_Flag);          - �бро� бита 8 в переменной System_Status
 //
 #define Set_Flag(FlagDef)           Set_Bit(FlagDef)
 #define Clear_Flag(FlagDef)         Clear_Bit(FlagDef)
@@ -122,28 +122,28 @@
                        ((0x##Value##L >> 0x0009) & 0x0008) + ((0x##Value##L >> 0x0006) & 0x0004) +\
                        ((0x##Value##L >> 0x0003) & 0x0002) + ((0x##Value##L  & 0x0001)))
 
-// Ñêîðîñòü ïîðòà UART
+// Скоро�ть порта UART
 #define Baud_Rate(BaudRate)       (unsigned  int)((unsigned long)(__MCU_Clock) / (((BaudRate) * 0x10L) - 1))
 #define Baud_RateL(BaudRate)      (unsigned char)((unsigned long)(__MCU_Clock) / (((BaudRate) * 0x10L) - 1))
 #define Baud_RateH(BaudRate)      (unsigned char)((unsigned long)(__MCU_Clock) / (((BaudRate) * 0x10L) - 1) >> 8)
 
-// Ïåðåèìåíîâàíèå òèïîâ
+// Переименование типов
 
 #ifndef bool
   #include <stdbool.h>
 #endif
 
-// Áóëåâûé òèï
+// Булевый тип
 typedef bool                  Boolean;
 
-// Öåëûé òèï, 8 áèò
+// Целый тип, 8 бит
 typedef unsigned char				  Byte;
 typedef unsigned char				  u08;
 typedef signed char				    ShortInt;
 typedef signed char				    s08;
 typedef signed char				    SByte;
 
-// Öåëûé òèï, 16 áèò
+// Целый тип, 16 бит
 typedef unsigned int				  Word;
 typedef unsigned int				  u16;
 typedef unsigned int          UInt16;
@@ -151,7 +151,7 @@ typedef signed int            SmallInt;
 typedef signed int            s16;
 typedef signed int            SInt16;
 
-// Öåëûé òèï, 32 áèòà
+// Целый тип, 32 бита
 typedef unsigned long				  DWord;
 typedef unsigned long				  Cardinal;
 typedef unsigned long				  u32;
@@ -160,7 +160,7 @@ typedef signed long				    Integer;
 typedef signed long				    s32;
 typedef signed long           SInt32;
 
-// Öåëûé òèï, 64 áèòà
+// Целый тип, 64 бита
 typedef unsigned long long    DDWord;
 typedef unsigned long	long	  u64;
 typedef unsigned long long    UInt64;
@@ -168,10 +168,10 @@ typedef signed long long	    Int64;
 typedef signed long	long	    s64;
 typedef signed long	long	    SInt64;
 
-// Âåùåñòâåííûé òèï, 32 áèòà
+// Веще�твенный тип, 32 бита
 typedef float                 Float;
 
-//Âåùåñòâåííûé òèï, 32 áèòà (åñëè ðàçðåøåíî â íàñòðîéêàõ, òî 64 áèòà)
+//Веще�твенный тип, 32 бита (е�ли разрешено в на�тройках, то 64 бита)
 typedef double                Double;
 typedef long double           Extended;
 
@@ -416,60 +416,60 @@ typedef union
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////
 //
-//  Îïåðàöèè ñ ïîðòàìè.
-//
-//  Ñèíòàêñèñ:
-//      #define <èìÿ>   <Letter>, <Idx>, [<Level>], [<PullUp>]
-//
-//      <Letter>  - Áóêâà ïîðòà (A, B, C, è ò. ä.).
-//      <Idx>     - Íîìåð âûâîäà ïîðòà (0-7).
-//      <Level>   - Àêòèâíûé óðîâåíü. (High èëè Low, åñëè íå óêàçàí, òî High);
-//                    High - ëîãè÷åñêàÿ åäèíèöà;
-//                    Low  - ëîãè÷åñêèé íîëü.
-//      <PullUp>  - Âíåøíèé ïîäòÿãèâàþùèé ðåçèñòîð. (On èëè Off, åñëè íå óêàçàí, òî Off);
-//                    On  - èñïîëüçóåòñÿ âíåøíèé ïîäòÿãèâàþùèé ðåçèñòîð;
-//                    Off - âíåøíåãî ïîäòÿãèâàþùåãî ðåçàñòîðà íåò.
-//
-//  Îïèñàíèå ìàêðîêîìàíä:
-//      Pin_HiZ (Set_Pin_HiZ)             - åñëè PullUp = Off, òî âûâîäà ïîðòà óñòàíàâëèâàåòñÿ â "òðåòüå" (Hi-Z) ñîñòîÿíèå;
-//      Pin_PullUp_IO (Set_Pin_PullUp_IO) - óñòàíîâêà âûâîäà ïîðòà äëÿ ðàáîòû ñ âíåøíèì "ïîäòÿãèâàþùèì" ðåçèñòîðîì;
-//      Pin_In (Set_Pin_In)               - óñòàíîâêà âûâîäà ïîðòà êàê âõîä;
-//      Pin_Out (Set_Pin_Out)             - óñòàíîâêà âûâîäà ïîðòà êàê âûõîä;
-//      Pin_On (Set_Pin_On)               - óñòàíîâêà àêòèâíîãî ëîãè÷åñêîãî óðîâíÿ íà âûâîäå ïîðòà;
-//      Pin_High (Set_Pin_High)           - óñòàíîâêà "åäèíè÷íîãî" ëîãè÷åñêîãî óðîâíÿ íà âûâîäå ïîðòà;
-//      Pin_Off (Set_Pin_Off)             - óñòàíîâêà íåàêòèâíîãî ëîãè÷åñêîãî óðîâíÿ íà âûâîäå ïîðòà;
-//      Pin_Low (Set_Pin_Low)             - óñòàíîâêà "íóëåâîãî" ëîãè÷åñêîãî óðîâíÿ íà âûâîäå ïîðòà;
-//      Pin_Signal (Get_Pin_Signal)       - ïðîâåðêà ëîãè÷åñêîãî óðîâíÿ íà âûâîäå ïîðòà;
-//      Pin_Change (Change_Pin_Signal)    - èçìåíåíèå ëîãè÷åñêîãî óðîâíÿ íà âûâîäå ïîðòà íà ïðîòèâîïîëîæíîå;
-//      Pin_Invert (Invert_Pin_Signal)    - àíàëîãè÷íî Pin_Change;
-//      Pin_Out_On (Set_Pin_Out_On)       - óñòàíîâêà âûâîäà ïîðòà êàê âûõîä è óñòàíîâêà àêòèâíîãî ëîãè÷åñêîãî óðîâíÿ;
-//      Pin_Out_Off (Set_Pin_Out_Off)     - óñòàíîâêà âûâîäà ïîðòà êàê âûõîä è óñòàíîâêà íåàêòèâíîãî ëîãè÷åñêîãî óðîâíÿ;
-//      Pin_Out_High (Set_Pin_Out_High)   - óñòàíîâêà âûâîäà ïîðòà êàê âûõîä è óñòàíîâêà åäèíè÷íîãî ëîãè÷åñêîãî óðîâíÿ íà âûâîäå ïîðòà;
-//      Pin_Out_Low (Set_Pin_Out_Low)     - óñòàíîâêà âûâîäà ïîðòà êàê âûõîä è óñòàíîâêà íóëåâîãî ëîãè÷åñêîãî óðîâíÿ íà âûâîäå ïîðòà.
-//
-//  Ïðèìå÷àíèÿ:
-//      1. Åñëè â îïðåäåëåíèè âûâîäà ïîðòà óêàçàíî, ÷òî èñïîëüçóåòñÿ âíåøíèé ïîäòÿãèâàþùèé
-//         ðåçèñòîð (PullUp = On), òî ìàêðîêîìàíäû Pin_In è Pin_Out âûïîëíÿþò äåéñòâèÿ,
-//         àíàëîãè÷íûå ìàêðîêîìàíäå Pin_PullUp_IO.
-//      2.  ñêîáêàõ óêàçàíû ìàêðîêîìàíäû, âûïîëíÿþùèå àíàëîãè÷íûå äåéñòâèÿ, íî ïàðàìåòðû äëÿ
-//         íèõ ïåðåäàþòñÿ íå ÷åðåç îïðåäåëåíèå define, à òàêæå êàê â ôóíêöèþ.
-//      3. Â îïðåäåëåíèè define ïîñëåäíèå äâà ïàðàìåòðà ìîæíî íå óêàçûâàòü, íî ÇÀÏßÒÛÅ ÎÏÓÑÊÀÒÜ ÍÅËÜÇß.
-//
-//  Ïðèìåðû:
+//  Операции � портами.
+//
+//  Синтак�и�:
+//      #define <им�>   <Letter>, <Idx>, [<Level>], [<PullUp>]
+//
+//      <Letter>  - Буква порта (A, B, C, и т. д.).
+//      <Idx>     - �омер вывода порта (0-7).
+//      <Level>   - �ктивный уровень. (High или Low, е�ли не указан, то High);
+//                    High - логиче�ка� единица;
+//                    Low  - логиче�кий ноль.
+//      <PullUp>  - Внешний подт�гивающий рези�тор. (On или Off, е�ли не указан, то Off);
+//                    On  - и�пользует�� внешний подт�гивающий рези�тор;
+//                    Off - внешнего подт�гивающего реза�тора нет.
+//
+//  Опи�ание макрокоманд:
+//      Pin_HiZ (Set_Pin_HiZ)             - е�ли PullUp = Off, то вывода порта у�танавливает�� в "третье" (Hi-Z) �о�то�ние;
+//      Pin_PullUp_IO (Set_Pin_PullUp_IO) - у�тановка вывода порта дл� работы � внешним "подт�гивающим" рези�тором;
+//      Pin_In (Set_Pin_In)               - у�тановка вывода порта как вход;
+//      Pin_Out (Set_Pin_Out)             - у�тановка вывода порта как выход;
+//      Pin_On (Set_Pin_On)               - у�тановка активного логиче�кого уровн� на выводе порта;
+//      Pin_High (Set_Pin_High)           - у�тановка "единичного" логиче�кого уровн� на выводе порта;
+//      Pin_Off (Set_Pin_Off)             - у�тановка неактивного логиче�кого уровн� на выводе порта;
+//      Pin_Low (Set_Pin_Low)             - у�тановка "нулевого" логиче�кого уровн� на выводе порта;
+//      Pin_Signal (Get_Pin_Signal)       - проверка логиче�кого уровн� на выводе порта;
+//      Pin_Change (Change_Pin_Signal)    - изменение логиче�кого уровн� на выводе порта на противоположное;
+//      Pin_Invert (Invert_Pin_Signal)    - аналогично Pin_Change;
+//      Pin_Out_On (Set_Pin_Out_On)       - у�тановка вывода порта как выход и у�тановка активного логиче�кого уровн�;
+//      Pin_Out_Off (Set_Pin_Out_Off)     - у�тановка вывода порта как выход и у�тановка неактивного логиче�кого уровн�;
+//      Pin_Out_High (Set_Pin_Out_High)   - у�тановка вывода порта как выход и у�тановка единичного логиче�кого уровн� на выводе порта;
+//      Pin_Out_Low (Set_Pin_Out_Low)     - у�тановка вывода порта как выход и у�тановка нулевого логиче�кого уровн� на выводе порта.
+//
+//  Примечани�:
+//      1. Е�ли в определении вывода порта указано, что и�пользует�� внешний подт�гивающий
+//         рези�тор (PullUp = On), то макрокоманды Pin_In и Pin_Out выполн�ют дей�тви�,
+//         аналогичные макрокоманде Pin_PullUp_IO.
+//      2. В �кобках указаны макрокоманды, выполн�ющие аналогичные дей�тви�, но параметры дл�
+//         них передают�� не через определение define, а также как в функцию.
+//      3. В определении define по�ледние два параметра можно не указывать, но З�ПЯТЫЕ ОПУСК�ТЬ �ЕЛЬЗЯ.
+//
+//  Примеры:
 //      #define Example1    B, 5, Low,
 //      #define Example2    B, 5,,
 //      #define Example3    B, 5, Low, On
 //      #define Example4    B, 5,, Off
 //
-//      Pin_Out(Example1);	- óñòàíîâêà âûâîäà 5 ïîðòà Â íà âûõîä;
-//      Pin_On(Example1);		- óñòàíîâêà óêàçàííîãî àêòèâíîãî óðîâíÿ (Low) íà âûâîäå 5 ïîðòà B.
+//      Pin_Out(Example1);	- у�тановка вывода 5 порта В на выход;
+//      Pin_On(Example1);		- у�тановка указанного активного уровн� (Low) на выводе 5 порта B.
 //
-//  Ïðèìåð ê ïðèìå÷àíèþ 2:
-//      Ìàêðîêîìàíäà Set_Pin_On(B, 5, Low, On) âûïîëíèò àíàëîãè÷íûå äåéñòâèÿ, ÷òî è êîìàíäà Pin_On(Example3)
+//  Пример к примечанию 2:
+//      Макрокоманда Set_Pin_On(B, 5, Low, On) выполнит аналогичные дей�тви�, что и команда Pin_On(Example3)
 //
 ////////////////////////////////////////////////////////////////////////////////////////////////////
 
-// Îñíîâíûå îïåðàöèè ñ ïîðòàìè
+// О�новные операции � портами
 #define Set_PORT_Bit(Ltr, Idx)        (PORT##Ltr |=  _Bit(Idx))
 #define Clr_PORT_Bit(Ltr, Idx)        (PORT##Ltr &= ~_Bit(Idx))
 #define Invert_PORT_Bit(Ltr, Idx)     (PORT##Ltr ^=  _Bit(Idx))
@@ -482,29 +482,29 @@ typedef union
 #define Toggle_DDR_Bit(Ltr, Idx)      Invert_DDR_Bit(Ltr, Idx)
 #define Get_PIN_State(Ltr, Idx)       (PIN##Ltr  &  _Bit(Idx))
 
-// Óñòàíîâêà âûâîäà ïîðòà â òðåòüå ñîñòîÿíèå (Hi-Z)
+// У�тановка вывода порта в третье �о�то�ние (Hi-Z)
 #define Set_Pin_HiZ(Ltr, Idx, Level, PullUp)         { Clr_DDR_Bit(Ltr, Idx); Clr_PORT_Bit(Ltr, Idx); }
 #define Pin_HiZ(PortDef)                             Set_Pin_HiZ(PortDef)
 
-// Óñòàíîâêà âûâîäà ïîðòà äëÿ ðàáîòû ñ âíåøíèì ïîäòÿãèâàþùèì ðåçèñòîðîì
+// У�тановка вывода порта дл� работы � внешним подт�гивающим рези�тором
 #define SetPinPullUp(Ltr, Idx)
 #define SetPinPullUpOff(Ltr, Idx)
 #define SetPinPullUpOn(Ltr, Idx)                     Clr_PORT_Bit(Ltr, Idx)
 #define Set_Pin_PullUp_IO(Ltr, Idx, Level, PullUp)   { Clr_DDR_Bit(Ltr, Idx); SetPinPullUp##PullUp(Ltr, Idx); }
 #define Pin_PullUp_IO(PortDef)                       Set_Pin_PullUp_IO(PortDef)
 
-// Óñòàíîâêà âûâîäà ïîðòà êàê âõîä
+// У�тановка вывода порта как вход
 #define Set_Pin_In(Ltr, Idx, Level, PullUp)          Set_Pin_PullUp_IO(Ltr, Idx, Level, PullUp)
 #define Pin_In(PortDef)                              Set_Pin_In(PortDef)
 
-// Óñòàíîâêà âûâîäà ïîðòà êàê âûõîä
+// У�тановка вывода порта как выход
 #define SetPinOut(Ltr, Idx)                          Set_DDR_Bit(Ltr, Idx)
 #define SetPinOutOff(Ltr, Idx)                       Set_DDR_Bit(Ltr, Idx)
 #define SetPinOutOn(Ltr, Idx)                        Clr_DDR_Bit(Ltr, Idx)
 #define Set_Pin_Out(Ltr, Idx, Level, PullUp)         { SetPinOut##PullUp(Ltr, Idx); SetPinPullUp##PullUp(Ltr, Idx); }
 #define Pin_Out(PortDef)	                           Set_Pin_Out(PortDef)
 
-// Óñòàíîâêà àêòèâíîãî ëîãè÷åñêîãî óðîâíÿ íà âûâîäå ïîðòà
+// У�тановка активного логиче�кого уровн� на выводе порта
 #define SetPin(Ltr, Idx)                             Set_PORT_Bit(Ltr, Idx)
 #define SetPinHighOn(Ltr, Idx)	                     Clr_DDR_Bit(Ltr, Idx)
 #define SetPinHighOff(Ltr, Idx)	                     Set_PORT_Bit(Ltr, Idx)
@@ -517,19 +517,19 @@ typedef union
 #define Set_Pin_On(Ltr, Idx, Level, PullUp)	         SetPin##Level##PullUp(Ltr, Idx)
 #define Pin_On(PortDef)                              Set_Pin_On(PortDef)
 
-// Óñòàíîâêà âûâîäà ïîðòà êàê âûõîä è óñòàíîâêà àêòèâíîãî ëîãè÷åñêîãî óðîâíÿ
+// У�тановка вывода порта как выход и у�тановка активного логиче�кого уровн�
 #define Set_Pin_Out_On(Ltr, Idx, Level, PullUp)      { Set_Pin_Out(Ltr, Idx, Level, PullUp); Set_Pin_On(Ltr, Idx, Level, PullUp); }
 #define Pin_Out_On(PortDef)                          Set_Pin_Out_On(PortDef)
 
-// Óñòàíîâêà åäèíè÷íîãî ëîãè÷åñêîãî óðîâíÿ íà âûâîäå ïîðòà
+// У�тановка единичного логиче�кого уровн� на выводе порта
 #define Set_Pin_High(Ltr, Idx, Level, PullUp)        Set_Pin_On(Ltr, Idx, High, PullUp)
 #define Pin_High(PortDef)                            Set_Pin_High(PortDef)
 
-// Óñòàíîâêà âûâîäà ïîðòà êàê âûõîä è óñòàíîâêà åäèíè÷íîãî ëîãè÷åñêîãî óðîâíÿ íà âûâîäå ïîðòà
+// У�тановка вывода порта как выход и у�тановка единичного логиче�кого уровн� на выводе порта
 #define Set_Pin_Out_High(Ltr, Idx, Level, PullUp)    { Set_Pin_Out(Ltr, Idx, Level, PullUp); Set_Pin_High(Ltr, Idx, Level, PullUp); }
 #define Pin_Out_High(PortDef)                        Set_Pin_Out_High(PortDef)
 
-// Óñòàíîâêà íåàêòèâíîãî ëîãè÷åñêîãî óðîâíÿ íà âûâîäå ïîðòà
+// У�тановка неактивного логиче�кого уровн� на выводе порта
 #define ClrPin(Ltr, Idx)                             Clr_PORT_Bit(Ltr, Idx)
 #define ClrPinLow(Ltr, Idx)	                         Set_PORT_Bit(Ltr, Idx)
 #define ClrPinHigh(Ltr, Idx)	                       Clr_PORT_Bit(Ltr, Idx)
@@ -542,19 +542,19 @@ typedef union
 #define Set_Pin_Off(Ltr, Idx, Level, PullUp)	       ClrPin##Level##PullUp(Ltr, Idx)
 #define Pin_Off(PortDef)	                           Set_Pin_Off(PortDef)
 
-// Óñòàíîâêà íåàêòèâíîãî ëîãè÷åñêîãî óðîâíÿ íà âûâîäå ïîðòà
+// У�тановка неактивного логиче�кого уровн� на выводе порта
 #define Set_Pin_Out_Off(Ltr, Idx, Level, PullUp)     { Set_Pin_Out(Ltr, Idx, Level, PullUp); Set_Pin_Off(Ltr, Idx, Level, PullUp); }
 #define Pin_Out_Off(PortDef)                         Set_Pin_Out_Off(PortDef)
 
-// Óñòàíîâêà íóëåâîãî ëîãè÷åñêîãî óðîâíÿ íà âûâîäå ïîðòà
+// У�тановка нулевого логиче�кого уровн� на выводе порта
 #define Set_Pin_Low(Ltr, Idx, Level, PullUp)         Set_Pin_Off(Ltr, Idx, High, PullUp)
 #define Pin_Low(PortDef)                             Set_Pin_Low(PortDef)
 
-// Óñòàíîâêà âûâîäà ïîðòà êàê âûõîä è óñòàíîâêà íóëåâîãî ëîãè÷åñêîãî óðîâíÿ íà âûâîäå ïîðòà
+// У�тановка вывода порта как выход и у�тановка нулевого логиче�кого уровн� на выводе порта
 #define Set_Pin_Out_Low(Ltr, Idx, Level, PullUp)     { Set_Pin_Out(Ltr, Idx, Level, PullUp); Set_Pin_Low(Ltr, Idx, Level, PullUp); }
 #define Pin_Out_Low(PortDef)                         Set_Pin_Out_Low(PortDef)
 
-// Ïðîâåðêà ëîãè÷åñêîãî óðîâíÿ íà âûâîäå ïîðòà
+// Проверка логиче�кого уровн� на выводе порта
 #define GetPinSignal(Ltr, Idx)	                     Get_PIN_State(Ltr, Idx)
 #define GetPinSignalLow(Ltr, Idx)	                   (!Get_PIN_State(Ltr, Idx))
 #define GetPinSignalHigh(Ltr, Idx)	                 Get_PIN_State(Ltr, Idx)
@@ -564,7 +564,7 @@ typedef union
 #define Pin_State(PortDef)                           Get_Pin_Signal(PortDef)
 #define Test_Pin(PortDef)                            Get_Pin_Signal(PortDef)
 
-// Èçìåíåíèå ëîãè÷åñêîãî óðîâíÿ íà âûâîäå ïîðòà íà ïðîòèâîïîëîæíîå
+// Изменение логиче�кого уровн� на выводе порта на противоположное
 #define Invert(Ltr, Idx)                             Invert_PORT_Bit(Ltr, Idx)
 #define InvertOff(Ltr, Idx)                          Invert_PORT_Bit(Ltr, Idx)
 #define InvertOn(Ltr, Idx)                           Invert_DDR_Bit(Ltr, Idx)
@@ -584,7 +584,7 @@ typedef union
 #define BYTES(Value)    ((Byte *) & (Value))
 #define WORDS(Value)    ((Word *) & (Value))
 
-// Êîíôèãóðàöèîííûå áèòû è áèòû áëîêèðîâêè
+// Конфигурационные биты и биты блокировки
 #define _DataToZByte(Addr, Value)     __AddrToZByteToSPMCR_LPM((void __flash *)(Addr), (Value))
 #define _DataToR0Byte(Addr, Value)    __DataToR0ByteToSPMCR_SPM((Addr), (Value))
 #define Get_Lock_Bits()               _DataToZByte(0x0001, 0x09)

+ 0 - 0
pin_macros.h → avr/pin_macros.h


+ 5 - 5
kalman_filtr.txt

@@ -2,10 +2,10 @@ http://kazus.ru/forums/showthread.php?p=1025804#
 
 typedef struct
 {
-  float Result;                 //謥踠錪蠂賾渪槫 賝僝樇鳺
-  float Value;                  //黓羻僾鍷 賝僝樇鳺
-  float Previous;               //謥踠錪蠉� 禖玁儴樇� � 瀔槼崘齍樥 鴈蠈譇灕�
-  float K;                      //膰煏鐓灕樇� 嚦颬鳹鳿僪鳷, 瀁-鶂鎀欑膻� = 0.1
+  float Result;                 //�迮郱�郅��邽����迮迮 郱郇訄�迮郇邽迮
+  float Value;                  //邽��郋迡郇郋迮 郱郇訄�迮郇邽迮
+  float Previous;               //�迮郱�郅��訄� 赲��邽�郅迮郇邽� 赲 郈�迮迡�迡��迮邿 邽郇�迮�訄�邽邽
+  float K;                      //郕郋���邽�邽迮郇� ��訄訇邽郅邽郱訄�邽邽, 郈郋-�邾郋郅�訄郇邽� = 0.1
 } KalmanFloatTypeDefStruct;
 
 void KalmanFloatCalc (KalmanFloatTypeDefStruct * KalmanFloatStruct)
@@ -18,5 +18,5 @@ void KalmanFloatCalc (KalmanFloatTypeDefStruct * KalmanFloatStruct)
 }
 
 -=-=-=-=-
-釐�襜 闅幰魡:
+�郱��郋 郋���迡訄:
 http://avrproject.ru/publ/poleznaja_informacija/filtr_kalmana_bascom_avr/4-1-0-164

+ 184 - 184
stm32/SysTick.txt

@@ -1,67 +1,67 @@
-Сам таймер 24 разрядный. И тикает вниз от предзагруженного значения до 
-нуля, после чего перезагружается вновь и генерирует прерывание. 
-Источником тактирования является системная тактовая частота SYSCLK, либо 
-та же частота, но поделенная на 8 – SYSCLK/8.
+Сам таймер 24 разрядный. � тикает вниз от предзагруженного значения до 
+нуля, после чего перезагружается вновь и генерирует прерывание. 
+�сточником тактирования является системная тактовая частота SYSCLK, либо 
+та же частота, но поделенная на 8 – SYSCLK/8.
 
-Управляется он четырьмя регистрами:
+Управляется он четырьмя регистрами:
 0xE000E010	SYST_CSR	RW	SysTick control and status register
 0xE000E014	SYSCT_RVR	RW	SysTick reload value register
 0xE000E018	SYSCT_CVR	RW	SysTick current value register
 0xE000E01C	SYSCT_CALIB	RO	SysTick calibration value register
 
 
-*SYST_CSR*  SysTick Control and Status Register
егистр управления и статуса. Несмотря на то, что он 32 битный заняты там всего 4 бита :) 
- * Бит 0 — ENABLE — бит разрешающий таймеру считать. 1 можно, 0 — нельзя. Когда
-   мы ставим ENABLE в 1 то таймер автоматически загружает свои счетные регистры
-   значением из регистра SYST_RVR и начинает тикать вниз.
- * Бит 1 — TICKINT — разрешение прерывания. Когда этот бит 1, то на 
-   обнулении будет прерывание таймера.
- * Бит 2 — CLKSOURCE — откуда брать тики. Варианта два 0 — внешнее 
-   тактирование эталонного генератора, 1 — с частоты процессора.
- * Бит 16 — COUNTFLAG — флаг отсчета. Первый раз ставится в 1 после 
-   первого обнуления. При чтении, как я понял, автоматом обнуляется. 
-   Возвращает 1 если с последнего его чтения таймер перешел через ноль. 
-   Позволяет отследить были ли переполнения. Удобно.
-
-
-*SYST_RVR*  SysTick Reload Value Register
егистр предзагрузки. Именно отсюда берет таймер свое значение для 
-перезагрузки при обнулении. Фактически вот сюда и нужно грузить требуемое 
-число задержки. Регистр 32 разрядный, но используются только первые 24 
-бита.
-Класть туда можно любое число в диапазоне 0x00000001-0x00FFFFFF. Можно и 
-0 положить, но ничего не будет. Т.к. у таймера весь экшн происходит с 
-перехода из 0x00000001 в 0x00000000. А на ноль и получается ноль. Разве 
-что COUNTFLAG вскочит. Только и всего. Поэтому значение SYST_RVR должно 
-быть N-1 от желаемого количества тактов. Т.е. если надо получить 
-прерывание на каждые 10000 тактов, то кладем 9999.
-
-
-*SYST_CVR*  SysTick Current Value Register
-Это, собственно, и есть счетный регистр. Тут оно тикает! В первых трех 
-байтах. Есть у этого регистра особенность одна забавная. Из него можно 
-только читать. А вот запись любого значения сразу его обнуляет. С 
-обнулением флага COUNTFLAG.
-Т.е. если надо занулить таймер — пиши сюда :)
-
-
-*SYST_CALIB*  SysTick Calibration Value Register
-Это, как ясно из названия, регистр калибровки. Его можно только читать, и 
-возвращает он следующее:
- * SKEW — Показывает что записано в TENMS 0 — там реальные калибровочные 
-   константы. 1 — какой то мусор который не имеет значения. Ну или ноль.
- * NOREF — показывает есть ли у девайса эталонная тактовая частота. 0 — 
-   есть, 1 — нет. Это зависит от производителя, позаботился ли он о такой 
-   штуке :) Если эталонных часов нет, то бит CLKSOURCE из регистра SYST_CSR 
-   читается как 1 и его нельзя изменить.
- * TENMS — калибровочная константа. Содержит значение для 10мс задержки. 
-   Как я понял, для эталонного генератора. Которого может и не быть.
-
-
- *** Адреса и имена ***
-Осталось залезть в CMSIS и поискать там описание и дефайны SysTick. 
-Находятся быстро в core_cm3.h:
+*SYST_CSR* — SysTick Control and Status Register
 РµРіРёСЃС‚СЂ управления Рё статуса. Несмотря РЅР° то, что РѕРЅ 32 битный заняты там всего 4 бита :) 
+ * Бит 0 — ENABLE — бит разрешающий таймеру считать. 1 можно, 0 — нельзя. Когда
+   мы ставим ENABLE в 1 то таймер автоматически загружает свои счетные регистры
+   значением из регистра SYST_RVR и начинает тикать вниз.
+ * Бит 1 — TICKINT — разрешение прерывания. Когда этот бит 1, то на 
+   обнулении будет прерывание таймера.
+ * Бит 2 — CLKSOURCE — откуда брать тики. Варианта два 0 — внешнее 
+   тактирование эталонного генератора, 1 — с частоты процессора.
+ * Бит 16 — COUNTFLAG — флаг отсчета. Первый раз ставится в 1 после 
+   первого обнуления. При чтении, как я понял, автоматом обнуляется. 
+   Возвращает 1 если с последнего его чтения таймер перешел через ноль. 
+   Позволяет отследить были ли переполнения. Удобно.
+
+
+*SYST_RVR* — SysTick Reload Value Register
 РµРіРёСЃС‚СЂ предзагрузки. Р�менно отсюда берет таймер СЃРІРѕРµ значение для 
+перезагрузки при обнулении. Фактически вот сюда и нужно грузить требуемое 
+число задержки. Регистр 32 разрядный, но используются только первые 24 
+бита.
+Класть туда можно любое число в диапазоне 0x00000001-0x00FFFFFF. Можно и 
+0 положить, но ничего не будет. Т.к. у таймера весь экшн происходит с 
+перехода из 0x00000001 в 0x00000000. А на ноль и получается ноль. Разве 
+что COUNTFLAG вскочит. Только и всего. Поэтому значение SYST_RVR должно 
+быть N-1 от желаемого количества тактов. Т.е. если надо получить 
+прерывание на каждые 10000 тактов, то кладем 9999.
+
+
+*SYST_CVR* — SysTick Current Value Register
+Это, собственно, и есть счетный регистр. Тут оно тикает! В первых трех 
+байтах. Есть у этого регистра особенность одна забавная. �з него можно 
+только читать. А вот запись любого значения сразу его обнуляет. С 
+обнулением флага COUNTFLAG.
+Т.е. если надо занулить таймер — пиши сюда :)
+
+
+*SYST_CALIB* — SysTick Calibration Value Register
+Это, как ясно из названия, регистр калибровки. Его можно только читать, и 
+возвращает он следующее:
+ * SKEW — Показывает что записано в TENMS 0 — там реальные калибровочные 
+   константы. 1 — какой то мусор который не имеет значения. Ну или ноль.
+ * NOREF — показывает есть ли у девайса эталонная тактовая частота. 0 — 
+   есть, 1 — нет. Это зависит от производителя, позаботился ли он о такой 
+   штуке :) Если эталонных часов нет, то бит CLKSOURCE из регистра SYST_CSR 
+   читается как 1 и его нельзя изменить.
+ * TENMS — калибровочная константа. Содержит значение для 10мс задержки. 
+   Как я понял, для эталонного генератора. Которого может и не быть.
+
+
+ *** Адреса и имена ***
+Осталось залезть в CMSIS и поискать там описание и дефайны SysTick. 
+Находятся быстро в core_cm3.h:
 *------------------ File Begin -------------------*
 typedef struct
 {
@@ -105,18 +105,18 @@ typedef struct
 *------------------ File End -------------------*
 
 
-Нам там нужны имена битов. Вот они:
+Нам там нужны имена битов. Вот они:
 SysTick_CTRL_CLKSOURCE_Msk, SysTick_CTRL_TICKINT_Msk, SysTick_CTRL_ENABLE_Msk.
 
 
-Конфигурация таймера на тик в 1ms, таким образом, будет выглядеть примерно 
-так:
+Конфигурация таймера на тик в 1ms, таким образом, будет выглядеть примерно 
+так:
 *------------------ File Begin -------------------*
-#define F_CPU		72000000UL	// Тактовая у нас 72МГЦ
-#define TimerTick	F_CPU/1000-1	// Нам нужен килогерц
+#define F_CPU		72000000UL	// Тактовая у нас 72МГЦ
+#define TimerTick	F_CPU/1000-1	// Нам нужен килогерц
  
-SysTick->LOAD=TimerTick;	// Загрузка значения
-SysTick->VAL=TimerTick;		// Обнуляем таймеры и флаги. Записью, помните? 
+SysTick->LOAD=TimerTick;	// Загрузка значения
+SysTick->VAL=TimerTick;		// Обнуляем таймеры и флаги. Записью, помните? 
  
 SysTick->CTRL=	SysTick_CTRL_CLKSOURCE_Msk |
                 SysTick_CTRL_TICKINT_Msk   |
@@ -124,11 +124,11 @@ SysTick->CTRL=	SysTick_CTRL_CLKSOURCE_Msk |
 *------------------ File End -------------------*
 
 
- *** Обработчик прерывания SysTick ***
-Где взять имя обработчика? Да из таблицы прерываний. Поглядеть, если кто 
-не помнит, можно в STM32F10x.s
+ *** Обработчик прерывания SysTick ***
+Где взять имя обработчика? Да из таблицы прерываний. Поглядеть, если кто 
+РЅРµ РїРѕРјРЅРёС‚, РјРѕР¶РЅРѕ РІ STM32F10x.s
 
-Вот ее кусочек:
+Вот ее кусочек:
 *------------------ File Begin -------------------*
 ; Vector Table Mapped to Address 0 at Reset
  
@@ -154,22 +154,22 @@ __Vectors       DCD     __initial_sp              ; Top of Stack
 *------------------ File End -------------------*
  
 
-Имя есть. Осталось организовать прерывание:
+�мя есть. Осталось организовать прерывание:
 *------------------ File Begin -------------------*
 //SysTick Interrupt
 void SysTick_Handler(void)
 {
-	// Тут будем делать нечто полезное. Например, ставить бит B.05
+	// Тут будем делать нечто полезное. Например, ставить бит B.05
 	GPIOB->BSRR = GPIO_BSRR_BS5;	// Set bit
 }
 *------------------ File End -------------------*
  
 
-А сбрасывать его будет в главном цикле. В результате мы получим иголки с 
-частотой 1Кгц которые хорошо видно осциллографом :)
+А сбрасывать его будет в главном цикле. В результате мы получим иголки с 
+частотой 1Кгц которые хорошо видно осциллографом :)
 
 
-Вот так выглядит полный код примера:
+Вот так выглядит полный код примера:
 *------------------ File Begin -------------------*
 #include "stm32f10x.h"
 #define F_CPU 		72000000UL
@@ -206,10 +206,10 @@ int main(void)
 *------------------ File End -------------------*
 
 
- *** Функции CMSIS ***
+ *** Функции CMSIS ***
 
-У Таймера, раз он часть ядра, есть функция конфигурации в CMSIS. Описана 
-она в core_cm3.h и выглядит так:
+У Таймера, раз он часть ядра, есть функция конфигурации в CMSIS. Описана 
+она в core_cm3.h и выглядит так:
 *------------------ File Begin -------------------*
 static __INLINE uint32_t SysTick_Config(uint32_t ticks)
 { 
@@ -226,24 +226,24 @@ static __INLINE uint32_t SysTick_Config(uint32_t ticks)
 }
 *------------------ File End -------------------*
 
-То же самое, что и мы сделали вручную. Только есть проверка на 
-корректность значения и обрезка лишних битов. Возвращает 1 если данные 
-некорректные. Ну и еще там приоритет ставится если ядро М0 (это кстати хз 
-зачем? У M0 же должна быть своя версия CMSIS?)
+То же самое, что и мы сделали вручную. Только есть проверка на 
+корректность значения и обрезка лишних битов. Возвращает 1 если данные 
+некорректные. Ну и еще там приоритет ставится если ядро М0 (это кстати хз 
+зачем? У M0 же должна быть своя версия CMSIS?)
 
 
-Так что таймер можно загрузить и следующей фигней:
+Так что таймер можно загрузить и следующей фигней:
 	SysTick_Config(TimerTick);
 
-Для LPC все совершенно аналогично. До последней буковки можно сказать. 
-Т.к. это фича не STM32, а ядра и описана в CMSIS. Т.е. едина для всех.
+Для LPC все совершенно аналогично. До последней буковки можно сказать. 
+Т.к. это фича не STM32, а ядра и описана в CMSIS. Т.е. едина для всех.
 
 ===============================================================================
 
-Для конфигурации таймера в файле core_cm3.h есть функция 
-SysTick_Config(uint32_t ticks), в качестве аргумента которой передается 
-коэффициент деления тактовой частоты для получения необходимой временной 
-задержки.
+Для конфигурации таймера в файле core_cm3.h есть функция 
+SysTick_Config(uint32_t ticks), в качестве аргумента которой передается 
+коэффициент деления тактовой частоты для получения необходимой временной 
+задержки.
 ~~~~~~~~~~~~~~~~~~~~
 static __INLINE uint32_t SysTick_Config(uint32_t ticks)
 {
@@ -259,56 +259,56 @@ static __INLINE uint32_t SysTick_Config(uint32_t ticks)
 }
 ~~~~~~~~~~~~~~~~~~~~
 
-Это значение заносится в регистр перезагрузки. В самом начале выполняется 
-проверка на то, что данная величина не выходит за максимальный предел, 
-поскольку счетчик 24-разрядный, а передаваемый аргумент функции является 
-32-разрядным числом и необходимо об этом помнить.
+Это значение заносится в регистр перезагрузки. В самом начале выполняется 
+проверка на то, что данная величина не выходит за максимальный предел, 
+поскольку счетчик 24-разрядный, а передаваемый аргумент функции является 
+32-разрядным числом и необходимо об этом помнить.
 
-Далее в функции конфигурации SysTick_Config() задается уровень приоритета 
-прерывания, обнуляется счетный регистр, разрешается генерация прерывания, 
-задается источник тактирования и разрешается работа таймера – запускается 
-счет.
+Далее в функции конфигурации SysTick_Config() задается уровень приоритета 
+прерывания, обнуляется счетный регистр, разрешается генерация прерывания, 
+задается источник тактирования и разрешается работа таймера – запускается 
+счет.
 
-По умолчанию тактовая частота этого таймера будет равна системной тактовой 
-частоте SYSCLK. Если же нужно задать частоту тактирования таймера как 
-SYSCLK/8, то уже после этой функции инициализации можно вызвать функцию
+По умолчанию тактовая частота этого таймера будет равна системной тактовой 
+частоте SYSCLK. Если же нужно задать частоту тактирования таймера как 
+SYSCLK/8, то уже после этой функции инициализации можно вызвать функцию
 
 	SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8),
 
-которая находится в файле misc.c. Для этого к проекту необходимо 
-подключить файлы misc.c и misc.h.
+которая находится в файле misc.c. Для этого к проекту необходимо 
+подключить файлы misc.c и misc.h.
 
 
-В данных примерах таймер настраивается на генерацию прерывания через 
-“базовый” промежуток времени, равный 1 миллисекунде. Затем, уже с помощью 
-программного цикла формируется задержка, равная 1 секунде. Через каждую 
-секунду происходит попеременное зажигание/гашение светодиодов платы, здесь 
-я не стал особо мудрить, поскольку основной задачей была настройка 
-системного таймера для генерации прерываний через определенный интервал.
+В данных примерах таймер настраивается на генерацию прерывания через 
+“базовый” промежуток времени, равный 1 миллисекунде. Затем, уже с помощью 
+программного цикла формируется задержка, равная 1 секунде. Через каждую 
+секунду происходит попеременное зажигание/гашение светодиодов платы, здесь 
+я не стал особо мудрить, поскольку основной задачей была настройка 
+системного таймера для генерации прерываний через определенный интервал.
 
-Для задания длительности между двумя последующими прерываниями от таймера, 
-в регистр перезагрузки необходимо записать значение, которое 
-рассчитывается по простой формуле:
+Для задания длительности между двумя последующими прерываниями от таймера, 
+в регистр перезагрузки необходимо записать значение, которое 
+рассчитывается по простой формуле:
 
- * Reload Value = SysTick Counter Clock (Hz) x  Desired Time base (s), где
- * Reload Value – величина перезагружаемого значения для таймера 
- * SysTick Counter Clock (Hz) – тактовая частота таймера 
- * Desired Time base (s) – желаемое время формируемой временной задержки между прерываниями 
+ * Reload Value = SysTick Counter Clock (Hz) x  Desired Time base (s), РіРґРµ
+ * Reload Value – величина перезагружаемого значения для таймера 
+ * SysTick Counter Clock (Hz) – тактовая частота таймера 
+ * Desired Time base (s) – желаемое время формируемой временной задержки между прерываниями 
 
-Системная тактовая частота задается при начальной инициализации микроконтроллера.
+Системная тактовая частота задается при начальной инициализации микроконтроллера.
 
-На плате STM32VL-DISCOVERY микроконтроллер конфигурируется на работу с 
-внешним кварцем частотой 8 МГц, при этом его системная тактовая частота 
-после начальной инициализации будет равна 24 МГц.
+На плате STM32VL-DISCOVERY микроконтроллер конфигурируется на работу с 
+внешним кварцем частотой 8 МГц, при этом его системная тактовая частота 
+после начальной инициализации будет равна 24 МГц.
 
-На плате STM32L-DISCOVERY внешнего кварца нет и после начальной 
-инициализации системная тактовая частота формируется внутренним источником 
-MSI и равна 2,097 МГц.
+На плате STM32L-DISCOVERY внешнего кварца нет и после начальной 
+инициализации системная тактовая частота формируется внутренним источником 
+MSI и равна 2,097 МГц.
 
асчет перезагружаемых значений приведен ниже, в комментариях примеров программ для этих плат.
 Р°СЃС‡РµС‚ перезагружаемых значений приведен РЅРёР¶Рµ, РІ комментариях примеров программ для этих плат.
 
 
-Код программы для платы STM32VL-DISCOVERY (контроллер STM32F100)
+Код программы для платы STM32VL-DISCOVERY (контроллер STM32F100)
 ~~~~~~~~~~~~~~~~~~~~
 #include "stm32f10x.h"
 
@@ -320,43 +320,43 @@ GPIO_InitTypeDef    GPIO_InitStruct;
 
 int main()
 {
-  /*Вызов функции конфигурации системного таймера SysTick.
-  Эта функция находится в файле core_cm3.h и:
-  --Задает источник тактирования системного таймера (по умолчанию это SYSCLK = 24 МГц,
-    другой возможный вариант  - SysTick тактируется от SYSCLK/8);
-  --Задает уровень приоритета прерывания;
-  --Сбрасывает флаг ожидания прерывания, если он выставлен;
-  --Заносит в нужный регистр перезагружаемое значение для декрементирующего счетчика,
-    которое вычисляется по формуле:
+  /*Вызов функции конфигурации системного таймера SysTick.
+  Эта функция находится в файле core_cm3.h и:
+  --Задает источник тактирования системного таймера (по умолчанию это SYSCLK = 24 МГц,
+    другой возможный вариант  - SysTick тактируется от SYSCLK/8);
+  --Задает уровень приоритета прерывания;
+  --Сбрасывает флаг ожидания прерывания, если он выставлен;
+  --Заносит в нужный регистр перезагружаемое значение для декрементирующего счетчика,
+    которое вычисляется по формуле:
         Reload Value = SysTick Counter Clock (Hz) x  Desired Time base (s),
-        для базовой задержки длительностью 1 мс получим величину
-        Reload Value = 24 000 000 Гц х 0,001 с = 24 000
-    (Необходимо самостоятельно посчитать эту величину и вставить в качестве
-    параметра при вызове функции);
-  --Обнуляет счетчик
-  --Запускает счет системного таймера*/
+        для базовой задержки длительностью 1 мс получим величину
+        Reload Value = 24 000 000 Гц х 0,001 с = 24 000
+    (Необходимо самостоятельно посчитать эту величину и вставить в качестве
+    параметра при вызове функции);
+  --Обнуляет счетчик
+  --Запускает счет системного таймера*/
   SysTick_Config(24000);
 
-  //Включаем тактирование порта GPIOC
+  //Включаем тактирование порта GPIOC
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
-  //Конфигурируем выводы, к которым подключены светодиоды платы
-  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; //Выбираем выводы PC8, PC9
-  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //Максимальная скорость работы
-  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //Выход Push-Pull
-  GPIO_Init(GPIOC, &GPIO_InitStruct); //Заносим заданные настройки в регистры порта
+  //Конфигурируем выводы, к которым подключены светодиоды платы
+  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; //Выбираем выводы PC8, PC9
+  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //Максимальная скорость работы
+  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //Выход Push-Pull
+  GPIO_Init(GPIOC, &GPIO_InitStruct); //Заносим заданные настройки в регистры порта
 
   while(1)
   {
-    GPIO_ResetBits(GPIOC, GPIO_Pin_9); //Гасим зеленый LED
-    GPIO_SetBits(GPIOC, GPIO_Pin_8);   //Зажигаем синий LED
-    Delay_ms(1000); //Временная задержка на 1 с
-    GPIO_ResetBits(GPIOC, GPIO_Pin_8); //Гасим синий LED
-    GPIO_SetBits(GPIOC, GPIO_Pin_9);   //Зажигаем зеленый LED
-    Delay_ms(1000); //Временная задержка на 1 с
+    GPIO_ResetBits(GPIOC, GPIO_Pin_9); //Гасим зеленый LED
+    GPIO_SetBits(GPIOC, GPIO_Pin_8);   //Зажигаем синий LED
+    Delay_ms(1000); //Временная задержка на 1 с
+    GPIO_ResetBits(GPIOC, GPIO_Pin_8); //Гасим синий LED
+    GPIO_SetBits(GPIOC, GPIO_Pin_9);   //Зажигаем зеленый LED
+    Delay_ms(1000); //Временная задержка на 1 с
   }
 }
 
-//Функция временной задержки
+//Функция временной задержки
 void Delay_ms(__IO uint32_t nTime)
 {
   TimingDelay = nTime;
@@ -371,7 +371,7 @@ void TimingDelay_Decrement(void)
   }
 }
 
-//Обработчик прерывания системного таймера
+//Обработчик прерывания системного таймера
 void SysTick_Handler(void)
 {
   TimingDelay_Decrement();
@@ -379,7 +379,7 @@ void SysTick_Handler(void)
 ~~~~~~~~~~~~~~~~~~~~
 
 
-Код программы для платы STM32L-DISCOVERY (контроллер STM32L152)
+Код программы для платы STM32L-DISCOVERY (контроллер STM32L152)
 ~~~~~~~~~~~~~~~~~~~~
 #include "stm32l1xx.h"
 
@@ -391,45 +391,45 @@ GPIO_InitTypeDef    GPIO_InitStruct;
 
 int main()
 {
-    /*Вызов функции конфигурации системного таймера SysTick.
-  Эта функция находится в файле core_cm3.h и:
-  --Задает источник тактирования системного таймера (по умолчанию это SYSCLK = 2.097 МГц,
-    другой возможный вариант  - SysTick тактируется от SYSCLK/8);
-  --Задает уровень приоритета прерывания;
-  --Сбрасывает флаг ожидания прерывания, если он выставлен;
-  --Заносит в нужный регистр перезагружаемое значение для декрементирующего счетчика,
-    которое вычисляется по формуле:
+    /*Вызов функции конфигурации системного таймера SysTick.
+  Эта функция находится в файле core_cm3.h и:
+  --Задает источник тактирования системного таймера (по умолчанию это SYSCLK = 2.097 МГц,
+    другой возможный вариант  - SysTick тактируется от SYSCLK/8);
+  --Задает уровень приоритета прерывания;
+  --Сбрасывает флаг ожидания прерывания, если он выставлен;
+  --Заносит в нужный регистр перезагружаемое значение для декрементирующего счетчика,
+    которое вычисляется по формуле:
         Reload Value = SysTick Counter Clock (Hz) x  Desired Time base (s),
-        для базовой задержки длительностью 1 мс получим величину
-        Reload Value = 2 097 000 Гц х 0,001 с = 2097
-    (Необходимо самостоятельно посчитать эту величину и вставить в качестве
-    параметра при вызове функции);
-  --Обнуляет счетчик
-  --Запускает счет системного таймера*/
+        для базовой задержки длительностью 1 мс получим величину
+        Reload Value = 2 097 000 Гц х 0,001 с = 2097
+    (Необходимо самостоятельно посчитать эту величину и вставить в качестве
+    параметра при вызове функции);
+  --Обнуляет счетчик
+  --Запускает счет системного таймера*/
   SysTick_Config(2097);
 
-  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); //Включаем тактирование GPIOB
+  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); //Включаем тактирование GPIOB
 
-  //Конфигурируем выводы, к которым подключены светодиоды платы
-  GPIO_InitStruct.GPIO_Pin = (GPIO_Pin_6 | GPIO_Pin_7); //Выбираем выводы PB6, PB7
-  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; //Выводы порта в режиме выхода
-  GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //Выход Push-Pull
-  GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; //Выход без подтягивающих резисторов
-  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_40MHz; //Скорость порта максимальная
-  GPIO_Init(GPIOB, &GPIO_InitStruct); //Заданные настройки сохраняем в регистрах GPIOB
+  //Конфигурируем выводы, к которым подключены светодиоды платы
+  GPIO_InitStruct.GPIO_Pin = (GPIO_Pin_6 | GPIO_Pin_7); //Выбираем выводы PB6, PB7
+  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; //Выводы порта в режиме выхода
+  GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //Выход Push-Pull
+  GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; //Выход без подтягивающих резисторов
+  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_40MHz; //Скорость порта максимальная
+  GPIO_Init(GPIOB, &GPIO_InitStruct); //Заданные настройки сохраняем в регистрах GPIOB
 
   while(1)
   {
-    GPIO_ResetBits(GPIOB, GPIO_Pin_7); //Гасим зеленый LED
-    GPIO_SetBits(GPIOB, GPIO_Pin_6);   //Зажигаем синий LED
-    Delay_ms(1000); //Временная задержка на 1 с
-    GPIO_ResetBits(GPIOB, GPIO_Pin_6); //Гасим синий LED
-    GPIO_SetBits(GPIOB, GPIO_Pin_7);   //Зажигаем зеленый LED
-    Delay_ms(1000); //Временная задержка на 1 с
+    GPIO_ResetBits(GPIOB, GPIO_Pin_7); //Гасим зеленый LED
+    GPIO_SetBits(GPIOB, GPIO_Pin_6);   //Зажигаем синий LED
+    Delay_ms(1000); //Временная задержка на 1 с
+    GPIO_ResetBits(GPIOB, GPIO_Pin_6); //Гасим синий LED
+    GPIO_SetBits(GPIOB, GPIO_Pin_7);   //Зажигаем зеленый LED
+    Delay_ms(1000); //Временная задержка на 1 с
   }
 }
 
-//Функция временной задержки
+//Функция временной задержки
 void Delay_ms(__IO uint32_t nTime)
 {
   TimingDelay = nTime;
@@ -444,7 +444,7 @@ void TimingDelay_Decrement(void)
   }
 }
 
-//Обработчик прерывания системного таймера
+//Обработчик прерывания системного таймера
 void SysTick_Handler(void)
 {
   TimingDelay_Decrement();
@@ -453,15 +453,15 @@ void SysTick_Handler(void)
 
 ===============================================================================
 
- *** Литература: ***
+ *** Литература: ***
 
 Cortex-M3 Devices Generic User Guide
 Cortex-M3 Peripherals > System timer, SysTick
 4.4. System timer, SysTick
 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0552a/Babieigh.html
 
-ARM. Учебный Курс. SysTick — Системный таймер
+ARM. Учебный Курс. SysTick — Системный таймер
 http://easyelectronics.ru/arm-uchebnyj-kurs-systick-sistemnyj-tajmer.html
 
-STM32. Системный таймер SysTick.
+STM32. Системный таймер SysTick.
 http://chipspace.ru/stm32-systick/

+ 48 - 48
stm32/pin.txt

@@ -1,127 +1,127 @@
 https://hubstub.ru/stm32/65-stm32-gpio-ili-porty-vvoda-vyvoda.html
 stm32f1xx
 
-//Полагаем что выводы после сброса в режиме плавающего входа
+//Полагаем что выводы после сброса в режиме плавающего входа
 
-//разрешаем тактирование порта A
+//разрешаем тактирование порта A
 RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
 	
-//вход с подтяжкой к +
+//вход с подтяжкой к +
 GPIOA->CRL &= ~GPIO_CRL_CNF0;
 GPIOA->CRL |= GPIO_CRL_CNF0_1;
 GPIOA->ODR |= GPIO_ODR_ODR0; 
 
-//вход с подтяжкой к -
+//вход с подтяжкой к -
 GPIOA->CRL &= ~GPIO_CRL_CNF1;
 GPIOA->CRL |= GPIO_CRL_CNF1_1;
 GPIOA->ODR &= ~GPIO_ODR_ODR1; 
 
-//аналоговый режим
+//аналоговый режим
 GPIOA->CRL &= ~GPIO_CRL_CNF2;
 
-//выход с открытым стоком 2MHz
+//выход с открытым стоком 2MHz
 GPIOA->CRL &= ~GPIO_CRL_CNF3;
 GPIOA->CRL |= GPIO_CRL_CNF3_0;
 GPIOA->CRL |= GPIO_CRL_MODE3_1;
 
-//двухтактный выход 10MHz
+//двухтактный выход 10MHz
 GPIOA->CRL &= ~GPIO_CRL_CNF4;
 GPIOA->CRL |= GPIO_CRL_MODE4_0;
 
-//альтернативная ф-ция, двухтактный выход, 50 MHz
+//альтернативная ф-ция, двухтактный выход, 50 MHz
 GPIOA->CRL &= ~GPIO_CRL_CNF5;
 GPIOA->CRL |= GPIO_CRL_CNF5_1;
 GPIOA->CRL |= GPIO_CRL_MODE5;
 
-//альтернативная ф-ция, выход с открытым стоком,  50 MHz
+//альтернативная ф-ция, выход с открытым стоком,  50 MHz
 GPIOA->CRL |= GPIO_CRL_CNF6;
 GPIOA->CRL |= GPIO_CRL_MODE6;
 
 
-//проверяем значение нулевого вывода порта А
-if (GPIOА->IDR & GPIO_IDR_IDR0)
+//проверяем значение нулевого вывода порта А
+if (GPIOРђ->IDR & GPIO_IDR_IDR0)
 
 
-//если вывод в режиме входа то активируется подтяжка к питанию
+//если вывод в режиме входа то активируется подтяжка к питанию
 GPIOA->ODR |= GPIO_ODR_ODR0;
-//или к земле
+//или к земле
 GPIOA->ODR &= ~GPIO_ODR_ODR0;
-//если в режиме выхода, то на нём установится соответствующий лог.уровень
-//например так можно установить все выходы порта в 1
+//если в режиме выхода, то на нём установится соответствующий лог.уровень
+//например так можно установить все выходы порта в 1
 GPIOA->ODR = 0xFFFF;
 
 
-//сбросить нулевой бит порта А
+//сбросить нулевой бит порта А
 GPIOA->BRR = GPIO_BRR_BR0;
 
 
-//сбросить нулевой бит 
+//сбросить нулевой бит 
 GPIOA->BSRR = GPIO_BSRR_BR0;
-//установить нулевой бит
+//установить нулевой бит
 GPIOA->BSRR = GPIO_BSRR_BS0;
 
 -=-=-
-Как проверить состояние пина порта?
-Скажем 4 пина порта С?
+Как проверить состояние пина порта?
+Скажем 4 пина порта С?
 
-просто.
-Можно использовать стандартную библиотеку:
+просто.
+Можно использовать стандартную библиотеку:
 if (GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4)== Bit_RESET)....
-Можно и так(само коротко и быстро:
-if (GPIOС->IDR & GPIO_IDR_IDR4)...
+Можно и так(само коротко и быстро:
+if (GPIOРЎ->IDR & GPIO_IDR_IDR4)...
 
 
-#define pin_X  (GPIOС->IDR & GPIO_IDR_IDR4)
+#define pin_X  (GPIOРЎ->IDR & GPIO_IDR_IDR4)
 if (pin_X == 1) {......}
 
 -=-=-
 
-Код:
+РљРѕРґ:
 #define GPIO_ODR_ODR0                        ((uint16_t)0x0001)            /*!< Port output data, bit 0 */
 #define GPIO_ODR_ODR1                        ((uint16_t)0x0002)            /*!< Port output data, bit 1 */
 #define GPIO_ODR_ODR2                        ((uint16_t)0x0004)            /*!< Port output data, bit 2 */
 
-GPIO_ODR_ODR0 это макросы описывающие битовую маску.
-Хотите изменить сразу несколько - пишите как я в примере или укажите свою маску:
+GPIO_ODR_ODR0 это макросы описывающие битовую маску.
+Хотите изменить сразу несколько - пишите как я в примере или укажите свою маску:
 
-Код:
-GPIOB->ODR ^=0x00ff; //переключит младшие 8 ног.
+РљРѕРґ:
+GPIOB->ODR ^=0x00ff; //переключит младшие 8 ног.
 
-или что-б потом самому легче читалось:
+или что-б потом самому легче читалось:
 
-Код:
-/* маска для 8-ми нечетных ног */
+РљРѕРґ:
+/* маска для 8-ми нечетных ног */
 #define ODD_0_8 0x0055
-/* маска для 8-ми четных ног */
+/* маска для 8-ми четных ног */
 #define EVEN_0_8 0x00AA
-GPIOB->ODR ^= ODD_0_8; //переключит нечетные
-GPIOB->ODR ^= EVEN_0_8; //переключит четные
+GPIOB->ODR ^= ODD_0_8; //переключит нечетные
+GPIOB->ODR ^= EVEN_0_8; //переключит четные
 
 -=-=-=-=-=-
 
-а как тогда событие нажатия отследить?
+а как тогда событие нажатия отследить?
 
-Ну, как-то так (одновременно и с дребезгом поборемся):
+Ну, как-то так (одновременно и с дребезгом поборемся):
 
-Код:
+РљРѕРґ:
 #define MAXCNT 10
 char flip=0, pressed=0;
 
  while(1)
  {
-    if((GPIOA->IDR&0x01)==0) //кнопка не нажата (или 0 читается во впемя дребезга) - готовимся к обработке
+    if((GPIOA->IDR&0x01)==0) //кнопка не нажата (или 0 читается во впемя дребезга) - готовимся к обработке
     {
       pressed=0;
       cntr=0;
     }
     else
-      if(!pressed) //кнопка вроде бы нажата, но возможно это пока что только дребезг
+      if(!pressed) //кнопка вроде бы нажата, но возможно это пока что только дребезг
       {
-        cntr++; // сосчитаем до десяти в надежде, что за это время переходные процессы завершатся
-        if(cntr>MAXCNT) // десять последних проходов кнопка в состоянии "нажато" - считаем, что событие "нажатие кнопки" свершилось
-        {  // тут соб-сно ваша реакция на событие "нажатие кнопки", т.е. переход от 0 к 1
-          flip=!flip;  // организуем простейший двоичный переключатель ("flip-flop")
-          if(flip)      // и в зависимости от его состояния выполняем ту или иную ветвь
+        cntr++; // сосчитаем до десяти в надежде, что за это время переходные процессы завершатся
+        if(cntr>MAXCNT) // десять последних проходов кнопка в состоянии "нажато" - считаем, что событие "нажатие кнопки" свершилось
+        {  // тут соб-сно ваша реакция на событие "нажатие кнопки", т.е. переход от 0 к 1
+          flip=!flip;  // организуем простейший двоичный переключатель ("flip-flop")
+          if(flip)      // и в зависимости от его состояния выполняем ту или иную ветвь
           {
             GPIOC->BSRR = GPIO_BSRR_BS9;
             GPIOC->BSRR = GPIO_BSRR_BR8;
@@ -131,10 +131,10 @@ char flip=0, pressed=0;
             GPIOC->BSRR = GPIO_BSRR_BS8;
             GPIOC->BSRR = GPIO_BSRR_BR9;
           }
-          pressed=1;  // отработав событие "нажатие кнопки", отключаем проверку на это событие -> до следующего отпускания кнопки
+          pressed=1;  // отработав событие "нажатие кнопки", отключаем проверку на это событие -> до следующего отпускания кнопки
         }
       }
-      else //кнопка в состоянии "нажато" (после отловленного события "нажатие кнопки") - в нашем случае неинтересно 
+      else //кнопка в состоянии "нажато" (после отловленного события "нажатие кнопки") - в нашем случае неинтересно 
       {
       }
  }

+ 8 - 8
stm32/rcc.c

@@ -1,17 +1,17 @@
 /**
-  * Òàêòèðîâàíèå STM32
+  * Тактирование STM32
   * http://avr-start.ru/?p=3709
   */
 
-/* Äëÿ âíåøíåãî êâàðöà: */
+/* Дл� внешнего кварца: */
 
-  RCC->CR|=RCC_CR_HSEON; //Çàïóñêàåì ãåíåðàòîð HSE.
-  while (!(RCC->CR & RCC_CR_HSERDY)) {}; // Æäåì ãîòîâíîñòè
-  RCC->CFGR &=~RCC_CFGR_SW; //Ñáðàñûâàåì áèòû
-  RCC->CFGR |= RCC_CFGR_SW_HSE; // Ïåðåõîäèì íà HSE
+  RCC->CR|=RCC_CR_HSEON; //Запу�каем генератор HSE.
+  while (!(RCC->CR & RCC_CR_HSERDY)) {}; // Ждем готовно�ти
+  RCC->CFGR &=~RCC_CFGR_SW; //Сбра�ываем биты
+  RCC->CFGR |= RCC_CFGR_SW_HSE; // Переходим на HSE
 
 
-/* Äëÿ âíóòðåííåãî PLL */
+/* Дл� внутреннего PLL */
 
   RCC->CFGR |= RCC_CFGR_PLLMULL6;               //HSI / 2 * 6 = 24 MHz
   RCC->CR |= RCC_CR_PLLON;                      //enable PLL
@@ -21,7 +21,7 @@
   while((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_1) {} //wait till PLL is used
 
 
-/* Äëÿ âíåøíåãî PLL */
+/* Дл� внешнего PLL */
 
   RCC->CR |= RCC_CR_HSEON;                      //enable HSE
   while((RCC->CR & RCC_CR_HSERDY) == 0) {}      //wait till HSE is ready

+ 1 - 1
stm8/Makefile.stm8l

@@ -2,7 +2,7 @@
 # IAR Makefile for STM8L #
 ##########################
 
-# Âçÿë èç ïðîåêòà atomthreads è ïåðåèíà÷èë.
+# Вз�л из проекта atomthreads и переиначил.
 
 PROJECT=VAPC
 

+ 1 - 1
stm8/Makefile.stm8s

@@ -2,7 +2,7 @@
 # IAR Makefile for STM8S #
 ##########################
 
-# Âçÿë èç ïðîåêòà atomthreads è ïåðåèíà÷èë.
+# Вз�л из проекта atomthreads и переиначил.
 PROJECT=ChACM
 
 # Location of build tools and atomthreads sources

+ 8 - 8
stm8/eeprom.c

@@ -3,7 +3,7 @@
  * https://radiokot.ru/forum/viewtopic.php?p=2691126&sid=342073b18646c21ba245ff0ada5111b3#p2691126
  */
 
-/* eeprom в stm8 можно организовать просто */
+/* eeprom в stm8 можно организовать просто */
 
 typedef struct Par_t {
     uint16_t temperature;
@@ -15,9 +15,9 @@ typedef struct Par_t {
 __no_init Par_t Par;
 #pragma required=Par
 
- /* чтение очень просто, занимает намного меньше чем в АВР
-    - просто пересылка из области eeprom в память,
-    все находится в едином адресном пространстве: */
+ /* чтение очень просто, занимает намного меньше чем в АВР
+    - просто пересылка из области eeprom в память,
+    все находится в едином адресном пространстве: */
 
 uint16_t temperature, time;
 
@@ -25,8 +25,8 @@ temperature = Par.temperature;
 time = Par.time;
 
 /*
-в листинге всего то две команды:
-Код:
+в листинге всего то две команды:
+РљРѕРґ:
 LDW X, L:0x4000
 LDW L:temperature, X
 ...
@@ -34,14 +34,14 @@ LDW X, L:0x4002
 LDW L:time, X
 */
 
-/* запись тоже несложно: */
+/* запись тоже несложно: */
 
 mcu_eeprom_unlock();
 Par.temperature = 560;
 Par.time = time;
 FLASH->IAPSR &= ~FLASH_IAPSR_DUL; //EEPROM lock
 
-void mcu_eeprom_unlock(void) //Разблокировать EEPROM
+void mcu_eeprom_unlock(void) //Разблокировать EEPROM
 {
     FLASH->DUKR = ((unsigned char)0xAE);
     FLASH->DUKR = ((unsigned char)0x56);

+ 31 - 31
subroutine.c

@@ -1,31 +1,31 @@
 /*
 *
-*	Подпрограмки, которые я успел наваять на C
+*	Подпрограмки, которые я успел наваять на C
 *
 */
 
 
 //============================================================================
-// программный SPI. Выводит байт начиная со старшего бита
-// выходные пины -- SCK, MOSI, порт -- SPI_PORT. строб -- из 0 в 1
+// программный SPI. Выводит байт начиная со старшего бита
+// выходные пины -- SCK, MOSI, порт -- SPI_PORT. строб -- из 0 в 1
 void spi_SendByte (uint8_t DataByte) {
-	uint8_t i;					// счетчик бит
+	uint8_t i;					// счетчик бит
 	for (i=8; i>0; i--) {
-		SPI_PORT &= (~(1<<PIN_SCK));		// выдали строб
-		if (bit_is_set(DataByte,7)) {		// если бит 7 == 1
+		SPI_PORT &= (~(1<<PIN_SCK));		// выдали строб
+		if (bit_is_set(DataByte,7)) {		// если бит 7 == 1
 			SPI_PORT |= (1<<PIN_MOSI);	// MOSI = 1
-		} else {					// если бит 7 == 0
+		} else {					// если бит 7 == 0
 			SPI_PORT &= (~(1<<PIN_MOSI));	// MOSI = 0
 		}
-		SPI_PORT |= (1<<PIN_SCK);		// защёлкнули строб
-		DataByte <<= 1;				// сдвиг влево на 1 бит
+		SPI_PORT |= (1<<PIN_SCK);		// защёлкнули строб
+		DataByte <<= 1;				// сдвиг влево на 1 бит
 	}
 }
 
 
 //============================================================================
 // bcd2ascii
-// придумал сам, ещё не проверял
+// придумал сам, ещё не проверял
 typdef struct {uint8_t msb, uint8_t lsb} x2_ascii;
 
 x2_ascii BCD_to_ASCII(unit8_t bcd) {
@@ -43,7 +43,7 @@ x2_ascii BCD_to_ASCII(unit8_t bcd) {
 
 	return ascii;
 }
-// как-то так...
+// как-то так...
 
 //============================================================================
 /*
@@ -54,7 +54,7 @@ x2_ascii BCD_to_ASCII(unit8_t bcd) {
 Code:
 */
 
-char (*a)[10];	// Указатель на массив из десяти символов
+char (*a)[10];	// Указатель на массив из десяти символов
 
  // returns number of digits converted 
  // result array must be large enough to hold 
@@ -122,25 +122,25 @@ char* itoa(int value, char* result, int base) {
 
 //============================================================================
 /*
еализация от Кернигана и Ритчи
-Функция itoa появилась в первом издании книги Брайана Кернигана и Дениса
итчи Язык программирования Си, на странице 60. Второе издание Язык
-программирования Си («K&R2») на стр. 64 содержало нижеследующую реализацию
-itoa. В книге отмечено несколько вопросов, связанных с этой реализацией,
-включая тот факт, что она не в состоянии корректно обработать самое
-маленькое отрицательное число -2длина машинного слова в битах-1.[1]
 РµР°Р»РёР·Р°С†РёСЏ РѕС‚ Кернигана Рё Ритчи
+Функция itoa появилась в первом издании книги Брайана Кернигана и Дениса
 РёС‚чи Язык программирования РЎРё, РЅР° странице 60. Второе издание Язык
+программирования Си («K&R2») на стр. 64 содержало нижеследующую реализацию
+itoa. В книге отмечено несколько вопросов, связанных с этой реализацией,
+включая тот факт, что она не в состоянии корректно обработать самое
+маленькое отрицательное число -2длина машинного слова в битах-1.[1]
 */
- /* itoa:  конвертируем n в символы в s */
+ /* itoa:  конвертируем n в символы в s */
  void itoa(int n, char s[])
  {
      int i, sign;
  
-     if ((sign = n) < 0)  /* записываем знак */
-         n = -n;          /* делаем n положительным числом */
+     if ((sign = n) < 0)  /* записываем знак */
+         n = -n;          /* делаем n положительным числом */
      i = 0;
-     do {       /* генерируем цифры в обратном порядке */
-         s[i++] = n % 10 + '0';   /* берем следующую цифру */
-     } while ((n /= 10) > 0);     /* удаляем */
+     do {       /* генерируем цифры в обратном порядке */
+         s[i++] = n % 10 + '0';   /* берем следующую цифру */
+     } while ((n /= 10) > 0);     /* удаляем */
      if (sign < 0)
          s[i++] = '-';
      s[i] = '\0';
@@ -148,11 +148,11 @@ itoa. 
  }
 
 /*
-Функция reverse реализована двумя страницами ранее:
+Функция reverse реализована двумя страницами ранее:
 */
 #include <string.h>
 
-/* reverse:  переворачиваем строку s на месте */
+/* reverse:  переворачиваем строку s на месте */
 void reverse(char s[])
 {
     int i, j;
@@ -166,12 +166,12 @@ void reverse(char s[])
 }
 
 //============================================================================
-// задержка на прерываниях
+// задержка на прерываниях
 void delay_ms (word ms) {
-	ADCSRA &= (~(1<<ADEN)); // выключим АЦП
-	do { // два байта экономии
+	ADCSRA &= (~(1<<ADEN)); // выключим АЦП
+	do { // два байта экономии
 		set_sleep_mode(SLEEP_MODE_IDLE);
 		sleep_mode();
 	} while (ms > 0);
-	ADCSRA |= (1<<ADEN); // включим АЦП
+	ADCSRA |= (1<<ADEN); // включим АЦП
 }

+ 22 - 22
классы.txt

@@ -1,43 +1,43 @@
-НАСЛЕДОВАНИЕ КЛАССОВ
+НАСЛЕДОВАН�Е КЛАССОВ
 
-Ключевое слово virtual
-Чтобы производный класс получил возможность перекрывать методы, используйте ключевое
-слово *virtual*.
+Ключевое слово virtual
+Чтобы производный класс получил возможность перекрывать методы, используйте ключевое
+слово *virtual*.
 
-// родительский метод
+// родительский метод
 class Bird {
 	public virtual void Fly() {
-		// код, заставляющий птицу летать
+		// код, заставляющий птицу летать
 	}
 }
 
-Добавление одноименного метода в производный класс
-Переопределенный метод должен иметь такую же сигнатуру, то есть то же самое возвращаемое
-значение и параметры. В его объявлении используется ключевое слово *override*.
+Добавление одноименного метода в производный класс
+Переопределенный метод должен иметь такую же сигнатуру, то есть то же самое возвращаемое
+значение и параметры. В его объявлении используется ключевое слово *override*.
 
-// дочерний метод
+// дочерний метод
 class Penguin : Bird {
 	public override void Fly() {
-		MessageBox.Show("Пингвины не летают!")
+		MessageBox.Show("Пингвины не летают!")
 	}
 }
 
 !!!
-Используйте ключевое слово *override* для добавления в производный класс
-методов, замещающих методы унаследованные. Перекрывать можно методы,
-помеченные в базовом классе словом *virtual*.
+�спользуйте ключевое слово *override* для добавления в производный класс
+методов, замещающих методы унаследованные. Перекрывать можно методы,
+помеченные в базовом классе словом *virtual*.
 
 -=-=-=-=-=-=-=-=-=-=-=-
 
-Если в классе присутствуют конструкторы, то все классы, которые от
-него наследуют, должны вызывать хотя бы один из этих конструк-
-торов. При этом конструктор производного класса может иметь свои
-собственные параметры.
+Если в классе присутствуют конструкторы, то все классы, которые от
+него наследуют, должны вызывать хотя бы один из этих конструк-
+торов. При этом конструктор производного класса может иметь свои
+собственные параметры.
 
 class Subclass : BaseClass {
-	public Subclass(список параметров)
-		: base(список параметров базового класса) {
-		// сначала выполняется конструктор базового класса,
-		// а потом все остальные операторы
+	public Subclass(список параметров)
+		: base(список параметров базового класса) {
+		// сначала выполняется конструктор базового класса,
+		// а потом все остальные операторы
 	}
 }