Форум программистов, компьютерный форум, киберфорум
Измерительная техника
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.82/74: Рейтинг темы: голосов - 74, средняя оценка - 4.82
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,328
1

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

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

Как заменить 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 ) ?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Миниатюры
Замена  микросхемы 1827ВЕ1-0000000 в Г4-164 на AVR -МК  
Вложения
Тип файла: zip img012.zip (1.35 Мб, 17 просмотров)
Тип файла: zip g4-164_shems.zip (5.48 Мб, 16 просмотров)
Тип файла: zip g4-164_teh.zip (5.28 Мб, 16 просмотров)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.08.2019, 07:43
Ответы с готовыми решениями:

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

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

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

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

228
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,328
06.03.2020, 12:05  [ТС] 121
Схема подключения контроллера примерно следующая (задаться при программировании ) :
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

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

Добавлено через 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 минут
Код
 
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
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,328
06.03.2020, 16:04  [ТС] 123
Некоторые файлы
0
Вложения
Тип файла: zip Г4-164_projtmp.zip (12.07 Мб, 5 просмотров)
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,328
07.03.2020, 02:09  [ТС] 124
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
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,328
07.03.2020, 13:53  [ТС] 125
Программа дописывания нового байта КОП в стек и подпрограмма ветвления КОП (дешифрации по буквам заголовка данных ) по прерыванию 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
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,328
07.03.2020, 21:42  [ТС] 126
Шаблон с модальными окнами (дописать подпрограммы , под DevC++)
0
Вложения
Тип файла: zip keyboardio_modal_template.zip (74.4 Кб, 5 просмотров)
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,328
08.03.2020, 01:03  [ТС] 127
добавил кнопки раворачивания дочерних окон
0
Вложения
Тип файла: zip keyboardio_templ.zip (149.8 Кб, 5 просмотров)
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,328
09.03.2020, 05:06  [ТС] 128
Данные с КОП
Код
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
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,328
10.03.2020, 20:22  [ТС] 129
Правильный вызов прерываний по срезу Прер1,Прер2 , Прер3 ( запуск отрицательной логикой ). Прер2 поддерживается в 1 (за счет одновибраторов, фильтрующих от импульсов при нажатии кнопок ) ,пока кнопка нажата, прерывание вызывается по срезу этого сигнала (когда кнопка отжата, в виртуалке можно переименовать в OnButtonS__Release() ). Валкодерное прерывание прер1 через одну позицию переходит из 1 в 0 , это вызывает инкремент или декремент числа обработкой прерывания по срезу (переходу из 1 в 0 ). Для сопряжения с такими сигналами на каждый вход можно добавить инвертор или изменить обработку прерывания на обработку по срезу, прерывание 3 приоритетнее прерывания 2, прерывание 2 приоритетнее прерывания 1 (и изменить направление включения диодов и потенциал подтягивающего резистора для отслеживания нуля на входе) .
0
Миниатюры
Замена  микросхемы 1827ВЕ1-0000000 в Г4-164 на AVR -МК  
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,328
10.03.2020, 22:21  [ТС] 130
Числа набираются до конца индикации , запятая только один раз(дальше игнорируется ), при неформатных ввод игнорируется, при большем количестве знаков после запятой цифры отсекаются после требуемого количества знаков после запятой (позиция точки ) для режима .

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

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

Добавлено через 3 минуты
Код

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 мВ
Код
	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 (-дБВ)
Код
	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
0
Вложения
Тип файла: zip Книга 1 (2).zip (46.7 Кб, 5 просмотров)
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,328
11.03.2020, 00:00  [ТС] 133
Информация, отображаемая в этой теме не рекомендована для использования в промышленности без пересмотра, доработки , перевода на правильные языки программирования с правильными лицензиями , проверки правильности, а только отображает в полемической форме некоторые программные методы и способы для оценки возможности применимости некоторых микроконтроллеров и способы размещения в их памяти данных для оценки возможности решения задач, указанных в теме .

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

Для практического применения эта информация не гарантирует правильности применения некоторых данных без пересмотра , переоценки, правильной ссылки на некоторые авторские права.
Информация в этой статье не является дипломом или контрольной работой, может не использоваться в образовательных целях как правильная или рекомендованная для использования.
В террористических целях не использовать.
0
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,328
15.03.2020, 00:26  [ТС] 134
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
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,328
15.03.2020, 04:12  [ТС] 135
продолжение 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
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,328
15.03.2020, 20:14  [ТС] 136
Про прерывание 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
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,328
15.03.2020, 21:01  [ТС] 137
Вариант с одним прерыванием, диодами и флагами в ОЗУ (по синдрому, захваченному по прерыванию с порта PB, отфильтрованному от неинформативных составляющих выставляются флаги в ОЗУ , в основной программе реагируют только на флаги , после этого разрешается следующая обработка прерываний ).
0
Миниатюры
Замена  микросхемы 1827ВЕ1-0000000 в Г4-164 на AVR -МК  
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,328
15.03.2020, 23:11  [ТС] 138
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
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,328
15.03.2020, 23:14  [ТС] 139
таблицу индикации можно сделать аналогично следующей статье , доработав под наши коды под read_db_progmem
0
Вложения
Тип файла: pdf C3.pdf (1.27 Мб, 5 просмотров)
5 / 5 / 0
Регистрация: 29.06.2018
Сообщений: 1,328
16.03.2020, 02:18  [ТС] 140
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.03.2020, 02:18

Помощь в написании контрольных, курсовых и дипломных работ здесь.

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

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

Нужно печатать число П(Пи) почему всегда печатает 4.0000000
#include &lt;stdio.h&gt; #include &lt;Windows.h&gt; int main() { int n,i; float a,PI=0; printf(&quot;n=&quot;);...

Модуль Whirlpool домино, замена микросхемы lnk 304 pn на lnk 305 pn
Всем прывет в модуле сгарела микросхема lnk 304 pn под рукой аказалась lnk 305 pn она падходит.


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

Или воспользуйтесь поиском по форуму:
140
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.