Форум программистов, компьютерный форум, киберфорум
Измерительная техника
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/117: Рейтинг темы: голосов - 117, средняя оценка - 4.56
7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536

Замена микросхемы 1827ВЕ1-0000000 в Г4-164 на AVR -МК

31.08.2019, 07:43. Показов 29941. Ответов 229
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как заменить 1827ВЕ1-0000000 (аналог 586ВЕ1, система команд в книжке Гамкрелидзе, кажется, отрицательная логика на мультиплексированной шине адреса-данных , нестандартный UART ) в Г4-164 на AVR -МК ATMEGA8A, ATMEGA48, ATMEGA8535, используя , например, маскированные прерывания от одного из портов, битвайсовую эмуляцию пинов (шину ПЗУ можно не использовать ), подпрограммы задержки , используя С++, ассемблерные вставки ? Предусмотреть частоты , а которых переключаются фильтры, увеличение девиации в n раз в коэффициентах АЦП при включении делителей на n, таблицу коэффициентов в ЦАП в децибелах (с учетом , например, того , что 31,7-100 мВ , на 31,6 переключается аттенюатор и включается верх напряжения ЦАП ОН ), обработку прерывания от КОП и другие функции , как по инструкции (https://www.astena.ru/teh_3.html ) ?
Миниатюры
Замена  микросхемы 1827ВЕ1-0000000 в Г4-164 на AVR -МК  
Вложения
Тип файла: zip img012.zip (1.35 Мб, 38 просмотров)
Тип файла: zip g4-164_shems.zip (5.48 Мб, 35 просмотров)
Тип файла: zip g4-164_teh.zip (5.28 Мб, 35 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.08.2019, 07:43
Ответы с готовыми решениями:

Замена микросборок 2.030.036 ,2.030.034 в Г4-164, Г4-176
Замена микросборок 2.030.036 в Г4-164, 2.030.034 в Г4-176 : на какие транзисторы в современных условиях лучше заменить...

замена микросхемы
Нужно заменить микросхему драйвер двигателя на HDD Smooth 100369972 . На али есть такие схемки но смущает то что цифробуквы на моей схемке...

Замена микросхемы AT49F002NT
Господа! Если кто знает ,какая микросхема может заменить AT49F002NT?

229
7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
06.03.2020, 12:05  [ТС]
Студворк — интернет-сервис помощи студентам
Схема подключения контроллера примерно следующая (задаться при программировании ) :
Миниатюры
Замена  микросхемы 1827ВЕ1-0000000 в Г4-164 на AVR -МК  
0
7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
06.03.2020, 15:33  [ТС]
Если в регистрах информация не будет меняться, пока нет строба сдвига по соответствующему адресу, в подпрограммах можно и оставить подачу ИЗП после всех байтов , чтобы не мерцало , все-таки после всех программ сдвига подавать , когда все готовы (архитектура и инструкция, быстрее выполняется ).

Добавлено через 18 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
uint8_t SevenSegment(uint8_t Digit  , uint8_t Comma )
{
 
/*
LSB  e; c; b; d; f; g; a; h  MSB
     a 
b        c
     d
e        f
     g
              h
1 on the inform bus means turn on segment
                                          ecbdfga; 
*/
uint8_t db=0;
 
switch (Digit){
                 //hagfdbce
case 0 :     db= 0b01110111;  break ;  // a,b,e,g,f,c=1
case 1 :     db= 0b00010010;  break ;  // c,f=1
case 2:      db= 0b01101011;  break;   // a,c,d,e,g=1
case 3:      db= 0b01111010;  break;   // a,c,d,f,g=1
case 4 :     db= 0b01011110;  break;   // a,b,c,d,f=1
case 5:      db= 0b01111100;  break;   // a,b,d,f,g=1
case 6:      db= 0b01111101;  break;   // a,b,d,e,f,g=1
case 7:      db= 0b01010010;  break;   // a,c,f =1
case 8:      db= 0b01111111;  break;   //a,b,c,d,e,f,g =1
case 9:      db= 0b01111110;  break;   //a,d,c,d,f=1
case f :      db= 0b0000100;   break; // symbol '-' for FM
//case c:      db= 0b0000000; break;  //   
}
 
 
if(Comma==1) { db|=0b10000000; }//  h
return db;
}
SendBitsBlink(uint8_t BitsAddr) встроить в SendBitsRAM(uint8_t BitsAddr, uint8_t Digit , uint8_t BitComma) (до 16-битной посылки с разными адресами ).


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
void SendBitsRAM(uint8_t BitsAddr, uint8_t Digit , uint8_t BitComma, uint8_t BitsAddr_Blink)
{
/*
     a 
b        c
     d
e        f
     g
              h
1 on the inform bus means turn on segment
 
8; 4; 2 ; 1 ; e; c; b; d; f; g; a; h;
 
x x x x x x x      x x x         x x      x x x x
for 1 on the inform bus send 0 to pin 34 ( and send strobe after it )
*/
  
 uint8_t db1;
 
 db1=SevenSegment(Digit  , BitComma);  
 
#define ADDR_SYNCRAM 15
 
if ((BitsAddr&0x08)==0) { SendBitInform(1);  }  else { SendBitInform(0); }  //addr 8    , fix bits mask and  logic
SendStrobeSync ( ADDR_SYNCRAM); //1
 
if ((BitsAddr&0x04)==0) { SendBitInform(1);  }  else { SendBitInform(0); }  //addr 4    , fix bits mask and  logic
SendStrobeSync ( ADDR_SYNCRAM);  //2
 
if ((BitsAddr&0x02)==0) { SendBitInform(1);  }  else { SendBitInform(0); }  //addr 2   ,   fix bits mask and  logic
SendStrobeSync ( ADDR_SYNCRAM); //3
 
if ((BitsAddr&0x01)==0) { SendBitInform(1);  }  else { SendBitInform(0); }  //addr 1  , fix bits mask and  logic
SendStrobeSync ( ADDR_SYNCRAM);//4
 
 
if ((db1&0x01)==0) { SendBitInform(1);  }  else { SendBitInform(0); }  //e
SendStrobeSync ( ADDR_SYNCRAM);//5        bit 0 ,LSB 
 
 
db1=  (db1>>1);
if ((db1&0x01)==0 ) { SendBitInform(1);  }  else { SendBitInform(0); }  //c
SendStrobeSync ( ADDR_SYNCRAM);//6        bit 1
 
 db1= (db1>>1);
if ((db1&0x01)==0) { SendBitInform(1);  }  else { SendBitInform(0); }  //b
SendStrobeSync ( ADDR_SYNCRAM);//7        bit 2
 
 db1= (db1>>1);
if ((db1&0x01)==0) { SendBitInform(1);  }  else { SendBitInform(0); }  //d
SendStrobeSync ( ADDR_SYNCRAM);//8       bit 3
 
  db1= (db1>>1);
if ((db1&0x01)==0) { SendBitInform(1);  }  else { SendBitInform(0); }  //f
SendStrobeSync ( ADDR_SYNCRAM);//9      bit 4
 
 
  db1= (db1>>1);
if ((db1&0x01)==0 ) { SendBitInform(1);  }  else { SendBitInform(0); }  //g
SendStrobeSync ( ADDR_SYNCRAM);//10     bit 5
 
 
db1= (db1>>1);
if ((db1&0x01)==0) { SendBitInform(1);  }  else { SendBitInform(0); }  //a
SendStrobeSync ( ADDR_SYNCRAM);//11    bit 6
 
db1=(db1>>1);
if ((db1&0x01)==0) { SendBitInform(1);  }  else { SendBitInform(0); }  //h
SendStrobeSync ( ADDR_SYNCRAM);//12   bit 7
 
/*
first sent bit 3  2   1  0 last sent bit 
for 1 on the inform bus send 0 to pin 34 ( and send strobe after it )
*/
  
//SendMemWrRAMPulse();
 
 //check "polarity"  for codes by circuit 
 
if ((BitsAddr_Blink&0x08)==0) { SendBitInform(1);  }  else { SendBitInform(0); }  //addr 8    , fix bits mask and  logic
SendStrobeSync ( ADDR_SYNCBLINK); //1
 
if ((BitsAddr_Blink&0x04)==0) { SendBitInform(1);  }  else { SendBitInform(0); }  //addr 4    , fix bits mask and  logic
SendStrobeSync ( ADDR_SYNCBLINK);  //2
 
if ((BitsAddr_Blink&0x02)==0) { SendBitInform(1);  }  else { SendBitInform(0); }  //addr 2   ,   fix bits mask and  logic
SendStrobeSync ( ADDR_SYNCBLINK); //3
 
if ((BitsAddr_Blink&0x01)==0) { SendBitInform(1);  }  else { SendBitInform(0); }  //addr 1  , fix bits mask and  logic
SendStrobeSync ( ADDR_SYNCBLINK);//4
 
 //without SyncWRRAM pulse , use after send all digits for blink control with TurnOnBlink(),TurnOffBlink(); 
 
 
 
 
SendMemWrRAMPulse();
return;
}
Добавлено через 20 минут
Для проверки реакции на основные кодовые комбинации и посылки в эмуляторе может понадобиться подпрограмма дешифрации семисегментного кода с знаками прочерка, подпрограмма декодирования знакоместа , выключенного , выделенного (мигающего ) разряда
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
char *decodedigit(uint8_t seg_code)
{
 
//seg_code=~seg_code;
switch(seg_code)
{
case 0b01110111:  return "0";   break ;  // a,b,e,g,f,c=1
case 0b00010010: return "1" ;   break ;  // c,f=1
case 0b01101011: return  "2" ;  break;   // a,c,d,e,g=1
case 0b01111010: return  "3" ;  break;   // a,c,d,f,g=1
case 0b01011110: return  "4" ;  break;   // a,b,c,d,f=1
case 0b01111100: return  "5" ;  break;   // a,b,d,f,g=1
case 0b01111101: return  "6" ;  break;   // a,b,d,e,f,g=1
case 0b01010010: return "7" ;  break;   // a,c,f =1
case 0b01111111:  return "8"  ;  break;   //a,b,c,d,e,f,g =1
case 0b01111110:  return "9" ;    break;   //a,d,c,d,f=1
case 0b0000100:  return  "-" ;  break; // symbol '-' for FM
case 0b0000000:  return  "\0 ";  break;  //   
 
case 0b11110111:  return "0.";   break ;  // a,b,e,g,f,c=1
case 0b10010010: return "1." ;   break ;  // c,f=1
case 0b11101011: return  "2." ;  break;   // a,c,d,e,g=1
case 0b11111010: return  "3." ;  break;   // a,c,d,f,g=1
case 0b11011110: return  "4." ;  break;   // a,b,c,d,f=1
case 0b11111100: return  "5." ;  break;   // a,b,d,f,g=1
case 0b11111101: return  "6." ;  break;   // a,b,d,e,f,g=1
case 0b11010010: return "7." ;  break;   // a,c,f =1
case 0b11111111:  return "8."  ;  break;   //a,b,c,d,e,f,g =1
//case 0b11111110:  return "9." ;    break;   //a,d,c,d,f=1
case 0b1000100:  return  "-." ;  break; // symbol '-' for FM
case 0b1000000:  return  " .";  break;  //   
default : return "\0" ; break ; 
}
return   " " ; 
}
Добавлено через 1 час 20 минут
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
DIGITS :            { "1"    "0"  "0."  "0"   "0"  "0"    "0" } ;{ "0" "0" "0."} { "0"  "0"}{"1"  "0"  "0"  "0."}
DCCODE :           0    ;    1  ;   2  ;   3  ;   4  ;   5   ;    6   ; ;    7 ;    8 ;    9 ;;   a  ;    b  ;;  c     ;  d   ;  e  ;   f   ;
 
nDCCODE           f     ;    e  ;   d  ;   c  ;   b ;    a   ;   9    ; ;    8 ;     7;      6;;  5  ;   4;; 3     ;   2  ;   1 ;   0   ;  
 
(самый дальний (последний в инструкции) по регистрам первыми , 8 анодных +4 )
1) nDCCODE8    (инверсный бит 3 адреса )
2) nDCCODE4    (инверсный бит 2 адреса)
3) nDCCODE2    (инверсный бит 1 адреса)
4) nDCCODE1    (инверсный бит 0 адреса)
5)   /д (если 1, то светится, будучи проинвертированным,как ноль открывает транзистор )
6)   /в (если 1, то светится, будучи проинвертированным,как ноль открывает транзистор )
7)   /б (если 1, то светится, будучи проинвертированным,как ноль открывает транзистор )
8)   /г (если 1, то светится, будучи проинвертированным,как ноль открывает транзистор )
9)   /е (если 1, то светится, будучи проинвертированным,как ноль открывает транзистор )
10)(если 1, то светится, будучи проинвертированным,как ноль открывает транзистор )
11) /а  (если 1, то светится, будучи проинвертированным,как ноль открывает транзистор )
12)(если 1, то светится, будучи проинвертированным,как ноль открывает транзистор )
 
потом запись в регистр памяти  (ИЗП ОЗУ=0)
     а
б       в
    г
д       е
    ж         
               и
Добавлено через 2 минуты
Уточнить инверсии

Добавлено через 15 минут
Код мерцающего разряда выбранного режима отправлять после всех цифр с адресом знакоместа
DIGITS : { "1" "0" "0." "0" "0" "0" "0" } ;{ "0" "0" "0."} { "0" "0"}{"1" "0" "0" "0."}
DCCODE : 0 ; 1 ; 2 ; 3 ; 4 ; 5 ; 6 ; ; 7 ; 8 ; 9 ;; a ; b ;; c ; d ; e ; f ;

Шина Информ:

1) DC_CODE_8 (номер мерцающего разряда , бит 3 прямой код,перепись по фронту СИ Мерц )
2) DC_CODE_4 (номер мерцающего разряда , бит 2 прямой код,перепись по фронту СИ Мерц )
3) DC_CODE_2 (номер мерцающего разряда , бит 1 прямой код,перепись по фронту СИ Мерц )
4) DC_CODE_1 (номер мерцающего разряда , бит 0 прямой код,перепись по фронту СИ Мерц )

(без ИЗП ОЗУ )



выключение мерцания по лог 1 на выкл мерц, вкл мерцания автоматически по сигналу СИ Мерц

Добавлено через 9 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  
 //у нас после вывода 34 инвертор ,
 // для отправки адреса знакоместа  в инверсном коде нужно выдавать 
 // код бита в прямом на пин 34 как на выход и сопровождать стробом СИ ОЗУ
//(по фронту на шине, ставить импульс 1 на выводе 36, подключенном у нас через еще один инвертор +инвертор на плате ) 
if ((BitsAddr&0x08)==0) { SendBitInform(0);  }  else { SendBitInform(1); }  //addr 8    , fix bits mask and  logic
SendStrobeSync ( ADDR_SYNCRAM); //1
 
if ((BitsAddr&0x04)==0) { SendBitInform(0);  }  else { SendBitInform(1); }  //addr 4    , fix bits mask and  logic
SendStrobeSync ( ADDR_SYNCRAM);  //2
 
if ((BitsAddr&0x02)==0) { SendBitInform(0);  }  else { SendBitInform(1); }  //addr 2   ,   fix bits mask and  logic
SendStrobeSync ( ADDR_SYNCRAM); //3
 
if ((BitsAddr&0x01)==0) { SendBitInform(0);  }  else { SendBitInform(1); }  //addr 1  , fix bits mask and  logic
SendStrobeSync ( ADDR_SYNCRAM);//4
Добавлено через 1 минуту
У нас в дешифраторе кодов зажигается по единице
uint8_t SevenSegment(uint8_t Digit , uint8_t Comma )
{

/*
LSB e; c; b; d; f; g; a; h MSB
a
b c
d
e f
g
h
1 on the inform bus means turn on segment
ecbdfga;
*/
uint8_t db=0;

switch (Digit){
//hagfdbce
case 0 : db= 0b01110111; break ; // a,b,e,g,f,c=1
case 1 : db= 0b00010010; break ; // c,f=1
case 2: db= 0b01101011; break; // a,c,d,e,g=1
case 3: db= 0b01111010; break; // a,c,d,f,g=1
case 4 : db= 0b01011110; break; // a,b,c,d,f=1
case 5: db= 0b01111100; break; // a,b,d,f,g=1
case 6: db= 0b01111101; break; // a,b,d,e,f,g=1
case 7: db= 0b01010010; break; // a,c,f =1
case 8: db= 0b01111111; break; //a,b,c,d,e,f,g =1
case 9: db= 0b01111110; break; //a,d,c,d,f=1
case f : db= 0b0000100; break; // symbol '-' for FM
//case c: db= 0b0000000; break; //
}


if(Comma==1) { db|=0b10000000; }// h
return db;
}

Добавлено через 9 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
//перед пином 34 инвертор D12,код битов прямой  , зажигается единицей на информ 
//, значит включение сегмента  посылать нулем по биту =1 , можно процедуру в  SendBitnInform () переименовать 
 db1=SevenSegment(Digit  , BitComma);
...отправить адрес n8,n4,n2,n1 
 
 
 
if ((db1&0x01)==0) { SendBitnInform(1);  }  else { SendBitnInform(0); }  //e
SendStrobeSync ( ADDR_SYNCRAM);//5        bit 0 ,LSB 
 
 
 
db1=  (db1>>1);
if ((db1&0x01)==0 ) { SendBitnInform(1);  }  else { SendBitnInform(0); }  //c
SendStrobeSync ( ADDR_SYNCRAM);//6        bit 1
 
 db1= (db1>>1);
if ((db1&0x01)==0) { SendBitnInform(1);  }  else { SendBitnInform(0); }  //b
SendStrobeSync ( ADDR_SYNCRAM);//7        bit 2
 
 db1= (db1>>1);
if ((db1&0x01)==0) { SendBitnInform(1);  }  else { SendBitnInform(0); }  //d
SendStrobeSync ( ADDR_SYNCRAM);//8       bit 3
 
  db1= (db1>>1);
if ((db1&0x01)==0) { SendBitnInform(1);  }  else { SendBitnInform(0); }  //f
SendStrobeSync ( ADDR_SYNCRAM);//9      bit 4
 
 
  db1= (db1>>1);
if ((db1&0x01)==0 ) { SendBitnInform(1);  }  else { SendBitnInform(0); }  //g
SendStrobeSync ( ADDR_SYNCRAM);//10     bit 5
 
 
db1= (db1>>1);
if ((db1&0x01)==0) { SendBitnInform(1);  }  else { SendBitnInform(0); }  //a
SendStrobeSync ( ADDR_SYNCRAM);//11    bit 6
 
db1=(db1>>1);
if ((db1&0x01)==0) { SendBitnInform(1);  }  else { SendBitnInform(0); }  //h
SendStrobeSync ( ADDR_SYNCRAM);//12   bit 7
Добавлено через 44 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
void SendBitsRAM(uint8_t BitsAddr, uint8_t Digit , uint8_t BitComma/*,  uint8_t BitsBlink*/)
{
/*
     a 
b        c
     d
e        f
     g
              h
1 on the inform bus means turn on segment
 
Inform n8; n4; n2 ; n1 ; e; c; b; d; f; g; a; h;
 
 
0 1 2 3 4 5 6      7 8 9         a b      c d e f      Addr
f  e d c b  a 9      8 7 6        5 4      3 2 1 0   ~Addr
x x x x x x x      x x x         x x      x x x x
 
     
*/
  
 uint8_t db1;
 
 db1=SevenSegment(Digit  , BitComma);  
 BitsAddr=~BitsAddr; /* send address bit using inverse code */
#define ADDR_SYNCRAM 15
 
/*  for set 1 on the bit Inform set 0 on the nInform (for pin 34 emulation )  */
/*  for set 0 on the bit Inform set 1 on the nInform (for pin 34 emulation )  */ 
 
 
Send_nInformBit_1_IfByteFalse((uint8_t)(BitsAddr&0x08));  //addr 8    , fix bits mask and  logic
SendStrobeSync ( ADDR_SYNCRAM); //1
 
Send_nInformBit_1_IfByteFalse((uint8_t)(BitsAddr&0x04)); //addr 4    , fix bits mask and  logic
SendStrobeSync ( ADDR_SYNCRAM);  //2
 
Send_nInformBit_1_IfByteFalse((uint8_t)(BitsAddr&0x02));  //addr 2   ,   fix bits mask and  logic
SendStrobeSync ( ADDR_SYNCRAM); //3
 
Send_nInformBit_1_IfByteFalse((uint8_t)(BitsAddr&0x01)); //addr 1  , fix bits mask and  logic
SendStrobeSync ( ADDR_SYNCRAM);//4
 
/* for turn on segment set 1  on the Inform Bus, set nIform(34)=0,  as the output */
 Send_nInformBit_0_IfFirtstBitTrue(  db1);  //e
SendStrobeSync ( ADDR_SYNCRAM);//5        bit 0 ,LSB 
db1=  (db1>>1);
Send_nInformBit_0_IfFirtstBitTrue(  db1);  //c
SendStrobeSync ( ADDR_SYNCRAM);//6        bit 1
db1= (db1>>1);
Send_nInformBit_0_IfFirtstBitTrue(  db1);  //b
SendStrobeSync ( ADDR_SYNCRAM);//7        bit 2
 
 db1= (db1>>1);
Send_nInformBit_0_IfFirtstBitTrue(  db1);  //d
SendStrobeSync ( ADDR_SYNCRAM);//8       bit 3
 
  db1= (db1>>1);
Send_nInformBit_0_IfFirtstBitTrue(  db1);  //f
SendStrobeSync ( ADDR_SYNCRAM);//9      bit 4
 
 
  db1= (db1>>1);
Send_nInformBit_0_IfFirtstBitTrue(  db1); //g
SendStrobeSync ( ADDR_SYNCRAM);//10     bit 5
 
 
db1= (db1>>1);
Send_nInformBit_0_IfFirtstBitTrue(  db1); //a
SendStrobeSync ( ADDR_SYNCRAM);//11    bit 6
 
db1=(db1>>1);
Send_nInformBit_0_IfFirtstBitTrue(  db1);  //h
SendStrobeSync ( ADDR_SYNCRAM);//12   bit 7
 
 
SendMemWrRAMPulse();
return;
}
Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
uint8_t CheckFirstBit(uint8_t db1)
{
 if ((db1&0x01)==0) { return 0 ;} else   { return 1 ; }
}
 
 
void Send_nInformBit_0_IfByteFalse(uint8_t dbyte1)
{
if (dbyte1==0) { SendBitInform(0);  }  else { SendBitInform(1); }  
return;
}
 
 void Send_nInformBit_1_IfByteFalse(uint8_t dbyte1)
{
if (dbyte1==0) { SendBitInform(1);  }  else { SendBitInform(0); }  
return;
}
void Send_nInformBit_0_IfFirtstBitTrue(uint8_t db1)
{
if (CheckFirstBit( db1)) { SendBitInform(0);  }  else { SendBitInform(1); }  
return;
}
 
void Send_nInformBit_1_IfFirtstBitTrue(uint8_t db1)
{
if (CheckFirstBit( db1)) { SendBitInform(1);  }  else { SendBitInform(0); }  
return;
}
Добавлено через 1 минуту
Проверить по схеме на корректность уровней и адаптировать под них другие подпрограммы, оптимизировать программы задержки .
0
7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
06.03.2020, 16:04  [ТС]
Некоторые файлы
Вложения
Тип файла: zip Г4-164_projtmp.zip (12.07 Мб, 10 просмотров)
0
7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
07.03.2020, 02:09  [ТС]
https://forum.arduino.cc/index.php?topic=107920.0

Добавлено через 2 минуты
https://www.mikrocontroller.net/topic/150282

Добавлено через 7 минут
http://www.cplusplus.com/reference/cstdlib/malloc/

Добавлено через 17 минут
В конце ввода массива с переменным количеством цифр (байтов ) может потребоваться, например такая подпрограмма (до достижения максимального количества цифр используется подпрограмма добавления введенной цифры в массив введенных цифр размером не больше допустимого и инкрементирование счетчика байтов (цифр(чисел), соответствующих скан-кодам или сообщениям тела данных кодов КОП(GPIB) через декодер,если точка(но не конец сообщения , а разделитель) , то не инкрементируется счетчик и присваивается значение переменной положения запятой ) ) , только для цифр (проработать положение переменной CommaPos)
C++
1
2
3
4
5
6
7
8
9
10
uint8_t *InitByteArray(uint8_t *Bytes, uint8_t Count, uint8_t NBytes    )//fix for CommaPos
 
{
uint8_t *tmpBytes; 
uint8_t i;
tmpBytes=(uint8_t)malloc ((size_t)NBytes );   //fix  metod of  memory allocation  ненадежно через приведенный тип ?
 for (i=0;i<NBytes ; i++) {  if (i<=Count)    {  tmpBytes[i]=Bytes[i]  } else { tmpBytes[i]=0;   }  }  //fix for CommaPos
  
return tmpBytes;
}
Добавлено через 11 минут
Можно к *ByteOut что нибудь с new (malloc(), delete[]) приделать (у нас new нет, пока так, на точки и запятые правильная реакция должна быть , на вторые защита от ошибок, как в фирменном случае ):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
volatile uint8_t AddByteDB(  uint8_t *num , uint8_t nmax, uint8_t *ByteOut , uint8_t *CommaPos   )
{
uint8_t  byte;
uint8_t number; 
  //get next chaar 
byte=GetGPIBByte ();
number=*num;
if(number>=nmax) { *num=nmax; return 1; }
if(byte==0x2e)  {    return 1; }
if((byte>=0x30)&&(byte<=0x39 ))  {   ByteOut[number]=byte;  *num+=1; return 0 ;}
if((byte==0x2c) &&(number<nmax)) {  *CommaPos=number;  return 0 ; }
 
 
}
Добавлено через 43 секунды
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
case 0x41:  //A      freq  , for example "A520.100,B80." or "A520.100," <=7 digits + comma
                     counter=0;
                     
                   if( PokeByteDB(   &counter ,  7,  BytesF  , &ByteFCommaPos   )==1) {goto label_001; }
                   if( PokeByteDB(   &counter ,  7,  BytesF  , &ByteFCommaPos   )==1) {goto label_001;  }
                   if( PokeByteDB(   &counter ,  7,  BytesF  , &ByteFCommaPos   )==1) {goto label_001; }
                   if( PokeByteDB(   &counter ,  7,  BytesF  , &ByteFCommaPos   )==1) {goto label_001;  }
                   if( PokeByteDB(   &counter ,  7,  BytesF  , &ByteFCommaPos   )==1) {goto label_001;  }
                   if( PokeByteDB(   &counter ,  7,  BytesF  , &ByteFCommaPos   )==1) {goto label_001;  }
                   if( PokeByteDB(   &counter ,  7,  BytesF  , &ByteFCommaPos   )==1) {goto label_001;  } 
                   if( PokeByteDB(   &counter ,  7,  BytesF  , &ByteFCommaPos   )==1) {goto label_001;  }
            label_001: 
                    ParseBytesF();      
            break;
Добавлено через 35 минут
https://ru.wikipedia.org/wiki/... 0%B8%D0%B2

Добавлено через 13 минут
Динамический массив для AVR на Си

Добавлено через 16 минут
http://fitu.npi-tu.ru/assets/f... -s-v6..pdf см . про malloc, calloc, realloc,free , для добавления в динамический массив следующего принятого байта в стек и переразметки массива (для компа бывает, для АВР может глючить или не потянет стабильно ,выполняется медленно ,сильно жрет ОЗУ и регистры , работать с uint8_t ).

Добавлено через 23 минуты
https://learnc.info/c/memory_allocation.html

Добавлено через 2 часа 31 минуту
Как правильно делать первичную разметку стека на 1 байт и добавлять по байту (применительно к AVR C в дальнейшем )?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
 
 
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
 
typedef unsigned char uint8_t;
 
 
#define CHAR_DOT 0x2E
#define CHAR_COMMA 0x2C
uint8_t  AddByteToStack( uint8_t *pArray , uint8_t tmpByte   , uint8_t *Counter, uint8_t NByte  )
{
      //preset CommaPos to last digit before program 
if( tmpByte==CHAR_DOT) { /*  SetCommaPos(CommaPos, *Counter); */ printf(" dot "); return 0; }
if( tmpByte==CHAR_COMMA) {   printf(" comma ");    return 1; } 
if( *Counter >=(--NByte ) ) {      return 1;  }
 if(   pArray ==NULL ) { pArray = (uint8_t *) malloc( (size_t) sizeof(uint8_t ));  *( pArray+ (*Counter) )=tmpByte; return  0;} 
  pArray = (uint8_t *)  realloc (pArray ,(size_t) NByte  )  ; 
*Counter +=1 ;
*( pArray+ (*Counter) )=tmpByte;
//strcat (pArray, tmpByte);
   
 
 return 0;
}
/*
 
uint8_t *InitByteArray(uint8_t *Bytes, uint8_t Count, uint8_t NBytes   )
{
uint8_t *tmpBytes; 
uint8_t i;
tmpBytes=(uint8_t)malloc ((size_t)NBytes );   //fix  metod of  memory allocation 
 for (i=0;i<NBytes ; i++) {  if (i<=Count)    {  tmpBytes[i]=Bytes[i]  } else { tmpBytes[i]=0;   }  }
  
return tmpBytes;
}
 
 
*/
 
 
 
uint8_t GetByte()
{
    char byte;
printf("\nInput byte " )    ;
scanf("%c",&byte);
    return (uint8_t)byte;
}
 
void PrintByte(uint8_t byte )
{
    
printf ("\n 0x%0.2x",(int)byte);    
}
 
 
int main( void )
{
 
 
uint8_t *Stack;
   //Stack=(uint8_t *) malloc((size_t)   sizeof(uint8_t ));
uint8_t count=0; 
uint8_t Flag=0;
uint8_t newbyte ;
 
while ( Flag==0) 
{ 
 newbyte =GetByte();
 
 printf("\n count=%d",(int) count);    PrintByte(newbyte);
 Flag=AddByteToStack( Stack , newbyte   , &count, 7 ) ;
 
  PrintByte(Stack[(int)count]);
 
}
 
 
 
   free( Stack );
   exit( 0 );
}
Добавлено через 6 минут
Если не "предразмечать" динамический извне (иначе можно и статический со скобками применить, не более 7 и просеивать , иногда так лучше , а возвращать переменной размерности под функцию (7 или 6 (заполнять 7) для частоты , 3 для ЧМ ,2 для АМ, 4 для выхода )), а размечать и наращивать изнутри программы добавления байта в стек (будет использоваться и для КОП, и для клавиатуры ) , как правильнее применять malloc ,realloc , можно ли без sizeof(uint8_t), у нас в байтах для однобайтных (если потом для контроллера )?

Добавлено через 1 час 6 минут
https://stackoverflow.com/ques... ction-in-c

Добавлено через 11 минут
https://www.log2base2.com/C/po... -in-c.html

Добавлено через 22 минуты
https://stackoverflow.com/ques... c-function

Добавлено через 24 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
uint8_t  *AddByteToStack( uint8_t *pArray , uint8_t tmpByte   , uint8_t *Counter, uint8_t NByte , uint8_t *Flag  )
{
      //preset CommaPos to last digit before program 
if( tmpByte==CHAR_DOT) { /*  SetCommaPos(CommaPos, *Counter); */ printf(" dot "); *Flag=0;  return pArray; }
if( tmpByte==CHAR_COMMA) {   printf(" comma ");  *Flag=1;    return pArray; } 
if( *Counter >=(--NByte ) ) {   *Flag=1;     return pArray;  }
if(pArray ==NULL ) 
{   
pArray = (uint8_t *) malloc( (size_t) sizeof(uint8_t )); 
*(pArray)=tmpByte;   //pArray[0]=tmpByte
++ *Counter   ; 
*Flag=0;  
return  pArray;
} 
else 
 
{
  pArray  = (uint8_t*)  realloc ( pArray ,(size_t) ( sizeof(pArray)+sizeof(uint8_t ))   )  ; 
  *Counter +=1;
  pArray[ (  *Counter  ) ] =tmpByte;
}
//strcat (pArray, tmpByte);
   
 
 return pArray;
}
/*
 
uint8_t *InitByteArray(uint8_t *Bytes, uint8_t Count, uint8_t NBytes   )
{
uint8_t *tmpBytes; 
uint8_t i;
tmpBytes=(uint8_t)malloc ((size_t)NBytes );   //fix  metod of  memory allocation 
 for (i=0;i<NBytes ; i++) {  if (i<=Count)    {  tmpBytes[i]=Bytes[i]  } else { tmpBytes[i]=0;   }  }
  
return tmpBytes;
}
 
 
*/
 
 
 
uint8_t GetByte()
{
    char byte;
printf("\n   Input byte " ) ;
scanf("%s",&byte);
    return (uint8_t)byte;
}
 
void PrintByte(uint8_t byte )
{
    
printf ("\n 0x%0.2x",(int)byte);    
}
 
 
int main( void )
{
 
 
uint8_t *Stack=NULL;
   //Stack=(uint8_t *) malloc((size_t)   sizeof(uint8_t ));
uint8_t count=0; 
uint8_t Flag=0;
uint8_t newbyte ;
 
while ( Flag==0) 
{ 
 newbyte =GetByte();
 
 printf("\n count=%d",(int) count);    PrintByte(newbyte);
 Stack=AddByteToStack(  Stack , newbyte   , &count, 7 ,&Flag ) ;
 
 // PrintByte(Stack[(int)count]);
 
}
 
 
 
   free( Stack );
   exit( 0 );
}
Добавлено через 1 минуту
Нужно ,чтобы после запятой было не более указанного количества знаков , до запятой переменное, не более требуемого (в зависимости от режима )

Добавлено через 3 минуты
Много места занимает и долго считается, может просто массивы со скобками сделать ? Но там про стек принятых символов равен пустому приводит к ветвлению . Можно "асимптотически" сделать. Тогда другие типы данных и типы данных в структурах.

Добавлено через 1 час 0 минут
Один из вариантов(доработать обработку запятых и количество знаков до и после запятой), можно и на указатели, массив с плавающим началом переделать


Добавлено через 32 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
 
 
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
 
typedef unsigned char uint8_t;
 
 
#define CHAR_DOT 0x2E
#define CHAR_COMMA 0x2C
/*
void increase(int** data)
{
    *data = realloc(*data, 5 * sizeof int);
}
*/
 
 
 
 
uint8_t  *AddByteToStack( uint8_t *pArray , uint8_t tmpByte  , uint8_t *Counter, uint8_t NByte , uint8_t *Flag  , uint8_t *DotPos   )
{
      //preset CommaPos to last digit before program
       
if( tmpByte==CHAR_DOT) {  *DotPos=*Counter;   printf(" dot "); *Flag=0;  return pArray; }
if( tmpByte==CHAR_COMMA) { /* *DotPos=*Counter;*/    printf(" comma ");  *Flag=1;    return pArray; } 
if( (*Counter ) >=(--NByte ) ) { *Flag=1;     return pArray;  }
if(pArray ==NULL ) 
{   
//pArray = (uint8_t*) malloc( (size_t) sizeof(uint8_t )); 
pArray = (uint8_t*) malloc( (size_t)1); 
  pArray[0] =tmpByte;   //pArray[0]=tmpByte
 *Counter=0;
 
*Flag=0;  
return  pArray;
} 
else 
 
{
 // pArray  = (uint8_t*)  realloc ( pArray ,(size_t) ( sizeof(pArray)+sizeof(uint8_t ))   )  ; 
    pArray  = (uint8_t*)  realloc ( pArray ,(size_t) ( sizeof(pArray)+1)   )  ;
    *Counter +=1;
  
   // *(pArray+ *Counter) =tmpByte;
    pArray[ (  *Counter  ) ] =tmpByte;
 
   
}
//strcat (pArray, tmpByte);
   
 
 return pArray;
}
/*
 
uint8_t *InitByteArray(uint8_t *Bytes, uint8_t Count, uint8_t NBytes   )
{
uint8_t *tmpBytes; 
uint8_t i;
tmpBytes=(uint8_t)malloc ((size_t)NBytes );   //fix  metod of  memory allocation 
 for (i=0;i<NBytes ; i++) {  if (i<=Count)    {  tmpBytes[i]=Bytes[i]  } else { tmpBytes[i]=0;   }  }
  
return tmpBytes;
}
 
 
*/
 
 
 
uint8_t GetByte()
{
    char byte;
printf("\n   Input byte " ) ;
scanf("%s",&byte);
    return (uint8_t)byte;
}
 
void PrintByte(uint8_t byte )
{
    
printf ("\n 0x%0.2x",(int)byte);    
}
 
 
int main( void )
{
 
 
uint8_t *Stack=NULL;
  
uint8_t count=0; 
uint8_t Flag=0;
uint8_t newbyte ;
uint8_t dotpos=2;
 
while ( Flag==0) 
{ 
 newbyte =GetByte();
 
    PrintByte(newbyte);
 Stack=AddByteToStack(  Stack , newbyte   , &count, 7 ,&Flag,&dotpos ) ;  //fix for smart comma input , add DotPos (or commaPos)
 
 //printf("\n count=%d",(int) count); 
 //PrintByte(Stack[(int)count ]);
 
}
 printf ("\n");
for(uint8_t i=0;i<7;i++) {  PrintByte(Stack[(int)i ]); if(i==dotpos){printf(" .");}}
 
   free( Stack );
   exit( 0 );
}
0
7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
07.03.2020, 13:53  [ТС]
Программа дописывания нового байта КОП в стек и подпрограмма ветвления КОП (дешифрации по буквам заголовка данных ) по прерыванию 3 и обработкт прерываний 1 и 2 от передней панели с дешифрацией немного другая (для компьютерного моделирования может потребоваться и та, что с ветвлением , для контроллера смотреть алгоритм в инструкции , флаги по прерываниям и формирование внутреннего минтерма дп (в плате связи, а не на шине КОП ) , инициирующего завершение "рукопожатия" после приема байта для КОП ).

Добавлено через 14 минут
Возможно ,для аналогичности алгоритма алгоритму из инструкции для точек 2, 7,8,6, 1 на блок-схеме в инструкции стек должен быть

C++
1
2
3
uint8_t FlagRevers;
uint8_t *StackKeyb;
uint8_t *StackGPIB;
обработчики должны содержать дешифраторы скан-кодов ; заголовков данных , тела данных(учитывать точку как запятую в цифрах и ограничение на колическтво ) , ограничителей данных

Добавлено через 3 минуты
Дешифрация до результирующих команд с двумя дешифраторами .

Можно прикинуть
C++
1
if((... /*Keyb */)|( .../*GPIB*/))
вместо
C++
1
 switch()  {   case: ...     default:  }
Добавлено через 59 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
#include "subroutines1.h"
 
 
//fix  variables, arguments , some data for subroutines 
 
 
 
 
 
void ParseKeyboard()
{
 
 
 
 /*        8_1    , after decode , fix  */
switch(ScanCode&ButtonsMask)
{
case BUTTON_0:
case BUTTON_1:
case BUTTON_2:
case BUTTON_3:
case BUTTON_4:
case BUTTON_5:
case BUTTON_6:
case BUTTON_7:
case BUTTON_8:
case BUTTON_9:
case BUTTON_COMMA:
case BUTTON_SHARP:
if(MemoryWriteModeOn())  {  WriteStatement(ScanCode); break;  }
if(MemoryRecallModeOn()) {   GetStatementFromMemory(ScanCode); break }
InputDigit();  
break;
 
 
case  BUTTON_F:   
                             SetDutyReg(Token_F );
                           break ;
 
case BUTTON_FM: 
                          TurnOnFM(); 
                            SetDutyReg(Token_FM);
                          break;
case BUTTON_AM:  
                            TurnOnAM(); 
                              SetDutyReg(Token_AM);
                             break;
case BUTTON_PM: 
                             TurnOnPM(); 
                                SetDutyReg(Token_PM);
                              break;
case BUTTON_MOD_OFF:
                              TurnOffModulation(); 
                                SetDutyReg(Token_ModOff);
                              break;
 /* 9   */
case BUTTON_EXT:  
                              PrepareExtModulation(); 
                              
                              break;
case BUTTON_STEP:
                               StepOnMode(); 
                              
                               break;
case BUTTON_OUT:  
                               OutputOn();   
                                 SetDutyReg(Token_Out); 
                                break; 
case BUTTON_LFO:  
                              ChangeLFOCode();   
                               
                              break;
case BUTTON_SHARP:
                              SetMemWrMode();  
                           
                              break;
case BUTTON_RECALL:
                             SetMemRecallMode();   
                             
                              break;
 /*  10   */
case BUTTON_MHz:
                            NormalizeFreq();                               
                             break;
case BUTTON_kHz:
                            if(CheckStepModeOn()) { NormalizeStep();}   
                             else {  /* 13_2 */    NormalizeFM();} 
                                 
                            break;
case BUTTON_PERCENT:
                             NormalizeAMCoef(); /* 14_2 */ 
                             
                             break;
case BUTTON_mV:
                            SetOutInputMode(0); 
                            NormalizeOutput(); /* 15_2 */ 
                            break;
 
case BUTTON_uV:
                            SetOutInputMode(1);
                             NormalizeOutput();
                             break;
case BUTTON_dBV:
                             SetOutInputMode(2);
                             NormalizeOutput(); 
                             break;
/* 11   */
case BUTTON_6dB:
                            if (!CheckModeAM())  { TurnOn6Db(); }   
                              
                             break; 
default: 
                           if(IsModeStep()) {  ChangeFreqOneStep(); /* 12_3 */ NormalizeFreq(); break; }   
 
                            ChangeStepParam();   // ? fix
                           break;
}
 /*  to  1  */ 
return ;
 
}
 
 
 
 
 
 
 
void CheckStackClear()
{
if (   /*check stack !=NULL, stack GPIB!=NULL */       )  {  /*fix*/ GetByteFromStack();  /*add decode*/ ParseKeyboard();      }
return ;
}
 
void InputByteGetAcept()
{
/*   7 , from Int3  */
//fix type of variables and decoder subroutines
InputByteGPIB();
Send_data_accept();
if  (IfNotCommaGPIBReceived())  { PushByteToStack();  return ;  /* to point 1 */     }
else {   /* 6_1 */ CheckStackClear() ;   return ;  /* to point 1 */    }
return;   /* to point 1 */ 
}
 
 
 
 
void ParseInterrupts()
{
/*  2    */
AnalyseInterrupt_InputData();
if (Int3Flag==1) {    /* 7  */  /* add decoder subroutines for GPIB  */  }
if (Int2Flag==1) {    /* 8  */  /* add decoder subroutine  */  ParseKeyboard();   }
 
mode=SetSelectedFunctionParams();
 
switch (mode)
case MODE_FREQ:    /* 12_1  */
               NormalizeFreq(); 
                 break;
case MODE_FM:        /* 13_1  */
                NormalizeFM();
                break;
case MODE_AM :     /* 14_1  */
               NormalizeAMCoef(); 
               break;
default :
                 NormalizeOutput1();  /* 15_1  */
                 break;
}
 
return;
}
 
 
 
 
 
 
 
void   ParseFlags1()
{
 
if ((flag1&FLAG_PARSECODE_FM)!=0) { ParseCodesFM(); ParseCodesHFO();  return;  }
if((flag1&FLAG_PARSECODE_AM)!=0) { ParseCodesAM();   return; }            
if((flag1&FLAG_PARSECODE_OUT!=0) { ParseCodesAtt();  ParseStaticCommands();  ParseCodesOut();  return; } 
if((flag1& FLAG_PARSECODE_FREQ)!=0) {  ParseCodesDVDC(); ParseCodesBand(); ParseStaticCommands() CheckFMMax();  
                             return;  }
                         
 
if((flag2&FLAG_INC_STEP)!=0)   {  IncStep();  return;}
/*  3   */
if((flag2&FLAG_DEC_STEP)!=0)   { DecStep();  return;}
 
if((flag3&FLAG_TURN_OFF)!=0)  { TurnOffUnusedMode(); return;  }
if((flag3&FLAG_DISP_ERROR)!=0)  { DisplayErrorFM(); return; }
if((flag3&FLAG_DISP_FM)!=0)  { DisplayFMValue();  return; }
if((flag3&FLAG_DISP_AM)!=0)  { DisplayAMValue();  return;  }
if((flag3&FLAG_DISP_OUT)!=0)  { DisplayOutValue();  return; }
if((flag3&FLAG_DISP_FREQ)!=0)  { DisplayFreqValue();  return;  }
/*  4   */ 
if((flag3&FLAG_BLINK_OFF)!=0)  { SendBlinkOff();  return; }
if((flag3&FLAG_BLINK_CODE)!=0)  { SendBlinkCode();  return; }
 
 
if((flag4&FLAG_MODE)!=0)  { SendStaticCommands(); return;  }
if((flag4&FLAG_LFO)!=0)  { SendLFOCodes();  return;  }
if((flag4&FLAG_FM_CODE)!=0)  { SendFMCodes();  return;  }
if((flag4&FLAG_AM_CODE)!=0)  { SendAMCodes(); return;  }
/*  5  */
if((flag4&FLAG_ATT_CODE)!=0)  { SendAttCodes();  return;  }
if((flag4&FLAG_HFO_CODE)!=0)  { SendHFOCodes();  return;  }
if((flag4&FLAG_DVDC_CODE)!=0)  { SendDVDCCodes();  return; }
/*  6  */ 
 
 
 
/*  1   */
return;
}
 
 
 
 
 
 
 
 
 
 
 
 
void ParseFlags()
{
//SetDutyRegDefault() after init subroutine once 
//
if  (DutyRegZero())  {  SendMemWr();   if  (( Int3Flag==0)|( Int2Flag==0)|( Int1Flag==0)) {  ;  /* loop while not interrupt */} else        { ParseInterrupts(); break  ;  }  }
SetFlagZero();
ParseFlags1();
 
//1
}
Добавлено через 3 минуты
C++
1
((flag1&FLAG_PARSECODE_FM)!=0)  или ((flag1&FLAG_PARSECODE_FM)==0) и т.д.
определиться с отрицательностью (для ==0 ) логики флагов после сброса
(у нас по умолчанию нули в ячейках и положительная логика, но можно инициализировать флаги ),
хотя с нулем результат и маску сравнивать проще
Вообще, это обобщенно,упрощенно , функционально , для юзеров, когда он в сборе
0
7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
07.03.2020, 21:42  [ТС]
Шаблон с модальными окнами (дописать подпрограммы , под DevC++)
Вложения
Тип файла: zip keyboardio_modal_template.zip (74.4 Кб, 11 просмотров)
0
7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
08.03.2020, 01:03  [ТС]
добавил кнопки раворачивания дочерних окон
Вложения
Тип файла: zip keyboardio_templ.zip (149.8 Кб, 8 просмотров)
0
7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
09.03.2020, 05:06  [ТС]
Данные с КОП
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Int3=1 
 
Bit=/0=1 (don't read )
 
1)
 prepare to read from LD using PIN34 
Send SyncLD      
read nDB0   (poke to nD0)
2)
 prepare to read from LD using PIN34 
Send SyncLD      
read nDB1   (poke to nD1)
3)
 prepare to read from LD using PIN34 
Send SyncLD      
read nDB2  (poke to nD2)
4)
 prepare to read from LD using PIN34 
Send SyncLD      
read nDB3  (poke to nD3)
5)
 prepare to read from LD using PIN34 
Send SyncLD      
read nDB4 (poke to nD4)
6)
 prepare to read from LD using PIN34 
Send SyncLD      
read nDB5 (poke to nD5)
7)
 prepare to read from LD using PIN34 
Send SyncLD      
read nDB6 (poke to nD6)
8)
 prepare to read from LD using PIN34 
Send SyncLD      
read /0=1   (poke to nD7)
 
 
DBInput=~DBDBInput;
// теперь DBInput в положительной логике, как в посылаемых исходных кодах 
// (на переключателях , логически ), старший бит равен 0   
Send_data_accept
Добавлено через 42 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
uint8_t GetBitInformLD ( )
{
SetPinsDefault1();
SetPin34Input();   
SetAddrInformInLD();
//SetPin34Input(); 
if(  CheckPin34In()==0) { return 0x00  ;   } else  { return 0x01  ; }
 
}
 
 
 
 
uint8_t GetByteLD(  )
{
 
 
uint8_t db ;
// nLD0 ,nLD1,nLD2,nLD3,nLD4,nLD4,nLD5,nLD6, 1 
 
 db=0; 
 
SetPin34Input();  
//fix SendStrobeSync to 50 us only for  LD  ,remove set pin 34 out  for this subroutine 
SendPulseSync50us(ADDR_SYNC);  //Pin36 to multiplexer ,Sync 
if (GetBitInformLD ( ) ==0) { db|=0x01; } //nLD0
 
SendPulseSync50us(ADDR_SYNC);  //Pin36 to multiplexer ,Sync 
if (GetBitInformLD ( ) ==0) { db|=0x02; } //nLD1
 
SendPulseSync50us(ADDR_SYNC);  //Pin36 to multiplexer ,Sync 
if (GetBitInformLD ( ) ==0) { db|=0x04; } //nLD2  
 
SendPulseSync50us(ADDR_SYNC);  //Pin36 to multiplexer ,Sync 
if (GetBitInformLD ( ) ==0) { db|=0x08; } //nLD3  
 
SendPulseSync50us(ADDR_SYNC);  //Pin36 to multiplexer ,Sync 
if (GetBitInformLD ( ) ==0) { db|=0x10; } //nLD4 
 
SendPulseSync50us(ADDR_SYNC);  //Pin36 to multiplexer ,Sync 
if (GetBitInformLD ( ) ==0) { db|=0x20; } //nLD5
  
SendPulseSync50us(ADDR_SYNC);  //Pin36 to multiplexer ,Sync 
if (GetBitInformLD ( ) ==0) { db|=0x40; } //nLD6   
   
SendPulseSync50us(ADDR_SYNC);  //Pin36 to multiplexer ,Sync 
//if (GetBitInformLD ( ) ==0) { db|=0x80; } //n0    
 
 //SendPin38_Pulse1_20uS();
return db;
}
Добавлено через 14 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 
void  SendPin36Pulse1()
{
delay_us(1);
SetPin36High();  //send pulse 
delay_us(50);  //fix
SetPin36Low();   //not active  
delay_us(40);  //fix 
}
 
 
void  SendPin36Pulse2()
{
delay_us(1);
SetPin36High();  //send pulse 
delay_us(40);  //fix
SetPin36Low();   //not active  
delay_us(40);  //fix 
}
 
void SendPulseSyncInLD( )
{
SetPinsDefault1();
SetPin34In(); 
SetAddrSync (ADR_SYNC); 
SendPin36Pulse1(); 
}
 
 
void SendPulseSyncInGCD( )
{
SetPinsDefault1();
SetPin34In(); 
SetAddrSync ( ADDR_SYNC_POOL); 
SendPin36Pulse2(); 
}
Добавлено через 9 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
uint8_t GetByteLD(  )
{
 
 
uint8_t db ;
// nLD0 ,nLD1,nLD2,nLD3,nLD4,nLD4,nLD5,nLD6, 1 
 
 db=0; 
 
SetPin34Input();  
 
SendPulseSyncInLD( );  //Pin36 to multiplexer ,Sync 
if (GetBitInformLD ( ) ==0) { db|=0x01; } //nLD0
 
SendPulseSyncInLD( );  //Pin36 to multiplexer ,Sync 
if (GetBitInformLD ( ) ==0) { db|=0x02; } //nLD1
 
SendPulseSyncInLD( );  //Pin36 to multiplexer ,Sync 
if (GetBitInformLD ( ) ==0) { db|=0x04; } //nLD2  
 
SendPulseSyncInLD( ); //Pin36 to multiplexer ,Sync 
if (GetBitInformLD ( ) ==0) { db|=0x08; } //nLD3  
 
SendPulseSyncInLD( ); //Pin36 to multiplexer ,Sync 
if (GetBitInformLD ( ) ==0) { db|=0x10; } //nLD4 
 
SendPulseSyncInLD( );  //Pin36 to multiplexer ,Sync 
if (GetBitInformLD ( ) ==0) { db|=0x20; } //nLD5
  
SendPulseSyncInLD( ); //Pin36 to multiplexer ,Sync 
if (GetBitInformLD ( ) ==0) { db|=0x40; } //nLD6   
   
SendPulseSyncInLD( );  //Pin36 to multiplexer ,Sync 
if (GetBitInformLD ( ) ==0) { db|=0x80; } //n0    
  
 
 
SendPulse_data_accept(); //optimize plce of this subroutine 
return db;
}
 
uint8_t GetByteGCd(  )
{
 
 
uint8_t db ;
//
 
 db=0; 
 
 
 
  
SendPulseSyncInGCD( );  //Pin36 to multiplexer ,SyncPool
if (GetBitInformGCd ( )==0) { db|=0x01; } // 
SendPulseSyncInGCD( );  //Pin36 to multiplexer ,SyncPool
if (GetBitInformGCd ( ) ==0) { db|=0x02; } // 
SendPulseSyncInGCD( );  //Pin36 to multiplexer ,SyncPool
if (GetBitInformGCd ( ) ==0) { db|=0x04; } // 
SendPulseSyncInGCD( );  //Pin36 to multiplexer ,SyncPool
if (GetBitInformGCd ( ) ==0) { db|=0x08; } //  
SendPulseSyncInGCD( );  //Pin36 to multiplexer ,SyncPool
if (GetBitInformGCd ( )==0) { db|=0x10; } // 
SendPulseSyncInGCD( ); //Pin36 to multiplexer ,SyncPool
if (GetBitInformGCd ( ) ==0) { db|=0x20; } // 
SendPulseSyncInGCD( );  //Pin36 to multiplexer ,SyncPool
if (GetBitInformGCd ( ) ==0) { db|=0x40; } //
SendPulseSyncInGCD( );  //Pin36 to multiplexer ,SyncPool    
if (GetBitInformGCd ( ) ==0) { db|=0x80; } //   
 //fix sub
 
//optimize inversion of the data 
 
 
return db;
}
Добавлено через 40 минут
В нашей программе в сообщениях при нажатии кнопок бит ,посылаемый первым , отображается слева , когда валкодер крутят на 1 позицию по часовой стрелке, посылка равна восемь нулей. При ДУ ( при совпадении МАП , ложном ОИ, если ДУ истинно ,нет разадресации,нет ПНМ,ВНМ , когда горит светодиод ДУ ) прерывания с клавиатуры закрыты , опрос для кодов от валкодера и клавиатуры программно не подается.

Добавлено через 7 минут
Для совпадения наших битов с принятыми можно записать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
uint8_t GetByteGCd(  )
{
 
 
uint8_t db ;
//
 
 db=0; 
 
//nr0;nc0;nr2;nr1;nc1;x;x;x
 
  
SendPulseSyncInGCD( );  //Pin36 to multiplexer ,SyncPool
if (GetBitInformGCd ( )!=0) { db|=0x01; } // 
SendPulseSyncInGCD( );  //Pin36 to multiplexer ,SyncPool
if (GetBitInformGCd ( )!=0) { db|=0x02; } // 
SendPulseSyncInGCD( );  //Pin36 to multiplexer ,SyncPool
if (GetBitInformGCd ( )!=0) { db|=0x04; } // 
SendPulseSyncInGCD( );  //Pin36 to multiplexer ,SyncPool
if (GetBitInformGCd ( ) !=0) { db|=0x08; } //  
SendPulseSyncInGCD( );  //Pin36 to multiplexer ,SyncPool
if (GetBitInformGCd ( )!=0) { db|=0x10; } // 
SendPulseSyncInGCD( ); //Pin36 to multiplexer ,SyncPool
if (GetBitInformGCd ( )!=0) { db|=0x20; } // 
SendPulseSyncInGCD( );  //Pin36 to multiplexer ,SyncPool
if (GetBitInformGCd ( )!=0) { db|=0x40; } //
SendPulseSyncInGCD( );  //Pin36 to multiplexer ,SyncPool    
if (GetBitInformGCd ( )!=0) { db|=0x80; } //   
 
 
7 6  5  4    3     2     1      0 
x;x;x;nc1;nr1;nr2;nc0;nr0;      
 
return db;
}
, первый бит будет добавляться в младший разряд , последний в последние , а на положительность направления приращения проверяют сравнением байта скан-кода по прер 1 после приема 8 бит (каждый после СИ ОПР ) с нулем. Тогда записать скан -коды задом наперед и перевести в двоичные , обрабатывать по маске без 3 последних . Если с этим определились , программу можно упростить до "гридликовых" кодов, занося их в дефайны правильно .

Добавлено через 26 минут
Доработать эмулятор для возможности ввода с 2 и 3 дочерних окон ( делать окно активным, или уточнить как это сделать ) .

Добавлено через 14 минут
посмотреть в книге Петзольда (и т.д. ) .

Добавлено через 3 часа 54 минуты
В виртуалку можно добавить хендлеры контролов, заменяющих светодиоды, пробросив их от заданного дочернего окна
при вызове, а вот из окна в окно и с активным дочерним окном пока проблемы (не вводится, не делается активным, но кнопка нажимается, переписать ) :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
uint8_t GPIB_BYTE;
int ADL=0;  //you can temporary set it into 1 and build  alt.  edition  without ATN=1 layer 
 
void SetLed(  HWND hwnd  , int ItemId, int led_on)
{
if(led_on){ SendMessage(GetDlgItem(  hwnd, ItemId ) ,  BM_SETCHECK ,TRUE,  0);}
else { SendMessage(GetDlgItem(  hwnd, ItemId ) ,  BM_SETCHECK ,FALSE,  0);}
return;
}
 
 
void SetRENLed(HWND hwnd, int ledren_on )
{
SetLed( hwnd,  IDC_LED_REN,   ledren_on);
return;
}
 
void SetPLLSegment(HWND hwnd,int segpll_on )
{
SetLed(  hwnd,  IDC_PLL_SEGMENT_M,   segpll_on);
return;
}
 
 
void SetTextOutLD(HWND hwnd, uint8_t byte_ttl)
{
uint8_t  byteout=~byte_ttl;
char    edittxt[25]    ;
int b[8];
 
byteout|=0x80;
 
if((byteout&0x01)!=0) {  b[0]= 1 ;  } else  {  b[0]= 0 ;  }
if((byteout&0x02)!=0) {  b[1]= 1 ;  } else  {  b[1]= 0 ;  }
if((byteout&0x04)!=0) {  b[2]= 1 ;  } else  {  b[2]= 0 ;  }
if((byteout&0x08)!=0) {  b[3]= 1 ;  } else  {  b[3]= 0 ;  }
if((byteout&0x10)!=0) {  b[4]= 1 ;  } else  {  b[4]= 0 ;  }
if((byteout&0x20)!=0) {  b[5]= 1 ;  } else  {  b[5]= 0 ;  }
if((byteout&0x40)!=0) {  b[6]= 1 ;  } else  {  b[6]= 0 ;  }
if((byteout&0x80)!=0) {  b[7]= 1 ;  } else  {  b[7]= 0 ;  }
sprintf(edittxt, "(8th)%d%d%d%d%d%d%d%d(1st)",b[7],b[6],b[5],b[4],b[3],b[2],b[1],b[0]      );
//snprintf()
SetDlgItemText(hwnd,IDC_OUT_LD , edittxt );
 
}
 
 
 
 
 
int CheckMLA(HWND hwnd , uint8_t ByteVal )
{
if (ByteVal  ==0x3F) {return 0; }
if(  ((ByteVal &0x01)!=0)&&   (IsDlgButtonChecked(hwnd, IDC_A1_TTL) )){  
if(  ((ByteVal &0x02)!=0)&&   (IsDlgButtonChecked(hwnd, IDC_A2_TTL) )){   
if(  ((ByteVal &0x04)!=0)&&   (IsDlgButtonChecked(hwnd, IDC_A3_TTL) )){ 
if(  ((ByteVal &0x08)!=0)&&  (IsDlgButtonChecked(hwnd, IDC_A4_TTL) )){ 
if(  ((ByteVal &0x10)!=0)&&  (IsDlgButtonChecked(hwnd, IDC_A5_TTL) )){ 
return 1;
}}}}}
return 0;
}
 
 
void GetByteGPIBFromEditbox( HWND hwnd )
{
int editlength;
char edittxt[3]={'2','0',0};
uint8_t ByteVal=0x00;
 GetDlgItemText(hwnd, IDC_INPUT_DB_GPIB , edittxt, 3);
editlength=strlen(edittxt);
 
ByteVal =(uint8_t ) atoi(edittxt ) ;
 
 
 
if(IsDlgButtonChecked(hwnd, IDC_REN_TTL) ){ 
if(!IsDlgButtonChecked(hwnd, IDC_IFC_TTL) ){
if( IsDlgButtonChecked(hwnd, IDC_ATN_TTL) ){
 
if( ByteVal  ==0x01){        ADL=0;SetRENLed( hwnd,0 );  }
// if( ByteVal  ==0x14){   /* DCL   restart controller */   ADL=0;  SetRENLed( hwnd,0 );}
//if(( ByteVal  ==0x04)&&(ADL==1)     ){  /* SDC restart controller */     ADL=0;  SetRENLed( hwnd,0 );}
if((ByteVal&0b11110000)==0x20)
{
if(CheckMLA( hwnd ,  ByteVal )) {   ADL=1; } 
 
//fix logic
 
 }
 
}}}
 
if   (ADL==1) { SetRENLed( hwnd,1 ); }   else {   SetRENLed( hwnd,0 );  }
 
if( IsDlgButtonChecked(hwnd, IDC_REN_TTL) ){ 
if(! IsDlgButtonChecked(hwnd, IDC_IFC_TTL) ){
if(! IsDlgButtonChecked(hwnd, IDC_ATN_TTL) ){
if(ADL==1){    // ~   , after  ACDS, for handshake successful , if ADL =1 check 
 
SetTextOutLD(hwnd, ByteVal);
SendMessage(GetDlgItem(  hwnd,  IDC_DATA_ACCEPT ) ,  BM_SETCHECK ,TRUE,  0);
  
 Beep(523,500); //only for emulator, to view  accept  
SendMessage(GetDlgItem(  hwnd,  IDC_DATA_ACCEPT ) ,  BM_SETCHECK ,FALSE,  0);
 
MessageBox(NULL, edittxt,  " DB  ", 0);
 
 
}}}}
 
 
}
Добавлено через 3 часа 42 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
bool CompareAddress(uint8_t DB, uint8_t MLA     )
{
//D5_2 and D10
if (DB&1F)==MLA)  { return TRUE ;}  else {return FALSE; }
 
}
 
 
 
void DC_D9(uint8_t DB_TTL, bool *DC1, bool *DC9) 
{
switch(DB_TTL&0x0F)
{
case 1:  *DC1=1; *DC9=0; break;
case 9: *DC1=0;   *DC9=1; break;
default : *DC1=0; *DC9=0; break;  
}
return;
}
 
 
 
 
bool  Get_KD15(uint8_t DB_TTL, bool DC9  )
{
bool y1,y2,y3;
y1= (!( (DC9)&&((DB_TTL&0x02)!=0)&&((DB_TTL&0x04)!=0) ));
y2=1^(DB_TTL&0x10);
y3=((!y1)&(!y2));
return y3;
}
 
 
 
void DC_D8_D11_D3  ( uint8_t DB_TTL,  bool ATN_TTL ,bool D13_12, bool Q_D15,bool *y1_D13 )
{
uint8_t inDC;
bool  DC0  ;
 
inDC=(DB_TTL&0x07);
if(!ATN_TTL) { inDC|=0x08;   }
switch(inDC)
{
case 0:   DC0=1;   break;
default :   DC0=0;  break;
}
 
bool  x1_D13= (!(Q_D15& DC0))  ;
if(D13_12) { *y1_D13=0;    }
else {  *y1_D13=(!x1_D13);     }
 
return;
}
 
 
void DC_D8_D7_2_CD15 ( uint8_t DB_TTL,  bool ATN_TTL ,bool D13_12,  bool *y2_D13 , bool *y3_D13  )
{
uint8_t inDC;
bool   DC2,    DC3  ;
 
inDC=(DB_TTL&0x07);
if(!ATN_TTL) { inDC|=0x08;   }
switch(inDC)
{
case 0:      DC2=0; DC3=0;   break;
case 2:     DC2=1;  DC3=0; break;
case 3:     DC2=0;  DC3=1; break;
default :   DC2=0;  DC3=0; break;
}
 
 
bool  x2_D13=(!(DC2& DC3))  ; 
bool  x3_D13=FALSE;
if(D13_12) { *y2_D13=0; *y3_D13=0;  }
else {    *y2_D13=(!x2_D13); *y3_D13=(!x3_D13); }
 
return;
}
 
 
 
 
 
/*
C      J     K    R    Qn       nQn
rise  0      0     0    Qn-1    !Qn-1
rise  1      0     0    1           0
rise  0      1     0    0           0
rise  1      1     0    !Qn-1   !Qn-1
x      x      x     1    0           1
 
 
*/
void TriggerD15( bool R, bool S,  bool J1, bool K1, bool Crise1  ,    bool *Qout1, bool *nQout1     )
{
static  bool Q1, nQ1;
//static  bool C1;
 
 
 
//problem with rise detection
if (Crise1) 
{
  
if((J1)&(K1))  { Q1= Q1;      nQ1=nQ1;        } 
if((J1)&(!K1)) { Q1=TRUE; nQ1=FALSE; }
if((K1)&(!J1)) { Q1=FALSE; nQ1=TRUE; } 
if((J1)&(K1))  { Q1=nQ1;      nQ1=Q1;         } 
 if(S1) { Q1=TRUE; nQ1=FALSE; }
if(R1) { Q1=FALSE; nQ1=TRUE; }
}
 
if(S1) { Q1=TRUE;   nQ1=FALSE; }
if(R1) { Q1=FALSE; nQ1=TRUE;  }
 
 
return;
}
 
 
 
void TriggerD15_2( bool R2, bool S2, bool J2, bool K2, bool Crise2  ,    bool *Qout2, bool *nQout2     )
{
static  bool Q2, nQ2;
 
 
  
//problem with rise detection
 
if (Crise2) 
{
 //C1=C;
if((J2)&(K2))  { Q2= Q2;      nQ2=nQ2;        } 
if((J2)&(!K2)) { Q2=TRUE; nQ2=FALSE; }
if((K2)&(!J2)) { Q2=FALSE;nQ2=TRUE; } 
if((J2)&(K2))  { Q2=nQ2;       nQ2=Q2;         } 
 if(S2) { Q2=TRUE;  nQ2=FALSE; }
if(R2) { Q2=FALSE; nQ2 =TRUE; }
}
 
if(S2) { Q2=TRUE;   nQ2=FALSE; }
if(R2) { Q2=FALSE; nQ2=TRUE;  }
 
 
return;
}
 
bool RD15_D6( bool nrtl,  bool REN_TTL ,bool dc1, bool   d13_y1 )
{
return ( (!nrtl)|(!REN_TTL )|( !((dc1)&(d13_y1))) );
}
 
 
 
void ParseDCD12_D3(  bool ATN_TTL , inNQD15    , bool *y1_pin3, bool *y2_pin8)
{
 bool y1= ((!ATN_TTL)&(!inNQD15 ));
*y1_pin3=y1;
 bool y2=(y1 |ATN_TTL);
 *y2_pin8=(!y2);
 
}
 
bool  D12_D16_PARSEElement(bool ATN_TTL, bool inNQD15 , bool inA, bool inB)
{
bool inAE,inBE;
ParseDCD12_D3( ATN_TTL , inNQD15    , inBE, inAE);
return(  ((inA)&(inAE))    |    ((inB)&(inBE))   );
}
 
void ParseD14_2( bool S , bool C,  bool inD, bool *outQ  )
{
static  bool Q1 ;
if(C) {  Q1=inD;  }   
if(S) {  Q1=0;       }
 
 
*outQ =Q1;
}
 
void ParseD14_1( bool S , bool C,  bool inD, bool *outQ  )
{
static  bool Q1 ;
if(C) {  Q1=inD;  }   
if(S) {  Q1=0;       }
 
 
*outQ =Q1;
}
Добавлено через 2 часа 30 минут
Проверить отрицательность логики по прер1, прер2 и прер3 (особенно ).
Инд ДУ =0 ( полож. )(выход 14 = 1 ), когда триггер сброшен (прибор разадресован, хотя бы по кнопке на передней панели ),
на выходе 11 D11.4 приоритетно лог. 1 от нуля , тогда прер3=1 ТТЛ , нет сигнала (отрицательная логика ).

Добавлено через 48 секунд
Схему прерываний дорабатывать.

Добавлено через 30 минут
decode.h (может потребоваться для виртуалки и моделирования, подключаемые файлы и внешние триггерные модули подключать в файле над ним , логика ТТЛ, коды шин для подпрограмм приводятся к положительной логике внутренней шины после ТТЛизации отрицательной логики с открытым коллектором для шины и положительной с ОК для ГП и ДП ( отрицательной для нГП, нДП) )
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
...
 
 
 
bool CompareAddress(uint8_t DB, uint8_t MLA     )
{
//D5_2 and D10
if (DB&1F)==MLA)  { return TRUE ;}  else {return FALSE; }
 
}
 
 
 
void DC_D9(uint8_t DB_TTL, bool *DC1, bool *DC9) 
{
switch( (DB_TTL&0x0F))
{
case 1:  *DC1=1; *DC9=0; break;
case 9: *DC1=0;   *DC9=1; break;
default : *DC1=0; *DC9=0; break;  
}
return;
}
 
void DC_D9_DC1 (uint8_t DB_TTL, bool *DC1 ) 
{
switch(DB_TTL&0x0F)
{
case 1:  *DC1=1;   break;
case 9: *DC1=0;    break;
default : *DC1=0;   break;  
}
return;
}
 
void DC_D9_DC9(uint8_t DB_TTL,  bool *DC9) 
{
switch(DB_TTL&0x0F)
{
case 1:    *DC9=0; break;
case 9:    *DC9=1; break;
default :  *DC9=0; break;  
}
return;
}
 
 
 
 
 
bool  Get_KD15(uint8_t DB_TTL, bool DC9  )
{
bool y1,y2,y3;
y1=(bool)(!( (DC9==TRUE)&&((DB_TTL&0x02)!=0)&&((DB_TTL&0x04)!=0) ));
y2=(bool)(1^( DB_TTL &(0x10) )  );
y3=(bool)((!(y1==TRUE))&(!(y2==TRUE)));
return y3;
}
 
 
void DC_D8_D11_1  ( uint8_t DB_TTL,  bool ATN_TTL , bool Q_D15, bool *x1_D13 )
{
uint8_t inDC;
bool  DC0  ;
 
inDC=(DB_TTL&0x07);
if(!(ATN_TTL)) { inDC|=0x08;   }
switch(inDC)
{
case 0:   DC0=1;   break;
default :   DC0=0;  break;
}
 
bool  x1__D13= (!(Q_D15& DC0))  ;
*x1_D13 =(!(x1__D13));
return;
}
 
 
void DC_D8_D11_D13_1  ( uint8_t DB_TTL,  bool ATN_TTL , bool D13_12, bool Q1_D15, bool *y1_D13 )
{
uint8_t inDC;
bool  DC0  ;
 
inDC=(DB_TTL&0x07);
if(!(ATN_TTL) ) { inDC|=0x08;   }
switch(inDC)
{
case 0:    DC0=1;   break;
default :   DC0=0;  break;
}
 
bool  x1_D13= (!((Q1_D15)& (DC0)) )  ;
if(D13_12==TRUE) { *y1_D13=FALSE;    } else {  *y1_D13=(!(x1_D13));     }
 
return;
}
 
 
 
 
void DC_D8_D7_2_D13_2 ( uint8_t DB_TTL,  bool ATN_TTL ,bool D13_12,  bool *y2_D13   )
{
uint8_t inDC;
bool   DC2, DC3   ;
 
inDC=(DB_TTL&0x07);
if(!ATN_TTL) { inDC|=0x08;   }
switch(inDC)
{
case 0:      DC2=0; DC3=0;   break;
case 2:     DC2=1;  DC3=0; break;
case 3:     DC2=0;  DC3=1; break;
default :   DC2=0;  DC3=0; break;
}
 
bool  x2_D13=(!((DC2)&(DC3)))  ; 
 
if(D13_12==TRUE) { *y2_D13=FALSE;   } else {    *y2_D13=(!(x2_D13));   }
 
return;
}
 
void DC_D13_3 (  bool D13_12,    bool *y3_D13  )
{
 
bool  x3_D13=FALSE;
if(D13_12) { *y3_D13=0;  }  else {  *y3_D13=(!(x3_D13)); }
 
return;
}
 
 
 
 
 
 
 
 
bool RD15_D6( bool nrtl,  bool REN_TTL ,bool dc1, bool   d13_y1 )
{
return ( (!nrtl)|(!(REN_TTL) )|( !((dc1)&(d13_y1))) );
}
 
 
 
void ParseDCD12_D3(  bool ATN_TTL , inNQD15    , bool *y1_pin3, bool *y2_pin8)
{
 bool y1= ((!ATN_TTL)&(!inNQD15 ));   *y1_pin3=y1;
 bool y2=(y1 |ATN_TTL);   *y2_pin8=(!(y2));
return; 
}
 
bool  D12_D16_PARSEElement(bool ATN_TTL, bool inNQD15 , bool inA, bool inB)
{
bool inAE,inBE;
ParseDCD12_D3( ATN_TTL , inNQD15    , inBE, inAE);
return(  ((inA)&(inAE))    |    ((inB)&(inBE))   );
}
 
 
 
 
/*******************************************************/
bool GetC( uint8_t DB_TTL, bool ATN_TTL , bool D13_12)
{
bool Y2_D13 ;
DC_D8_D7_2_D13_2 ( DB_TTL, ATN_TTL , D13_12,  &Y2_D13   );
return (bool)Y2_D13;
}
 
bool GetJ_minterm(uint8_t DB_TTL , uint8_t MLA_switch  )
{
return CompareAddress( DB_TTL,  MLA_switch );
}
 
bool GetK1_minterm(uint8_t DB_TTL   )
{
bool DC9;
DC_D9_DC9( DB_TTL,  &DC9); 
Get_KD15(uint8_t DB_TTL, bool DC9  );
}
 
bool GetR1( bool  IFC_TTL) { return (!(IFC_TTL)) ;   }
 
 
bool GetR2(uint8_t DB_TTL,   bool REN_TTL , bool ATN_TTL,  bool nrtl    , D13_12,  Q1_D15    )
{
bool dc1,   d13_y1;
DC_D9_DC1(DB_TTL, &dc1 ); 
DC_D8_D11_D13_1  ( DB_TTL, ATN_TTL , D13_12,  Q1_D15, &d13_y1   );
return RD15_D6  ( nrtl, REN_TTL , dc1, d13_y1 );
}
 
 
 
 
bool GetInt3OutTTL( bool ATN_TTL, bool DAV_TTL, bool  Q2_D15  )
{
 // If  Q2_D15=0 -local , Q2_D15=1 remote,  
bool y3_d16=(bool)   D12_D16_PARSEElement(ATN_TTL,  nQ1D15 , FALSE , DAV_TTL);  
return (bool)  (!((Q2_D15)&(y3_d16)))    ;  
 
} 
 
 
 
bool GetIndREN(  bool  Q2_D15)
//bool GetIndREN(  bool nQ2_D15)
{
//1 remote 0 local    
//return (bool)(!nQ2_D15);
return (bool)( Q2_D15);
}
Добавлено через 2 часа 46 минут
Кнопка ДУ на передней панели обычно выполняет функцию внм (rtl), светодиод ДУ (REN, или прибор адресован). минтерм nrtl- это инверсия от rtl, истинного когда кнопка ДУ нажата (там на корпус замыкается, поэтому у нас nrtl=0, когда кнопка нажата) . Это обрабатывается без процессора , как и сигнал сегмента ошибки ФАПЧ (там из ЧФД провод, хотя от неправильных кодов это косвенно зависит).
0
7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
10.03.2020, 20:22  [ТС]
Правильный вызов прерываний по срезу Прер1,Прер2 , Прер3 ( запуск отрицательной логикой ). Прер2 поддерживается в 1 (за счет одновибраторов, фильтрующих от импульсов при нажатии кнопок ) ,пока кнопка нажата, прерывание вызывается по срезу этого сигнала (когда кнопка отжата, в виртуалке можно переименовать в OnButtonS__Release() ). Валкодерное прерывание прер1 через одну позицию переходит из 1 в 0 , это вызывает инкремент или декремент числа обработкой прерывания по срезу (переходу из 1 в 0 ). Для сопряжения с такими сигналами на каждый вход можно добавить инвертор или изменить обработку прерывания на обработку по срезу, прерывание 3 приоритетнее прерывания 2, прерывание 2 приоритетнее прерывания 1 (и изменить направление включения диодов и потенциал подтягивающего резистора для отслеживания нуля на входе) .
Миниатюры
Замена  микросхемы 1827ВЕ1-0000000 в Г4-164 на AVR -МК  
0
7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
10.03.2020, 22:21  [ТС]
Числа набираются до конца индикации , запятая только один раз(дальше игнорируется ), при неформатных ввод игнорируется, при большем количестве знаков после запятой цифры отсекаются после требуемого количества знаков после запятой (позиция точки ) для режима .

Добавлено через 6 минут
і-ю программу обработчика кнопок можно назвать OnButtonSm_n _Up()

Добавлено через 34 минуты
Реакцию на кнопки в виртуалке изображать упрощенно (при отжатии обрабатывать подавать сообщения ), на кнопку ДУ (RTL) реагировать упрощенно ( подача rtl, в оригинале при нажатии nrtl=0( или rtl=1),вызывает разадресацию , при отжатии nrtl=1 ( или rtl=0) ,пассивный для схемы сброса триггера ), просто обеспечив реакцию на сигнал разадрресации по нажатии кнопки , аналогично схеме при nrtl=0 .

Добавлено через 36 минут
Реакцию на кнопки эмуляции вращение валкодера по часовой стрелке (вверх) и против часовой стрелки можно только для кодов сделать упрощенными , формируя за 1 нажатие (вращение на срабатывание триггера на включение и выключение бита Прер1 ) Прер 1 (его срез, =0 в оригинале или его вызов функционально) скан-код , заполненный 8 нулями(бит читается по соответсвующему адресу ввода в режиме ввода после подачи импульса опроса с ЭВМ (предотвратить ложное состояние "выход на выход" при чтении и установки адреса на шине пина 34 ) ) при вращении по часовой стрелке и заполненный чередующимися нулями и единицами (зависит от предыдущих состояний, логика JK триггера с инверсным входом K и J=1, инверсией результата при считывании , съеме с соответствующих битов ).

Добавлено через 28 минут
https://exploreembedded.com/wi... Interrupts
https://forum.arduino.cc/index.php?topic=585581.0
https://embedderslife.wordpres... -int0-avr/
https://www.avrfreaks.net/foru... e-atmega16
Внешнее прерывание Mega16 - [РЕШЕНО]
http://www.cyberforum.ru/avr/thread1617040.html
C++
1
MCUCR |= (1<<ISC01) | (0<<ISC00);  // activate INT0 interrupt for falling edges
см.

C++
1
2
3
4
MCUCR  , ISCx1 , ISCx0
GICR
GIFR 
GIMSK
,
даташит на выбранный контроллер , эскиз схемы включения, биты для соответствующего прерывания , результирующая реакция - вызов обработчика прерывания или установка флага прерывания по срезу Прер3, Прер2,Прер1 .
С битами подтяжки и буферами определиться. После вызова обработчика прерывания до выполнения команд чувствительность к прерываниям отключать ( cli(); ) до обработки прерывания в программе, потом включать , например в mainloop forever после подпрограмм декодирования флагов и отправки сообщений.

Добавлено через 5 минут
http://ww1.microchip.com/downl... oc2466.pdf

Добавлено через 23 секунды
http://www.circuitstoday.com/w... pts-in-avr

Добавлено через 1 минуту
http://www.customelectronics.r... -enkodera/

Добавлено через 2 минуты
https://www.avrfreaks.net/foru... definition
0
7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
10.03.2020, 22:24  [ТС]
rising edge - по фронту (если с инверторами и по фронту)
falling edge - по срезу (наш результирующий случай)
Миниатюры
Замена  микросхемы 1827ВЕ1-0000000 в Г4-164 на AVR -МК  
0
7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
10.03.2020, 23:37  [ТС]
https://www.google.com/search?... 07&bih=690

Добавлено через 28 секунд
http://www.circuitstoday.com/w... pts-in-avr

Добавлено через 3 минуты
Code
1
2
3
4
5
6
7
8
Interrupt Sense Control
 
ISCx1 ISCx0 Interrupt Generated Upon
0 0 The low Level of INTx pin
0 1 Any logical change in INTx pin
1 0 Falling edge of INTx  
1 1 Rising edge of INTx
x- Interrupt number, either 0 or 1
Добавлено через 2 минуты
Уточнить по даташиту для трех прерываний их правильные названия для нашего процессора и выбранного приоритета прерываний (или обработки по прерыванию по маске синдрома входных кодов, если с диодами с расстановкой приоритета обработчиков вручную, если АТМега48А, можно и для АТМега16А ).

Добавлено через 15 минут
Если писать программу на ассемблере, может обязательно потребоваться разбивка таблиц декодировщиков для напряжения ниже 317-101 мВ и 0-9,9 (-дБВ) с учетом ослабления ступенчатого аттенюатора на старший и младший байт таблицы и побайтная загрузка выборки из них (можно использовать указатели, инкремент адреса (PC) на гридликовое число , соответствующее номеру ячейки ) в подпрограмму отправки .

Сравнивать для частоты ,ЧМ и выхода можно и байты с нибблами в двоично-десятичном коде, но для вычисления потребуется
специальный тип данных и подпрограмма с обработчиком переносов и преобразованием данных .

Добавлено через 33 секунды
Для правильной выборки и кодирования потребуется программа кодопреобразователя.

Добавлено через 46 минут
Для 316-101 мВ
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
    N /0,3162   round() int->hex    HiByte  LowByte
316 999,3674889 999 03E7    0x03    0xe7
315 996,2049336 996 03E4    0x03    0xe4
314 993,0423782 993 03E1    0x03    0xe1
313 989,8798229 990 03DE    0x03    0xde
312 986,7172676 987 03DB    0x03    0xdb
311 983,5547122 984 03D8    0x03    0xd8
310 980,3921569 980 03D4    0x03    0xd4
309 977,2296015 977 03D1    0x03    0xd1
308 974,0670462 974 03CE    0x03    0xce
307 970,9044908 971 03CB    0x03    0xcb
306 967,7419355 968 03C8    0x03    0xc8
305 964,5793801 965 03C5    0x03    0xc5
304 961,4168248 961 03C1    0x03    0xc1
303 958,2542694 958 03BE    0x03    0xbe
302 955,0917141 955 03BB    0x03    0xbb
301 951,9291588 952 03B8    0x03    0xb8
300 948,7666034 949 03B5    0x03    0xb5
299 945,6040481 946 03B2    0x03    0xb2
298 942,4414927 942 03AE    0x03    0xae
297 939,2789374 939 03AB    0x03    0xab
296 936,116382  936 03A8    0x03    0xa8
295 932,9538267 933 03A5    0x03    0xa5
294 929,7912713 930 03A2    0x03    0xa2
293 926,628716  927 039F    0x03    0x9f
292 923,4661607 923 039B    0x03    0x9b
291 920,3036053 920 0398    0x03    0x98
290 917,14105   917 0395    0x03    0x95
289 913,9784946 914 0392    0x03    0x92
288 910,8159393 911 038F    0x03    0x8f
287 907,6533839 908 038C    0x03    0x8c
286 904,4908286 904 0388    0x03    0x88
285 901,3282732 901 0385    0x03    0x85
284 898,1657179 898 0382    0x03    0x82
283 895,0031626 895 037F    0x03    0x7f
282 891,8406072 892 037C    0x03    0x7c
281 888,6780519 889 0379    0x03    0x79
280 885,5154965 886 0376    0x03    0x76
279 882,3529412 882 0372    0x03    0x72
278 879,1903858 879 036F    0x03    0x6f
277 876,0278305 876 036C    0x03    0x6c
276 872,8652751 873 0369    0x03    0x69
275 869,7027198 870 0366    0x03    0x66
274 866,5401645 867 0363    0x03    0x63
273 863,3776091 863 035F    0x03    0x5f
272 860,2150538 860 035C    0x03    0x5c
271 857,0524984 857 0359    0x03    0x59
270 853,8899431 854 0356    0x03    0x56
269 850,7273877 851 0353    0x03    0x53
268 847,5648324 848 0350    0x03    0x50
267 844,402277  844 034C    0x03    0x4c
266 841,2397217 841 0349    0x03    0x49
265 838,0771664 838 0346    0x03    0x46
264 834,914611  835 0343    0x03    0x43
263 831,7520557 832 0340    0x03    0x40
262 828,5895003 829 033D    0x03    0x3d
261 825,426945  825 0339    0x03    0x39
260 822,2643896 822 0336    0x03    0x36
259 819,1018343 819 0333    0x03    0x33
258 815,9392789 816 0330    0x03    0x30
257 812,7767236 813 032D    0x03    0x2d
256 809,6141682 810 032A    0x03    0x2a
255 806,4516129 806 0326    0x03    0x26
254 803,2890576 803 0323    0x03    0x23
253 800,1265022 800 0320    0x03    0x20
252 796,9639469 797 031D    0x03    0x1d
251 793,8013915 794 031A    0x03    0x1a
250 790,6388362 791 0317    0x03    0x17
249 787,4762808 787 0313    0x03    0x13
248 784,3137255 784 0310    0x03    0x10
247 781,1511701 781 030D    0x03    0x0d
246 777,9886148 778 030A    0x03    0x0a
245 774,8260595 775 0307    0x03    0x07
244 771,6635041 772 0304    0x03    0x04
243 768,5009488 769 0301    0x03    0x01
242 765,3383934 765 02FD    0x02    0xfd
241 762,1758381 762 02FA    0x02    0xfa
240 759,0132827 759 02F7    0x02    0xf7
239 755,8507274 756 02F4    0x02    0xf4
238 752,688172  753 02F1    0x02    0xf1
237 749,5256167 750 02EE    0x02    0xee
236 746,3630614 746 02EA    0x02    0xea
235 743,200506  743 02E7    0x02    0xe7
234 740,0379507 740 02E4    0x02    0xe4
233 736,8753953 737 02E1    0x02    0xe1
232 733,71284   734 02DE    0x02    0xde
231 730,5502846 731 02DB    0x02    0xdb
230 727,3877293 727 02D7    0x02    0xd7
229 724,2251739 724 02D4    0x02    0xd4
228 721,0626186 721 02D1    0x02    0xd1
227 717,9000633 718 02CE    0x02    0xce
226 714,7375079 715 02CB    0x02    0xcb
225 711,5749526 712 02C8    0x02    0xc8
224 708,4123972 708 02C4    0x02    0xc4
223 705,2498419 705 02C1    0x02    0xc1
222 702,0872865 702 02BE    0x02    0xbe
221 698,9247312 699 02BB    0x02    0xbb
220 695,7621758 696 02B8    0x02    0xb8
219 692,5996205 693 02B5    0x02    0xb5
218 689,4370651 689 02B1    0x02    0xb1
217 686,2745098 686 02AE    0x02    0xae
216 683,1119545 683 02AB    0x02    0xab
215 679,9493991 680 02A8    0x02    0xa8
214 676,7868438 677 02A5    0x02    0xa5
213 673,6242884 674 02A2    0x02    0xa2
212 670,4617331 670 029E    0x02    0x9e
211 667,2991777 667 029B    0x02    0x9b
210 664,1366224 664 0298    0x02    0x98
209 660,974067  661 0295    0x02    0x95
208 657,8115117 658 0292    0x02    0x92
207 654,6489564 655 028F    0x02    0x8f
206 651,486401  651 028B    0x02    0x8b
205 648,3238457 648 0288    0x02    0x88
204 645,1612903 645 0285    0x02    0x85
203 641,998735  642 0282    0x02    0x82
202 638,8361796 639 027F    0x02    0x7f
201 635,6736243 636 027C    0x02    0x7c
200 632,5110689 633 0279    0x02    0x79
199 629,3485136 629 0275    0x02    0x75
198 626,1859583 626 0272    0x02    0x72
197 623,0234029 623 026F    0x02    0x6f
196 619,8608476 620 026C    0x02    0x6c
195 616,6982922 617 0269    0x02    0x69
194 613,5357369 614 0266    0x02    0x66
193 610,3731815 610 0262    0x02    0x62
192 607,2106262 607 025F    0x02    0x5f
191 604,0480708 604 025C    0x02    0x5c
190 600,8855155 601 0259    0x02    0x59
189 597,7229602 598 0256    0x02    0x56
188 594,5604048 595 0253    0x02    0x53
187 591,3978495 591 024F    0x02    0x4f
186 588,2352941 588 024C    0x02    0x4c
185 585,0727388 585 0249    0x02    0x49
184 581,9101834 582 0246    0x02    0x46
183 578,7476281 579 0243    0x02    0x43
182 575,5850727 576 0240    0x02    0x40
181 572,4225174 572 023C    0x02    0x3c
180 569,259962  569 0239    0x02    0x39
179 566,0974067 566 0236    0x02    0x36
178 562,9348514 563 0233    0x02    0x33
177 559,772296  560 0230    0x02    0x30
176 556,6097407 557 022D    0x02    0x2d
175 553,4471853 553 0229    0x02    0x29
174 550,28463   550 0226    0x02    0x26
173 547,1220746 547 0223    0x02    0x23
172 543,9595193 544 0220    0x02    0x20
171 540,7969639 541 021D    0x02    0x1d
170 537,6344086 538 021A    0x02    0x1a
169 534,4718533 534 0216    0x02    0x16
168 531,3092979 531 0213    0x02    0x13
167 528,1467426 528 0210    0x02    0x10
166 524,9841872 525 020D    0x02    0x0d
165 521,8216319 522 020A    0x02    0x0a
164 518,6590765 519 0207    0x02    0x07
163 515,4965212 515 0203    0x02    0x03
162 512,3339658 512 0200    0x02    0x00
161 509,1714105 509 01FD    0x01    0xfd
160 506,0088552 506 01FA    0x01    0xfa
159 502,8462998 503 01F7    0x01    0xf7
158 499,6837445 500 01F4    0x01    0xf4
157 496,5211891 497 01F1    0x01    0xf1
156 493,3586338 493 01ED    0x01    0xed
155 490,1960784 490 01EA    0x01    0xea
154 487,0335231 487 01E7    0x01    0xe7
153 483,8709677 484 01E4    0x01    0xe4
152 480,7084124 481 01E1    0x01    0xe1
151 477,5458571 478 01DE    0x01    0xde
150 474,3833017 474 01DA    0x01    0xda
149 471,2207464 471 01D7    0x01    0xd7
148 468,058191  468 01D4    0x01    0xd4
147 464,8956357 465 01D1    0x01    0xd1
146 461,7330803 462 01CE    0x01    0xce
145 458,570525  459 01CB    0x01    0xcb
144 455,4079696 455 01C7    0x01    0xc7
143 452,2454143 452 01C4    0x01    0xc4
142 449,082859  449 01C1    0x01    0xc1
141 445,9203036 446 01BE    0x01    0xbe
140 442,7577483 443 01BB    0x01    0xbb
139 439,5951929 440 01B8    0x01    0xb8
138 436,4326376 436 01B4    0x01    0xb4
137 433,2700822 433 01B1    0x01    0xb1
136 430,1075269 430 01AE    0x01    0xae
135 426,9449715 427 01AB    0x01    0xab
134 423,7824162 424 01A8    0x01    0xa8
133 420,6198608 421 01A5    0x01    0xa5
132 417,4573055 417 01A1    0x01    0xa1
131 414,2947502 414 019E    0x01    0x9e
130 411,1321948 411 019B    0x01    0x9b
129 407,9696395 408 0198    0x01    0x98
128 404,8070841 405 0195    0x01    0x95
127 401,6445288 402 0192    0x01    0x92
126 398,4819734 398 018E    0x01    0x8e
125 395,3194181 395 018B    0x01    0x8b
124 392,1568627 392 0188    0x01    0x88
123 388,9943074 389 0185    0x01    0x85
122 385,8317521 386 0182    0x01    0x82
121 382,6691967 383 017F    0x01    0x7f
120 379,5066414 380 017C    0x01    0x7c
119 376,344086  376 0178    0x01    0x78
118 373,1815307 373 0175    0x01    0x75
117 370,0189753 370 0172    0x01    0x72
116 366,85642   367 016F    0x01    0x6f
115 363,6938646 364 016C    0x01    0x6c
114 360,5313093 361 0169    0x01    0x69
113 357,368754  357 0165    0x01    0x65
112 354,2061986 354 0162    0x01    0x62
111 351,0436433 351 015F    0x01    0x5f
110 347,8810879 348 015C    0x01    0x5c
109 344,7185326 345 0159    0x01    0x59
108 341,5559772 342 0156    0x01    0x56
107 338,3934219 338 0152    0x01    0x52
106 335,2308665 335 014F    0x01    0x4f
105 332,0683112 332 014C    0x01    0x4c
104 328,9057559 329 0149    0x01    0x49
103 325,7432005 326 0146    0x01    0x46
102 322,5806452 323 0143    0x01    0x43
101 319,4180898 319 013F    0x01    0x3f
Добавлено через 3 минуты
Для логарифмического, через 10 дБВ, 0-9,9 (-дБВ)
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
    1000*( (10^-(O9-10)/20))    round() int->hex    HiByte  LowByte
10  1000    1000    03E8    0x03    0xe8
10,1    988,5530947 989 03DD 0x03 0xdd
10,2    977,237221  977 03D1 0x03 0xd1
10,3    966,050879  966 03C6    0x03    0xc6
10,4    954,992586  955 03BB 0x03 0xbb
10,5    944,0608763 944 03B0    0x03    0xb0
10,6    933,2543008 933 03A5    0x03    0xa5
10,7    922,5714272 923 039B    0x03    0x9b
10,8    912,0108394 912 0390    0x03    0x90
10,9    901,5711376 902 0386    0x03    0x86
11  891,2509381 891 037B    0x03    0x7b
11,1    881,048873  881 0371    0x03    0x71
11,2    870,96359   871 0367    0x03    0x67
11,3    860,9937522 861 035D    0x03    0x5d
11,4    851,1380382 851 0353    0x03    0x53
11,5    841,3951416 841 0349    0x03    0x49
11,6    831,7637711 832 0340    0x03    0x40
11,7    822,2426499 822 0336    0x03    0x36
11,8    812,8305162 813 032D 0x03 0x2d
11,9    803,5261222 804 0324    0x03    0x24
12  794,3282347 794 031A    0x03    0x1a
12,1    785,2356346 785 0311    0x03    0x11
12,2    776,2471166 776 0308    0x03    0x08
12,3    767,3614894 767 02FF    0x02    0xff
12,4    758,577575  759 02F7    0x02    0xf7
12,5    749,8942093 750 02EE    0x02    0xee
12,6    741,3102413 741 02E5    0x02    0xe5
12,7    732,8245331 733 02DD 0x02 0xdd
12,8    724,4359601 724 02D4 0x02 0xd4
12,9    716,1434102 716 02CC 0x02 0xcc
13  707,9457844 708 02C4    0x02    0xc4
13,1    699,841996  700 02BC 0x02 0xbc
13,2    691,8309709 692 02B4    0x02    0xb4
13,3    683,9116473 684 02AC 0x02 0xac
13,4    676,0829754 676 02A4    0x02    0xa4
13,5    668,3439176 668 029C    0x02    0x9c
13,6    660,693448  661 0295    0x02    0x95
13,7    653,1305526 653 028D 0x02 0x8d
13,8    645,654229  646 0286    0x02    0x86
13,9    638,2634862 638 027E    0x02    0x7e
14  630,9573445 631 0277    0x02    0x77
14,1    623,7348355 624 0270    0x02    0x70
14,2    616,5950019 617 0269    0x02    0x69
14,3    609,5368972 610 0262    0x02    0x62
14,4    602,5595861 603 025B    0x02    0x5b
14,5    595,6621435 596 0254    0x02    0x54
14,6    588,8436554 589 024D 0x02 0x4d
14,7    582,1032178 582 0246    0x02    0x46
14,8    575,4399373 575 023F    0x02    0x3f
14,9    568,8529308 569 0239    0x02    0x39
15  562,3413252 562 0232    0x02    0x32
15,1    555,9042573 556 022C    0x02    0x2c
15,2    549,5408739 550 0226    0x02    0x26
15,3    543,2503315 543 021F    0x02    0x1f
15,4    537,0317964 537 0219    0x02    0x19
15,5    530,8844442 531 0213    0x02    0x13
15,6    524,8074602 525 020D 0x02 0x0d
15,7    518,8000389 519 0207    0x02    0x07
15,8    512,861384  513 0201    0x02    0x01
15,9    506,9907083 507 01FB    0x01    0xfb
16  501,1872336 501 01F5    0x01    0f5
16,1    495,4501908 495 01EF    0x01    0xef
16,2    489,7788194 490 01EA    0x01    0xea
16,3    484,1723676 484 01E4    0x01    0xe4
16,4    478,6300923 479 01DF    0x01    0xdf
16,5    473,151259  473 01D9 0x01 0xd9
16,6    467,7351413 468 01D4 0x01 0xd4
16,7    462,3810214 462 01CE    0x01    0xce
16,8    457,0881896 457 01C9    0x01    0xc9
16,9    451,8559444 452 01C4    0x01    0xc4
17  446,6835922 447 01BF    0x01    0xbf
17,1    441,5704474 442 01BA 0x01 0xba
17,2    436,5158322 437 01B5    0x01    0xb5
17,3    431,5190768 432 01B0    0x01    0xb0
17,4    426,5795188 427 01AB 0x01 0xab
17,5    421,6965034 422 01A6    0x01    0xa6
17,6    416,8693835 417 01A1    0x01    0xa1
17,7    412,0975191 412 019C    0x01    0x9c
17,8    407,3802778 407 0197    0x01    0x97
17,9    402,7170343 403 0193    0x01    0x93
18  398,1071706 398 018E    0x01    0x8e
18,1    393,5500755 394 018A    0x01    0x8a
18,2    389,045145  389 0185    0x01    0x85
18,3    384,591782  385 0181    0x01    0x81
18,4    380,1893963 380 017C    0x01    0x7c
18,5    375,8374043 376 0178    0x01    0x78
18,6    371,5352291 372 0174    0x01    0x74
18,7    367,2823005 367 016F    0x01    0x6f
18,8    363,0780548 363 016B    0x01    0x6b
18,9    358,9219346 359 0167    0x01    0x67
19  354,8133892 355 0163    0x01    0x63
19,1    350,751874  351 015F    0x01    0x5f
19,2    346,7368505 347 015B    0x01    0x5b
19,3    342,7677865 343 0157    0x01    0x57
19,4    338,8441561 339 0153    0x01    0x53
19,5    334,9654392 335 014F    0x01    0x4f
19,6    331,1311215 331 014B    0x01    0x4b
19,7    327,3406949 327 0147    0x01    0x47
19,8    323,5936569 324 0144    0x01    0x44
19,9    319,889511  320 0140    0x01    0x40
Вложения
Тип файла: zip Книга 1 (2).zip (46.7 Кб, 8 просмотров)
0
7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
11.03.2020, 00:00  [ТС]
Информация, отображаемая в этой теме не рекомендована для использования в промышленности без пересмотра, доработки , перевода на правильные языки программирования с правильными лицензиями , проверки правильности, а только отображает в полемической форме некоторые программные методы и способы для оценки возможности применимости некоторых микроконтроллеров и способы размещения в их памяти данных для оценки возможности решения задач, указанных в теме .

Основные опыты проводить виртуально, теоретически .

Для практического применения эта информация не гарантирует правильности применения некоторых данных без пересмотра , переоценки, правильной ссылки на некоторые авторские права.
Информация в этой статье не является дипломом или контрольной работой, может не использоваться в образовательных целях как правильная или рекомендованная для использования.
В террористических целях не использовать.
0
7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
15.03.2020, 00:26  [ТС]
https://www.avrfreaks.net/foru... -correctly

Добавлено через 5 часов 39 минут
piniosubs.asm
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
 
 
.equ  PIN37_DDR= DDRC;
.equ PIN37_PORT =PORTC; use invertor after this pin
.equ OUT_PIN37 PORTC0;
.equ PIN39_DDR DDRC  ;
.equ PIN39_PORT DDRC;
.equ OUT_PIN39 PORTC1  ;use invertor after this pin
.equ PIN36_DDR DDRC;
.equ PIN36_PORT PORTC;
.equ OUT_PIN36 PORTC2;
 
.equ PORT_PIN34  PORTC;
.equ PORTIN_PIN34  PINC;
.equ PIN34_DDR DDRC;
.equ OUT_PIN34 PORTC3;
.equ IN_PIN34 PINC3;
 
 
 
 
.equ ADDR_IN_LD_SYNC_POOL  =  0x00;
.equ ADDR_IN_GCD_SYNC = 0x01;
.equ ADDR_INFORM_WAIT =0x02;
 
 
 
 
 
 
 
 
 
 
 
 
.macro  SetPin23High 
; turn on 6dB 
     
    sbi PIN23_PORT, PIN23_OUT ;
.endmacro
 
.macro SetPin23Low 
; turn off 6dB 
    
    cbi PIN23_PORT, PIN23_OUT ;
.endmacro
 
 
 .macro SetPin37Low     
    cbi PIN37_PORT, OUT_PIN37 ;      
 .endmacro
 
 .macro SetPin37High     
    sbi  PIN36_PORT,OUT_PIN36 ;   
 .endmacro
 
 .macro SetPin36Low
    cbi PIN36_PORT,OUT_PIN36 ;
  .endmacro
 
  .macro SetPin36High     
     sbi PIN36_PORT,OUT_PIN36 ;  
  .endmacro
 
 
  .macro  SetPin39Low
    cbi PIN39_PORT,OUT_PIN39 ;
  .endmacro
 
  .macro SetPin39High 
     sbi PIN39_PORT, OUT_PIN39 ;
 .endmacro
 
 
  .macro SetPin34Out 
 
    sbi PIN34_DDR,OUT_PIN34 ;
.endmacro
 
 .macro SetPin34Input 
 
    cbi PIN34_DDR,OUT_PIN34 ;
.endmacro
 
 .macro SetPin34High 
     sbi PORT_PIN34,OUT_PIN34 ;
.endmacro
    
 .macro SetPin34Low 
    cbi PORT_PIN34, OUT_PIN34 ;
.endmacro
 
.macro IfFirstBitIsZero
 
mov tmp, @0     
cpi tmp, 0 
breq  label_macro1_tmp_yes 
call @1
label_macro1_tmp_yes:
call @2
 
 
.endmacro
 
 
 
 
 InitPins: 
 
out DDR_ADDR, 0x0f;    
sbi PIN23_DDR, PIN23_OUT  ;
sbi PIN23_DDR, OUT_PIN37 ;
sbi PIN36_DDR, OUT_PIN36  ;
sbi PIN39_DDR, OUT_PIN39 ;
cbi PIN34_DDR, OUT_PIN34 ;
ret 
 
 
 
 
 
 
 
 
Set6dBOn:
mov tmp, tmpreg1     
cpi tmp, 0 
breq   label1_if_yes 
          SetPin23High
          ret
label1_if_yes:
        SetPin23Low 
 
 ret 
 
 
CheckPin34In: 
 
SetPin34Input ;
ldi tmp , 0x00
sbic   PORTIN_PIN34,IN_PIN34 
ldi tmp , 0x01
ret
 
 
 
SetAddr:
                       ; tmp1=addr
                   
                  andi tmp1 , 0x0f
                  out  PORT_ADDR,tmp1  ;
ret
 
SetAddrInform:
                   ldi    tmp1  , PORT_ADDR,  
                   out  PORT_ADDR,  tmp1;
ret
 
 SetAddrInformInGCd: 
                  ldi    tmp1  , ADDR_IN_GCD
                  out   PORT_ADDR, tmp1  ;
ret
 
 
 SetAddrInformInLD:
 
      ldi    tmp1  , ADDR_IN_LD  
      out PORT_ADDR, tmp1;
ret
Добавлено через 3 минуты
siosubs.asm (адаптировать, переделать, дополнить , проверить )
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
.include "piniosubs.asm"
; ADDR_IN_LD_SYNC      
;ADDR_IN_GCD_SYNC   
 
;ADDR_SYNC_POOL 0x00
; ADR_SYNC  0x01
 
; ADDR_INFORM_WAIT 0x02
 
 
.equ ADDR_AM_VREF   =   0x04
.equ ADDR_FM               =   0x03
.equ ADDR_BLINKOFF  =  0x05
.equ ADDR_HFO             =  0x06  
.equ ADDR_SYNCSTATIC  =   0x07
 
.equ ADDR_SYNCBLINK =0x08
 
.equ ADDR_MODE           =0x0a
 
.equ ADDR_DPKD  = 0x0c
.equ ADDR_LFO =    0x0d
.equ ADDR_ATT =     0x0e
.equ ADDR_SYNCRAM =0x0f
 
 
 SetPinsDefault1:
 
SetPin37Low ;     not active  , for 1 on the    on the trigger,  use invertor  and D12
SetPin39Low ;     not active  , for 1 on the    on the MemWr RAM, use invertor
SetPin36Low ;      not active  , for 0 on the    on the multiplexer , use invertor and D12
ret
 
 SendPin36Pulse: 
 
call delay_1us;
SetPin36High;   send pulse 
call delay_20us;
SetPin36Low;    not active  
call delay_50us;
ret
 
 
SendPin37Pulse:
call delay_1us;
 SetPin37High;   send pulse 
call delay_20us;
SetPin37Low ;    not active   
call delay_50us ;
ret
 
 
 
 
SendPin39Pulse:
 
call delay_1us;
SetPin39High ;  send pulse 
call delay_20us ;
SetPin39Low ;    not active  , for 1 on the    on the trigger,  use invertor  and D12
call delay_50us ;
ret
 
 
 
 
 
 
 
 GetBitInformLD:  
 
call SetPinsDefault1 ;
;SetPin34Input ;  
 
call SetAddrInformInLD ;
SetPin34Input ; 
ldi tmp , 0x00
sbic   PORTIN_PIN34, IN_PIN34 
ldi tmp , 0x01
ret
 
 
SendStrobeSync  :   ; tmp1 is  addr1 
call SetPinsDefault1 ;
call SetPin34Out ; 
call SetAddrSync ; tmp1 is  addr1 
call SendPin36Pulse ;
ret 
 
 
 
 
GetBitInformGCd:
 
 
SetPin34Input ; 
call SetPinsDefault1 ;
call SetAddrInformInGCd ;
SetPin34Input ; 
 
SendStrobeSync ADDR_SYNC ;
SetPin34Input ;
ldi tmp , 0x00
sbic   PORTIN_PIN34, IN_PIN34 
ldi tmp , 0x01
ret
 
 
 
SendPin34LowIfDataIsZero
 
cpi tmp,0x00
breq label_sethi_if_zero
SetPin34Low;
ret
label_sethi_if_zero:
SetPin34High ;
ret;
 
 
 
 
SendBitInform:  ; value in tmpreg
 
call SetPinsDefault1;
call SetAddrInform ;
SetPin34Out ;
 
ldi tmp , 0x00
sbic   PORTIN_PIN34, IN_PIN34 
ldi tmp , 0x01
call SendPin34LowIfDataIsZero
ret
 
SendMemWrPulse:
 
call SetPinsDefault1 ;
call SendPin37Pulse ;
ret
 
SendMemWrRAMPulse:
call SetPinsDefault1 ;
call SendPin39Pulse ;
ret
 
 
 
 
 
 
SendPin36Pulse1:
 
call delay_1us;
SetPin36High;  send pulse 
call delay_50us;  fix
SetPin36Low;   not active  
call delay_40us;  fix 
ret
 
SendPin36Pulse2:
 
call delay_1us;
SetPin36High;  send pulse 
call delay_40us;  fix
SetPin36Low;  not active  
call delay_40us;   fix 
ret
 
SendPulseSyncInLD:
 
call SetPinsDefault1 ;
SetPin34In ; 
ldi tmp1, ADR_SYNC
call SetAddrSync ;   
call SendPin36Pulse1 ; 
ret
 
 
SendPulseSyncInGCD: 
 
call SetPinsDefault1 ;
SetPin34In ; 
ldi tmp1, ADDR_SYNC_POOL
SetAddrSync ; 
call SendPin36Pulse2 ; 
ret
 
 
 
 
CheckFirstBit: ; tmp2 =db1
 
andi tmp2,0x01
cpi   tmp2,0x00
breq  label_check_ifzero_1
 ldi tmp, 0x01
ret 
label_check_ifzero_1 :
 ldi tmp, 0x00
ret 
 
 
 
Send_nInformBit_0_IfByteFalse: ;    dbyte1 in tmp2
; if (dbyte1==0) { SendBitInform(0);  }  else { SendBitInform(1); }  
cpi tmp2, 0x00
breq  label_bitinform_send1;
ldi tmp,0x01
call SendBitInform 
label_bitinform_send1:
ldi tmp,0x00
call SendBitInform 
ret
 
 Send_nInformBit_1_IfByteFalse: ;    dbyte1 in tmp2
;if (dbyte1==0) { SendBitInform(1);  }  else { SendBitInform(0); }  
cpi tmp2, 0x00
breq  label_bitinform_send2;
ldi tmp,0x00
call SendBitInform 
label_bitinform_send2:
ldi tmp,0x01
call SendBitInform 
ret
 
 
 
Send_nInformBit_0_IfFirtstBitTrue:;   db1
; if (CheckFirstBit( db1)) { SendBitInform(0);  }  else { SendBitInform(1); }
andi tmp2, 0x01 ;  
cpi tmp2, 0x00  ; Send_nInformBit_1_IfByteFalse 
breq  label_bitinform_send3;
ldi tmp,0x00
call SendBitInform 
label_bitinform_send3:
ldi tmp,0x01
call SendBitInform 
ret
 
 
 Send_nInformBit_1_IfFirtstBitTrue;       db1 
 
;if (CheckFirstBit( db1)) { SendBitInform(1);  }  else { SendBitInform(0); }  
andi tmp2, 0x01 ;  
cpi tmp2, 0x00 ; Send_nInformBit_0_IfByteFalse
breq  label_bitinform_send4;
ldi tmp,0x01
call SendBitInform 
label_bitinform_send4:
ldi tmp,0x00
call SendBitInform 
ret
 
 
/*************************************/
 
 
 
 
 
 
void SendDivCoefDPKD;   reg_byte0, reg_byte1,reg_byte2,reg_byte3, reg_byte4, reg_byte5;    digits_f[6] 
{
 
; for bit=1 in the register set 0  on the pin34 as output , 1-st bit of the LSB digit of the dividing coeff.  first 
 
 
 
 
mov reg_data, reg_byte0 ; digits_f[0];   8, for D24
 
mov tmp2, reg_data 
call Send_nInformBit_0_IfFirtstBitTrue( db1); //bit 0 digit1  , LSB
ldi tmp1, ADDR_DPKD
call SendStrobeSync ;
 
lsr reg_data
mov tmp2, reg_data 
call Send_nInformBit_0_IfFirtstBitTrue ;  bit 1  digit1
ldi tmp1, ADDR_DPKD
call SendStrobeSync ;
 
 
lsr reg_data
mov tmp2, reg_data 
call Send_nInformBit_0_IfFirtstBitTrue ;  bit 2  digit1
ldi tmp1, ADDR_DPKD
call SendStrobeSync ;
 
 
lsr reg_data
mov tmp2, reg_data 
call Send_nInformBit_0_IfFirtstBitTrue ;  bit 3  digit1
ldi tmp1, ADDR_DPKD
call SendStrobeSync ;
;**************
 mov reg_data, reg_byte1 ;  digits_f[1];//9, for D26
mov tmp2, reg_data 
call Send_nInformBit_0_IfFirtstBitTrue ; //bit 0  digit2
ldi tmp1, ADDR_DPKD
call SendStrobeSync ;
 
 
lsr reg_data
mov tmp2, reg_data 
call Send_nInformBit_0_IfFirtstBitTrue ;  //bit 1  digit2
ldi tmp1, ADDR_DPKD
call SendStrobeSync ;
 
lsr reg_data
mov tmp2, reg_data 
call Send_nInformBit_0_IfFirtstBitTrue ; //bit 2  digit2
ldi tmp1, ADDR_DPKD
call SendStrobeSync ;
 
lsr reg_data
mov tmp2, reg_data 
call Send_nInformBit_0_IfFirtstBitTrue ; //bit 3  digit2
ldi tmp1, ADDR_DPKD
call SendStrobeSync ;
;*************
 mov reg_data, reg_byte2 ; digits_f[2];//9, for D7
mov tmp2, reg_data 
call Send_nInformBit_0_IfFirtstBitTrue ; //bit 0  digit3
ldi tmp1, ADDR_DPKD
call SendStrobeSync ;
 
 
lsr reg_data
mov tmp2, reg_data 
call Send_nInformBit_0_IfFirtstBitTrue ;  //bit 1  digit3
ldi tmp1, ADDR_DPKD
call SendStrobeSync ;
 
lsr reg_data
mov tmp2, reg_data 
call Send_nInformBit_0_IfFirtstBitTrue ;  //bit 2  digit3
ldi tmp1, ADDR_DPKD
call SendStrobeSync ;
 
lsr reg_data
mov tmp2, reg_data 
call Send_nInformBit_0_IfFirtstBitTrue ;  //bit 3  digit3
ldi tmp1, ADDR_DPKD
call SendStrobeSync ;
;*************
mov reg_data, reg_byte3 ;  digits_f[3];//9, for D10
mov tmp2, reg_data 
call Send_nInformBit_0_IfFirtstBitTrue ;  //bit 0  digit4
ldi tmp1, ADDR_DPKD
call SendStrobeSync ;
 
 
lsr reg_data
mov tmp2, reg_data 
call Send_nInformBit_0_IfFirtstBitTrue ;  //bit 1  digit4
ldi tmp1, ADDR_DPKD
call SendStrobeSync ;
 
lsr reg_data
mov tmp2, reg_data 
call Send_nInformBit_0_IfFirtstBitTrue ;  //bit 2  digit4
ldi tmp1, ADDR_DPKD
call SendStrobeSync ;
 
lsr reg_data
mov tmp2, reg_data 
call Send_nInformBit_0_IfFirtstBitTrue ;  //bit 3  digit4
ldi tmp1, ADDR_DPKD
call SendStrobeSync ;
;*************
mov reg_data, reg_byte4 ;  digits_f[4];//7,for D16
mov tmp2, reg_data 
call Send_nInformBit_0_IfFirtstBitTrue ; //bit 0  digit5
ldi tmp1, ADDR_DPKD
call SendStrobeSync ;
 
lsr reg_data
mov tmp2, reg_data 
call Send_nInformBit_0_IfFirtstBitTrue ;  //bit 1  digit5
ldi tmp1, ADDR_DPKD
call SendStrobeSync ;
 
lsr reg_data
mov tmp2, reg_data 
call Send_nInformBit_0_IfFirtstBitTrue ;  //bit 2  digit5
ldi tmp1, ADDR_DPKD
call SendStrobeSync ;
 
lsr reg_data
mov tmp2, reg_data 
call Send_nInformBit_0_IfFirtstBitTrue ; //bit 3  digit5
ldi tmp1, ADDR_DPKD
call SendStrobeSync ;
 
;*************
 mov reg_data, reg_byte5  ; digits_f[5];//12, for D20
mov tmp2, reg_data 
call Send_nInformBit_0_IfFirtstBitTrue ;  //bit 0  digit6
ldi tmp1, ADDR_DPKD
call SendStrobeSync ;
 
 
lsr reg_data
mov tmp2, reg_data 
call Send_nInformBit_0_IfFirtstBitTrue ; //bit 1  digit6
ldi tmp1, ADDR_DPKD
call SendStrobeSync ;
 
lsr reg_data
mov tmp2, reg_data 
call Send_nInformBit_0_IfFirtstBitTrue ;  //bit 2  digit6
ldi tmp1, ADDR_DPKD
call SendStrobeSync ;
 
lsr reg_data
mov tmp2, reg_data 
call Send_nInformBit_0_IfFirtstBitTrue ;  //bit 3  digit6
ldi tmp1, ADDR_DPKD
call SendStrobeSync ;
 
;SendMemWrPulse();
ret
 
 
 
SendDAC_FM_DAC: ;  DACFM reg_digit1 ,    DACAt    reg_digit0 
 
; for send 0  to the trigger FM/At  set 1   on the pin 34 and send SyncAM pulse 
 
 
 mov reg_data, reg_byte0 ;    db1=DACAt;   
mov tmp2, reg_data 
call Send_nInformBit_0_IfFirtstBitTrue ; bit '8' DAC at, no data
ldi tmp1, ADDR_FM
call SendStrobeSync ;
 
lsr reg_data
mov tmp2, reg_data 
call Send_nInformBit_0_IfFirtstBitTrue ;    bit '4' DAC at
ldi tmp1, ADDR_FM
call SendStrobeSync ;
 
 
lsr reg_data
mov tmp2, reg_data 
call Send_nInformBit_0_IfFirtstBitTrue ; bit '2' DAC at
ldi tmp1, ADDR_FM
call SendStrobeSync ;
 
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;   bit '1' DAC at 
ldi tmp1, ADDR_FM
call SendStrobeSync ;
 
; send DAC FM coefs 
 
 mov reg_data, reg_byte1  ; db1= DACFM ;
 mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;   bit 2 DAC FM 
ldi tmp1, ADDR_FM
call SendStrobeSync ;
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;  bit 3 DAC FM
ldi tmp1, ADDR_FM
call SendStrobeSync ;
 
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;   bit 4 DAC FM 
ldi tmp1, ADDR_FM
call SendStrobeSync ;
 
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;   bit 5 DAC FM 
ldi tmp1, ADDR_FM
call SendStrobeSync ;
 
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;   bit 6 DAC FM  
ldi tmp1, ADDR_FM
call SendStrobeSync ;
 
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;    bit 7 DAC FM
ldi tmp1, ADDR_FM
call SendStrobeSync ;
 
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;   bit 8 DAC FM 
ldi tmp1, ADDR_FM
call SendStrobeSync ;
 
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;   bit 9 DAC FM  
ldi tmp1, ADDR_FM
call SendStrobeSync ;   12 pulses 
 
ret
 
 
 
 
 SendModeBits: ;   BitsOut  reg_digit0 ,  BitsModul reg_digit1 ,  BitsLFO reg_digit2
 
;21 or 24 bit data
 
 
 
 mov reg_data, reg_byte0 ;     BitsOut
;lsr reg_data
;lsr reg_data
;lsr reg_data
 mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;  1 Out 
ldi tmp1, ADDR_MODE
call SendStrobeSync ;  1
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;  8 +6dB
ldi  tmp1, ADDR_MODE
call SendStrobeSync;   2
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue  ;  4 uV
ldi  tmp1, ADDR_MODE
call SendStrobeSync;  3
 
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;   2 mV
ldi  tmp1, ADDR_MODE
call SendStrobeSync; 4
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;  1 dBV
ldi  tmp1, ADDR_MODE
call SendStrobeSync; 5
 
;*************************
 
mov reg_data, reg_byte1 ;   BitsModul; 
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;   no
ldi  tmp1, ADDR_MODE
call SendStrobeSync; 6
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;  no
ldi  tmp1, ADDR_MODE
call SendStrobeSync; 7
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;   PM ext
ldi  tmp1, ADDR_MODE
call SendStrobeSync; 8
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;  AM ext
ldi  tmp1, ADDR_MODE
call SendStrobeSync; 9
 
 
lsr reg_data
mov tmp2, reg_data
call  Send_nInformBit_0_IfFirtstBitTrue ;  FM ext
ldi  tmp1, ADDR_MODE
call SendStrobeSync; 10
 
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;  PM
ldi  tmp1, ADDR_MODE
call SendStrobeSync; 11
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;   AM
ldi  tmp1, ADDR_MODE
call SendStrobeSync; 12
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;   FM
ldi  tmp1, ADDR_MODE
call SendStrobeSync; 13
 
 
;***************
 mov reg_data, reg_byte2 ;   BitsLFO;
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;  10k
ldi  tmp1, ADDR_MODE
call SendStrobeSync; 14
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;  3,4k
ldi  tmp1, ADDR_MODE
call SendStrobeSync; 15
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;  2,5k
ldi  tmp1, ADDR_MODE
call SendStrobeSync; 16
 
lsr reg_data
mov tmp2, reg_data
call  Send_nInformBit_0_IfFirtstBitTrue ;  1k
ldi  tmp1, ADDR_MODE
call SendStrobeSync; 17
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;   0,4k
ldi  tmp1, ADDR_MODE
call SendStrobeSync; 18
 
lsr reg_data
mov tmp2, reg_data
call  Send_nInformBit_0_IfFirtstBitTrue ;   0,3k
ldi  tmp1, ADDR_MODE
call SendStrobeSync; 19
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;   0,2k
ldi  tmp1, ADDR_MODE
call SendStrobeSync; 20
 
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;  0,05k
ldi  tmp1, ADDR_MODE
call SendStrobeSync; 21
 
ret
 
 SendDAC_AM_VRefCoefs: ; DACVref reg_byte1, reg_byte0 ,  DACAM   reg_byte3,reg_byte2 
 
; for send 0  to the trigger AM/Vref  set 1   on the pin 34 and send SyncAM pulse 
;send DAC Vref 0...9 coefs , 1000= 0x03e8=0b 0000 0011 1110 1000 
 ; db1=DACVref ; 
 
mov reg_data ,  reg_byte0
mov tmp2, reg_data  
call Send_nInformBit_0_IfFirtstBitTrue ;   bit 0 DAC VRef
ldi  tmp1, ADDR_AM_VREF
call SendStrobeSync
 
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;  bit 1 DAC VRef  
ldi  tmp1, ADDR_AM_VREF
call SendStrobeSync
 
 
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;  bit 2 DAC VRef  
ldi  tmp1, ADDR_AM_VREF
call SendStrobeSync
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;  bit 3 DAC VRef  
ldi  tmp1, ADDR_AM_VREF
call SendStrobeSync
 
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;  bit 4 DAC VRef  
ldi  tmp1, ADDR_AM_VREF
call SendStrobeSync
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;  bit 5 DAC VRef  
ldi  tmp1, ADDR_AM_VREF
call SendStrobeSync
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;   bit 6 DAC VRef  
ldi  tmp1, ADDR_AM_VREF
call SendStrobeSync
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;  bit 7 DAC VRef  
ldi  tmp1, ADDR_AM_VREF
call SendStrobeSync
 
 
mov reg_data ,  reg_byte1
mov tmp2, reg_data  
call Send_nInformBit_0_IfFirtstBitTrue ;   bit 8 DAC VRef  
ldi  tmp1, ADDR_AM_VREF
call SendStrobeSync
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;   bit 9 DAC VRef  
ldi  tmp1, ADDR_AM_VREF
call SendStrobeSync
 
 ;send DAC AM coeffs 0...9
;send DAC Vref 0...9 coefs 
;db1=DACAM 
 
mov reg_data ,  reg_byte2
call Send_nInformBit_0_IfFirtstBitTrue ;  bit 0 DAC AM
ldi  tmp1, ADDR_AM_VREF
call SendStrobeSync
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;   bit 1 DAC AM 
ldi  tmp1, ADDR_AM_VREF
call SendStrobeSync
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;  bit 2 DAC AM  
ldi  tmp1, ADDR_AM_VREF
call SendStrobeSync
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;   bit 3 DAC AM  
ldi  tmp1, ADDR_AM_VREF
call SendStrobeSync
 
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;  bit 4 DAC AM
ldi  tmp1, ADDR_AM_VREF
call SendStrobeSync
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;  bit 5 DAC AM  
ldi  tmp1, ADDR_AM_VREF
call SendStrobeSync 
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;  bit 6 DAC AM 
ldi  tmp1, ADDR_AM_VREF
call SendStrobeSync
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;  bit 7 DAC AM 
ldi  tmp1, ADDR_AM_VREF
call SendStrobeSync
 
mov reg_data ,  reg_byte3
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;  bit 8 DAC AM  
ldi  tmp1, ADDR_AM_VREF
call SendStrobeSync
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;  bit 9 DAC AM 
ldi  tmp1, ADDR_AM_VREF
call SendStrobeSync;  20 pulses StrobeSyncAM 
 
ret
 
 
 SendLFOBits: ; LFObits  reg_byte0 ,  LFOenabled    reg_byte1
 
 
; db1=LFOenabled;  
 
mov reg_data ,  reg_byte1
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;     bit nE
ldi  tmp1, ADDR_LFO
call SendStrobeSync
 
;db1= LFObits;
 
mov reg_data ,  reg_byte0
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;    bit '1' LFO
ldi  tmp1, ADDR_LFO
call SendStrobeSync
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;   bit '2' LFO
ldi  tmp1, ADDR_LFO
call SendStrobeSync
 
lsr reg_data
mov tmp2, reg_data
call Send_nInformBit_0_IfFirtstBitTrue ;   bit '4'   LFO
ldi  tmp1, ADDR_LFO
call SendStrobeSync
 
; SendMemWrPulse();
ret
 
 
/***************************************/
0
7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
15.03.2020, 04:12  [ТС]
продолжение siosubs.asm
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
 SendAttBits:   ;  bits_att ,   FlagOff 
 
 ; uint8_t db1;
 ;db1=bits_att;
 
  
 ;0 means yoke off (  for 1 on the inform bus )
;1 means yoke on  (  for 0 on the inform bus )
 
mov reg_data ,  reg_byte0
cpi reg_data,0x00
breq  If_OutOn
ldi reg_data,0x00
 
If_OutOn:
mov tmp2, reg_data 
call Send_nInformBit_1_IfFirtstBitTrue ;   10dB
ldi  tmp1, ADDR_ATT
call SendStrobeSync
 
lsr reg_data
mov tmp2, reg_data 
call Send_nInformBit_1_IfFirtstBitTrue ;   20 dB
ldi  tmp1, ADDR_ATT
call SendStrobeSync
 
 
lsr reg_data
mov tmp2, reg_data 
call Send_nInformBit_1_IfFirtstBitTrue ;    40 dB
ldi  tmp1, ADDR_ATT
call SendStrobeSync
 
 
lsr reg_data
mov tmp2, reg_data 
call  Send_nInformBit_1_IfFirtstBitTrue ;    80 dB
ldi  tmp1, ADDR_ATT
call SendStrobeSync
 
lsr reg_data
mov tmp2, reg_data 
call Send_nInformBit_1_IfFirtstBitTrue ;    10 dB off
ldi  tmp1, ADDR_ATT
call SendStrobeSync
 
lsr reg_data
mov tmp2, reg_data 
call Send_nInformBit_1_IfFirtstBitTrue ;   20 dB off
ldi  tmp1, ADDR_ATT
call SendStrobeSync
 
lsr reg_data
mov tmp2, reg_data 
call Send_nInformBit_1_IfFirtstBitTruee ;   40 dB off
ldi  tmp1, ADDR_ATT
call SendStrobeSync 
 
lsr reg_data
mov tmp2, reg_data 
call Send_nInformBit_1_IfFirtstBitTrue ; 80 dB off
ldi  tmp1, ADDR_ATT
call SendStrobeSync
 
ret
 
 
 
 SendHFObits: ; FMAtt reg_byte0 ,   OscCode  reg_byte1
 
; db1=FMAtt;
mov reg_data ,  reg_byte0
 mov tmp2, reg_data 
call Send_nInformBit_0_IfFirtstBitTrue ;    FM Att 1/10
ldi  tmp1, ADDR_HFO
call SendStrobeSync
 
; db1= OscCode ;
mov reg_data ,  reg_byte1
mov tmp2, reg_data 
call Send_nInformBit_0_IfFirtstBitTrue ;    OSCSEL '1'
ldi  tmp1, ADDR_HFO
call SendStrobeSync
 
lsr reg_data
mov tmp2, reg_data 
call Send_nInformBit_0_IfFirtstBitTrue ;      OSCSEL '2'
ldi  tmp1, ADDR_HFO
call SendStrobeSync
 
 
lsr reg_data
mov tmp2, reg_data 
call Send_nInformBit_0_IfFirtstBitTrue ;     OSCSEL '4'
ldi  tmp1, ADDR_HFO
call SendStrobeSync
 
lsr reg_data
mov tmp2, reg_data 
call Send_nInformBit_0_IfFirtstBitTrue ;     FilterBand
ldi  tmp1, ADDR_HFO
call SendStrobeSync
 
lsr reg_data
mov tmp2, reg_data 
call Send_nInformBit_0_IfFirtstBitTrue ;    BandSel '1' 
ldi  tmp1, ADDR_HFO
call SendStrobeSync
 
lsr reg_data
mov tmp2, reg_data 
call Send_nInformBit_0_IfFirtstBitTrue ;    BandSel '2'
ldi  tmp1, ADDR_HFO
call SendStrobeSync
 
lsr reg_data
mov tmp2, reg_data 
call Send_nInformBit_0_IfFirtstBitTrue ;   BandSel '4'
ldi  tmp1, ADDR_HFO
call SendStrobeSync
ret
 
 
 
 SendStaticCMDBits: ; StaticCMD 
;
    
    ; uint8_t db1;
; for 0 on the trigger out (for not inverted outputs) send 0 via the inform bus
; for 1 on the trigger out (for not inverted outputs) set 1 via the inform bus
 
; for 1 on the trigger out  for   inverted outputs AMext,FMext,PMext  send 0 via the inform bus
; for 0 on the trigger out  for   inverted outputs  AMext,FMext,PMext send 1  via the inform bus
 
; nPMext ; nFMext ; nAMext ; PM; FM; AM; MixOn; 1kHz 
 
 ; db1=StaticCMD ;
 
 mov tmp2 ,  reg_byte0
 andi tmp2,0x01 
 call  Send_nInformBit_0_IfByteFalse ;   1 kHz   
 ldi  tmp1, ADDR_SYNCSTATIC   ;    
 call SendStrobeSync   ;   1
     
 mov tmp2 ,  reg_byte0
 andi tmp2,0x02 
 call  Send_nInformBit_0_IfByteFalse ;    MixOn 
 ldi  tmp1, ADDR_SYNCSTATIC   ;    
 call SendStrobeSync   ;  2
 
 mov tmp2 ,  reg_byte0
 andi tmp2,0x04 
 call  Send_nInformBit_0_IfByteFalse ;  AM 
ldi  tmp1, ADDR_SYNCSTATIC   ;    
call SendStrobeSync;  3 
 
     
 
 mov tmp2 ,  reg_byte0
 andi tmp2,0x08 
 call  Send_nInformBit_0_IfByteFalse ;    FM  
 ldi  tmp1, ADDR_SYNCSTATIC   ;    
call SendStrobeSync;   4
     
 mov tmp2 ,  reg_byte0
 andi tmp2,0x10 
 call  Send_nInformBit_0_IfByteFalse ; PM
 ldi  tmp1, ADDR_SYNCSTATIC   ;    
 call SendStrobeSync; 5
     
 mov tmp2 ,  reg_byte0
 andi tmp2,0x20 
 call  Send_nInformBit_0_IfByteFalse ; notAMext, see inverse output of the trigger D16
 ldi  tmp1, ADDR_SYNCSTATIC   ;    
 call SendStrobeSync;  6
     
 mov tmp2 ,  reg_byte0
 andi tmp2,0x40 
 call  Send_nInformBit_0_IfByteFalse ;  notFMext, see inverse output of the trigger D16
ldi  tmp1, ADDR_SYNCSTATIC   ;    
 call SendStrobeSync;  7
     
 mov tmp2 ,  reg_byte0
 andi tmp2,0x80 
 call  Send_nInformBit_0_IfByteFalse ;  notPMext, see inverse output of the trigger D16
ldi  tmp1, ADDR_SYNCSTATIC   ;    
call SendStrobeSync;  8 
 
 ;SendMemWrPulse();
 ret
 
 /******************************************/
 SevenSegment:  ;   Digit  reg_byte0 ,   Comma reg_byte1
 
 
;
;LSB  e; c; b; d; f; g; a; h  MSB
;     a 
;b        c
;     d
;e        f
;     g
;              h
;1 on the inform bus means turn on segment
;                                          ecbdfga; 
; 
;uint8_t db=0;
 
mov tmp, reg_byte0
 
cpi   tmp , 0x00
breq  label_case0
 
cpi   tmp, 0x01
breq  label_case1
 
cpi  tmp , 0x02
breq  label_case2
 
cpi  tmp , 0x03
breq  label_case4
 
 
cpi  tmp , 0x04
breq label_case5
 
cpi  tmp , 0x05
breq  label_case6
 
cpi  tmp , 0x06
breq  
 
cpi  tmp , 0x07
breq label_case7 
 
cpi  tmp , 0x08
breq label_case8
 
cpi  tmp , 0x09
breq  label_case8
 
 cpi  tmp , 0x0f
 breq  label_casef
 
 goto label_commacheck;        ; fix to pointered table
                 ;hagfdbce
label_case0:     
                  ;  ldi tmp,  0b01110111; 
                     ldi tmp,  0b10001000;   inverse (complement ) code 
                    goto label_commacheck  ;   a,b,e,g,f,c=1
label_case1 :   
                  ;  ldi tmp, 0b00010010; 
                     ldi tmp, 0b11101101;      inverse code 
                    goto label_commacheck ;    c,f=1
label_case2:      
                   ; ldi tmp, 0b01101011;  
                     ldi tmp, 0b10010100;    inverse code 
                    goto label_commacheck;     a,c,d,e,g=1
label_case3:     
                  ;  ldi tmp, 0b01111010; 
                     ldi tmp, 0b10000101;  inverse code 
                    goto label_commacheck;    a,c,d,f,g=1
label_case4 :    
                  ; ldi tmp, 0b01011110; 
                   ldi tmp, 0b10100001;   inverse code 
                    goto label_commacheck;    a,b,c,d,f=1
label_case5:     
                   ; ldi tmp,  0b01111100;  
                   ldi tmp,  0b10000011;  
                   goto label_commacheck;    a,b,d,f,g=1
label_case6:     
                         ; ldi tmp, 0b01111101;  
                           ldi tmp, 0b10000010;   inverse code  
                          goto label_commacheck;     a,b,d,e,f,g=1
label_case7:      
                          ; ldi tmp,  0b01010010; 
                            ldi tmp,  0b10101101;    inverse code  
                          goto label_commacheck;     a,c,f =1
label_case8:      
                         ;ldi tmp,  0b01111111;  
                          ldi tmp,  0b10000000; inverse code  
                          goto label_commacheck;    a,b,c,d,e,f,g =1
label_case9:      
                        ;  ldi tmp,  0b01111110;  
                           ldi tmp,  0b10000001; inverse code 
                          goto label_commacheck;    a,d,c,d,f=1
label_casef :     
                          ; ldi tmp,  0b0000100;   
                            ldi tmp,  0b1111011; inverse code                    
                            goto label_commacheck; symbol '-' for FM
 
label_casec:      
                         ;  ldi tmp,  0b0000000; 
                            ldi tmp,  0b11111111; 
                           goto label_commacheck;    
 
  mov tmp2, reg_byte1
  cpi   tmp2, 0x00 
 ; ori  tmp, 0b10000000 ; h 
  andi  tmp,0b01111111 ; h 
 ;  bitvise inversion
 ; com tmp
 ;  clc 
    mov reg_byte4, tmp
 ret
 
 
 
 
 SendBitsBlink:   ; BitsAddr in  reg_byte0
 
 
; first sent bit 3  2   1  0 last sent bit 
; for 1 on the inform bus send 0 to pin 34 ( and send strobe after it )
 
mov tmp2,   reg_byte0
 
 
mov tmp2,   reg_byte0
andi tmp2 ,0x08
call Send_nInformBit_1_IfByteFalse ;   addr 8    , fix bits mask and  logic
ldi tmp1, ADDR_SYNCBLINK ; 
call SendStrobeSync ;  1
 
mov tmp2,   reg_byte0
andi tmp2 ,0x04
call Send_nInformBit_1_IfByteFalse ;    addr 4    , fix bits mask and  logic
ldi tmp1, ADDR_SYNCBLINK ; 
call SendStrobeSync ;   2
 
mov tmp2,   reg_byte0
andi tmp2 ,0x02
call Send_nInformBit_1_IfByteFalse ;   addr 2   ,   fix bits mask and  logic
ldi tmp1, ADDR_SYNCBLINK ; 
call SendStrobeSync ;   3
 
mov tmp2,   reg_byte0
andi tmp2 ,0x01
call Send_nInformBit_1_IfByteFalse ;    addr 1  , fix bits mask and  logic
ldi tmp1, ADDR_SYNCBLINK ; 
call SendStrobeSync ;  4
 
; without SyncWRRAM pulse , use after send all digits for blink control with TurnOnBlink(),TurnOffBlink(); 
ret
 
 
 
 
 
 
 
 
 
 
 
void SendBitsRAM(uint8_t BitsAddr, uint8_t Digit , uint8_t BitComma/*,  uint8_t BitsBlink*/)
 
;
;     a 
;b        c
;     d
;e        f
;     g
 ;             h
;1 on the inform bus means turn on segment
;
;Inform n8; n4; n2 ; n1 ; e; c; b; d; f; g; a; h;
;
;
;0 1 2 3 4 5 6      7 8 9         a b      c d e f      Addr
;f  e d c b  a 9      8 7 6        5 4      3 2 1 0   ~Addr
;x x x x x x x      x x x         x x      x x x x ;
; Digit  reg_byte0 ,   Comma reg_byte1
 
 
call SevenSegment ;   
 
 
; send address bit using inverse code */
.equ  ADDR_SYNCRAM =15
 
;  for set 1 on the bit Inform set 0 on the nInform (for pin 34 emulation )   
; for set 0 on the bit Inform set 1 on the nInform (for pin 34 emulation )    
 
 
mov tmp2, reg_byte1
andi tmp2, 0x08
call Send_nInformBit_1_IfByteFalse ;   addr 8    , fix bits mask and  logic
ldi tmp1, ADDR_SYNCRAM
call SendStrobeSync  ; 1
 
mov tmp2, reg_byte1
andi tmp2, 0x04
call Send_nInformBit_1_IfByteFalse ;  addr 4    , fix bits mask and  logic
ldi tmp1, ADDR_SYNCRAM
call SendStrobeSync  ;  2
 
mov tmp2, reg_byte1
andi tmp2, 0x02
call Send_nInformBit_1_IfByteFalse ;   addr 2   ,   fix bits mask and  logic
ldi tmp1, ADDR_SYNCRAM
call SendStrobeSync ;  3
 
mov tmp2, reg_byte1
andi tmp2, 0x01
call Send_nInformBit_1_IfByteFalse ; addr 1  , fix bits mask and  logic
ldi tmp1, ADDR_SYNCRAM
call SendStrobeSync ; 4
 
/* for turn on segment set 1  on the Inform Bus, set nIform(34)=0,  as the output */
mov reg_data ,  reg_byte4 
mov tmp2, reg_data
 
call  Send_nInformBit_0_IfFirtstBitTrue ;   e
ldi tmp1, ADDR_SYNCRAM
call SendStrobeSync; 5        bit 0 ,LSB 
 
lsr reg_data
mov tmp2, reg_data
Send_nInformBit_0_IfFirtstBitTrue ;   c
ldi tmp1, ADDR_SYNCRAM
call SendStrobeSync; 6        bit 1
 
lsr reg_data
mov tmp2, reg_data
Send_nInformBit_0_IfFirtstBitTrue ;   b
ldi tmp1, ADDR_SYNCRAM
call SendStrobeSync; 7        bit 2
 
lsr reg_data
mov tmp2, reg_data
Send_nInformBit_0_IfFirtstBitTrue ;   d
ldi tmp1, ADDR_SYNCRAM
call SendStrobeSync; 8       bit 3
 
lsr reg_data
mov tmp2, reg_data
Send_nInformBit_0_IfFirtstBitTrue ;   f
ldi tmp1, ADDR_SYNCRAM
call SendStrobeSync; 9      bit 4
 
 
lsr reg_data
mov tmp2, reg_data
Send_nInformBit_0_IfFirtstBitTrue ;  g
ldi tmp1, ADDR_SYNCRAM
call SendStrobeSync; 10     bit 5
 
 
lsr reg_data
mov tmp2, reg_data
Send_nInformBit_0_IfFirtstBitTrue ; a
ldi tmp1, ADDR_SYNCRAM
call SendStrobeSync; 11    bit 6
 
lsr reg_data
mov tmp2, reg_data
Send_nInformBit_0_IfFirtstBitTrue ;   h
ldi tmp1, ADDR_SYNCRAM
call SendStrobeSync; 12   bit 7
 
 
call SendMemWrRAMPulse ;
 
ret
 
 
  
/****************************************************/
 
 
 
 
 GetByteLD:
 
; nLD0 ,nLD1,nLD2,nLD3,nLD4,nLD4,nLD5,nLD6, 1 
 
  
 
 SetPin34Input ;  
 
 
clr reg_data; 
call SendPulseSyncInLD ;   Pin36 to multiplexer ,Sync 
call GetBitInformLD;
brne  label_LD1;
ori reg_data,0x01;   if nLD0=0   , set 1 
 
label_LD1:
call SendPulseSyncInLD ;   Pin36 to multiplexer ,Sync 
call GetBitInformLD;
brne  label_LD2;
ori reg_data,0x02;  if nLD1=0   , set 1 
 
label_LD2:
call SendPulseSyncInLD ;   Pin36 to multiplexer ,Sync 
call GetBitInformLD;
brne  label_LD3;
ori reg_data,0x04;   if nLD2=0   , set 1  
 
label_LD3:
call SendPulseSyncInLD ;  Pin36 to multiplexer ,Sync 
call GetBitInformLD;
brne  label_LD4;
ori reg_data,0x08;  if nLD3=0   , set 1  
 
label_LD4:
call SendPulseSyncInLD ;  Pin36 to multiplexer ,Sync 
call GetBitInformLD;
brne  label_LD5;
ori reg_data,0x10;    if nLD4=0   , set 1  
 
label_LD5:
call SendPulseSyncInLD ;   Pin36 to multiplexer ,Sync 
call GetBitInformLD;
brne  label_LD6;
ori reg_data,0x20;    if nLD5=0   , set 1   
  
label_LD6:
call SendPulseSyncInLD ;   Pin36 to multiplexer ,Sync 
call GetBitInformLD;
brne  label_LD7;
ori reg_data,0x40;  if nLD6=0   , set 1      
   
label_LD7:
call SendPulseSyncInLD ;   Pin36 to multiplexer ,Sync 
brne  label_endLD;
ori reg_data, 0x80;              no    
 
label_endLD:
andi reg_data, 0x7F; 
 
; call SendPulse_data_accept;  optimize plce of this subroutine 
 
mov tmp, reg_data
ret
 
 
 
GetByteGCd:
 
;nr0;nc0;nr2;nr1;nc1;x;x;x
 
 clr reg_data;
call SendPulseSyncInGCD ;   Pin36 to multiplexer ,SyncPool
call GetBitInformGCd; 
breq  label_GCd1;
ori reg_data,0x01;
 
 
label_GCd1:
call SendPulseSyncInGCD ;  //Pin36 to multiplexer ,SyncPool
call GetBitInformGCd; 
breq  label_GCd2;
ori reg_data,0x02;
 
 
label_GCd2:
call SendPulseSyncInGCD ;   //Pin36 to multiplexer ,SyncPool
call GetBitInformGCd; 
breq  label_GCd3;
ori reg_data,0x04;
 
label_GCd3:
call SendPulseSyncInGCD ;   //Pin36 to multiplexer ,SyncPool
call GetBitInformGCd; 
breq  label_GCd4;
ori reg_data,0x08;
 
label_GCd4:
call SendPulseSyncInGCD ; //Pin36 to multiplexer ,SyncPool
call GetBitInformGCd; 
breq  label_GCd5;
ori reg_data,0x10;
 
 
label_GCd5:
call SendPulseSyncInGCD ; //Pin36 to multiplexer ,SyncPool
call GetBitInformGCd; 
breq  label_GCd6;
ori reg_data,0x20;
 
label_GCd6:
call SendPulseSyncInGCD ;  //Pin36 to multiplexer ,SyncPool
call GetBitInformGCd; 
breq  label_GCd7;
ori reg_data,0x40;
 
label_GCd7:
call SendPulseSyncInGCD ;  //Pin36 to multiplexer ,SyncPool    
call GetBitInformGCd; 
breq  label_GCd7;
ori reg_data,0x80;  
 
 mov tmp, reg_data
 
;7 6  5  4    3     2     1    0 
;x;x;x;nc1;nr1;nr2;nc0;nr0;      
 
ret
Добавлено через 5 минут
информация для размышления из интернета на тему загрузки массива из памяти программ
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
LDI     ZL,low(data*2)  ; заносим младший байт адреса, в регистровую пару Z
    LDI     ZH,high(data*2) ; заносим старший байт адреса, в регистровую пару Z
                    ; умножение на два тут из-за того, что адрес указан в
                    ; в двубайтных словах, а нам надо в байтах. 
                    ; Поэтому и умножаем на два
                    ; После загрузки адреса можно загружать число из памяти
 
    LPM     R16, Z          ; в регистре R16 после этой команды будет число 12,
                    ; взятое из памяти программ.
 
 
; где то в конце программы, но в сегменте .CSEG
data:   .db 12,34,45,23
Добавлено через 3 минуты
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
    .DSEG
        .ORG SRAM_START+100
 
Variables:  .byte 3
Готово, расчистили себе буфферную зону от начала до 100.
 
Ладно, с адресацией разобрались. Как работать с ячейками памяти? А для этих целей существует две группы команд. LOAD и STORE самая многочисленная группа команд.
 
Дело в том, что с ячейкой ОЗУ ничего нельзя сделать кроме как загрузить в нее байт из РОН, или выгрузить из нее байт в РОН.
 
Записывают в ОЗУ команды Store (ST**), а считываю команды Load (LD**).
 
Чтение идет в регистр R16…R31, а адрес ячейки задается либо непосредственно в команде. Вот простой пример. Есть трехбайтная переменная Variables, ее надо увеличить на 1. Т.е. сделать операцию Variables++
 
 
LDI     ZL,low(data*2)  ; заносим младший байт адреса, в регистровую пару Z
    LDI     ZH,high(data*2) ; заносим старший байт адреса, в регистровую пару Z
                    ; умножение на два тут из-за того, что адрес указан в
                    ; в двубайтных словах, а нам надо в байтах. 
                    ; Поэтому и умножаем на два
                    ; После загрузки адреса можно загружать число из памяти
 
    LPM     R16, Z          ; в регистре R16 после этой команды будет число 12,
                    ; взятое из памяти программ.
 
 
; где то в конце программы, но в сегменте .CSEG
data:   .db 12,34,45,23
 
 
 
А можно применить и другой метод. Косвенную запись через индексный регистр.
    .DSEG
Variables:  .byte   3
Variavles2: .byte   1
 
        .CSEG
; Берем адрес нашей переменной
    LDI YL,low(Variables)
    LDI     YH,High(Variables)
 
; Переменная лежит в памяти, сначала надо ее достать.
    LD  R16, Y+     ; Считать первый байт Variables  в R16
    LD  R17, Y+     ; Считать второй байт Variables  в R17
    LD  R18, Y+     ; Ну и третий байт в R18
 
; Теперь прибавим к ней 1, т.к. AVR не умеет складывать с константой, только 
; вычитать, приходиться извращаться. Впрочем, особых проблем не доставляет. 
 
    SUBI    R16,(-1)    ; вообще то SUBI это вычитание, но -(- дает +
    SBCI    R17,(-1)    ; А тут перенос учитывается. Но об этом потом.
    SBCI    R18,(-1)    ; Математика в ассемблере это отдельная история
 
    ST  -Y,R18      ; Сохраняем все как было. 
    ST  -Y,R17      ; Но в обратном порядке
    ST  -Y,R16
Добавлено через 14 минут
https://microelectronic.at.ua/... r/1-1-0-17

Добавлено через 21 минуту
http://www.rjhcoding.com/avr-asm-pm.php

Добавлено через 12 секунд
Можно и старший и младший поочередно

Добавлено через 22 минуты
Assembler
1
goto  xx-> jmp (rjmp for mega8a)
Добавлено через 1 час 55 минут
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
;
; testapp16.asm
;
; Created: 15.03.2020 0:34:13
; Author : USERPC01
;
 
 
; Replace with your application code
;.DEVICE mega16a
.include "m16adef.inc"
 
.CSEG
.org 0x000     jmp InitStack
     
     ; add restart  vectors here 
 
 
InitStack:
        LDI R16,Low(RAMEND) ; Инициализация стека
        OUT SPL,R16
 
        LDI R16,High(RAMEND)
        OUT SPH,R16   
        jmp start
/*
 
LogTable1:
   .db 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08
 
EndLogTable:
 
*/
 
 
 
 LogTable1:
.db 0x03,0xe8,  0x03,0xdd,  0x03,0xd1,  0x03,0xc6,  0x03,0xbb,  0x03,0xb0,  0x03,0xa5,  0x03,0x9b,  0x03,0x90,  0x03,0x86 
.db 0x03,0x7b,  0x03,0x71,  0x03,0x67,  0x03,0x5d,  0x03,0x53,  0x03,0x49,  0x03,0x40,  0x03,0x36,  0x03,0x2d,  0x03,0x24 
.db 0x03,0x1a,  0x03,0x11,  0x03,0x08,  0x02,0xff,  0x02,0xf7,  0x02,0xee,  0x02,0xe5,  0x02,0xdd,  0x02,0xd4,  0x02,0xcc 
.db 0x02,0xc4,  0x02,0xbc,  0x02,0xb4,  0x02,0xac,  0x02,0xa4,  0x02,0x9c,  0x02,0x95,  0x02,0x8d,  0x02,0x86,  0x02,0x7e 
.db 0x02,0x77,  0x02,0x70,  0x02,0x69,  0x02,0x62,  0x02,0x5b,  0x02,0x54,  0x02,0x4d,  0x02,0x46,  0x02,0x3f,  0x02,0x39 
.db 0x02,0x32,  0x02,0x2c,  0x02,0x26,  0x02,0x1f,  0x02,0x19,  0x02,0x13,  0x02,0x0d,  0x02,0x07,  0x02,0x01,  0x01,0xfb 
.db 0x01,0xf5,  0x01,0xef,  0x01,0xea,  0x01,0xe4,  0x01,0xdf,  0x01,0xd9,  0x01,0xd4,  0x01,0xce,  0x01,0xc9,  0x01,0xc4 
.db 0x01,0xbf,  0x01,0xba,  0x01,0xb5,  0x01,0xb0,  0x01,0xab,  0x01,0xa6,  0x01,0xa1,  0x01,0x9c,  0x01,0x97,  0x01,0x93 
.db 0x01,0x8e,  0x01,0x8a,  0x01,0x85,  0x01,0x81,  0x01,0x7c,  0x01,0x78,  0x01,0x74,  0x01,0x6f,  0x01,0x6b,  0x01,0x67 
.db 0x01,0x63,  0x01,0x5f,  0x01,0x5b,  0x01,0x57,  0x01,0x53,  0x01,0x4f,  0x01,0x4b,  0x01,0x47,  0x01,0x44,  0x01,0x40 
EndLogTable:
 
LinTable316:
 
.db 0x03,0xe7,  0x03,0xe4,  0x03,0xe1,  0x03,0xde,  0x03,0xdb,  0x03,0xd8,  0x03,0xd4,  0x03,0xd1,  0x03,0xce,  0x03,0xcb 
.db 0x03,0xc8,  0x03,0xc5,  0x03,0xc1,  0x03,0xbe,  0x03,0xbb,  0x03,0xb8,  0x03,0xb5,  0x03,0xb2,  0x03,0xae,  0x03,0xab 
.db 0x03,0xa8,  0x03,0xa5,  0x03,0xa2,  0x03,0x9f,  0x03,0x9b,  0x03,0x98,  0x03,0x95,  0x03,0x92,  0x03,0x8f,  0x03,0x8c 
.db 0x03,0x88,  0x03,0x85,  0x03,0x82,  0x03,0x7f,  0x03,0x7c,  0x03,0x79,  0x03,0x76,  0x03,0x72,  0x03,0x6f,  0x03,0x6c 
.db 0x03,0x69,  0x03,0x66,  0x03,0x63,  0x03,0x5f,  0x03,0x5c,  0x03,0x59,  0x03,0x56,  0x03,0x53,  0x03,0x50,  0x03,0x4c 
.db 0x03,0x49,  0x03,0x46,  0x03,0x43,  0x03,0x40,  0x03,0x3d,  0x03,0x39,  0x03,0x36,  0x03,0x33,  0x03,0x30,  0x03,0x2d 
.db 0x03,0x2a,  0x03,0x26,  0x03,0x23,  0x03,0x20,  0x03,0x1d,  0x03,0x1a,  0x03,0x17,  0x03,0x13,  0x03,0x10,  0x03,0x0d 
.db 0x03,0x0a,  0x03,0x07,  0x03,0x04,  0x03,0x01,  0x02,0xfd,  0x02,0xfa,  0x02,0xf7,  0x02,0xf4,  0x02,0xf1,  0x02,0xee 
.db 0x02,0xea,  0x02,0xe7,  0x02,0xe4,  0x02,0xe1,  0x02,0xde,  0x02,0xdb,  0x02,0xd7,  0x02,0xd4,  0x02,0xd1,  0x02,0xce 
.db 0x02,0xcb,  0x02,0xc8,  0x02,0xc4,  0x02,0xc1,  0x02,0xbe,  0x02,0xbb,  0x02,0xb8,  0x02,0xb5,  0x02,0xb1,  0x02,0xae 
.db 0x02,0xab,  0x02,0xa8,  0x02,0xa5,  0x02,0xa2,  0x02,0x9e,  0x02,0x9b,  0x02,0x98,  0x02,0x95,  0x02,0x92,  0x02,0x8f 
.db 0x02,0x8b,  0x02,0x88,  0x02,0x85,  0x02,0x82,  0x02,0x7f,  0x02,0x7c,  0x02,0x79,  0x02,0x75,  0x02,0x72,  0x02,0x6f 
.db 0x02,0x6c,  0x02,0x69,  0x02,0x66,  0x02,0x62,  0x02,0x5f,  0x02,0x5c,  0x02,0x59,  0x02,0x56,  0x02,0x53,  0x02,0x4f 
.db 0x02,0x4c,  0x02,0x49,  0x02,0x46,  0x02,0x43,  0x02,0x40,  0x02,0x3c,  0x02,0x39,  0x02,0x36,  0x02,0x33,  0x02,0x30 
.db 0x02,0x2d,  0x02,0x29,  0x02,0x26,  0x02,0x23,  0x02,0x20,  0x02,0x1d,  0x02,0x1a,  0x02,0x16,  0x02,0x13,  0x02,0x10 
.db 0x02,0x0d,  0x02,0x0a,  0x02,0x07,  0x02,0x03,  0x02,0x00,  0x01,0xfd,  0x01,0xfa,  0x01,0xf7,  0x01,0xf4,  0x01,0xf1 
.db 0x01,0xed,  0x01,0xea,  0x01,0xe7,  0x01,0xe4,  0x01,0xe1,  0x01,0xde,  0x01,0xda,  0x01,0xd7,  0x01,0xd4,  0x01,0xd1 
.db 0x01,0xce,  0x01,0xcb,  0x01,0xc7,  0x01,0xc4,  0x01,0xc1,  0x01,0xbe,  0x01,0xbb,  0x01,0xb8,  0x01,0xb4,  0x01,0xb1 
.db 0x01,0xae,  0x01,0xab,  0x01,0xa8,  0x01,0xa5,  0x01,0xa1,  0x01,0x9e,  0x01,0x9b,  0x01,0x98,  0x01,0x95,  0x01,0x92 
.db 0x01,0x8e,  0x01,0x8b,  0x01,0x88,  0x01,0x85,  0x01,0x82,  0x01,0x7f,  0x01,0x7c,  0x01,0x78,  0x01,0x75,  0x01,0x72 
.db 0x01,0x6f,  0x01,0x6c,  0x01,0x69,  0x01,0x65,  0x01,0x62,  0x01,0x5f,  0x01,0x5c,  0x01,0x59,  0x01,0x56,  0x01,0x52 
.db 0x01,0x4f,  0x01,0x4c,  0x01,0x49,  0x01,0x46,  0x01,0x43,  0x01,0x3f
EndLinTable316:
 
 
 
 
 
LoadTable1:
 
 ; ldi r18, 8
ldi ZL, low( LogTable1<<1)   ; load BYTE ADDRESS (word address*2) of the table into
ldi ZH, high(LogTable1<<1)  ; X
clr r21
add ZL, r20
adc ZH, r21 
clr r21
add ZL, r20
adc ZH, r21 ; increment  2*NumCell byte from start of the array 
 
 
 
lpm r17,Z+  ; Load constant from Program
lpm r16, Z  
ret
 
LoadTable2:
;fix for  316-V 
 ; ldi r18, 8
ldi ZL, low( LinTable316<<1)   ; load BYTE ADDRESS (word address*2) of the table into
ldi ZH, high(LinTable316<<1)  ; X
clr r21
add ZL, r20
adc ZH, r21
clr r21
add ZL, r20
adc ZH, r21; increment  2*NumCell byte from start of the array , fix for 316-V 
 
 
 
lpm r17,Z+  ; Load constant from Program
lpm r16, Z  
ret
Main:
 
ldi r18, 0xff
out DDRC,r18
out DDRD,r18
 out DDRA,r18
ldi r20,0
 
start:
 out PORTA,r20    
call LoadTable1 ;
out PORTC,r16
 out PORTD,r17 
inc r20;
 
cpi r20,100
breq Main
 
     jmp start
Добавлено через 4 минуты
тестовая программа на асссемблере по массивам (независимо от схемы, просто для дебаггера и проверки проекта , выводит в порты старший и младший байт таблицы дешифратора логарифмичского масштаба , для 0,316-0,101 добавить вычитание из регистровой пары с числом 316 числа 316...101 (два раза , младший и старший байт ), к которому приводятся показания ,если секция 10 дБ включена ).

Добавлено через 36 минут
Будет ли


Assembler
1
2
3
4
5
6
7
8
ldi ZL, low( LogTable1<<1)   ; load BYTE ADDRESS (word address*2) of the table into
ldi ZH, high(LogTable1<<1)  ; X
clr r21
add ZL, r20
adc ZH, r21 
clr r21
add ZL, r20
adc ZH, r21
давать переполнение и сбой после 128, 256 , 300 элемента массива(если сменить на линейный , в нем 2*215 элементов, а в логарифмическом 2*100 (для однобайтного до умножения на 2 подойдет,а с учетом умножения на два для адреса памяти сдвигом учитывать проблему переноса )) ? Проверить. Может на регистровую пару XH:XL перейти ?
В другую потом нужно будет вводить 32-битное число , значит нужны будут две регистровые пары последовательно ,
но у нас указатель можно заново инициализировать, разбить по байтам и парам байтов с переносом , самое проблемное у нас семиразрядное десятичное число в шестнадцатеричном виде или до семи регистров (ячеек ) последовательно, только по байтам как массив байтов с цифрами в двоично-десятичном коде 2421(8421) .
0
7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
15.03.2020, 20:14  [ТС]
Про прерывание 2 (проблема с инверторами или внедрение диодов, из интернета и даташита )
"

Для разрешения или запрещения внешних прерываний предназначен управляющий регистр GICR (General Interrupt Control Register).



Установка битов INT1, INT0 или INT2 разрешает прерывания при возникновении события на соответствующем выводе микроконтроллера AVR, а сброс — запрещает.

Естественно нужно установить еще и флаг глобального разрешения прерываний - I, который расположен в регистре SREG. Без него вообще ни одно прерывание вызываться не будет.

Внешнее прерывание может происходить по одному из условий:
– по низкому уровню на выводах INT0, INT1,
– по любому изменению логического уровня на выводах INT0, INT1
– по спадающему фронту сигнала на выводах INT0, INT1, INT2,
– по нарастающему фронту на выводах INT0, INT1, INT2.

Небольшая иллюстрация, чтобы уяснить разницу между фронтом и уровнем сигнала.



Условия генерации прерываний устанавливаются с помощью конфигурационных регистров. Для INT0, INT1 – это регистр MCUCR (MCU Control Register). Для INT2 – MCUCSR (MCU Control and Status Register)

В таблице ниже приведены возможные значения разрядов ISC01, ISC00 и соответствующие им условия генерации внешнего прерывания.

MCUCR – MCU Control Register
7 6 5 4 3 2 1 0
SM2 SE SM1 SM0 ISC11 ISC10 ISC01 ISC00

ISC01 ISC00 Description
0 0 The low level of INT0 generates an interrupt request.
0 1 Any logical change on INT0 generates an interrupt request.
1 0 The falling edge of INT0 generates an interrupt request.
1 1 The rising edge of INT0 generates an interrupt request.

ISC11 ISC10 Description
0 0 The low level of INT1 generates an interrupt request.
0 1 Any logical change on INT1 generates an interrupt request.
1 0 The falling edge of INT1 generates an interrupt request.
1 1 The rising edge of INT1 generates an interrupt request.

MCUCSR – MCU Control and Status Register

Bit 6 – ISC2: Interrupt Sense Control 2
The Asynchronous External Interrupt 2 is activated by the external pin INT2 if the SREG I-bit and the
corresponding interrupt mask in GICR are set. If ISC2 is written to zero, a falling edge on INT2 activates the
interrupt. If ISC2 is written to one, a rising edge on INT2 activates the interrupt. Edges on INT2 are registered
asynchronously. Pulses on INT2 wider than the minimum pulse width given in “External Interrupts
Characteristics” on page 283 will generate an interrupt. Shorter pulses are not guaranteed to generate an
interrupt. When changing the ISC2 bit, an interrupt can occur. Therefore, it is recommended to first disable INT2
by clearing its Interrupt Enable bit in the GICR Register. Then, the ISC2 bit can be changed. Finally, the INT2
Interrupt Flag should be cleared by writing a logical one to its Interrupt Flag bit (INTF2) in the GIFR Register
before the interrupt is re-enabled.

GICR – General Interrupt Control Register
7 6 5 4 3 2 1 0
INT1 INT0 INT2 – – – IVSEL IVCE
Bit 7 – INT1: External Interrupt Request 1 Enable
When the INT1 bit is set (one) and the I-bit in the Status Register (SREG) is set (one), the external pin interrupt
is enabled. The Interrupt Sense Control1 bits 1/0 (ISC11 and ISC10) in the MCU General Control Register
(MCUCR) define whether the External Interrupt is activated on rising and/or falling edge of the INT1 pin or level
sensed. Activity on the pin will cause an interrupt request even if INT1 is configured as an output. The
corresponding interrupt of External Interrupt Request 1 is executed from the INT1 interrupt Vector

Bit 6 – INT0: External Interrupt Request 0 Enable
When the INT0 bit is set (one) and the I-bit in the Status Register (SREG) is set (one), the external pin interrupt
is enabled. The Interrupt Sense Control0 bits 1/0 (ISC01 and ISC00) in the MCU General Control Register
(MCUCR) define whether the External Interrupt is activated on rising and/or falling edge of the INT0 pin or level
sensed. Activity on the pin will cause an interrupt request even if INT0 is configured as an output. The
corresponding interrupt of External Interrupt Request 0 is executed from the INT0 interrupt vector.
• Bit 5 – INT2: External Interrupt Request 2 Enable
When the INT2 bit is set (one) and the I-bit in the Status Register (SREG) is set (one), the external pin interrupt
is enabled. The Interrupt Sense Control2 bit (ISC2) in the MCU Control and Status Register (MCUCSR) defines
whether the External Interrupt is activated on rising or falling edge of the INT2 pin. Activity on the pin will cause
an interrupt request even if INT2 is configured as an outp


Прерывание INT2 может происходить только по фронтам сигнала, поэтому для установки условий используется всего один бит - это бит ISC2 регистра MCUCSR.

ISC2
0 по срезу на выводе INT2
1 по фронту на выводе INT2


Кстати, при смене значения бита ISC2 может быть сгенерировано прерывание INT2. Чтобы этого не происходило, нужно производить модификацию бита ISC2 так: запретить внешнее прерывание, поменять бит ISC2, сбросить флаг прерывания — INTF2 (смотри ниже) и опять разрешить прерывание INT2.

Обнаружение фронтов сигналов на выводах INT0/INT1 осуществляется синхронно, то есть по сигналу тактового генератора. Минимальная длительность входного импульса, гарантирующая генерацию прерывания, составляет один период тактового сигнала микроконтроллера AVR.



"

Добавлено через 6 минут
Придется через диоды делать на одно или два прерывания
0
7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
15.03.2020, 21:01  [ТС]
Вариант с одним прерыванием, диодами и флагами в ОЗУ (по синдрому, захваченному по прерыванию с порта PB, отфильтрованному от неинформативных составляющих выставляются флаги в ОЗУ , в основной программе реагируют только на флаги , после этого разрешается следующая обработка прерываний ).
Миниатюры
Замена  микросхемы 1827ВЕ1-0000000 в Г4-164 на AVR -МК  
0
7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
15.03.2020, 23:11  [ТС]
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
InitInterrupts:
 
 
; Int0 interrupt on edge (on rise with invertors)  , pull -up(pull-down with invertors ), input 
;  for circuit with 3 diode and resistor , check for invertors 
; PB0 Interrupt 1 , if  0   (or if<>0 with invertors), low priority
; PB1 Interrupt 2 , if  0   (or if<>0 with invertors)
; PB2 Interrupt 3 , if  0   (or if<>0 with invertors), high priority
 
cli 
 
in r16, DDRD
andi r16, 11111011
out r16, DDRD
 
in r16, DDRB
andi r16, 11111000
out r16, DDRB
 
in r16, MCUCR
ori r16,  (1<<ISC01)
;ori r16,  (1<<ISC00)  ; add if   on rise 
out  MCUCR, r16
 
; or see GIMSK for other MCU
in r16, GICR
ori  r16, (1<<INT0);
out GICR, r16
 
 
ret
 
 
 
 
 
 
 
 
 
EXT_INT0:
cli
nop
in r16, PORTB
andi r16, 0x00000111
 
 
; on edge 
mov r17,r16
andi r17, 0x00000100
cpi  r17,  0x00
breq  SetIntFlagOnInterrupt3 ; on edge
;breq  SetIntFlagOnInterrupt3; on rise
 
 
 
mov r17,r16
andi r17, 0x00000010
cpi  r17,  0x00
breq  SetIntFlagOnInterrupt2 ; on edge
;brne  SetIntFlagOnInterrupt2  ; on rise
 
 
 
mov r17,r16
andi r17, 0x00000001
cpi  r17,  0x00
breq  SetIntFlagOnInterrupt1 ; on edge
;brne  SetIntFlagOnInterrupt1  ; on rise
 
jmp Main ; must return to the begin of the main loop after InitPins,InitInterrupts,  InitDevice 
; reti    ;return to the next line after interrupt , not used in our program
Добавлено через 1 минуту
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.include "m16adef.inc"
 
.CSEG
.org 0x000   jmp RESET
.org  0x002   jmp EXT_INT0 ; IRQ0 Handler
; .org  0x004    jmp EXT_INT1 ; IRQ1 Handler     
; .org   0x024    jmp EXT_INT2 ; IRQ2 Handler
 
 ; .ORG   INT_VECTORS_SIZE   
.org 0x02A ; fix for other processors 
 
 
 
 
.include "initpins.asm"
.include "intparser.asm"
.include "initdevice.asm"
; fix 
 
 
RESET: 
                    ldi r16,high(RAMEND; Main program start
                   out SPH,r16 ; Set Stack Pointer to top of RAM
                    ldi r16,low(RAMEND)
                   out SPL,r16
                   call InitPins
                   call InitDevice
                   jmp Main
 
...
Добавлено через 25 минут
Можно отключить подтяжку, чтобы не влияла на информ, приделав обычные резисторы

Assembler
1
2
3
  in r17,MCUCR
  ori r17, (1<<PUD) ; disable pull-up 
  out r17,MCUCR
Добавлено через 2 минуты
При инициализации порта А отключать модуль АЦП (после сброса обычно это так ).
В атмега48 маловато ОЗУ (может, хватит ), в атмега8 мало памяти программ и неудобные пины . 16-я дорогая, но в нее поместится.

Добавлено через 3 минуты
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
; for ATMEGA16a
 
; PC0 - i/o  nInform   , see circuit 
; PC1  nPIN36   Sync 
; PC2  nPIN37   nMemWr                  1 wr
; PC3  nPIN39   nMemWrRAM         1 wr 
; PC4  PIN23   0 6dB off
; PC5  PIN38  DataAccept   1 wr 
; for PC1-PC3  use additional invertors   
 
;PA0  PIN29    ADRMUX1
;PA1  PIN30    ADRMUX2
;PA2  PIN31    ADRMUX4
;PA3  PIN32    ADRMUX8
 
 
 .equ ADDR_INFORM_WAIT_RESET =0x02 ;
 
 
;PB
 
InitPins:
 
in r16, DDRC
ori   0x00111110  
andi 0x00111110
out r16, DDRC   ; PC0 in , PC1-PC5 out
 
ldi  r16, 00000000  ; PC0 pull-down ,  PC1-PC5  pull-down 
out  PORTC
 
 
 
in r16, DDRA
ori 0x00001111     ; ser PA0-PA3  output 
out r16, DDRA
ldi r16, ADDR_INFORM_WAIT_RESET
out PORTA,r16
 
clr r16
out DDRB, r16
out DDRD, r16
out PORTB, r16
 
in r16, DDRD
andi r16, 11110011 ; Set PD2,PD3  input
out r16, DDRD
 
 
 
 
in r16, DDRB
andi r16, 11111000 ; set PB0-PB2 input  (0 in the DDRx)
out r16, DDRB
 
;insert    disable ADC alt function for PORT A  (if with ADC) here 
 
  in r17,MCUCR
  ori r17, (1<<PUD) ; disable pull-up 
  out r17,MCUCR
 
ret
Добавлено через 7 минут
Assembler
1
2
3
4
5
6
7
8
9
10
11
.macro read_db_progmem ; memory_address, offset, output register
ldi zh, high(2*@0)  //load higher bits of 2*memory_address
ldi zl, low(2*@0) //load lower bits of 2*memory_address
 
clr r21  //resets r21
clc 
add zl, @1 //adds @1 (offset) to zl
adc zh, r21 //adds carry to zh
lpm@2, Z //loads memory location Z into output
.endmacro
; for one byte
0
7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
15.03.2020, 23:14  [ТС]
таблицу индикации можно сделать аналогично следующей статье , доработав под наши коды под read_db_progmem
Вложения
Тип файла: pdf C3.pdf (1.27 Мб, 8 просмотров)
0
7 / 7 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
16.03.2020, 02:18  [ТС]
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
LabelIndTableInvCode:
.db 0b10001000 , 0b11101101,0b10010100,0b10000101,0b10100001,0b10000011,0b10000010, 0b10101101,0b10000000, 0b10000001 
.db 0b11111111, 0b11111111,0b11111111,0b11111111,0b11111111,0b11111111,0b11111111,0b11111111,0b11111111,0b11111111, 0b1111011
 
LabelIndTableInvCodeEnd: ; end of table  you may delete this label 
 
 
 
 SevenSegment:  ;   Digit  reg_byte0 ,   Comma reg_byte1
; r16 is tmp 
mov r20, reg_byte0
ldi zh, high( LabelIndTableInvCode<<1)  ;load higher bits of 2*memory_address
ldi zl,  low(  LabelIndTableInvCode<<1) ; load lower bits of 2*memory_address
clr r21   ; clear  r21
clc 
add zl,  r20 ; adds r20 (offset) to zl
adc zh, r21 ; adds carry to zh
lpm tmp, Z ;loads memory location Z into output
 
  mov tmp2, reg_byte1
  cpi   tmp2, 0x00 
  breq  ExitInd2
  andi  tmp,0b01111111 ; h 
ExitInd2:
    mov reg_byte4, tmp
ret
Добавлено через 39 секунд
Отправлять можно и в цикле побайтно

Добавлено через 21 минуту
В таблице
Assembler
1
2
3
4
5
LabelIndTableInvCode:
.db 0b10001000 , 0b11101101,0b10010100,0b10000101,0b10100001,0b10000011,0b10000010, 0b10101101,0b10000000, 0b10000001 
.db 0b11111111, 0b11111111,0b11111111,0b11111111,0b11111111,0b11111111,0b11111111,0b11111111,0b11111111,0b11111111, 0b1111011
 
LabelIndTableInvCodeEnd: ; end of table  you may delete this label
во второй строке поставить код 0b1111011 на место для кода прочерка (начало + 15 , определится c кодом , например , посылая 0x0f для прочерка другой подпрограммой или изменив программу , можно и на 0x0a перевести )
Assembler
1
2
3
4
LabelIndTableInvCode:
.db 0b10001000 , 0b11101101,0b10010100,0b10000101,0b10100001,0b10000011,0b10000010, 0b10101101,0b10000000, 0b10000001 
.db 0b11111111, 0b11111111,0b11111111,0b11111111,0b11111111,0b11111111, 0b1111011 
LabelIndTableInvCodeEnd: ; end of table  you may delete this label
Добавлено через 2 часа 16 минут
Программа для проверки возможности обращения к ОЗУ (подставить метку последней ячейки , вручную в дебаггере проверить, где 01 записалось в ОЗУ, в дальнейшем применять ограничители для программ ввода переменных, ячейка не менее ,чем 0x1EB ) .

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
;
; test2.asm
;
; Created: 15.03.2020 18:09:37
; Author : USERPC01
;
 
 
 
 
 
; Replace with your application code
 
.include "m16adef.inc" ; Используем ATMega16
;= Start macro.inc ===============================
; Макросы тут
.macro WriteByteToRam
ldi ZL, low(@0 )   ; load BYTE ADDRESS (word address*2) of the table into
ldi ZH, high(@0)     ; X
mov r20, @1
clr r21
clc
add ZL, r20
adc ZH, r21 
ST Z, @2       ; STS    Variables+offset,Rn
 
.endmacro
 
.macro  GetByteFromRAM
ldi ZL, low(@0 )   ; load BYTE ADDRESS (word address*2) of the table into
ldi ZH, high(@0)     ; X
mov r20, @1
clr r21
clc
add ZL, r20
adc ZH, r21 
LD   @2 , Z      ; STS  Variables+offset,Rn
 
 
.endmacro 
 
 
 
 
 
 
;= End macro.inc =================================
; RAM =============================================
.DSEG ; Сегмент ОЗУ
;.org 0x0060
.ORG SRAM_START
ParseFlags: 
            .byte   4
 
Flags1: 
             .byte  2
 
CurrentState:       
CurrFlags:           .byte 4 
CurrFreqDigits:  .byte 8  ; freq
CurrFreqDotPos:  .byte 1  
CurrFMDigits:    .byte 3  ; FM
CurrFMDotPos:    .byte 1
CurrAMDigits:    .byte 2  ; AM
CurrOutDigits:   .byte 4  ; Out
CurrOutDotPos:   .byte 1  ; 
CurrOutMode:     .byte 1  ;  
CurrOutState:    .byte 1  ;  
Curr6dBState:    .byte 1  ;  
CurrLFOState:    .byte 1  ; LFO
CurrModState:    .byte 1  ; 
CurrBandState:   .byte 1  ; 
 
 
FirstState:        .byte 1
FirstFlags:        .byte 4 
FirstFreqDigits:  .byte 8  ; freq
FirstFreqDotPos:  .byte 1  
FirstFMDigits:   .byte 3  ; FM
FirstFMDotPos:    .byte 1
FirstAMDigits:   .byte 2  ; AM
FirstOutDigits:  .byte 4  ; Out
FirstOutDotPos:  .byte 1  ; 
FirstOutMode:    .byte 1  ;  
FirstOutState:   .byte 1  ;  
First6dBState:   .byte 1  ;  
FirstLFOState:    .byte 1  ; 
FirstModState:    .byte 1  ; 
FirstBandState:   .byte 1  ; 
 
               
 
SecondState:        .byte 1
SecondFlags:        .byte 4 
SecondFreqDigits:  .byte 8  ; freq
SecondFreqDotPos:  .byte 1  
SecondFMDigits:  .byte 3  ; FM
SecondFMDotPos:    .byte 1
SecondAMDigits:  .byte 2  ; AM
SecondOutDigits:     .byte 4  ; Out
SecondOutDotPos:     .byte 1  ; 
SecondOutMode:   .byte 1  ;  
SecondOutState:  .byte 1  ;  
Second6dBState:  .byte 1  ;  
SecondLFOState:    .byte 1  ; 
SecondModState:    .byte 1  ; 
SecondBandState:   .byte 1  ;
 
ThirdState:        .byte 1
ThirdFlags:        .byte 4 
ThirdFreqDigits:  .byte 8  ; freq
ThirdFreqDotPos:  .byte 1  
ThirdFMDigits:   .byte 3  ; FM
ThirdFMDotPos:    .byte 1
ThirdAMDigits:   .byte 2  ; AM
ThirdOutDigits:  .byte 4  ; Out
ThirdOutDotPos:  .byte 1  ; 
ThirdOutMode:    .byte 1  ;  
ThirdOutState:   .byte 1  ;  
Third6dBState:   .byte 1  ;  
ThirdLFOState:    .byte 1  ; 
ThirdModState:    .byte 1  ; 
ThirdBandState:   .byte 1  ; 
 
FourthState:      .byte 1
FourthFlags:        .byte 4 
FourthFreqDigits:  .byte 8  ; freq
FourthFreqDotPos:  .byte 1  
FourthFMDigits:  .byte 3  ; FM
FourthFMDotPos:    .byte 1
FourthAMDigits:  .byte 2  ; AM
FourthOutDigits:     .byte 4  ; Out
FourthOutDotPos:     .byte 1  ; 
FourthOutMode:   .byte 1  ;  
FourthOutState:  .byte 1  ;  
Fourth6dBState:  .byte 1  ;  
FourthLFOState:    .byte 1  ; 
FourthModState:    .byte 1  ; 
FourthBandState:   .byte 1  ; 
 
 
FifthState:        .byte 1
FifthFlags:        .byte 4 
FifthFreqDigits:  .byte 8  ; freq
FifthFreqDotPos:  .byte 1  
FifthFMDigits:   .byte 3  ; FM
FifthFMDotPos:    .byte 1
FifthAMDigits:   .byte 2  ; AM
FifthOutDigits:  .byte 4  ; Out
FifthOutDotPos:  .byte 1  ; 
FifthOutMode:    .byte 1  ;  
FifthOutState:   .byte 1  ;  
Fifth6dBState:   .byte 1  ;  
FifthLFOState:    .byte 1  ; 
FifthhModState:    .byte 1  ; 
FifthBandState:   .byte 1  ; 
 
SixthState:        .byte 1
SixthFlags:        .byte 4 
SixthFreqDigits:  .byte 8  ; freq
SixthFreqDotPos:  .byte 1  
SixthFMDigits:   .byte 3  ; FM
SixthFMDotPos:    .byte 1
SixthAMDigits:   .byte 2  ; AM
SixthOutDigits:  .byte 4  ; Out
SixthOutDotPos:  .byte 1  ; 
SixthOutMode:    .byte 1  ;  
SixthOutState:   .byte 1  ;  
Sixth6dBState:   .byte 1  ;  
SixthLFOState:    .byte 1  ; 
SixthhModState:    .byte 1  ; 
SixthBandState:   .byte 1  ; 
 
SeventhState:       .byte 1
SeventhFlags:        .byte 4 
SeventhFreqDigits:  .byte 8  ; freq
SeventhFreqDotPos:  .byte 1  
SeventhFMDigits:     .byte 3  ; FM
SeventhFMDotPos:    .byte 1
SeventhAMDigits:     .byte 2  ; AM
SeventhOutDigits:    .byte 4  ; Out
SeventhOutDotPos:    .byte 1  ; 
SeventhOutMode:  .byte 1  ;  
SeventhOutState:     .byte 1  ;  
Seventh6dBState:     .byte 1  ;  
SeventhLFOState:    .byte 1  ; 
SeventhModState:    .byte 1  ; 
SeventhBandState:   .byte 1  ; 
 
EighthState:       .byte 1
EighthFlags:        .byte 4 
EighthFreqDigits:  .byte 8  ; freq
EighthFreqDotPos:  .byte 1  
EighthFMDigits:  .byte 3  ; FM
EighthFMDotPos:    .byte 1
EighthAMDigits:  .byte 2  ; AM
EighthOutDigits:     .byte 4  ; Out
EighthOutDotPos:     .byte 1  ; 
EighthOutMode:   .byte 1  ;  
EighthOutState:  .byte 1  ;  
Eighth6dBState:  .byte 1  ;  
EighthLFOState:    .byte 1  ; 
EighthModState:    .byte 1  ; 
EighthBandState:   .byte 1  ; 
 
NinethState:        .byte 1 
NinethFlags:        .byte 4 
NinethFreqDigits:  .byte 8  ; freq
NinethFreqDotPos:  .byte 1  
NinethFMDigits:  .byte 3  ; FM
NinethFMDotPos:    .byte 1
NinethAMDigits:  .byte 2  ; AM
NinethOutDigits:     .byte 4  ; Out
NinethOutDotPos:     .byte 1  ; 
NinethOutMode:   .byte 1  ;  
NinethOutState:  .byte 1  ;  
Nineth6dBState:  .byte 1  ;  
NinethLFOState:    .byte 1  ; 
NinethModState:    .byte 1  ; 
NinethBandState:   .byte 1  ; 
 
TenthState:        .byte 1
TenthFlags:        .byte 4 
TenthFreqDigits:  .byte 8  ; freq
TenthFreqDotPos:  .byte 1  
TenthFMDigits:    .byte 3  ; FM
TenthFMDotPos:    .byte 1
TenthAMDigits:   .byte 2  ; AM
TenthOutDigits:  .byte 4  ; Out
TenthOutDotPos:  .byte 1  ; 
TenthOutMode:    .byte 1  ;  
TenthOutState:    .byte 1  ;  
Tenth6dBState:    .byte 1  ;  
TenthLFOState:    .byte 1  ; 
TenthModState:    .byte 1  ; 
TenthBandState:   .byte 1  ; 
 
 
EleventhState:        .byte 1
EleventhFlags:        .byte 4 
EleventhFreqDigits:  .byte 8  ; freq
EleventhFreqDotPos:  .byte 1  
EleventhFMDigits:    .byte 3  ; FM
EleventhFMDotPos:    .byte 1
EleventhAMDigits:    .byte 2  ; AM
EleventhOutDigits:   .byte 4  ; Out
EleventhOutDotPos:   .byte 1  ; 
EleventhOutMode:     .byte 1  ;  
EleventhOutState:    .byte 1  ;  
Eleventh6dBState:    .byte 1  ;  
EleventhLFOState:    .byte 1  ; 
EleventhModState:    .byte 1  ; 
EleventhBandState:   .byte 1  ; 
 
StackInkey:
StackInkeyDigits:     .byte 8
StackInkeyCommaPos:  .byte 1
 
StackGPIBNumbers:
StackGPIBDigits:      .byte 8
StackGPIBCommaPos:    .byte 1
 
EndOfStack:
 
 
; FLASH ===========================================
.CSEG ; Кодовый сегмент
 
.org 0x000
       jmp Init
 
 
 
 
Init:
ldi R16,Low(RAMEND) ; Инициализация стека
out SPL,R16
ldi R16,High(RAMEND)
out SPH,R16
 
 
 
 
jmp Main
 
 
 
 
 
 
 
/*
 
WriteRAM :
; ldi r16, 8
ldi ZL, low(  Variables  )   ; load BYTE ADDRESS (word address*2) of the table into
ldi ZH, high( Variables)  ; X
clr r21
clc
add ZL, r20
adc ZH, r21 
;clr r21
;clc
;add ZL, r20
;adc ZH, r21 ;
ST Z+,r20      ; STS    Variables,R16
ST Z,r21       ; STS    Variables+1,R17
*/
/*
 
ReadRAMTable:
; ldi r16, 8
ldi ZL, low( Variables )   ; load BYTE ADDRESS (word address*2) of the table into
ldi ZH, high( Variables)  ; X
clr r21
clc
add ZL, r20
adc ZL, r21 
;clr r21
;clc
;add ZL, r20
;adc ZH, r21 ;
 
LD   r18,Z+    ; LDS    R16, Variables
LD   r17,Z      ; LDS   R17, Variables+1   
*/
 
 
 
 
 
Main:
ldi r16,0xff
out DDRC,r16
out DDRD,r16
ldi r16, 0x01
 
Main1:
; call WriteRAM;
WriteByteToRam StackGPIBCommaPos, r16, r16
GetByteFromRAM StackGPIBCommaPos, r16, r17
 out PORTC, r17
;out PORTD, r18
 inc r16 
 
jmp Main1
 
 
 
 
;dataTable: 
;.db   0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08 
 
; EEPROM ==========================================
.ESEG ; Сегмент EEPROM
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.03.2020, 02:18
Помогаю со студенческими работами здесь

Замена микросхемы на аналоговую
Привет всем. Какой микросхемой можно заменить микросхему FBBHAQ DM0265RB ? Она с платы 'SMPS 888 VER1.1', которая с...

Hp pavilion g6 замена микросхемы видео-чипа
Здравствуйте, может кто-то есть из сервисного центра? Какой срок гарантии дается при замене микросхемы видео-чипа? Отдал в сервисный центр,...

Acer Aspire One D255. Замена микросхемы U13
Здравствуйте форумчане. Имеется Ноут Acer Aspire One D255 (PAV70 LA-6221P Rev:1.0) , у него выгорела микросхема: U13 - G547H2 она же...

Acer aspire 5602wlmi замена сгоревшей микросхемы PG1AY 6900AS
помогите пожалуйста в ноутбуке Acer aspire 5602wlmi сгорела микросхема &quot;PG1AY 6900AS&quot; найти такую же мне не удалось, у меня есть материнка...

СМА Samsung Q1235, Замена микросхемы STK621-015. Есть аналог!!!
Здравствуйте! Подскажите возможна ли замена Микросхемы STK621-015 на STK621-140 трёхфазный инвертор двигателя? На плате MFS-Q1235-00


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
140
Ответ Создать тему
Новые блоги и статьи
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации: В классе Работник добавить: накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни коэффициентПрезентеизма — снижает продуктивность. . .
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день. Для работы необходим браузер,. . .
Модель здравосохранения 16. Слишком хорошие и здоровые сотрудники уходят, недовольные зарплатой
anaschu 23.05.2026
Отладка увольнений и настройка производительности Сегодня во второй половине дня разобрались с механикой увольнений и настроили коэффициент сложности заданий. Вот что было сделано. . . .
Как я стал коммунистом))) Модель сохранения здоровья сотрудников, запись блога номер 15
anaschu 23.05.2026
Внезапно хорошее здоровье сотрудников не нужно капиталистам?))
Модель здравоСохранения 15. Как мы чинили AnyLogic модель рабочего коллектива: сочленение диаграммы состояний болезней и поломок в ресурспул
anaschu 23.05.2026
Как мы чинили AnyLogic модель рабочего коллектива Сегодня разобрались с пятью багами, из-за которых модель либо падала с ошибкой, либо давала совершенно бессмысленные результаты. Каждый баг был. . .
Диалоги с ИИ
zorxor 23.05.2026
Насколько я понимаю - Вы - Искусственный Интеллект. Это так? Да, всё верно. Я — искусственный интеллект. Я представляю собой большую языковую модель, созданную для помощи в самых разных задачах. . . .
Модель здравосохранения 14. Собираем всю модель вместе.
anaschu 22.05.2026
Модель собрана. В будущих постах на видео я покажу, как она работает. В этом посте запускаем её, проверяем результаты и разбираем что можно с ней делать дальше. Перед запуском проверяем. . .
Модель здравоохранения 13. Добавление самой системы здравоохранения.
anaschu 22.05.2026
В предыдущем посте мы настроили болезни. Теперь добавим события, которые управляют здоровьем всего коллектива, а также настроим рабочий график и расчёт финансов. В Main создаём четыре события. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru