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

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

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

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

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

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

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

229
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
03.04.2020, 15:36  [ТС]
Студворк — интернет-сервис помощи студентам
Правильнее
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
#define INTERUPT3_BYTEMASK 0x04
#define INTERUPT2_BYTEMASK 0x02
#define INTERUPT1_BYTEMASK 0x01
 
 
#define FLAG_PARSECODE_FM  0x01
#define FLAG_PARSECODE_AM  0x02
#define FLAG_PARSECODE_OUT 0x03
#define FLAG_PARSECODE_FREQ 0x04
#define FLAG_INC_STEP 0x05
#define FLAG_DEC_STEP 0x06
#define FLAG_TURN_OFF_MODES 0x07
#define FLAG_DISP_ERROR 0x08
#define FLAG_DISP_FM 0x09
#define FLAG_DISP_AM 0x0a
#define FLAG_DISP_OUT 0x0b
#define FLAG_DISP_FREQ 0x0c
#define FLAG_BLINK_OFF 0x0d
#define FLAG_BLINK_CODE 0x0e
#define FLAG___MODE 0x0f
#define FLAG___LFO 0x10
#define  FLAG__FM_CODE 0x11
#define FLAG__AM_CODE 0x12
#define FLAG__ATT_CODE 0x13
#define FLAG__HFO_CODE 0x14
#define  FLAG__DVDC_CODE 0x15
 
#define FREQ_BYTEMASK 0x01
#define FM_BYTEMASK     0x02
#define AM_BYTEMASK    0x04
 
//reg_data0
#define MASK_FLAG_PARSECODE_FM 0x01
#define MASK_FLAG_PARSECODE_AM 0x02
#define MASK_FLAG_PARSECODE_OUT 0x04
#define  MASK_FLAG_PARSECODE_FREQ 0x08
 
 
//reg_data1
#define  MASK_FLAG_INC_STEP  0x01
#define  MASK_FLAG_DEC_STEP 0x02
 
//reg_data2
#define MASK_FLAG_TURN_OFF (uint8_t) 0x01
#define MASK_FLAG_DISP_ERROR (uint8_t) 0x02
#define MASK_FLAG_DISP_FM (uint8_t) 0x04
#define MASK_FLAG_DISP_AM (uint8_t) 0x08
#define MASK_FLAG_DISP_OUT (uint8_t) 0x10
#define MASK_FLAG_DISP_FREQ (uint8_t) 0x20
#define MASK_BLINK_OFF (uint8_t)   0x40
#define MASK_FLAG_BLINK_CODE (uint8_t) 0x80
 
 
//reg_data3 
#define  MASK_FLAG_MODE (uint8_t) 0x01
#define  MASK_FLAG_LFO (uint8_t) 0x02
#define  MASK_FLAG_FM_CODE (uint8_t) 0x04
#define  MASK_FLAG_AM_CODE (uint8_t) 0x08
#define  MASK_FLAG_ATT_CODE (uint8_t) 0x10
#define  MASK_FLAG_HFO_CODE (uint8_t) 0x20
#define  MASK_FLAG_DVDC_CODE  (uint8_t) 0x40
Добавлено через 43 минуты
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
 
 
 #include <avr/io.h>
 #include <avr/pgmspace.h>
 #include  "defines.h"
 #include  "intparser.h"
 #include  "gpibio.h"
 #include   "subroutines.h"
 
 
 
 
 
uint8_t CheckButtonsNumericKeypad(uint8_t byte )
{
 
if(byte==BUTTON_0){  goto CaseBUTTON_NUMKEYPAD ;      }
if(byte==BUTTON_1){  goto CaseBUTTON_NUMKEYPAD ;      }
if(byte==BUTTON_2){  goto CaseBUTTON_NUMKEYPAD ;      }
if(byte==BUTTON_3){  goto CaseBUTTON_NUMKEYPAD ;      }
if(byte==BUTTON_4){  goto CaseBUTTON_NUMKEYPAD ;      }
if(byte==BUTTON_5){  goto CaseBUTTON_NUMKEYPAD ;      }
if(byte==BUTTON_6){  goto CaseBUTTON_NUMKEYPAD ;      } 
if(byte==BUTTON_7){  goto CaseBUTTON_NUMKEYPAD ;      }
if(byte==BUTTON_8){  goto CaseBUTTON_NUMKEYPAD ;      }
if(byte==BUTTON_9){  goto CaseBUTTON_NUMKEYPAD ;      }
if(byte== BUTTON_COMMA){  goto CaseBUTTON_NUMKEYPAD ;      }
if(byte== BUTTON_SHARP){  goto CaseBUTTON_NUMKEYPAD ;      }
return  0;
 
 
CaseBUTTON_NUMKEYPAD:
 
 if ( (CheckMemoryWriteModeOn()!=0))    {  WriteStatement() ; }   
 if ((CheckMemoryRecallModeOn()!=0))    {   GetStatementFromMemory(); }   
 
 InputParamValue();
return 1;
}
 
 
  //LabelPoint8:
void ParseKeyb()
{
//;        8_1  
 
uint8_t byte=GetScanCodeValue() ;
byte&=BITMASK_KEYBOARD;
if(CheckButtonsNumericKeypad( byte )==0x01) { return; } 
 
 
if((byte& BUTTON_F)!=0) {  SetDutyReg(TOKEN_F);  return ;}  
if((byte& BUTTON_FM)!=0) { TurnOnFM (); SetDutyReg(TOKEN_FM);  return ;      }
if((byte& BUTTON_AM)!=0) { TurnOnAM(); SetDutyReg(TOKEN_AM);  return ;     }
if((byte&BUTTON_PM)!=0) { TurnOnPM(); SetDutyReg(TOKEN_PM);  return ;  }
if((byte& BUTTON_MOD_OFF)!=0) { TurnOffModulation(); SetDutyReg(TOKEN_MOD_OFF);  return ; }
if((byte&BUTTON_EXT)!=0)  { PrepareExtModulation () ; return; } /* 9*/
if((byte& BUTTON_STEP)!=0) { StepModeOn(); return; }
 
if((byte& BUTTON_OUT)!=0) { OutputOn(); SetDutyReg(TOKEN_OUT); return; }
if((byte& BUTTON_OUT_OFF)!=0) { OutputOnOff();  return; }
if((byte& BUTTON_LFO)!=0) { ChangeLFONum(); return; }
if((byte& BUTTON_SHARP)!=0) { SetMemWrMode(); return;  }
if((byte&BUTTON_RECALL)!=0) { SetMemRecallMode(); return; }
if((byte& BUTTON_MHz)!=0) { NormalizeFreq(); return; }//;  10   
if((byte& BUTTON_kHz)!=0) { if (CheckStepModeOn()){ NormalizeStep();  return; } else { NormalizeFM();  return;}  }//;  macro,  13_2 or to 1 
if((byte& BUTTON_PERCENT)!=0) { NormalizeAMCoef(); return; }  //;   14_2   
if((byte& BUTTON_mV)!=0) { SetOutInputMode(TOKEN_Out_mV);  return;} //;   15_2  
if((byte& BUTTON_mkV)!=0) {SetOutInputMode( TOKEN_Out_mkV );  return;}//;   15_2 
if((byte& BUTTON_dBV)!=0) { SetOutInputMode(TOKEN_Out_dB);  return;} //;   15_2  
if((byte& BUTTON_6dB)!=0) { if (CheckModeAM==0)    { TurnOn6dB(); }  return; }//;   11  
//CaseDefault: 
if(StepMode==1) { ChangeFreqOneStep() ;   NormalizeFreq(); return; }   ;//  12_3,   
ChangeStepParam(); 
  return ; //to point1             
}
 
/* ******************** */
 
 
 
void ParseInterrupts(  )
{
LabelPoint2:
 
//;   2     
// AnalyseInterrupt_InputData() ;
 
 
if((IntFlags&INTERUPT3_BYTEMASK)!=0) { ParseGPIBByte();  return;  } //;  add decoder subroutines for GPIB , goto LabelPoint7 
if((IntFlags&INTERUPT2_BYTEMASK)!=0) { ParseKeyb();  return; } //;  add decoder subroutines ,    ParseKeyboard();
 
 
if((DutyReg&FREQ_BYTEMASK)!=0) {     NormalizeFreq()  ;  return;    /* 12_1 */      }
if((DutyReg&FM_BYTEMASK)!=0) {    NormalizeFM()  ;  return; /*  13_1 */      } 
if((DutyReg&AM_BYTEMASK)!=0) {    NormalizeAMCoef()  ;  return; /*  14_1 */      }  
NormalizeOutput1()   ; /* 15_1 */
return;
}
 
 
 
 
 
 
/* *********************** */
 
 
 
uint8_t selectedflag=0;
void SetSelectedFlag ( uint8_t flag)
{
selectedflag=flag;
}
 
 
void SetSelectedFlagZero ( )
{
 
 
if(selectedflag==FLAG_PARSECODE_FM ) { Flag[0]&=(uint8_t) ~( MASK_FLAG_PARSECODE_FM);      } 
if(selectedflag==FLAG_PARSECODE_AM ) { Flag[0]&=(uint8_t) ~( MASK_FLAG_PARSECODE_AM);      } 
if(selectedflag==FLAG_PARSECODE_OUT ) { Flag[0]&=(uint8_t) ~( MASK_FLAG_PARSECODE_OUT);      } 
if(selectedflag==FLAG_PARSECODE_FREQ ) { Flag[0]&=(uint8_t) ~( MASK_FLAG_PARSECODE_FREQ);      } 
 
if(selectedflag==FLAG_INC_STEP ) { Flag[1]&=(uint8_t) ~( MASK_FLAG_INC_STEP);      } 
if(selectedflag==FLAG_DEC_STEP) { Flag[0]&=(uint8_t) ~( MASK_FLAG_DEC_STEP);      } 
 
if(selectedflag==FLAG_TURN_OFF_MODES) { Flag[2]&=(uint8_t) ~(  MASK_FLAG_TURN_OFF);      } 
if(selectedflag==FLAG_DISP_ERROR) { Flag[2]&=(uint8_t) ~( MASK_FLAG_DISP_ERROR);      } 
if(selectedflag==FLAG_DISP_FM) { Flag[2]&=(uint8_t) ~(  MASK_FLAG_DISP_FM);      } 
if(selectedflag==FLAG_DISP_AM) { Flag[2]&=(uint8_t) ~(  MASK_FLAG_DISP_AM);      } 
if(selectedflag==FLAG_DISP_OUT) { Flag[2]&=(uint8_t) ~(  MASK_FLAG_DISP_OUT);      } 
if(selectedflag== FLAG_DISP_FREQ) { Flag[2]&=(uint8_t) ~( MASK_FLAG_DISP_FREQ);      } 
if(selectedflag==FLAG_BLINK_OFF) { Flag[2]&=(uint8_t) ~(  MASK_BLINK_OFF);      } 
if(selectedflag== FLAG_BLINK_CODE) { Flag[2]&=(uint8_t) ~(  MASK_FLAG_BLINK_CODE);      } 
 
if(selectedflag== FLAG___MODE) { Flag[3]&=(uint8_t) ~( MASK_FLAG_MODE);      } 
if(selectedflag== FLAG___LFO) { Flag[3]&=(uint8_t) ~( MASK_FLAG_LFO);      } 
if(selectedflag== FLAG__FM_CODE) { Flag[3]&=(uint8_t) ~( MASK_FLAG_FM_CODE);      } 
if(selectedflag== FLAG__AM_CODE) { Flag[3]&=(uint8_t) ~( MASK_FLAG_AM_CODE);      } 
if(selectedflag== FLAG__ATT_CODE) { Flag[3]&=(uint8_t) ~( MASK_FLAG_ATT_CODE);      } 
if(selectedflag== FLAG__HFO_CODE) { Flag[3]&=(uint8_t) ~( MASK_FLAG_HFO_CODE);      } 
if(selectedflag== FLAG__DVDC_CODE) { Flag[3]&=(uint8_t) ~( MASK_FLAG_DVDC_CODE);      } 
selectedflag=0;
return;
}
 
 
 
 
 
 
volatile void CheckFlags1(){
 
 
 
 
if( (Flag[0]&MASK_FLAG_PARSECODE_FM)!=0){   ParseCodesFM() ;  ParseCodesHFO() ;  SetSelectedFlag (FLAG_PARSECODE_FM);  return; }
if((Flag[0]&MASK_FLAG_PARSECODE_AM)!=0) {   ParseCodesAM();   SetSelectedFlag (FLAG_PARSECODE_AM);   return; }
if((Flag[0]&MASK_FLAG_PARSECODE_OUT)!=0){  ParseCodesAtt() ; ParseStaticCommands() ; ParseCodesOut() ; 
              SetSelectedFlag (FLAG_PARSECODE_OUT);  return; }
if((Flag[0]&MASK_FLAG_PARSECODE_FREQ)!=0){ ParseCodesDVDC() ; ParseCodesBand() ; ParseStaticCommands();  
              CheckFMMax() ; SetSelectedFlag (FLAG_PARSECODE_FREQ);  return;  }
 
if((Flag[1]&MASK_FLAG_INC_STEP)!=0) { IncStep(); SetSelectedFlag (FLAG_INC_STEP); return; } //3 
if((Flag[1]&MASK_FLAG_DEC_STEP)!=0)  {DecStep(); SetSelectedFlag (FLAG_DEC_STEP); return; } 
 
if((Flag[2]&MASK_FLAG_TURN_OFF)!=0) { TurnOffUnusedModes(); SetSelectedFlag (FLAG_TURN_OFF_MODES);  return ; } 
if((Flag[2]&MASK_FLAG_DISP_ERROR)!=0) { DisplayErrorFM(); SetSelectedFlag (FLAG_DISP_ERROR);  return ; }
if((Flag[2]&MASK_FLAG_DISP_FM)!=0)  { DisplayFMValue(); SetSelectedFlag (FLAG_DISP_FM); return;  }
if((Flag[2]&MASK_FLAG_DISP_AM)!=0) { DisplayAMValue(); SetSelectedFlag ( FLAG_DISP_AM); return;  }
if((Flag[2]&MASK_FLAG_DISP_OUT)!=0) { DisplayOutValue(); SetSelectedFlag ( FLAG_DISP_OUT); return; }
if((Flag[2]&MASK_FLAG_DISP_FREQ)!=0) { DisplayFreqValue(); SetSelectedFlag ( FLAG_DISP_FREQ); return; }
 
if((Flag[2]&MASK_BLINK_OFF)!=0)  { SendBlinkOff(); SetSelectedFlag ( FLAG_BLINK_OFF); return; } //4
if((Flag[2]&MASK_FLAG_BLINK_CODE)!=0)  { SendBlinkCode();  SetSelectedFlag ( FLAG_BLINK_CODE); return; }
 
 
if((Flag[3]&MASK_FLAG_MODE)!=0)  { SendStaticCommands(); SetSelectedFlag ( FLAG___MODE); return; }
if((Flag[3]&MASK_FLAG_LFO)!=0)  { SendLFOCodes(); SetSelectedFlag ( FLAG___LFO); return; }
if((Flag[3]&MASK_FLAG_FM_CODE)!=0) { SendFMCodes(); SetSelectedFlag ( FLAG__FM_CODE); return; }
if((Flag[3]&MASK_FLAG_AM_CODE)!=0)  { SendAMCodes(); SetSelectedFlag ( FLAG__AM_CODE); return;}
 
if((Flag[3]&MASK_FLAG_ATT_CODE)!=0) {SendAttCodes();   SetSelectedFlag( FLAG__ATT_CODE); return ; } //5
if((Flag[3]&MASK_FLAG_HFO_CODE)!=0) { SendHFOCodes(); SetSelectedFlag( FLAG__HFO_CODE);   return ; }
if((Flag[3]&MASK_FLAG_DVDC_CODE)!=0)  { SendDVDCCodes(); SetSelectedFlag( FLAG__DVDC_CODE);   return ; }
return; // goto  LabelPoint1 
} 
 
 
 
//; jump to this subroutine in the main() after  init subroutines   
 
void  main_sub ()
{
LabelPoint1:
cli();
if(  DutyReg !=0) { goto LabelOnDutyRegNotZero;}
/* if duty reg=0 */
SendMemWrPulse();
SetAddrWait();
sei();
LabelNoInterrupts:
 
//fix
if (IntFlags==0) {  /*sleep(); */  goto      LabelNoInterrupts;          }  // ;  loop while no interrupts
cli();
ParseInterrupts( ); //goto  LabelPoint2;
 
goto  LabelPoint1; 
 
LabelOnDutyRegNotZero:
SetSelectedFlagZero();
CheckFlags1();
goto LabelPoint1;
return  ;
}
Добавлено через 1 час 50 минут
Сортировка байтов приборных сообщений GPIB в результирующем виде отностиельно включаемых режимов может быть подобна следующей ( эмуляция включения режимов для ПК ):
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
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
#include <stdio.h>
#include <stdint.h>
 
 
 
 
#define MODE_NOCMD 0
#define MODE_TURN_OFF_OUT 1
#define MODE_TURN_OFF_6dB   2
#define MODE_TURN_ON_6dB     3
 
#define MODE_INT_AM  4  
#define MODE_EXT_AM 5
#define MODE_INT_FM 6
#define MODE_EXT_FM 7
#define MODE_TURN_ON_EXT_PM 8
#define MODE_TURN_ON_INT_PM 9
 
 
#define MODE_TURN_OFF_EXT_AM 10
#define MODE_TURN_OFF_INT_AM 11
#define MODE_TURN_OFF_EXT_FM 12
#define MODE_TURN_OFF_INT_FM 13 
#define MODE_TURN_OFF_PM  14
//#define MODE_TURN_OFF_EXT_PM  15
 
#define MODE_FREQ   16
#define MODE_PREP_EXT_MOD 17
#define MODE_TURN_ON_OUT 18
#define MODE_TURN_ON_OUT_dB 19
#define MODE_TURN_ON_OUT_mV 20
#define MODE_TURN_ON_OUT_mkV 21
#define MODE_PREPSETFREQLFO  22
 
#define MODE_SETFREQLFO0 30
#define MODE_SETFREQLFO1 31
#define MODE_SETFREQLFO2 32
#define MODE_SETFREQLFO3 33
#define MODE_SETFREQLFO4 34
#define MODE_SETFREQLFO5 35
#define MODE_SETFREQLFO6 36
#define MODE_SETFREQLFO7 37
 
 
#define  NUM_DIGITS_FREQ 7
#define  NUM_DIGITS_FM 3 
#define  NUM_DIGITS_AM 2
#define  NUM_DIGITS_OUT 4
 
 
uint8_t  GetGPIBByte()
{
uint8_t byte; 
printf("\n Input byte  char  :   ");
scanf("%s",&byte);
//printf("\n      Send active signal  on Interrupt 3  ");
return byte; 
}
 
 
void ExecCMD(uint8_t mode)
{
 
switch (mode){
case MODE_NOCMD: 
 
              printf("\n\t\t\t\t  No CMD  or error  ");
 
 
                             break;
case MODE_TURN_OFF_OUT: 
                printf("\n\t\t\t\t  turn Off Out  "); 
                             break;
case MODE_TURN_OFF_6dB: 
                 printf("\n\t\t\t\t  TURN OFF 6dB  "); 
                             break;
 
case MODE_TURN_ON_6dB: 
                 printf("\n\t\t\t\t  TURN ON 6dB  "); 
                             break;
                             
case MODE_INT_AM: 
                 printf("\n\t\t\t\t  TURN ON INT AM  "); 
                             break;
case MODE_EXT_AM: 
                 printf("\n\t\t\t\t  TURN ON EXT AM  ");    
                             break;    
case MODE_INT_FM: 
                  printf("\n\t\t\t\t  TURN INT FM  "); 
                             break;
case MODE_EXT_FM:  
                  printf("\n\t\t\t\t  TURN EXT FM  "); 
                             break;                                                                               
 
case MODE_TURN_ON_EXT_PM:  
                  printf("\n\t\t\t\t  TURN ON EXT PM  "); 
                             break; 
case MODE_TURN_ON_INT_PM:  
                  printf("\n\t\t\t\t  TURN ON INT PM  "); 
                             break;
 case MODE_TURN_OFF_EXT_AM:  
                  printf("\n\t\t\t\t  TURN ON EXT AM  "); 
                             break;
 case MODE_TURN_OFF_INT_AM:  
                  printf("\n\t\t\t\t  TURN ON INT AM  "); 
                             break;
 case MODE_TURN_OFF_EXT_FM:  
                  printf("\n\t\t\t\t  TURN ON EXT FM  "); 
                             break;
 case MODE_TURN_OFF_INT_FM:  
                  printf("\n\t\t\t\t  TURN ON INT FM  "); 
                             break;                            
                             
 case MODE_TURN_OFF_PM:  
                  printf("\n\t\t\t\t  MODE TURN OFF PM  "); 
                             break;                                    
 case MODE_FREQ:  
                  printf("\n\t\t\t\t  MODE FREQ  "); 
                             break;  
                             
 case MODE_TURN_ON_OUT: 
                  printf("\n\t\t\t\t  TURN ON OUT  ");                   
                 break; 
                     
                             
 case MODE_TURN_ON_OUT_dB:  
                  printf("\n\t\t\t\t  TURN ON OUT dB  ");                    
                 break; 
 case MODE_TURN_ON_OUT_mV:  
                  printf("\n\t\t\t\t  TURN ON OUT mV  ");                    
                 break; 
 case MODE_TURN_ON_OUT_mkV: 
                  printf("\n\t\t\t\t  TURN ON OUT mkV  ");                   
                 break;                          
 case MODE_SETFREQLFO0: 
                  printf("\n\t\t\t\t  MODE_SETFREQLFO0  ");                      
                 break;              
                 
 case MODE_SETFREQLFO1: 
                  printf("\n\t\t\t\t  MODE_SETFREQLFO1  ");                      
                 break;              
                 
 case MODE_SETFREQLFO2: 
                  printf("\n\t\t\t\t  MODE_SETFREQLFO2  ");                      
                 break;
 case MODE_SETFREQLFO3: 
                  printf("\n\t\t\t\t  MODE_SETFREQLFO3 ");                   
                 break;              
 case MODE_SETFREQLFO4: 
                  printf("\n\t\t\t\t  MODE_SETFREQLFO4  ");                      
                 break;              
 case MODE_SETFREQLFO5: 
                  printf("\n\t\t\t\t  MODE_SETFREQLFO5  ");                      
                 break; 
 case MODE_SETFREQLFO6: 
                  printf("\n\t\t\t\t  MODE_SETFREQLFO6  ");                      
                 break; 
 case MODE_SETFREQLFO7: 
                  printf("\n\t\t\t\t  MODE_SETFREQLFO7  ");                      
                 break;                                                                  
                 
                                                                                                  
default :
 break;
 
}
 
 
return;
}
 
 
 
 
 
 
 
/*
 
    0  digits[0] = 5
    1  digits[1] = 2
    2  digits[2] = 0    CommaPos=2
           
    3  digits[3] =1  
    4  digits[4]=0     auto 0 
    5  digits[5]=0     auto 0
    6  digits[6]=0     auto 0
    7  end
 
    0  digits[0]  
    1  digits[1]   
    2  digits[2]  
    3  end
 
 2  0 digits[0]=8
 1  1 digits[1]=0
 0  2  end
 
 
 4  0 digits[0]=1
 3  1 digits[0]=0 CommaPos=1
 2  2 digits[0]=0
 1  3 digits[0]=0
 0  4  end
 
 
*/
 
 uint8_t  count=0;   
 uint8_t FlagMsg=0;
 uint8_t flagLFO=0; 
 uint8_t FlagGetComma=0;
 uint8_t FlagMode=0;
 uint8_t tmpdigits[7] ;
 uint8_t CommaPos=0;
 
 
 
uint8_t GetNumDigitsMode( uint8_t FlagMode)
{
if(FlagMode==MODE_FREQ) {return 7; }
if(FlagMode==MODE_INT_AM) {return 2; } 
if(FlagMode==MODE_EXT_AM) {return 2; }  
if(FlagMode==MODE_INT_FM) {return 3; }  
if(FlagMode==MODE_EXT_FM) { return 3; }  
if(FlagMode==MODE_TURN_ON_OUT_dB) { return 4; } 
if(FlagMode==MODE_TURN_ON_OUT_mV) { return 4; }      
if(FlagMode==MODE_TURN_ON_OUT_mkV) { return 4; }    
return 0;
}
 
 
 
void ParseCommaPos(uint8_t   counter, uint8_t FlagMode)
{
CommaPos=counter;
 /* for evaluation only */ 
printf ( "\n\t\t\t\t comma posistion in %d digit     ",   counter  );   
    
return; 
}
 
void PutDigitToGPIBStackIfByte(uint8_t count, uint8_t  byte,   uint8_t FlagMode  )
{
tmpdigits[count]=byte-0x30;  
/* for evaluation only */ 
printf ( "\n\t\t\t\t %d digit is %d   ",   count , tmpdigits[count ]  );
}
 
 
void SetLastDigitsZero(uint8_t FlagMode, uint8_t count ,uint8_t NumDigMode )
{ 
if(NumDigMode !=0) { for (uint8_t i=count;i<=6; i++)    {  tmpdigits[i]=0; } }  
 
/* for evaluation only */ 
for (uint8_t i=0;i<NumDigMode; i++) { printf("\n%d", tmpdigits[i] );   if(i==CommaPos) { printf(" <comma>");}
}    
return ;    
}
 
 
 
 
uint8_t GetModeLFOIfDigit(uint8_t Flag_Mode   )
{
 
if (Flag_Mode==0x30) {    return MODE_SETFREQLFO0;   }
if (Flag_Mode==0x31) {    return MODE_SETFREQLFO1;    }
if (Flag_Mode==0x32) {    return MODE_SETFREQLFO2;    }
if (Flag_Mode==0x33) {    return MODE_SETFREQLFO3;    }
if (Flag_Mode==0x34) {    return MODE_SETFREQLFO4;    }
if (Flag_Mode==0x35) {    return MODE_SETFREQLFO5;    }
if (Flag_Mode==0x36) {    return MODE_SETFREQLFO6;    }
if (Flag_Mode==0x37) {    return MODE_SETFREQLFO7;    }
if (Flag_Mode==0x38) {    return MODE_NOCMD;   }
if (Flag_Mode==0x39) {    return MODE_NOCMD;   } 
return MODE_NOCMD;
}
 
//for sorting command chars (emulation of the mode switch )
void ParseCommand()
{
uint8_t byte=GetGPIBByte ();  //gets  TTL code from inverse code for LD bus  bits 
 
/* 'space' */
 if (byte==0x20)  { return; }
 
/*  ','  */
                 
 if (byte==0x2c){                        
 SetLastDigitsZero(FlagMode, count, GetNumDigitsMode(FlagMode));
 ExecCMD(FlagMode);                
 count=0;   FlagMsg= 0; FlagMode=MODE_NOCMD;  
 return;              
} 
 
 
/*  '.'  */
if (byte==0x2e)  {   
           
if ((FlagMsg==1)&&(FlagGetComma==1) )  { 
if(count==0) { PutDigitToGPIBStackIfByte( 0, 0x30, FlagMode  ); ParseCommaPos( 0, FlagMode);  count=1;   }
else { ParseCommaPos( ( count-1), FlagMode); }
FlagGetComma=0; return;  } 
FlagGetComma=0;
return;              
}
                
 
  /* '0'...'9' */
if ((byte>=0x30)&&(byte<=0x39)) {
 
 if (FlagMode==MODE_PREPSETFREQLFO)  {  FlagMode=  GetModeLFOIfDigit(byte); FlagMsg=0; return; } 
 
 
if (FlagMode==MODE_TURN_ON_OUT) { FlagMode= MODE_TURN_ON_OUT_dB;   } 
if ((count)>=GetNumDigitsMode(FlagMode)  )  { FlagMsg=0;   return; } //fix
if (FlagMsg==1){  PutDigitToGPIBStackIfByte( count , byte, FlagMode  ); count+=1; return;   }
 
return; 
}
 
 /* I   turn off output */
if(byte==0x49) { FlagMsg=0 ; FlagMode=MODE_TURN_OFF_OUT;  return;}                  
 
/* H  6 dB off        */     
if(byte==0x48){ FlagMsg=0 ; FlagMode=MODE_TURN_OFF_6dB;  return; }
/* O   turn on 6 dB  */
if(byte==0x4F){ FlagMsg=0 ; FlagMode=MODE_TURN_ON_6dB;  return; }   
/* D   PM on ; off for ND  */
if(byte==0x44){   FlagMsg=0 ;
if( FlagMode==MODE_PREP_EXT_MOD) { FlagMode=MODE_TURN_ON_EXT_PM; } else { FlagMode=MODE_TURN_ON_INT_PM; }
 return; }
 
/* E  PM off, end for BE,CE */
if(byte==0x45){   FlagMsg=0 ;  
 if(FlagMode==MODE_EXT_AM) {   FlagMode=MODE_TURN_OFF_EXT_AM; }
 if(FlagMode==MODE_EXT_FM) {   FlagMode=MODE_TURN_OFF_EXT_FM; }
 if(FlagMode==MODE_INT_AM) {   FlagMode=MODE_TURN_OFF_INT_AM; }
 if(FlagMode==MODE_INT_FM) {   FlagMode=MODE_TURN_OFF_INT_FM; } 
 else  {   FlagMode=MODE_TURN_OFF_PM; }             
 return;  }
/* A      freq  , for example "A520.100,B80." or "A520.100," <=7 digits + comma */
if(byte==0x41) { FlagGetComma=1; FlagMsg=1 ;  count=0;  FlagMode=MODE_FREQ;   return; }
/* N , for example "NB,","NB20,",  "NС,","ND" ,"NC100,"  */
if(byte==0x4e){ FlagGetComma=1; FlagMsg=1 ; FlagMode=MODE_PREP_EXT_MOD; return;  }              
 
/* B    end of  NB, NC,    begin of BE        AM,% for example  "B80." or "B80," , <=2 digits */
if(byte==0x42){ FlagMsg=1 ; FlagGetComma=1; count =0;
if (FlagMode==MODE_PREP_EXT_MOD) { FlagMode=MODE_EXT_AM ; }  else  {  FlagMode=MODE_INT_AM ;  } 
return;  }
/* C    end of  NB, NC,    begin of CE         , FM, kHz , <=3  digits  */  
if(byte==0x43){ count=0; FlagGetComma=1;  FlagMsg=1 ;    
if ( FlagMode==MODE_PREP_EXT_MOD) { FlagMode=MODE_EXT_FM; } else {FlagMode=MODE_INT_FM ;} 
return;  }
 
/*  K   turn on output , if  only K , turn on output */ 
if(byte==0x4B){ FlagGetComma=1; FlagMsg=1 ;   count=0; FlagMode=MODE_TURN_ON_OUT ; return; }
 /* L           output, mV, <=3.5 digits + comma */
if((byte==0x4C)||(byte==0x22)){  FlagGetComma=1;  FlagMsg=1 ; count=0; FlagMode=MODE_TURN_ON_OUT_mV; return; }
/* M  , for example,"M10.00,"  */               
if(byte==0x4D){ FlagGetComma=1; FlagMsg=1 ; count=0;   FlagMode=MODE_TURN_ON_OUT_mkV;     return; }
 /* F   Finternal ,for example "F1,"  */
if(byte==0x46){  FlagGetComma=0; FlagMsg=1; count=0;    FlagMode=MODE_PREPSETFREQLFO;     return; }
 
FlagGetComma=0; FlagMsg=0 ;   count=0;  FlagMode=MODE_NOCMD; ExecCMD(FlagMode);    //fix
 
return; 
}
 
void ParseCommand1()
{
ParseCommand();
//SendDataAcceptedStrobe(); 
}
/* *********************************** */
int main()
{
 
label1:
printf("\n Input command  bytes (  A520.1, B80, F1, M10.2 ,  ) ");  //fix 0x2e problem for end of message 
//printf("\n Input command  bytes \n(  0x41 0x35 0x32 0x30  0x2e 0x31 0x2c"); 
ParseCommand1();     //A 0x41
ParseCommand1(); //5 0x35
ParseCommand1(); //2 0x32
ParseCommand1(); //0 0x30
ParseCommand1(); //.0x2e
ParseCommand1(); //1 0x31
ParseCommand1(); //, 0x2c
//printf("\n Input command   0x20 0x42 0x38 0x30 0x2c 0x20 0x46 0x31 0x2c 0x20 0x4D 0x31 0x35 0x2e 0x20 0x2c ) ");  //fix 0x2e problem for end of message 
ParseCommand1(); //  0x20
ParseCommand1(); //B 0x42
ParseCommand1(); //8 0x38
ParseCommand1(); //0 0x30
ParseCommand1(); //, 0x2c
 
 
ParseCommand1(); //  0x20
ParseCommand1(); //F 0x46
ParseCommand1(); //1 0x31
ParseCommand1(); //, 0x2c
ParseCommand1(); //  0x20
ParseCommand1(); //M 0x4D
ParseCommand1(); //1 0x31
ParseCommand1(); //5 0x35
ParseCommand1(); //. 0x2e    
ParseCommand1(); // 0x20  
ParseCommand1(); // 0x2c
    
printf ("\n Inpuit 1 for exit or 0 for next command ");
int key;
scanf("%d",&key);
if (key==0) {goto label1; }
 
 
 
}
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
03.04.2020, 15:36  [ТС]
Сортировка байтов приборных сообщений GPIB в результирующем виде отностиельно включаемых режимов может быть подобна следующей ( эмуляция включения режимов для ПК ):
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
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
#include <stdio.h>
#include <stdint.h>
 
 
 
 
#define MODE_NOCMD 0
#define MODE_TURN_OFF_OUT 1
#define MODE_TURN_OFF_6dB   2
#define MODE_TURN_ON_6dB     3
 
#define MODE_INT_AM  4  
#define MODE_EXT_AM 5
#define MODE_INT_FM 6
#define MODE_EXT_FM 7
#define MODE_TURN_ON_EXT_PM 8
#define MODE_TURN_ON_INT_PM 9
 
 
#define MODE_TURN_OFF_EXT_AM 10
#define MODE_TURN_OFF_INT_AM 11
#define MODE_TURN_OFF_EXT_FM 12
#define MODE_TURN_OFF_INT_FM 13 
#define MODE_TURN_OFF_PM  14
//#define MODE_TURN_OFF_EXT_PM  15
 
#define MODE_FREQ   16
#define MODE_PREP_EXT_MOD 17
#define MODE_TURN_ON_OUT 18
#define MODE_TURN_ON_OUT_dB 19
#define MODE_TURN_ON_OUT_mV 20
#define MODE_TURN_ON_OUT_mkV 21
#define MODE_PREPSETFREQLFO  22
 
#define MODE_SETFREQLFO0 30
#define MODE_SETFREQLFO1 31
#define MODE_SETFREQLFO2 32
#define MODE_SETFREQLFO3 33
#define MODE_SETFREQLFO4 34
#define MODE_SETFREQLFO5 35
#define MODE_SETFREQLFO6 36
#define MODE_SETFREQLFO7 37
 
 
#define  NUM_DIGITS_FREQ 7
#define  NUM_DIGITS_FM 3 
#define  NUM_DIGITS_AM 2
#define  NUM_DIGITS_OUT 4
 
 
uint8_t  GetGPIBByte()
{
uint8_t byte; 
printf("\n Input byte  char  :   ");
scanf("%s",&byte);
//printf("\n      Send active signal  on Interrupt 3  ");
return byte; 
}
 
 
void ExecCMD(uint8_t mode)
{
 
switch (mode){
case MODE_NOCMD: 
 
              printf("\n\t\t\t\t  No CMD  or error  ");
 
 
                             break;
case MODE_TURN_OFF_OUT: 
                printf("\n\t\t\t\t  turn Off Out  "); 
                             break;
case MODE_TURN_OFF_6dB: 
                 printf("\n\t\t\t\t  TURN OFF 6dB  "); 
                             break;
 
case MODE_TURN_ON_6dB: 
                 printf("\n\t\t\t\t  TURN ON 6dB  "); 
                             break;
                             
case MODE_INT_AM: 
                 printf("\n\t\t\t\t  TURN ON INT AM  "); 
                             break;
case MODE_EXT_AM: 
                 printf("\n\t\t\t\t  TURN ON EXT AM  ");    
                             break;    
case MODE_INT_FM: 
                  printf("\n\t\t\t\t  TURN INT FM  "); 
                             break;
case MODE_EXT_FM:  
                  printf("\n\t\t\t\t  TURN EXT FM  "); 
                             break;                                                                               
 
case MODE_TURN_ON_EXT_PM:  
                  printf("\n\t\t\t\t  TURN ON EXT PM  "); 
                             break; 
case MODE_TURN_ON_INT_PM:  
                  printf("\n\t\t\t\t  TURN ON INT PM  "); 
                             break;
 case MODE_TURN_OFF_EXT_AM:  
                  printf("\n\t\t\t\t  TURN ON EXT AM  "); 
                             break;
 case MODE_TURN_OFF_INT_AM:  
                  printf("\n\t\t\t\t  TURN ON INT AM  "); 
                             break;
 case MODE_TURN_OFF_EXT_FM:  
                  printf("\n\t\t\t\t  TURN ON EXT FM  "); 
                             break;
 case MODE_TURN_OFF_INT_FM:  
                  printf("\n\t\t\t\t  TURN ON INT FM  "); 
                             break;                            
                             
 case MODE_TURN_OFF_PM:  
                  printf("\n\t\t\t\t  MODE TURN OFF PM  "); 
                             break;                                    
 case MODE_FREQ:  
                  printf("\n\t\t\t\t  MODE FREQ  "); 
                             break;  
                             
 case MODE_TURN_ON_OUT: 
                  printf("\n\t\t\t\t  TURN ON OUT  ");                   
                 break; 
                     
                             
 case MODE_TURN_ON_OUT_dB:  
                  printf("\n\t\t\t\t  TURN ON OUT dB  ");                    
                 break; 
 case MODE_TURN_ON_OUT_mV:  
                  printf("\n\t\t\t\t  TURN ON OUT mV  ");                    
                 break; 
 case MODE_TURN_ON_OUT_mkV: 
                  printf("\n\t\t\t\t  TURN ON OUT mkV  ");                   
                 break;                          
 case MODE_SETFREQLFO0: 
                  printf("\n\t\t\t\t  MODE_SETFREQLFO0  ");                      
                 break;              
                 
 case MODE_SETFREQLFO1: 
                  printf("\n\t\t\t\t  MODE_SETFREQLFO1  ");                      
                 break;              
                 
 case MODE_SETFREQLFO2: 
                  printf("\n\t\t\t\t  MODE_SETFREQLFO2  ");                      
                 break;
 case MODE_SETFREQLFO3: 
                  printf("\n\t\t\t\t  MODE_SETFREQLFO3 ");                   
                 break;              
 case MODE_SETFREQLFO4: 
                  printf("\n\t\t\t\t  MODE_SETFREQLFO4  ");                      
                 break;              
 case MODE_SETFREQLFO5: 
                  printf("\n\t\t\t\t  MODE_SETFREQLFO5  ");                      
                 break; 
 case MODE_SETFREQLFO6: 
                  printf("\n\t\t\t\t  MODE_SETFREQLFO6  ");                      
                 break; 
 case MODE_SETFREQLFO7: 
                  printf("\n\t\t\t\t  MODE_SETFREQLFO7  ");                      
                 break;                                                                  
                 
                                                                                                  
default :
 break;
 
}
 
 
return;
}
 
 
 
 
 
 
 
/*
 
    0  digits[0] = 5
    1  digits[1] = 2
    2  digits[2] = 0    CommaPos=2
           
    3  digits[3] =1  
    4  digits[4]=0     auto 0 
    5  digits[5]=0     auto 0
    6  digits[6]=0     auto 0
    7  end
 
    0  digits[0]  
    1  digits[1]   
    2  digits[2]  
    3  end
 
 2  0 digits[0]=8
 1  1 digits[1]=0
 0  2  end
 
 
 4  0 digits[0]=1
 3  1 digits[0]=0 CommaPos=1
 2  2 digits[0]=0
 1  3 digits[0]=0
 0  4  end
 
 
*/
 
 uint8_t  count=0;   
 uint8_t FlagMsg=0;
 uint8_t flagLFO=0; 
 uint8_t FlagGetComma=0;
 uint8_t FlagMode=0;
 uint8_t tmpdigits[7] ;
 uint8_t CommaPos=0;
 
 
 
uint8_t GetNumDigitsMode( uint8_t FlagMode)
{
if(FlagMode==MODE_FREQ) {return 7; }
if(FlagMode==MODE_INT_AM) {return 2; } 
if(FlagMode==MODE_EXT_AM) {return 2; }  
if(FlagMode==MODE_INT_FM) {return 3; }  
if(FlagMode==MODE_EXT_FM) { return 3; }  
if(FlagMode==MODE_TURN_ON_OUT_dB) { return 4; } 
if(FlagMode==MODE_TURN_ON_OUT_mV) { return 4; }      
if(FlagMode==MODE_TURN_ON_OUT_mkV) { return 4; }    
return 0;
}
 
 
 
void ParseCommaPos(uint8_t   counter, uint8_t FlagMode)
{
CommaPos=counter;
 /* for evaluation only */ 
printf ( "\n\t\t\t\t comma posistion in %d digit     ",   counter  );   
    
return; 
}
 
void PutDigitToGPIBStackIfByte(uint8_t count, uint8_t  byte,   uint8_t FlagMode  )
{
tmpdigits[count]=byte-0x30;  
/* for evaluation only */ 
printf ( "\n\t\t\t\t %d digit is %d   ",   count , tmpdigits[count ]  );
}
 
 
void SetLastDigitsZero(uint8_t FlagMode, uint8_t count ,uint8_t NumDigMode )
{ 
if(NumDigMode !=0) { for (uint8_t i=count;i<=6; i++)    {  tmpdigits[i]=0; } }  
 
/* for evaluation only */ 
for (uint8_t i=0;i<NumDigMode; i++) { printf("\n%d", tmpdigits[i] );   if(i==CommaPos) { printf(" <comma>");}
}    
return ;    
}
 
 
 
 
uint8_t GetModeLFOIfDigit(uint8_t Flag_Mode   )
{
 
if (Flag_Mode==0x30) {    return MODE_SETFREQLFO0;   }
if (Flag_Mode==0x31) {    return MODE_SETFREQLFO1;    }
if (Flag_Mode==0x32) {    return MODE_SETFREQLFO2;    }
if (Flag_Mode==0x33) {    return MODE_SETFREQLFO3;    }
if (Flag_Mode==0x34) {    return MODE_SETFREQLFO4;    }
if (Flag_Mode==0x35) {    return MODE_SETFREQLFO5;    }
if (Flag_Mode==0x36) {    return MODE_SETFREQLFO6;    }
if (Flag_Mode==0x37) {    return MODE_SETFREQLFO7;    }
if (Flag_Mode==0x38) {    return MODE_NOCMD;   }
if (Flag_Mode==0x39) {    return MODE_NOCMD;   } 
return MODE_NOCMD;
}
 
//for sorting command chars (emulation of the mode switch )
void ParseCommand()
{
uint8_t byte=GetGPIBByte ();  //gets  TTL code from inverse code for LD bus  bits 
 
/* 'space' */
 if (byte==0x20)  { return; }
 
/*  ','  */
                 
 if (byte==0x2c){                        
 SetLastDigitsZero(FlagMode, count, GetNumDigitsMode(FlagMode));
 ExecCMD(FlagMode);                
 count=0;   FlagMsg= 0; FlagMode=MODE_NOCMD;  
 return;              
} 
 
 
/*  '.'  */
if (byte==0x2e)  {   
           
if ((FlagMsg==1)&&(FlagGetComma==1) )  { 
if(count==0) { PutDigitToGPIBStackIfByte( 0, 0x30, FlagMode  ); ParseCommaPos( 0, FlagMode);  count=1;   }
else { ParseCommaPos( ( count-1), FlagMode); }
FlagGetComma=0; return;  } 
FlagGetComma=0;
return;              
}
                
 
  /* '0'...'9' */
if ((byte>=0x30)&&(byte<=0x39)) {
 
 if (FlagMode==MODE_PREPSETFREQLFO)  {  FlagMode=  GetModeLFOIfDigit(byte); FlagMsg=0; return; } 
 
 
if (FlagMode==MODE_TURN_ON_OUT) { FlagMode= MODE_TURN_ON_OUT_dB;   } 
if ((count)>=GetNumDigitsMode(FlagMode)  )  { FlagMsg=0;   return; } //fix
if (FlagMsg==1){  PutDigitToGPIBStackIfByte( count , byte, FlagMode  ); count+=1; return;   }
 
return; 
}
 
 /* I   turn off output */
if(byte==0x49) { FlagMsg=0 ; FlagMode=MODE_TURN_OFF_OUT;  return;}                  
 
/* H  6 dB off        */     
if(byte==0x48){ FlagMsg=0 ; FlagMode=MODE_TURN_OFF_6dB;  return; }
/* O   turn on 6 dB  */
if(byte==0x4F){ FlagMsg=0 ; FlagMode=MODE_TURN_ON_6dB;  return; }   
/* D   PM on ; off for ND  */
if(byte==0x44){   FlagMsg=0 ;
if( FlagMode==MODE_PREP_EXT_MOD) { FlagMode=MODE_TURN_ON_EXT_PM; } else { FlagMode=MODE_TURN_ON_INT_PM; }
 return; }
 
/* E  PM off, end for BE,CE */
if(byte==0x45){   FlagMsg=0 ;  
 if(FlagMode==MODE_EXT_AM) {   FlagMode=MODE_TURN_OFF_EXT_AM; }
 if(FlagMode==MODE_EXT_FM) {   FlagMode=MODE_TURN_OFF_EXT_FM; }
 if(FlagMode==MODE_INT_AM) {   FlagMode=MODE_TURN_OFF_INT_AM; }
 if(FlagMode==MODE_INT_FM) {   FlagMode=MODE_TURN_OFF_INT_FM; } 
 else  {   FlagMode=MODE_TURN_OFF_PM; }             
 return;  }
/* A      freq  , for example "A520.100,B80." or "A520.100," <=7 digits + comma */
if(byte==0x41) { FlagGetComma=1; FlagMsg=1 ;  count=0;  FlagMode=MODE_FREQ;   return; }
/* N , for example "NB,","NB20,",  "NС,","ND" ,"NC100,"  */
if(byte==0x4e){ FlagGetComma=1; FlagMsg=1 ; FlagMode=MODE_PREP_EXT_MOD; return;  }              
 
/* B    end of  NB, NC,    begin of BE        AM,% for example  "B80." or "B80," , <=2 digits */
if(byte==0x42){ FlagMsg=1 ; FlagGetComma=1; count =0;
if (FlagMode==MODE_PREP_EXT_MOD) { FlagMode=MODE_EXT_AM ; }  else  {  FlagMode=MODE_INT_AM ;  } 
return;  }
/* C    end of  NB, NC,    begin of CE         , FM, kHz , <=3  digits  */  
if(byte==0x43){ count=0; FlagGetComma=1;  FlagMsg=1 ;    
if ( FlagMode==MODE_PREP_EXT_MOD) { FlagMode=MODE_EXT_FM; } else {FlagMode=MODE_INT_FM ;} 
return;  }
 
/*  K   turn on output , if  only K , turn on output */ 
if(byte==0x4B){ FlagGetComma=1; FlagMsg=1 ;   count=0; FlagMode=MODE_TURN_ON_OUT ; return; }
 /* L           output, mV, <=3.5 digits + comma */
if((byte==0x4C)||(byte==0x22)){  FlagGetComma=1;  FlagMsg=1 ; count=0; FlagMode=MODE_TURN_ON_OUT_mV; return; }
/* M  , for example,"M10.00,"  */               
if(byte==0x4D){ FlagGetComma=1; FlagMsg=1 ; count=0;   FlagMode=MODE_TURN_ON_OUT_mkV;     return; }
 /* F   Finternal ,for example "F1,"  */
if(byte==0x46){  FlagGetComma=0; FlagMsg=1; count=0;    FlagMode=MODE_PREPSETFREQLFO;     return; }
 
FlagGetComma=0; FlagMsg=0 ;   count=0;  FlagMode=MODE_NOCMD; ExecCMD(FlagMode);    //fix
 
return; 
}
 
void ParseCommand1()
{
ParseCommand();
//SendDataAcceptedStrobe(); 
}
/* *********************************** */
int main()
{
 
label1:
printf("\n Input command  bytes (  A520.1, B80, F1, M10.2 ,  ) ");  //fix 0x2e problem for end of message 
//printf("\n Input command  bytes \n(  0x41 0x35 0x32 0x30  0x2e 0x31 0x2c"); 
ParseCommand1();     //A 0x41
ParseCommand1(); //5 0x35
ParseCommand1(); //2 0x32
ParseCommand1(); //0 0x30
ParseCommand1(); //.0x2e
ParseCommand1(); //1 0x31
ParseCommand1(); //, 0x2c
//printf("\n Input command   0x20 0x42 0x38 0x30 0x2c 0x20 0x46 0x31 0x2c 0x20 0x4D 0x31 0x35 0x2e 0x20 0x2c ) ");  //fix 0x2e problem for end of message 
ParseCommand1(); //  0x20
ParseCommand1(); //B 0x42
ParseCommand1(); //8 0x38
ParseCommand1(); //0 0x30
ParseCommand1(); //, 0x2c
 
 
ParseCommand1(); //  0x20
ParseCommand1(); //F 0x46
ParseCommand1(); //1 0x31
ParseCommand1(); //, 0x2c
ParseCommand1(); //  0x20
ParseCommand1(); //M 0x4D
ParseCommand1(); //1 0x31
ParseCommand1(); //5 0x35
ParseCommand1(); //. 0x2e    
ParseCommand1(); // 0x20  
ParseCommand1(); // 0x2c
    
printf ("\n Inpuit 1 for exit or 0 for next command ");
int key;
scanf("%d",&key);
if (key==0) {goto label1; }
 
 
 
}
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
03.04.2020, 18:39  [ТС]
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
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
#include <stdio.h>
#include <stdint.h>
 
 
 
 
#define MODE_NOCMD 0
#define MODE_TURN_OFF_OUT 1
#define MODE_TURN_OFF_6dB   2
#define MODE_TURN_ON_6dB     3
 
#define MODE_INT_AM  4  
#define MODE_EXT_AM 5
#define MODE_INT_FM 6
#define MODE_EXT_FM 7
#define MODE_TURN_ON_EXT_PM 8
#define MODE_TURN_ON_INT_PM 9
 
 
#define MODE_TURN_OFF_EXT_AM 10
#define MODE_TURN_OFF_INT_AM 11
#define MODE_TURN_OFF_EXT_FM 12
#define MODE_TURN_OFF_INT_FM 13 
#define MODE_TURN_OFF_PM  14
//#define MODE_TURN_OFF_EXT_PM  15
 
#define MODE_FREQ   16
#define MODE_PREP_EXT_MOD 17
#define MODE_TURN_ON_OUT 18
#define MODE_TURN_ON_OUT_dB 19
#define MODE_TURN_ON_OUT_mV 20
#define MODE_TURN_ON_OUT_mkV 21
#define MODE_PREPSETFREQLFO  22
 
#define MODE_SETFREQLFO0 30
#define MODE_SETFREQLFO1 31
#define MODE_SETFREQLFO2 32
#define MODE_SETFREQLFO3 33
#define MODE_SETFREQLFO4 34
#define MODE_SETFREQLFO5 35
#define MODE_SETFREQLFO6 36
#define MODE_SETFREQLFO7 37
 
 
#define  NUM_DIGITS_FREQ 7
#define  NUM_DIGITS_FM 3 
#define  NUM_DIGITS_AM 2
#define  NUM_DIGITS_OUT 4
 
 
uint8_t  GetGPIBByte()
{
uint8_t byte; 
printf("\n Input byte  char  :   ");
scanf("%s",&byte);
//printf("\n      Send active signal  on Interrupt 3  ");
return byte; 
}
 
 
void ExecCMD(uint8_t mode)
{
 
switch (mode){
case MODE_NOCMD: 
 
              printf("\n\t\t\t\t  No CMD  or error  ");
 
 
                             break;
case MODE_TURN_OFF_OUT: 
                printf("\n\t\t\t\t  turn Off Out  "); 
                             break;
case MODE_TURN_OFF_6dB: 
                 printf("\n\t\t\t\t  TURN OFF 6dB  "); 
                             break;
 
case MODE_TURN_ON_6dB: 
                 printf("\n\t\t\t\t  TURN ON 6dB  "); 
                             break;
                             
case MODE_INT_AM: 
                 printf("\n\t\t\t\t  TURN ON INT AM  "); 
                             break;
case MODE_EXT_AM: 
                 printf("\n\t\t\t\t  TURN ON EXT AM  ");    
                             break;    
case MODE_INT_FM: 
                  printf("\n\t\t\t\t  TURN INT FM  "); 
                             break;
case MODE_EXT_FM:  
                  printf("\n\t\t\t\t  TURN EXT FM  "); 
                             break;                                                                               
 
case MODE_TURN_ON_EXT_PM:  
                  printf("\n\t\t\t\t  TURN ON EXT PM  "); 
                             break; 
case MODE_TURN_ON_INT_PM:  
                  printf("\n\t\t\t\t  TURN ON INT PM  "); 
                             break;
 case MODE_TURN_OFF_EXT_AM:  
                  printf("\n\t\t\t\t  TURN ON EXT AM  "); 
                             break;
 case MODE_TURN_OFF_INT_AM:  
                  printf("\n\t\t\t\t  TURN ON INT AM  "); 
                             break;
 case MODE_TURN_OFF_EXT_FM:  
                  printf("\n\t\t\t\t  TURN ON EXT FM  "); 
                             break;
 case MODE_TURN_OFF_INT_FM:  
                  printf("\n\t\t\t\t  TURN ON INT FM  "); 
                             break;                            
                             
 case MODE_TURN_OFF_PM:  
                  printf("\n\t\t\t\t  MODE TURN OFF PM  "); 
                             break;                                    
 case MODE_FREQ:  
                  printf("\n\t\t\t\t  MODE FREQ  "); 
                             break;  
                             
 case MODE_TURN_ON_OUT: 
                  printf("\n\t\t\t\t  TURN ON OUT  ");                   
                 break; 
                     
                             
 case MODE_TURN_ON_OUT_dB:  
                  printf("\n\t\t\t\t  TURN ON OUT dB  ");                    
                 break; 
 case MODE_TURN_ON_OUT_mV:  
                  printf("\n\t\t\t\t  TURN ON OUT mV  ");                    
                 break; 
 case MODE_TURN_ON_OUT_mkV: 
                  printf("\n\t\t\t\t  TURN ON OUT mkV  ");                   
                 break;                          
 case MODE_SETFREQLFO0: 
                  printf("\n\t\t\t\t  MODE_SETFREQLFO0  ");                      
                 break;              
                 
 case MODE_SETFREQLFO1: 
                  printf("\n\t\t\t\t  MODE_SETFREQLFO1  ");                      
                 break;              
                 
 case MODE_SETFREQLFO2: 
                  printf("\n\t\t\t\t  MODE_SETFREQLFO2  ");                      
                 break;
 case MODE_SETFREQLFO3: 
                  printf("\n\t\t\t\t  MODE_SETFREQLFO3 ");                   
                 break;              
 case MODE_SETFREQLFO4: 
                  printf("\n\t\t\t\t  MODE_SETFREQLFO4  ");                      
                 break;              
 case MODE_SETFREQLFO5: 
                  printf("\n\t\t\t\t  MODE_SETFREQLFO5  ");                      
                 break; 
 case MODE_SETFREQLFO6: 
                  printf("\n\t\t\t\t  MODE_SETFREQLFO6  ");                      
                 break; 
 case MODE_SETFREQLFO7: 
                  printf("\n\t\t\t\t  MODE_SETFREQLFO7  ");                      
                 break;                                                                  
                 
                                                                                                  
default :
 break;
 
}
 
 
return;
}
 
 
 
 
 
 
 
/*
 
    0  digits[0] = 5
    1  digits[1] = 2
    2  digits[2] = 0    CommaPos=2
           
    3  digits[3] =1  
    4  digits[4]=0     auto 0 
    5  digits[5]=0     auto 0
    6  digits[6]=0     auto 0
    7  end
 
    0  digits[0]  
    1  digits[1]   
    2  digits[2]  
    3  end
 
 2  0 digits[0]=8
 1  1 digits[1]=0
 0  2  end
 
 
 4  0 digits[0]=1
 3  1 digits[0]=0 CommaPos=1
 2  2 digits[0]=0
 1  3 digits[0]=0
 0  4  end
 
 
*/
#define  MAXCMDCHARS_GPIB 9
 uint8_t  count=0;   
 uint8_t FlagMsg=0;
 uint8_t flagLFO=0; 
 uint8_t FlagGetComma=0;
 uint8_t FlagMode=0;
 uint8_t tmpdigits[7] ;
 uint8_t tmpCommaPos=0;
 uint8_t tmpGPIBstack[MAXCMDCHARS_GPIB];  //A123.4567  
 uint8_t StackBytesCount=0;
 
 
uint8_t GetNumDigitsMode( uint8_t FlagMode)
{
if(FlagMode==MODE_FREQ) {return 7; }
if(FlagMode==MODE_INT_AM) {return 2; } 
if(FlagMode==MODE_EXT_AM) {return 2; }  
if(FlagMode==MODE_INT_FM) {return 3; }  
if(FlagMode==MODE_EXT_FM) { return 3; }  
if(FlagMode==MODE_TURN_ON_OUT_dB) { return 4; } 
if(FlagMode==MODE_TURN_ON_OUT_mV) { return 4; }      
if(FlagMode==MODE_TURN_ON_OUT_mkV) { return 4; }    
return 0;
}
 
 
 
void ParseCommaPos(uint8_t   counter, uint8_t FlagMode)
{
tmpCommaPos=counter;
 /* for evaluation only */ 
printf ( "\n\t\t\t\t comma posistion in %d digit     ",   counter  );   
    
return; 
}
 
void PutDigitToGPIBStackIfByte(uint8_t count, uint8_t  byte,   uint8_t FlagMode  )
{
tmpdigits[count]=byte-0x30;  
/* for evaluation only */ 
printf ( "\n\t\t\t\t %d digit is %d   ",   count , tmpdigits[count ]  );
}
 
 
void SetLastDigitsZero(uint8_t FlagMode, uint8_t count ,uint8_t NumDigMode )
{ 
if(NumDigMode !=0) { for (uint8_t i=count;i<=6; i++)    {  tmpdigits[i]=0; } }  
 
/* for evaluation only */ 
for (uint8_t i=0;i<NumDigMode; i++) { printf("\n%d", tmpdigits[i] );   if(i==tmpCommaPos) { printf(" <comma>");}
}    
return ;    
}
 
 
 
 
 
 
 
uint8_t  CheckEndCmdGPIB ()
{
 
 
uint8_t byte=GetGPIBByte ();  //gets  TTL code from inverse code for LD bus  bits 
 
 
/* 'space' */
 if (byte==0x20)  {   return 0;   }
 
/*  ','  end of command */                 
 if (byte==0x2c) {  return 1;    } 
/*  '.'  */ 
 if (byte==0x2e) { goto  LabelPushToStackGPIB; }
/*  '0'...'9' , 0x22, A,B,C,D,E,F, H,I,K,L,M,N,O   */ 
 if ((byte>=0x30)&&(byte<=0x39)) { goto  LabelPushToStackGPIB;    }
 
 if ( (byte==0x22)||(byte==0x49) || (byte==0x48) || ((byte>=0x41)&&(byte<=0x46)) ||((byte>=0x4B) &&(byte<=0x4F)))   
{  goto  LabelPushToStackGPIB; }
 
 
 return 0; 
 
LabelPushToStackGPIB:
 
if (StackBytesCount>=(uint8_t) MAXCMDCHARS_GPIB )  {   return 0; }  /*  if  "stack"   overflow    */
tmpGPIBstack[StackBytesCount]=byte;
//printf("\n Push byte into  stack  %c, %d  ",tmpGPIBstack[StackBytesCount], StackBytesCount  );
 
StackBytesCount+=1; 
 return 0; 
}
 
 
uint8_t OnNewByteIfAtnHigh()
{
uint8_t byte1= CheckEndCmdGPIB ();
//SendDataAcceptedStrobe();  //fix
return byte1;
}
 
/* ***************************** */
 
void CheckGPIBStackChars( uint8_t byte )
{
 
 
/*  '.'  */
if (byte==0x2e) { if((FlagMsg==1)&&(FlagGetComma==1) ) { 
FlagGetComma=0;
printf("count= %d ",count );
if(count==0) { tmpdigits[0]=0; tmpCommaPos=0;  count=1;  } else { tmpCommaPos=( count-1);  }
return  ;  
} 
FlagGetComma=0;
return;              
}
                
 
  /* '0'...'9' */
if ((byte>=0x30)&&(byte<=0x39)) 
{
 
 if (FlagMode==MODE_PREPSETFREQLFO)  
  {
  FlagMsg=0;
  if (FlagMode==0x30) {    FlagMode= MODE_SETFREQLFO0;  return; }
  if (FlagMode==0x31) {    FlagMode= MODE_SETFREQLFO1;  return;  }
  if (FlagMode==0x32) {    FlagMode= MODE_SETFREQLFO2;  return;  }
  if (FlagMode==0x33) {    FlagMode= MODE_SETFREQLFO3;  return;  }
  if (FlagMode==0x34) {    FlagMode= MODE_SETFREQLFO4;  return;  }
  if (FlagMode==0x35) {    FlagMode= MODE_SETFREQLFO5;  return;  }
  if (FlagMode==0x36) {    FlagMode= MODE_SETFREQLFO6;  return;  }
  if (FlagMode==0x37) {    FlagMode= MODE_SETFREQLFO7;  return;  }
  FlagMode= MODE_NOCMD;   
  return;
}
 
 
if (FlagMode==MODE_TURN_ON_OUT) { FlagMode= MODE_TURN_ON_OUT_dB;   } 
if ((count+1)>GetNumDigitsMode(FlagMode)  )  { FlagMsg=0;   return; } //fix
if (FlagMsg==1){ if (FlagGetComma==1) { tmpCommaPos=count;}  tmpdigits[(count)]=(uint8_t)( byte-0x30) ;  count+=1;  return;   }
 
return; 
}
 
 /* I   turn off output */
if(byte==0x49) { FlagMsg=0 ;      FlagMode=MODE_TURN_OFF_OUT;  return;}                 
 
/* H  6 dB off        */     
if(byte==0x48){ FlagMsg=0 ;     FlagMode=MODE_TURN_OFF_6dB;  return; }
/* O   turn on 6 dB  */
if(byte==0x4F){ FlagMsg=0 ;    FlagMode=MODE_TURN_ON_6dB;  return; }    
/* D   PM on ; off for ND  */
if(byte==0x44){   FlagMsg=0 ;   
if( FlagMode==MODE_PREP_EXT_MOD) { FlagMode=MODE_TURN_ON_EXT_PM; } else { FlagMode=MODE_TURN_ON_INT_PM; }
 return; }
 
/* E  PM off, end for BE,CE */
if(byte==0x45){   FlagMsg=0 ;   tmpCommaPos=0;
 if(FlagMode==MODE_EXT_AM) {   FlagMode=MODE_TURN_OFF_EXT_AM; }
 if(FlagMode==MODE_EXT_FM) {   FlagMode=MODE_TURN_OFF_EXT_FM; }
 if(FlagMode==MODE_INT_AM) {   FlagMode=MODE_TURN_OFF_INT_AM; }
 if(FlagMode==MODE_INT_FM) {   FlagMode=MODE_TURN_OFF_INT_FM; } 
 else  {   FlagMode=MODE_TURN_OFF_PM; }             
 return;  }
/* A      freq  , for example "A520.100,B80." or "A520.100," <=7 digits + comma */
if(byte==0x41) { FlagGetComma=1; FlagMsg=1 ;  count=0;  FlagMode=MODE_FREQ;   return; }
/* N , for example "NB,","NB20,",  "NС,","ND" ,"NC100,"  */
if(byte==0x4e){ FlagGetComma=1; FlagMsg=1 ; FlagMode=MODE_PREP_EXT_MOD; return;  }              
 
/* B    end of  NB, NC,    begin of BE        AM,% for example  "B80." or "B80," , <=2 digits */
if(byte==0x42){ FlagMsg=1 ; FlagGetComma=1; count =0;
if (FlagMode==MODE_PREP_EXT_MOD) { FlagMode=MODE_EXT_AM ; }  else  {  FlagMode=MODE_INT_AM ;  } 
return;  }
/* C    end of  NB, NC,    begin of CE         , FM, kHz , <=3  digits  */  
if(byte==0x43){ count=0; FlagGetComma=1;  FlagMsg=1 ;    
if ( FlagMode==MODE_PREP_EXT_MOD) { FlagMode=MODE_EXT_FM; } else {FlagMode=MODE_INT_FM ;} 
return;  }
 
/*  K   turn on output , if  only K , turn on output */ 
if(byte==0x4B){ FlagGetComma=1; FlagMsg=1 ;   count=0; FlagMode=MODE_TURN_ON_OUT ; return; }
 /* L           output, mV, <=3.5 digits + comma */
if((byte==0x4C)||(byte==0x22)){  FlagGetComma=1;  FlagMsg=1 ; count=0; FlagMode=MODE_TURN_ON_OUT_mV; return; }
/* M  , for example,"M10.00,"  */               
if(byte==0x4D){ FlagGetComma=1; FlagMsg=1 ; count=0;   FlagMode=MODE_TURN_ON_OUT_mkV;     return; }
 /* F   Finternal ,for example "F1,"  */
if(byte==0x46){  FlagGetComma=0; FlagMsg=1; count=0;    FlagMode=MODE_PREPSETFREQLFO;     return; }
 
//FlagGetComma=0; FlagMsg=0 ;   count=0;  FlagMode=MODE_NOCMD; ExecCMD(FlagMode);    //fix
 
return ;    
}
 
void ParseCommand1()
{
    //for (uint8_t i=0;i<9; i++) { printf("\n char= =%c", tmpGPIBstack[i] );        } 
    
    
 /* after  ','  end of command */
  count=0;   FlagMsg= 0; FlagMode=MODE_NOCMD; tmpCommaPos=0;
 for(uint8_t i=0; i< StackBytesCount; i++) { printf("\nstack char= %c", tmpGPIBstack[i] );  CheckGPIBStackChars( tmpGPIBstack[i]) ; } 
 
 
 SetLastDigitsZero(FlagMode, count, GetNumDigitsMode(FlagMode));
 
 ExecCMD(FlagMode  );
  for (uint8_t i=0;i<7; i++) { printf("\n%d", tmpdigits[i] );   if(i==tmpCommaPos) { printf(" <comma>");} }      
 
 count=0;   FlagMsg= 0; FlagMode=MODE_NOCMD;  
 
 
 return;              
} 
 
 
/* *********************************** */
int main()
{
 
label1:
printf("\n Input command  bytes (  A520.1, B80, F1, M10.2 ,  ) ");  //fix 0x2e problem for end of message 
//printf("\n Input command  bytes \n(  0x41 0x35 0x32 0x30  0x2e 0x31 0x2c"); 
 
while (!OnNewByteIfAtnHigh()) { ; }     //A 0x41 //5 0x35 //2 0x32  //0 0x30 //.0x2e //1 0x31 //, 0x2c
 
ParseCommand1();
 
//printf("\n Input command   0x20 0x42 0x38 0x30 0x2c 0x20 0x46 0x31 0x2c 0x20 0x4D 0x31 0x35 0x2e 0x20 0x2c ) ");  //fix 0x2e problem for end of message 
 
printf ("\n Inpuit 1 for exit or 0 for next command ");
int key;
scanf("%d",&key);
if (key==0) {goto label1; }
 
 
 
}
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
04.04.2020, 12:43  [ТС]
В "мантридовском" Г4-176 неправильно управляется мерцание .
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
04.04.2020, 13:26  [ТС]
https://youtu.be/7CK6lVQXlUw На видео с ютуба (там 176-й и до 1020 МГц, а не до 639,999 МГц и проблемы с ТВ, в оригинальном тоже ошибка включения светодиода ) принцип ввода цифр и нормализация выглядит похоже, только мигание выбранного знака не прописано .


0 1 2 3 4 5 6
[f]
[ ] [ ] [ ] [ ] [ ] [ ] [1.]
[ ] [ ] [ ] [ ] [ ] [1] [2.]
[ ] [ ] [ ] [ ] [1] [2] [3.]
[ ] [ ] [ ] [1 ] [2] [3.] [4]
[ ] [ ] [ 1] [2] [3.] [4] [5]
[ ] [1] [2] [3.] [4] [5] [6]
[1] [2] [3.] [4] [5] [6] [7]
[MHz]
[1] [2] [3.] [4] [5] [6] [7]


Кроме этого я бы не рекомендовал тыкать провод в выход , как на ютубе со Славой, это приводит к радиохулиганству (там мантридовская прошивка 176 -го генератора и неисправная ФАПЧ , ошибка мерцания, но принцип ввода цифр с правого разряда аналогичен ).

Простейшая программа нормализации может быть и следующая (но там с правого разряда ввод ), но надо переделывать прицип ввода в стек.

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
uint32_t GetFreqFromDigits( uint8_t freq1)
{
uint32_t result  =(uint32_t )freq1[6];
for(uint8_t i=0; i<freq1[5]; i++) {   result +=10;  }
for(uint8_t i=0; i<freq1[4]; i++) {   result +=100;  }
for(uint8_t i=0; i<freq1[3]; i++) {   result +=1000;  }
for(uint8_t i=0; i<freq1[2]; i++) {   result +=10000;  }
for(uint8_t i=0; i<freq1[1]; i++) {   result +=100000;  }
for(uint8_t i=0; i<freq1[0]; i++) {   result +=1000000;  }
 
}
 
 
void NormalizeFreqkHz( )
{
 for (uint8_t i=count; i<=6; i++)   {  tmpdigits[i]=0; }  
uint32_t ftmp=GetFreqFromDigits( tmpdigits);
if((ftmp>=6400000) &&if(ftmp<=1000)){ return ; }
if  (ftmp>=1600000) { tmpdigits[6]=0; }
tmpcommapos-=3;
 
 
 
}
Вложения
Тип файла: 7z bandicam 2020-04-04 13-06-21-614.7z (8.69 Мб, 15 просмотров)
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
04.04.2020, 13:45  [ТС]
Пример введенной частоты на не совсем исправных генераторах из интернета :
Миниатюры
Замена  микросхемы 1827ВЕ1-0000000 в Г4-164 на AVR -МК   Замена  микросхемы 1827ВЕ1-0000000 в Г4-164 на AVR -МК   Замена  микросхемы 1827ВЕ1-0000000 в Г4-164 на AVR -МК  

Замена  микросхемы 1827ВЕ1-0000000 в Г4-164 на AVR -МК  
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
04.04.2020, 14:38  [ТС]
На 600.000 МГц юстификация цифр справа (усложняет алгоритм).

Добавлено через 1 минуту
Требует доработки программы выработки по частоте и организацию кэша.

Добавлено через 6 минут
После нажатия f мерцание в заданном разряде.
Если ошибочно вводить ,например, 3
/*
0 1 2 3 4 5 6

[1] [0] [0.] [0] [0] [0] [0]

[кнопка f] (включается мерцание выбранного разряда )
[ ] [ ] [ ] [ ] [ ] [ ] [3.] // мерцание выключается, набор с правого разряда
[ ] [ ] [ ] [ ] [ ] [3] [3.]
[ ] [ ] [ ] [ ] [3] [3] [3.]
[ ] [ ] [ ] [3 ] [3] [3] [3.]
[ ] [ ] [ 3] [3] [3] [3] [3.]
[ ] [3] [3] [3] [3] [3] [3.]
[3] [3] [3] [3] [3] [3] [3.]
[кнопка MHz] отбой набора, частота остается той же, мерцание в заданном разряде
[1] [0] [0.] [0] [0] [0] [0] //при вращении валкодера частота изменяется на единицу в заданном разряде






*/

Добавлено через 3 минуты
Все -таки со стеком . Так неудобнее по программе (иначе тип переутверждать , а новые других типов правильнее по конструкции ) .
С Мега32-й реальнее по памяти.

Добавлено через 2 минуты
Но я бы другой процессор выбрал .
Для настоящего ремонта с оригинальным процессором правильнее, профессиональнее и законнее, но этот пост только для оценки возможности применения процессоров с подобными возможностями для этого .

Добавлено через 10 минут
Исходник Мантрида требует доработки (кроме этого в оригинальном на ТВ- работает ТВ+ ) , его можно и на этот тип переделать , пока он его не публикует, да и их сайт заблокировали за флуд и крэк на сайте.

Добавлено через 11 минут
При вводе 12,6 кГц ЧМ на 100 МГц
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
7    8     9
[]   []    []  //гашение   
    [кнопка ЧМ]
[0.][0]  [0]       , вкл 1 кГц
 
 
[ ][ ]  [1]      
[ ][1]  [2]
[ ][1]  [2.] 
[1][2.]  [6]
 
[кнопка кГц]
[1][2.]  [5]
 
 
[ ][ ]  [1] 
[ ][ ]  [1.]     
[ ][1.]  [2]
 
[кнопка кГц]
[1.][2]  [0]
Добавлено через 1 минуту
У нас по кодированию нулевой разряд слева , но можно на вычитание .

Добавлено через 2 минуты
Результирующие программы отправки могут быть аналогичны (с исправлениями , оптимизацией инверсии и адаптацией типов ) уже рассмотренным , а вот с индикацией , нормализацией проблема с производительностью процессора (там не случайно 16-битный использовался).

Добавлено через 11 минут
при 639.999 МГц

/*
0 1 2 3 4 5 6

[1] [0] [0.] [0] [0] [0] [0]

[кнопка f] (включается мерцание выбранного разряда )
[ ] [ ] [ ] [ ] [ ] [ ] [6.] //6 мерцание выключается, набор с правого разряда
[ ] [ ] [ ] [ ] [ ] [6] [3.] //3
[ ] [ ] [ ] [ ] [6] [3] [9.]//9
[ ] [ ] [ ] [ ] [6] [3] [9.]//,
[ ] [ ] [ ] [6] [3] [9.] [9]//9
[ ] [ ] [ 6] [3] [9.] [9] [9]//9
[ ] [6] [3] [9.] [9] [9] [9]//9
(кнопка МГц)
[ ] [6] [3] [9.] [9] [9] [9] //слева гашение , настоящий код [6] [3] [9.] [9] [9] [9] [0], последний не считается в программе выработки , если частота больше или равна 160 МГц, но меньше или равна 639,999 МГц .

(за примерно 2 мс все коды должны быть отправлены,а ФАПЧ должна "уравновеситься" за время не более 1 с , если ЗГ исправен(по триммерам и коэффициенту перекрытия ГУН), а коды корректны ).

Добавлено через 41 секунду
Программу вывода на индикацию переделать.
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
04.04.2020, 14:50  [ТС]
На примере 176-го генератора (у нас аналогично от 0,1 до 159,9999 и от 160,000 до 639,999 МГц , только до 639,999 МГц , дальше ограничение или отбой и нет ТВ в окошке АМ ):
Миниатюры
Замена  микросхемы 1827ВЕ1-0000000 в Г4-164 на AVR -МК  
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
04.04.2020, 14:51  [ТС]
Правая юстификация цифр .
Придется флаг поддиапазона и измененную программу выработки делать .
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
04.04.2020, 14:52  [ТС]
Из интернета примеры индикации (правда , на 176 генераторе ):
Вложения
Тип файла: zip IMG_20171026_205251.thumb.jpg.1a5dfd160d7d1a1a027bfdbcffa6dedc.zip (5.24 Мб, 11 просмотров)
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
04.04.2020, 14:53  [ТС]
Требует доп. ячеек ОЗУ.
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
04.04.2020, 15:11  [ТС]
Из инструкции (про "дп" маленькое (не NDAC ) и стек (можно динамическим массивом с указателем или счетчиком введеннных байтов представить )).
Миниатюры
Замена  микросхемы 1827ВЕ1-0000000 в Г4-164 на AVR -МК   Замена  микросхемы 1827ВЕ1-0000000 в Г4-164 на AVR -МК   Замена  микросхемы 1827ВЕ1-0000000 в Г4-164 на AVR -МК  

0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
04.04.2020, 22:51  [ТС]
Можно и дизъюнкцию условий от байтов КОП в обработчике скан-кодов предусмотреть .

Добавлено через 2 часа 39 минут
Оптимизировать структуру регистра флажков и правильно понимать дежурный регистр в условиях 8-битной архитектуры (учитывая упрощенность и обобщенность алгоритма в инструкции , предназначенность его для шестнадцатибитки ).

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

Добавлено через 1 час 2 минуты
После включения он включается на 100.0000 МГц , мерцание в единицах мегагерц, ЧМ и АМ выключены, выход 1000 мкВ , выход включен , 6 дБ отключено , ГЗЧ отключен (по у молчанию начинается с 1 кГц , 0.00 кГц, 0% ). Шаг для ЧМ, АМ и выхода первый раз после включения уточняется (к макросам флагов и смыслу дежурного регистра ) . Все время он ИЗП не посылает, а только после отправки кодов (кажется, на каждый или после выработки всех необходимых один раз , про проблему степени "дословности" восприятия алгоритма из инструкции ).

Добавлено через 51 секунду
Мы просто поменяли архитектуру процессора и разрядность , у нас с особенностями .

Добавлено через 44 минуты
Исправить баг со статическими командами и дефайнами , переосмыслить макросы
C++
1
2
if((Flag[3]&MASK_FLAG_MODE)!=0)  { SendMode(); SelectFlag( FLAG___MODE); return; }
if((Flag[3]&MASK_FLAG_STATICCMD)!=0)  { SendStaticCommands(); SelectFlag( FLAG____STATICCMD); return; }
Добавлено через 3 часа 8 минут
Исправить обработчик клавиатуры (для начала хотя бы так, в эмуляции на ПК отладить ):
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
#define TOKEN_F 0
#define TOKEN_FM 1
#define TOKEN_AM 2
#define TOKEN_PM 3
#define TOKEN_MOD_OFF 4
#define TOKEN_OUT 5
 
  //LabelPoint8:
void ParseKeyb()
{
//;        8_1  
 printf("\ncall ParseKeyb ");
uint8_t scancode;
GetScanCodeValue() ;
 
 
uint8_t byte1;
scanf("%x",&byte1);
printf("\n ********* ");
printf ("\n0x%.02x\n", (int)byte1);
 
 scancode=(uint8_t)byte1;
 
 
 scancode =( scancode&BITMASK_KEYBOARD);
 printf ("\nKeyb Byte    = 0x%.02x  **\n",scancode);
 
//if(CheckButtonsNumericKeypad( scancode )==0x01) {    return; } 
 
if( scancode == (uint8_t)BUTTON_F ) {  printf(" freq  ");  SetDutyReg(TOKEN_F);  return ;}   //  turn on blink in f , wait digits or  encoder  int or GPIB events 
if( scancode == (uint8_t)BUTTON_FM ) {  printf(" fm  "); TurnOnFM (); SetDutyReg(TOKEN_FM);  return ; }  //  turn on blink in FM , wait digits or  encoder  int or GPIB events
if( scancode == (uint8_t)BUTTON_AM ) { TurnOnAM(); SetDutyReg(TOKEN_AM);  return ;     } //  turn on blink in AM , wait digits or  encoder  int or GPIB events
if( scancode == (uint8_t)BUTTON_PM  ) { TurnOnPM(); SetDutyReg(TOKEN_PM);  return ;  } //  turn on int or exf PM, wait off 
if( scancode == (uint8_t)BUTTON_MOD_OFF ) { TurnOffModulation(); SetDutyReg(TOKEN_MOD_OFF);  return ; }
if( scancode == (uint8_t)BUTTON_EXT  )  { PrepareExtModulation () ; return; }    /* 9*/  
if( scancode == (uint8_t)BUTTON_STEP) ) { StepModeOn(); return; }
 
if( scancode ==(uint8_t) BUTTON_OUT  ) { printf(" out ");    OutputOn(); SetDutyReg(TOKEN_OUT); return; } //  turn on blink in Out , wait digits or  encoder  int or GPIB events 
if( scancode==(uint8_t) BUTTON_OUT_OFF ) { OutputOnOff();  return; }
if( scancode==(uint8_t)BUTTON_LFO ) { ChangeLFONum(); return; }
if( scancode==(uint8_t)BUTTON_SHARP ) { SetMemWrMode(); return;  }
if( scancode==(uint8_t)BUTTON_RECALL ) { SetMemRecallMode(); return; }
if( scancode==(uint8_t)BUTTON_MHz ) { NormalizeFreq(); return; }//;  10   
if( scancode==(uint8_t)BUTTON_kHz ) { if (CheckStepModeOn()!=0){ NormalizeStep();  return; } else { NormalizeFM();  return;}  }//;  macro,  13_2 or to 1 
if( scancode==(uint8_t)BUTTON_PERCENT ) { NormalizeAMCoef(); return; }  //;   14_2   
if( scancode==(uint8_t)BUTTON_mV ) { SetOutInputMode(TOKEN_Out_mV);  return;} //;   15_2  
if( scancode==(uint8_t)BUTTON_mkV ) {SetOutInputMode( TOKEN_Out_mkV );  return;}//;   15_2 
if( scancode==(uint8_t)BUTTON_dBV ) { SetOutInputMode(TOKEN_Out_dB);  return;} //;   15_2  
if( scancode==(uint8_t) BUTTON_6dB ) { if (CheckModeAM==0)    { TurnOn6dB(); }  return; }//;   11  
//CaseDefault: 
if(StepMode==1) { ChangeFreqOneStep() ;   NormalizeFreq(); return; }   ;//  12_3,   
ChangeStepParam();  
 
 
 
 
  return ; //to point1             
}
После выработки кодов (и т.д. ) ставить в 1 соответствующие флаги (пока висит на 0x10 (f), 0x07 (out) и т.д. ):


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
//#include < avr/io.h >
//#include <util/delay.h>
//#include <avr/interrupt.h>
//#include <avr/pgmspace.h>
 
#include <stdio.h>
#include <stdint.h>
#include <math.h>
 
void  SendStaticCommands(){ 
printf("\nSend static commands : %.02x " , (int)CurrentState.StaticCMDbits   ) ;  
 
}
void  SendLFOCodes(){ 
printf("\nSend LFO codes : LFO_num=%d ",   (int)CurrentState.LFO_num  ) ;
/*      */
}
 
 
void  SendFMCodes(){
 printf("\nSend FM codes : DAC =%x  FM_DAC_LFO =%x " ,  (int)DACFM,  FM_DAC_LFO) ;
 
}  
 
void  SendAMCodes(){
 printf("\nSend AM codes : DACVref=%d, DACAM=%d ", (int)DACVref ,  (int)  DACAM   ) ;
 
} 
 
 
void  SendAttCodes(){
 printf("\nSend Att codes : %.02x ",  (int)Attcode ) ;
 
} 
 
 
void  SendHFOCodes(){
 printf("\nSend HFO codes : OscCode=%.02x   AttCorFM=%02x " ,  (int)Osc_Code, (int)AttCorFM) ;
 
 } 
 
 
void  SendDVDCCodes(){
 printf("\nSend DVDC codes : %d %d %d  %d %d %d " ,(int) DVDCdigits[0],(int)DVDCdigits[1],(int)DVDCdigits[2],(int)DVDCdigits[3] ,(int)DVDCdigits[4],(int)DVDCdigits[5] ) ;
 
}
Добавлено через 1 минуту
расставить правильно флажки в модальных подпрограммах , сбрасывая их в правильном месте
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
//#include < avr/io.h >
//#include <util/delay.h>
//#include <avr/interrupt.h>
//#include <avr/pgmspace.h>
 
#include <stdio.h>
#include <stdint.h>
#include <math.h>
 
 
void ParseCodesFM() {   
printf("\nParsesCodeFM") ;  
 /* insert subroutines here*/
Flag[3]|=MASK_FLAG_FM_CODE;   // ready to send 
}
 
void ParseCodesAM(){        
printf("\nParsesCodeAM") ; 
/* insert subroutines here*/
Flag[3]|=MASK_FLAG_AM_CODE;  // ready to send 
}
 
void ParseCodesHFO() { 
printf("\nParseCodesHFO") ;
/* insert subroutines here*/
Flag[3]|=MASK_FLAG_HFO_CODE ; 
} 
 
 
void ParseCodesOutDACAttMode () {  
printf("\nParseCodesAtt") ; 
/* insert subroutines here*/
Flag[3]|=MASK_FLAG_ATT_CODE;
 
printf("\nParse DAC Out ") ; 
/* insert subroutines here*/
Flag[3]|=MASK_FLAG_AM_CODE; //fix
 
printf("\nParse Mode") ; 
/* insert subroutines here*/
Flag[3]|=MASK_FLAG_MODE;
}
 
void  ParseStaticCommands() { 
printf("\nParseStaticCommands") ;
/* insert subroutines here*/
Flag[3]|= ( MASK_FLAG_STATICCMD)  ;
 }
 
void ParseCodesDVDC(){  
printf("\nParseCodesDVDC") ; 
/* insert subroutines here*/
Flag[3]|=( MASK_FLAG_DVDC_CODE);
} 
 
 
 
void  CheckFMMax() { 
 
printf("\nParseCodesFM MAX") ;
/* insert subroutines here*/
//if(FMError!=0) { Flag[2]|=MASK_FLAG_DISP_ERROR;     }
 
}
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
05.04.2020, 00:19  [ТС]
Немного не понял смысл "дежурный регистра =0" и " есть прерывание ? " , "и установка выделенного флажка в 0 ", "установка выделенного флажка в 1 "(например , сканкод 0x07 ). После точки 2 возвращается в 1 до проверки дежурного регистра ? А ИЗП с условием ? Не хочет в нормализацию заходить . Может, в инструкции ошибка (скорее всего там защита, делать независимо , асимптотически ).
Вложения
Тип файла: zip testprog.zip (138.0 Кб, 8 просмотров)
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
05.04.2020, 01:58  [ТС]
Проблема типа :
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
//; jump to this subroutine in the main() after  init subroutines 
 
void  main_sub ()
{
cli();   DutyReg=0;  
 
LabelPoint1:
 
if(DutyReg !=0)      /*     parse mode  flags      */
{     
 
 SetSelectedFlagZero(selectedflag);     
 selectedflag=CheckFlags1();  //  32
 printf("  * %d   ", (int)selectedflag);  /*  for loop evaluation if debug        */
 sei();
 goto LabelPoint1;
 
}
 
 
/* if duty reg=0 */
 SendMemWrPulse();
 SetAddrWait();
sei();
LabelNoInterrupts:
    
if (IntFlags==0) {  /*sleep(); */  goto      LabelNoInterrupts;          }  // ;  loop while no interrupts
/* if interrupt was expected  */  
cli();
ParseInterrupts();  //goto  LabelPoint2;  return after  mode input
 
goto  LabelPoint1;
 
 
return  ;
}
В консольном режиме и не на чипе неудобно эмулировать прерывания .

Добавлено через 12 минут
Еще обратить внимание на Inp8-SEA, Inp15 -gnd , Inp11- прер2, Inp10- прер1, Inp9- прер3 .

Добавлено через 17 минут
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
uint8_t CheckDutyReg()
{
//if (DutyReg!=0) { return DutyReg; }
return DutyReg;
}   
void SetDutyReg(uint8_t Reg){ DutyReg|=(uint8_t)( 1<<Reg);  printf("SetDutyReg : DutyReg=0x%.02x  ",(int)DutyReg ) ;  return;  }    
#define FREQ_BYTEMASK 0x01
#define FM_BYTEMASK     0x02
#define AM_BYTEMASK    0x04
 
void ParseInterrupts()
{
LabelPoint2:
 printf("\nParse Interrupts , point2 ");
//;   2     
// AnalyseInterrupt_InputData() ;
 
 
if((IntFlags==INTERUPT3_BYTEMASK) ) { IntFlags=0; /* ParseGPIBByte();*/  return;  } //;  add decoder subroutines for GPIB , goto LabelPoint7 
if((IntFlags==INTERUPT2_BYTEMASK) ) {    ParseKeyb(); IntFlags=0;  DutyReg=0; return; } //;  add decoder subroutines ,    ParseKeyboard();
IntFlags=0;
 
if((DutyReg&FREQ_BYTEMASK)!=0  ) {  NormalizeFreq()  ;  DutyReg=0;    return;    /* 12_1 */      }//  
if((DutyReg&FM_BYTEMASK)!=0 ) { NormalizeFM()  ;   DutyReg=0; return; /*  13_1 */      } 
if((DutyReg&AM_BYTEMASK)!=0 ) { NormalizeAMCoef() ;    DutyReg=0;  return; /*  14_1 */      }  
 
 
  NormalizeOutput1();    DutyReg=0;  
 
/* 15_1 */
return;
}
 
/*
Âêë - > 
1) ×àñòîòà - > Ââîä (100.0000  ÌÃö ïî óìîë÷àíèþ) ->
Flag[0]|=(uint8_t)  ( MASK_FLAG_PARSECODE_FREQ); 
Âûðàáîòêà ïî ÷àñòîòå : âûðàáîòêà êîäîâ ÄÏÊÄ,ÃåíÂ×, ñòàòè÷. êîìàíä 
 
Flag[3]|=( MASK_FLAG_DVDC_CODE)|( MASK_FLAG_HFO_CODE)|( MASK_FLAG_STATICCMD)  ;
 
->Èíäèêàöèÿ - Îòïðàâêà  êîýôôèöèåíòîâ (ÃÂ×,ÄÄÏÊÄ, ñòàòè÷. êîìàíä  )  -  ìåðöàíèå â åäèíèöàõ ìåãàãåðö
 
 
 
 
 
2) ÂÂîä âûõîä 1000. ìê -
âûðàáîòêà ïî âûõîäó -> Èíäèêàöèÿ, èíäèêàöèÿ ðåæèìîâ ->  îòïðàâêà  êîýôô (Àòò, ÖÀÏ ,  )   
 
 
 
*/
 
 
/* *********************** */
 
 
 
 
 
void CheckFlags1(){
 
 
//printf("\n CheckFlags");
 
if((Flag[0]&MASK_FLAG_PARSECODE_FM)!=0){ ParseCodesFM() ;  ParseCodesHFO() ;  Flag[0]&=(uint8_t) ~( MASK_FLAG_PARSECODE_FM); return ; }   
if((Flag[0]&MASK_FLAG_PARSECODE_AM)!=0) { ParseCodesAM();   Flag[0]&=(uint8_t) ~( MASK_FLAG_PARSECODE_AM); return   ; }
if((Flag[0]&MASK_FLAG_PARSECODE_OUT)!=0){  ParseCodesOutDACAttMode() ; ParseStaticCommands() ;  Flag[0]&=(uint8_t) ~( MASK_FLAG_PARSECODE_OUT);  return   ; }
if((Flag[0]&MASK_FLAG_PARSECODE_FREQ)!=0){ ParseCodesDVDC() ;  ParseCodesHFO() ; ParseStaticCommands();  CheckFMMax() ; Flag[0]&=(uint8_t) ~( MASK_FLAG_PARSECODE_FREQ);   return ;  }
 
if((Flag[1]&MASK_FLAG_INC_STEP)!=0) { IncStep();  Flag[1]&=(uint8_t) ~( MASK_FLAG_INC_STEP);  return   ; } //3 
if((Flag[1]&MASK_FLAG_DEC_STEP)!=0) { DecStep();  Flag[1]&=(uint8_t) ~( MASK_FLAG_DEC_STEP);  return     ; } 
 
if((Flag[2]&MASK_FLAG_TURN_OFF)!=0) { TurnOffUnusedModes();  Flag[2]&=(uint8_t) ~(MASK_FLAG_TURN_OFF);      return ;  }   
if((Flag[2]&MASK_FLAG_DISP_ERROR)!=0) { DisplayErrorFM();    Flag[2]&=(uint8_t) ~(MASK_FLAG_DISP_ERROR);    return ; }
if((Flag[2]&MASK_FLAG_DISP_FM)!=0)  { DisplayFMValue();      Flag[2]&=(uint8_t) ~(MASK_FLAG_DISP_FM);       return ;  }
if((Flag[2]&MASK_FLAG_DISP_AM)!=0) { DisplayAMValue();       Flag[2]&=(uint8_t) ~(MASK_FLAG_DISP_AM);       return ;  }
if((Flag[2]&MASK_FLAG_DISP_OUT)!=0) { DisplayOutValue();     Flag[2]&=(uint8_t) ~(MASK_FLAG_DISP_OUT);      return ; }
if((Flag[2]&MASK_FLAG_DISP_FREQ)!=0) { DisplayFreqValue();   Flag[2]&=(uint8_t) ~(MASK_FLAG_DISP_FREQ);     return   ; }
 
if((Flag[2]&MASK_BLINK_OFF)!=0)  {   SendBlinkOff();  Flag[2]&=(uint8_t) ~(  MASK_BLINK_OFF);  return  ; } //4
if((Flag[2]&MASK_FLAG_BLINK_CODE)!=0)  { SendBlinkCode(); Flag[2]&=(uint8_t) ~(  MASK_FLAG_BLINK_CODE); return  ; }
 
 
if((Flag[3]&MASK_FLAG_MODE)!=0)  { SendModeCodes();  Flag[3]&=(uint8_t) ~( MASK_FLAG_MODE); return   ; }
if((Flag[3]&MASK_FLAG_STATICCMD)!=0)  { SendStaticCommands();   Flag[3]&=(uint8_t) ~( MASK_FLAG_STATICCMD);   return   ; }
if((Flag[3]&MASK_FLAG_LFO)!=0)  { SendLFOCodes();   Flag[3]&=(uint8_t) ~( MASK_FLAG_LFO);  return   ; }
if((Flag[3]&MASK_FLAG_FM_CODE)!=0) { SendFMCodes(); Flag[3]&=(uint8_t) ~( MASK_FLAG_FM_CODE);   return  ; }
if((Flag[3]&MASK_FLAG_AM_CODE)!=0)  { SendAMCodes();  Flag[3]&=(uint8_t) ~( MASK_FLAG_AM_CODE);  return   ;}
 
if((Flag[3]&MASK_FLAG_ATT_CODE)!=0) {SendAttCodes();  Flag[3]&=(uint8_t) ~( MASK_FLAG_ATT_CODE);  return ; } //5
if((Flag[3]&MASK_FLAG_HFO_CODE)!=0) { SendHFOCodes();  Flag[3]&=(uint8_t) ~( MASK_FLAG_HFO_CODE);     return ; }
if((Flag[3]&MASK_FLAG_DVDC_CODE)!=0)  { SendDVDCCodes();  Flag[3]&=(uint8_t) ~( MASK_FLAG_DVDC_CODE);  return  ; }
return    ; // goto  LabelPoint1 
} 
 
 
 
//; jump to this subroutine in the main() after  init subroutines 
 
void  main_sub ()
{
cli();   DutyReg=0;  
 
LabelPoint1:
 
if(DutyReg !=0)      /*     parse mode  flags      */
{     
 
      
  CheckFlags1();  //  32
 printf("  * %d   ", (int)selectedflag);  /*  for loop evaluation if debug        */
 if(GIE==0) { sei();  }   //GIE is for evaluation 
 goto LabelPoint1;
 
}
 
 
/* if duty reg=0 */
 //SendMemWrPulse();
 //SetAddrWait();
if(GIE==0) { sei();  }   //GIE is for evaluation 
LabelNoInterrupts:
    
if (IntFlags==0) {  /*sleep(); */  goto      LabelNoInterrupts;          }  // ;  loop while no interrupts
/* if interrupt was expected  */  
cli();
ParseInterrupts();  //goto  LabelPoint2;  return after  mode input
 
goto  LabelPoint1;
 
 
return  ;
}
Добавлено через 2 минуты
Не входит в

Code
1
2
3
4
5
6
if((DutyReg&FREQ_BYTEMASK)!=0  ) {  NormalizeFreq()  ;  DutyReg=0;    return;    /* 12_1 */      }//  
if((DutyReg&FM_BYTEMASK)!=0 ) { NormalizeFM()  ;   DutyReg=0; return; /*  13_1 */      } 
if((DutyReg&AM_BYTEMASK)!=0 ) { NormalizeAMCoef() ;    DutyReg=0;  return; /*  14_1 */      }  
 
 
  NormalizeOutput1();    DutyReg=0;
при 0x07 и 0x10

Есть скрытые особенности (вместо опечаток, в том числе архитектурные ).

Добавлено через 30 минут
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
void CheckFlags1(){
 
 
//printf("\n CheckFlags");
 
 
 
 
if((Flag[1]&MASK_FLAG_PARSECODE_FM)!=0){ ParseCodesFM() ;  ParseCodesHFO() ;  Flag[1]&=(uint8_t) ~( MASK_FLAG_PARSECODE_FM); return ; }   
if((Flag[1]&MASK_FLAG_PARSECODE_AM)!=0) { ParseCodesAM();   Flag[1]&=(uint8_t) ~( MASK_FLAG_PARSECODE_AM); return   ; }
if((Flag[1]&MASK_FLAG_PARSECODE_OUT)!=0){  ParseCodesOutDACAttMode() ; ParseStaticCommands() ;  Flag[1]&=(uint8_t) ~( MASK_FLAG_PARSECODE_OUT);  return   ; }
if((Flag[1]&MASK_FLAG_PARSECODE_FREQ)!=0){ ParseCodesDVDC() ;  ParseCodesHFO() ; ParseStaticCommands();  CheckFMMax() ; Flag[1]&=(uint8_t) ~( MASK_FLAG_PARSECODE_FREQ);   return ;  }
 
if((Flag[2]&MASK_FLAG_INC_STEP)!=0) { IncStep();  Flag[2]&=(uint8_t) ~( MASK_FLAG_INC_STEP);  return   ; } //3 
if((Flag[2]&MASK_FLAG_DEC_STEP)!=0) { DecStep();  Flag[2]&=(uint8_t) ~( MASK_FLAG_DEC_STEP);  return     ; } 
 
if((Flag[3]&MASK_FLAG_TURN_OFF)!=0) { TurnOffUnusedModes();  Flag[3]&=(uint8_t) ~(MASK_FLAG_TURN_OFF);      return ;  }   
if((Flag[3]&MASK_FLAG_DISP_ERROR)!=0) { DisplayErrorFM();    Flag[3]&=(uint8_t) ~(MASK_FLAG_DISP_ERROR);    return ; }
if((Flag[3]&MASK_FLAG_DISP_FM)!=0)  { DisplayFMValue();      Flag[3]&=(uint8_t) ~(MASK_FLAG_DISP_FM);       return ;  }
if((Flag[3]&MASK_FLAG_DISP_AM)!=0) { DisplayAMValue();       Flag[3]&=(uint8_t) ~(MASK_FLAG_DISP_AM);       return ;  }
if((Flag[3]&MASK_FLAG_DISP_OUT)!=0) { DisplayOutValue();     Flag[3]&=(uint8_t) ~(MASK_FLAG_DISP_OUT);      return ; }
if((Flag[3]&MASK_FLAG_DISP_FREQ)!=0) { DisplayFreqValue();   Flag[3]&=(uint8_t) ~(MASK_FLAG_DISP_FREQ);     return   ; }
if((Flag[3]&MASK_BLINK_OFF)!=0)  {   SendBlinkOff();  Flag[3]&=(uint8_t) ~(  MASK_BLINK_OFF);  return  ; } //4
if((Flag[3]&MASK_FLAG_BLINK_CODE)!=0)  { SendBlinkCode(); Flag[3]&=(uint8_t) ~(  MASK_FLAG_BLINK_CODE); return  ; }
 
 
if((Flag[4]&MASK_FLAG_MODE)!=0)  { SendModeCodes();  Flag[4]&=(uint8_t) ~( MASK_FLAG_MODE); return   ; }
if((Flag[4]&MASK_FLAG_STATICCMD)!=0)  { SendStaticCommands();   Flag[4]&=(uint8_t) ~( MASK_FLAG_STATICCMD);   return   ; }
if((Flag[4]&MASK_FLAG_LFO)!=0)  { SendLFOCodes();   Flag[4]&=(uint8_t) ~( MASK_FLAG_LFO);  return   ; }
if((Flag[4]&MASK_FLAG_FM_CODE)!=0) { SendFMCodes(); Flag[4]&=(uint8_t) ~( MASK_FLAG_FM_CODE);   return  ; }
if((Flag[4]&MASK_FLAG_AM_CODE)!=0)  { SendAMCodes();  Flag[4]&=(uint8_t) ~( MASK_FLAG_AM_CODE);  return   ;}
 
if((Flag[4]&MASK_FLAG_ATT_CODE)!=0) {SendAttCodes();  Flag[4]&=(uint8_t) ~( MASK_FLAG_ATT_CODE);  return ; } //5
if((Flag[4]&MASK_FLAG_HFO_CODE)!=0) { SendHFOCodes();  Flag[4]&=(uint8_t) ~( MASK_FLAG_HFO_CODE);     return ; }
if((Flag[4]&MASK_FLAG_DVDC_CODE)!=0)  { SendDVDCCodes();  Flag[4]&=(uint8_t) ~( MASK_FLAG_DVDC_CODE);  return  ; }
return    ; // goto  LabelPoint1 
} 
 
 
 
//; jump to this subroutine in the main() after  init subroutines 
 
void  main_sub ()
{
cli();   Flag[0]=0;  
 
LabelPoint1:
 
if((Flag[0] !=0) ||(Flag[1]!=0) ||(Flag[2]!=0) || (Flag[3]!=0)|| (Flag[4]!=0))      /*     parse mode  flags      */
{     
 
      
  CheckFlags1();  //  32
   /*  for loop evaluation if debug        */
 goto LabelPoint1;
 
}
 
 
/* if duty reg=0 */
 //SendMemWrPulse();
 //SetAddrWait();
  sei();    //GIE is for evaluation 
LabelNoInterrupts:
    
if (IntFlags==0) {  /*sleep(); */      goto      LabelNoInterrupts;          }  // ;  loop while no interrupts
/* if interrupt was expected  */  
cli();
ParseInterrupts();  //goto  LabelPoint2;  return after  mode input
 
goto  LabelPoint1;
 
 
return  ;
}
можно упаковать дежурный регистр в нулевую ячейку флагов,подвинув на 1 все флаги , там, кажется, надо проверять все флаги на нуль . Еще: тогда включить обработку цифровых кнопок , убрать мелкие баги .

Добавлено через 1 минуту
А с выбранным режимом как же ?

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
void SetDutyReg(uint8_t Reg){ Flag[0]|=(uint8_t)( 1<<Reg);  printf("SetDutyReg : DutyReg=0x%.02x  ",(int)Flag[0] ) ;  return;  }    
#define FREQ_BYTEMASK 0x01
#define FM_BYTEMASK     0x02
#define AM_BYTEMASK    0x04
 
void ParseInterrupts()
{
LabelPoint2:
 printf("\nParse Interrupts , point2 ");
//;   2     
// AnalyseInterrupt_InputData() ;
 
 
if((IntFlags==INTERUPT3_BYTEMASK) ) { IntFlags=0; /* ParseGPIBByte();*/  return;  } //;  add decoder subroutines for GPIB , goto LabelPoint7 
if((IntFlags==INTERUPT2_BYTEMASK) ) {    ParseKeyb(); IntFlags=0;  Flag[0]=0; return; } //;  add decoder subroutines ,    ParseKeyboard();
IntFlags=0;
 
if((Flag[0]&FREQ_BYTEMASK)!=0  ) {  NormalizeFreq()  ;  Flag[0]=0;    return;    /* 12_1 */      }//  
if((Flag[0]&FM_BYTEMASK)!=0 ) { NormalizeFM()  ;   Flag[0]=0; return; /*  13_1 */      } 
if((Flag[0]&AM_BYTEMASK)!=0 ) { NormalizeAMCoef() ;    Flag[0]=0;  return; /*  14_1 */      }  
 
 
  NormalizeOutput1();    Flag[0]=0;  
 
/* 15_1 */
return;
}
Здесь нужно что-то патчить .

Добавлено через 8 минут
там иначе, иначе в
C++
1
ChangeStepParam();
выходит
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
05.04.2020, 23:39  [ТС]
Вариант некоторых программ с внешней дешифрацией диапазона. Проблема : кноки МГц,кгц, % совпадают по кодам с их вторыми функциями -дБВ, мВ, мкВ . Нужно вводить флажок или особым образом обрабатывать дежурный регистр . С некоторыми режимами еще проблема.
Вложения
Тип файла: zip test_bug_dutyreflagsproblem.zip (156.5 Кб, 8 просмотров)
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
06.04.2020, 02:45  [ТС]
Будет занимать в памяти АТМега16А не менее (это без многих модулей нормализации ):
Code
1
2
3
4
5
Done executing task "RunCompilerTask".
    Task "RunOutputFileVerifyTask"
                Program Memory Usage    :   10666 bytes   65,1 % Full
                Data Memory Usage       :   482 bytes   47,1 % Full
    Done executing task "RunOutputFileVerifyTask".
В АТМега32 поместится.

Добавлено через 1 час 22 минуты
В программе аттенюатора фиксать баги . Можно в цикле проверять на условие :


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
const uint8_t  AttCode_Values[15]  PROGMEM   =
{
nATT_0_dB,  nATT_10_dB,nATT_20_dB,nATT_30_dB,nATT_40_dB,nATT_50_dB,nATT_60_dB,nATT_70_dB,
nATT_80_dB, nATT_90_dB,nATT_100_dB,nATT_110_dB,nATT_120_dB,nATT_130_dB,nATT_140_dB 
    
};
 
 
 
 
//uint8_t Attcode;
//uint16_t DACVref; in the sharedvals.h
 
void  GetDACValue_dBV( uint16_t Value_dBV        )
{
 uint16_t AttStage1=(uint16_t)0 ;
 uint8_t AttCount1=0;
 
for (  AttCount1=0; AttCount1<=14  ;   AttCount1+=1   ){
 
if((Value_dBV>=(uint16_t)(AttStage1))&&(Value_dBV<= (uint16_t)(AttStage1+99))) 
{
 Attcode=pgm_read_byte_near(AttCode_Values+(AttCount1))  ;
 DACVref =(uint16_t ) pgm_read_word_near(LogTable1+(uint16_t)(Value_dBV-AttStage1))  ;
return ;   
}
 
 AttStage1+=100;
}
 
 
 
return  ;
}
 
 
 
void GetDACValue_mV( uint16_t ValuemV    , uint8_t comma_pos       )
{
 
 
if((ValuemV>=317)&&(ValuemV<=1000))      //1000. ...317. mV
 {
     
if(comma_pos==COMMA_4DIGIT){   Attcode=nATT_0_dB; }  //1000. ...317. mV
if(comma_pos==COMMA_3DIGIT){   Attcode=nATT_20_dB; }//100.0  ...31.7 mV
if(comma_pos==COMMA_2DIGIT){   Attcode=nATT_40_dB; }//10.00  ...3.17 mV
DACVref =(uint16_t ) ValuemV ;
return      ;
 } 
 
 if((ValuemV>=101)&&(ValuemV<=316)){   //101. ...316.
 
if(comma_pos==COMMA_4DIGIT){   Attcode=nATT_10_dB; } //316. ...101. mV
if(comma_pos==COMMA_3DIGIT){   Attcode=nATT_30_dB; } //31.6  ...10.1  mV
if(comma_pos==COMMA_2DIGIT){   Attcode=nATT_50_dB; } //3.16  ...1.01  mV
 
//[0]  +(uint16_t) (316-Value_mV)
 DACVref =(uint16_t ) pgm_read_word_near(LinTable316+(uint16_t)(316-ValuemV))        ;
 
 
return ;
 } 
 
return  ;  
}
 
 
 
 
void  GetDACValue_mkV( uint16_t Value_mkV    , uint8_t commapos   )
{
 
 
 
if(Value_mkV>=317){      //1000. ...317. mkV
if(Value_mkV<=1000){
if(commapos==COMMA_4DIGIT){   Attcode=nATT_60_dB; }  //1000. ...317. uV
if(commapos==COMMA_3DIGIT){   Attcode=nATT_80_dB; }//100.0  ...31.7 uV
if(commapos==COMMA_2DIGIT){   Attcode=nATT_100_dB; }//10.00  ...3.17 uV
if(commapos==COMMA_1DIGIT){   Attcode=nATT_120_dB; }//1.000  ...0.317 uV 
DACVref =(uint16_t )Value_mkV;
return  ;
 }}
 
 if(Value_mkV>=101){   //101. ...316. mkV
if(Value_mkV<=316){
if(commapos==COMMA_4DIGIT){   Attcode=nATT_70_dB; } //316. ...101. uV
if(commapos==COMMA_3DIGIT){   Attcode=nATT_90_dB; } //31.6  ...10.1  uV
if(commapos==COMMA_2DIGIT){   Attcode=nATT_110_dB; } //3.16  ...1.01  uV
if(commapos==COMMA_1DIGIT){  Attcode=nATT_130_dB; }//0.316  ...0.101 uV  
 DACVref =(uint16_t ) pgm_read_word_near(LinTable316 +(uint16_t)  (316-Value_mkV))      ;
 
return;
 }}
 
if(Value_mkV>=32){   //0.100 ... 0.032 mkV
if(Value_mkV<=100){
if(commapos==COMMA_1DIGIT){   Attcode=nATT_140_dB; }//0.100  ...0.032 uV  
 
DACVref = (uint16_t )    (Value_mkV*10);  
 }}
 
 
return  ;  
 
}
 
 
 
void GetDACValue ( uint8_t digits[4], uint8_t comma_pos,   uint8_t mode    )
{
  
 uint16_t  Value=0;    //0032...1000
 
    for(uint8_t i=0; i<digits[0]; i++) {  Value+=1 ;  }
    for(uint8_t i=0; i<digits[1]; i++) {  Value+=10;  }
    for(uint8_t i=0; i<digits[2]; i++) {  Value+=100;  }
    for(uint8_t i=0; i<digits[3]; i++) {  Value+=1000;  }
 
 
if(mode==TOKEN_Out_dB)  {     GetDACValue_dBV(Value  );  return; } 
if(mode==TOKEN_Out_mkV)  {   GetDACValue_mkV( Value, comma_pos );  return;   } 
if(mode==TOKEN_Out_mV)  {     GetDACValue_mV(  Value, comma_pos );  return;   } 
return  ;
}
Добавлено через 31 секунду
Определится с порядком цифр в буферах и временном буфере.
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
06.04.2020, 03:36  [ТС]
Редакция программы для оценки объема ОЗУ и флэш-памяти(в программе отправки адресов мультиплексора ошибки , нет некоторых модулей, баги , неработоспособна, только для дебаггера пошагово и листинга некоторых программ ) :
Вложения
Тип файла: zip Gccapp_test_flash_size.zip (179.4 Кб, 8 просмотров)
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
06.04.2020, 20:21  [ТС]
По внешним признакам повторное нажатие МГц,кГц, % (дБ , мВ , мкВ ) в выбранном режиме к повторной отправке кодов не приводит (уточнить ). Мигание включается после включения на режим частоты, при нажатии ЧМ, АМ, выход переключается, в режиме шага мигания во всех разрядах цифровых индикаторов отключаются, восстанавливаются после выбора режима кнопками " частота" , "ЧМ", "АМ", "выход". Флаги оптимизировать .

Добавлено через 2 часа 25 минут
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
/* *********************** */
 
 
uint8_t selectedflag=0;
uint8_t selectedreg=0;
 
 
void CheckFlags1(){
 
 
if( selectedreg!=0 ) { Flag[selectedreg]&=( uint8_t) ~( ( uint8_t) selectedflag); }   
 selectedflag=0; selectedreg=0;
 
if((Flag[1]&MASK_FLAG_PARSECODE_FM)!=0){   ParseCodesFM() ;  ParseCodesHFO() ;  selectedflag= MASK_FLAG_PARSECODE_FM ;  selectedreg=1;  return ; }   
if((Flag[1]&MASK_FLAG_PARSECODE_AM)!=0) {  ParseCodesAM();  selectedflag= MASK_FLAG_PARSECODE_AM ; selectedreg=1; return   ; }
if((Flag[1]&MASK_FLAG_PARSECODE_OUT)!=0){  ParseCodesOutDACAttMode() ; ParseStaticCommands() ; selectedflag= MASK_FLAG_PARSECODE_OUT ; selectedreg=1;  return   ; }
if((Flag[1]&MASK_FLAG_PARSECODE_FREQ)!=0){ ParseCodesDVDC() ;  ParseCodesHFO() ; ParseStaticCommands();  CheckFMMax() ; selectedflag= MASK_FLAG_PARSECODE_FREQ;  selectedreg=1;   return ;  }
 
if((Flag[2]&MASK_FLAG_INC_STEP)!=0) { IncStep();  selectedflag= MASK_FLAG_INC_STEP; selectedreg=2;   return   ; } //3 
if((Flag[2]&MASK_FLAG_DEC_STEP)!=0) { DecStep();  selectedflag= MASK_FLAG_DEC_STEP; selectedreg=2;   return     ; } 
 
if((Flag[3]&MASK_FLAG_TURN_OFF)!=0) { TurnOffUnusedModes(); selectedflag= MASK_FLAG_TURN_OFF;  selectedreg=3; return ;  }   
if((Flag[3]&MASK_FLAG_DISP_ERROR)!=0) { DisplayErrorFM();   selectedflag= MASK_FLAG_DISP_ERROR;  selectedreg=3;     return ; }
if((Flag[3]&MASK_FLAG_DISP_FM)!=0)  { DisplayFMValue();     selectedflag= MASK_FLAG_DISP_FM ;   selectedreg=3;       return ;  }
if((Flag[3]&MASK_FLAG_DISP_AM)!=0) { DisplayAMValue();      selectedflag= MASK_FLAG_DISP_AM;   selectedreg=3;       return ;  }
if((Flag[3]&MASK_FLAG_DISP_OUT)!=0) { DisplayOutValue();    selectedflag= MASK_FLAG_DISP_OUT;  selectedreg=3;    return ; }
if((Flag[3]&MASK_FLAG_DISP_FREQ)!=0) { DisplayFreqValue();  selectedflag= MASK_FLAG_DISP_FREQ ;  selectedreg=3;   return   ; }
if((Flag[3]&MASK_BLINK_OFF)!=0)  {   SendBlinkOff();  selectedflag= MASK_BLINK_OFF; selectedreg=3; return  ; } //4
if((Flag[3]&MASK_FLAG_BLINK_CODE)!=0)  { SendBlinkCode(); selectedflag= MASK_FLAG_BLINK_CODE; selectedreg=3; return  ; }
 
 
if((Flag[4]&MASK_FLAG_MODE)!=0)  { SendModeCodes();  selectedflag=MASK_FLAG_MODE; selectedreg=4; return   ; }
if((Flag[4]&MASK_FLAG_STATICCMD)!=0)  { SendStaticCommands();   selectedflag=MASK_FLAG_STATICCMD; selectedreg=4;  return   ; }
if((Flag[4]&MASK_FLAG_LFO)!=0)  {  SendLFOCodes();   selectedflag=MASK_FLAG_LFO; selectedreg=4;  return   ; }
if((Flag[4]&MASK_FLAG_FM_CODE)!=0) { SendFMCodes();  selectedflag=MASK_FLAG_FM_CODE;  selectedreg=4;    return  ; }
if((Flag[4]&MASK_FLAG_AM_CODE)!=0)  { SendAMCodes();  selectedflag=MASK_FLAG_AM_CODE; selectedreg=4; return   ;}
 
if((Flag[4]&MASK_FLAG_ATT_CODE)!=0) {SendAttCodes();  selectedflag=MASK_FLAG_ATT_CODE; selectedreg=4;  return ; } //5
if((Flag[4]&MASK_FLAG_HFO_CODE)!=0) { SendHFOCodes();  selectedflag=MASK_FLAG_HFO_CODE; selectedreg=4;     return ; }
if((Flag[4]&MASK_FLAG_DVDC_CODE)!=0)  { SendDVDCCodes(); selectedflag=MASK_FLAG_DVDC_CODE;  selectedreg=4; return  ; }
 
GetByteFromStackIfStackNotClear( );
 
 
 
return    ; // goto  LabelPoint1 
}
Добавлено через 49 секунд
По блок-схеме для точки 6 было так .

Добавлено через 4 часа 49 минут
C++
1
2
3
4
5
6
7
//incone in cursor pos 
i=cursor_pos;   // nmax= 2, 3, 5, 6 
tmpdigit[i]=1; //1  
while((i+1)<=nmax) { if (tmpdigit[i]>9){ tmpdigit[i+1]+=1; tmpdigit[i]=0; i+=1;  } 
 
или см. сложение в столбик с регистром переноса и слагаемым шага . 
правильнее иначе.
Добавлено через 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
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
 
#include <stdio.h>
#include <stdint.h>
#include <math.h>
 
//#include <avr/io.h>
//#include <avr/pgmspace.h>
 #include  "defines.h"
 #include  "intparser.h"
 //#include  "gpibio.h"
 #include   "subroutines.h"
 
 
#define FREQ_BYTEMASK 0x01
#define FM_BYTEMASK     0x02
#define AM_BYTEMASK    0x04
#define PM_BYTEMASK    0x08
#define MOD_OFF_BYTEMASK    0x10
#define OUT_BYTEMASK 0x20
 
#define TOKEN_F 0x01  //0x01
#define TOKEN_FM 0x02 //0x02
#define TOKEN_AM 0x04 //0x04
#define TOKEN_PM 0x08 //0x08
#define TOKEN_MOD_OFF 0x10 //0x10
#define TOKEN_OUT 0x20 //0x20 
 
 
 
 
 
 
 
 
 
uint8_t CheckButtonsNumericKeypad(uint8_t byte )
{
 
if( (byte==BUTTON_0)||(byte==BUTTON_1)||(byte==BUTTON_2)||(byte==BUTTON_3)) {  goto CaseBUTTON_NUMKEYPAD ;      }
if( (byte==BUTTON_4)||(byte==BUTTON_4)||(byte==BUTTON_6)||(byte==BUTTON_7)) {  goto CaseBUTTON_NUMKEYPAD ;      }
if( (byte==BUTTON_8)||(byte==BUTTON_9)||(byte==BUTTON_COMMA)||(byte==BUTTON_SHARP)) {  goto CaseBUTTON_NUMKEYPAD ;      }
 
return  0x00;
 
 
CaseBUTTON_NUMKEYPAD:
 
 if ( (CheckMemoryWriteModeOn()!=0))    {  WriteStatement() ; }   
 if ((CheckMemoryRecallModeOn()!=0))    {   GetStatementFromMemory(); }   
 
 InputParamValue();
return 0x01;
}
 
#define TOKEN_FWD 0x00
#define TOKEN_REW 0b10101010
uint8_t  GetScanCodeValue(){  return (uint8_t) GetByteGCd() ; }
 
uint8_t GetByteGPIB()
{
return (uint8_t) GetByteLD() ; 
}
 
SendDataAccept(){  ; }
 
 
uint8_t ParseGPIBByte(       )
{
uint8_t gpibbyte=GetByteGPIB();
SendDataAccept();
 if (gpibbyte==0x20)  {  return  0;    } /* 'space' */
 if (gpibbyte==0x2c)  {  return 1;    } /*  ','  end of command */        
 if ((gpibbyte>=0x30)&&(gpibbyte<=0x39)) { goto  LabelPushToStackGPIB;    }
 if ( (gpibbyte==0x22)||(gpibbyte==0x49) || (gpibbyte==0x48) || ((gpibbyte>=0x41)&&(gpibbyte<=0x46)) ||((gpibbyte>=0x4B) &&(gpibbyte<=0x4F)))   {  goto  LabelPushToStackGPIB; }
return 0; 
LabelPushToStackGPIB:
//[A][1][2][3][.][4][5][6][7]  9 chars max without 'space' and ','
if (StackBytesCount>=(uint8_t) MAXSTACKCHARS  )  {   return 0; }  /*  if  "stack"   overflow    */
tmpStack[StackBytesCount]=gpibbyte;
//printf("\n Push byte into  stack  %c, %d  ", tmpStack[StackBytesCount], StackBytesCount  );
 
StackBytesCount+=1; 
 return 0; 
 
}
 
uint8_t DecodeGPIBBytes(uint8_t StackByte){ ; }
 
void ParseCode( uint8_t scancode  );
 
void  GetByteFromStackIfStackNotClear( )
{
uint8_t  StackByte=0;
if ( StackBytesCount!=0 ) 
{  
StackByte= tmpStack[StackBytesCount] ; StackBytesCount-=1; 
 StackByte= DecodeGPIBBytes( StackByte)    ; //fix subroutine 
ParseCode( StackByte ) ;  
}
return;
}
 
 
 
void SetDutyRegF(){  Flag[0] =TOKEN_F;   Flag[3] |=MASK_FLAG_DISP_FREQ| MASK_FLAG_BLINK_CODE;  printf("SetDutyReg : DutyReg=0x%.02x  ",(int)Flag[0] ) ;  return;  } 
void SetDutyRegFM(){ Flag[0] =TOKEN_FM;  Flag[3] |=MASK_FLAG_DISP_FM| MASK_FLAG_BLINK_CODE;  printf("SetDutyReg : DutyReg=0x%.02x  ",(int)Flag[0] ) ;  return;  }   
void SetDutyRegAM(){ Flag[0] =TOKEN_AM;  Flag[3] |=MASK_FLAG_DISP_AM| MASK_FLAG_BLINK_CODE;  printf("SetDutyReg : DutyReg=0x%.02x  ",(int)Flag[0] ) ;  return;  }   
void SetDutyRegPM(){ Flag[0] =TOKEN_PM;  Flag[4] |=MASK_FLAG_MODE| MASK_FLAG_STATICCMD;  printf("SetDutyReg : DutyReg=0x%.02x  ",(int)Flag[0] ) ;  return;  }   
void SetDutyRegOut(){ Flag[0] =TOKEN_OUT;  Flag[3] |=MASK_FLAG_DISP_OUT| MASK_FLAG_BLINK_CODE  ;  printf("SetDutyReg : DutyReg=0x%.02x  ",(int)Flag[0] ) ;  return;  }  
void SetDutyRegModOff(){ Flag[0] =TOKEN_MOD_OFF;  Flag[3] |=MASK_FLAG_TURN_OFF ;    printf("SetDutyReg : DutyReg=0x%.02x  ",(int)Flag[0] ) ;  return;  }    
 
 
 
 
 
uint8_t  Outmode=0;  
  //LabelPoint8:
 
 
 
void ParseCode( uint8_t scancode1)
{
//;        8_1  
 printf("\ncall ParseKeyb ,Flag[0]=%x" ,(int)Flag[0]   );
 
 
uint8_t scancode =( scancode1&BITMASK_KEYBOARD);
 printf ("\nKeyb Byte    = 0x%.02x  **\n",scancode);
 
if(CheckButtonsNumericKeypad( scancode )==0x01) { printf(" numeric  ");   return; } 
 
 
if  ( scancode == (uint8_t)BUTTON_F )   {      printf(" freq  ");  SetDutyRegF();               return ;}    
if( scancode == (uint8_t)BUTTON_FM ) {     printf(" fm  "); TurnOnFM (); SetDutyRegFM();  return ; }  
if( scancode == (uint8_t)BUTTON_AM ) {     printf(" am  "); TurnOnAM(); SetDutyRegAM();  return ;     } 
if( scancode == (uint8_t)BUTTON_PM  ) {     printf(" pm  ");TurnOnPM(); SetDutyRegPM();  return ;  }  
if( scancode == (uint8_t)BUTTON_MOD_OFF ) {   printf(" mod off  "); TurnOffModulation(); SetDutyRegModOff();  return ; }
if( scancode == (uint8_t)BUTTON_EXT  )  {    printf(" prepare ext  "); PrepareExtModulation () ; return; }    /* 9*/  
if( scancode == (uint8_t)BUTTON_STEP  ) {  printf(" step  "); StepModeOn(); return; }
 
if( scancode ==(uint8_t) BUTTON_OUT  ) {     printf(" out "); OutputOn(); SetDutyRegOut(); return; }  
if( scancode==(uint8_t) BUTTON_OUT_OFF ) {   printf(" out off  ");  OutputOnOff();  return; }
if( scancode==(uint8_t)BUTTON_LFO ) {        printf(" lfo  "); ChangeLFONum(); return; }
if( scancode==(uint8_t)BUTTON_SHARP ) {      printf(" #  "); SetMemWrMode(); return;  }
if( scancode==(uint8_t)BUTTON_RECALL ) {     printf(" recall   "); SetMemRecallMode(); return; }
 
if ( (Flag[0]&OUT_BYTEMASK)==0){
 
if( scancode==(uint8_t)BUTTON_MHz ) {   printf(" MHZ   "); NormalizeFreq(); return; }//;  10   
if( scancode==(uint8_t)BUTTON_kHz ) {   printf(" kHz   ");  if (CheckStepModeOn()!=0){ NormalizeStep();  return; } else { NormalizeFM();  return;}  }//;  macro,  13_2 or to 1 
if( scancode==(uint8_t)BUTTON_PERCENT ) { printf(" %%   ");    NormalizeAMCoef(); return; }  //;   14_2   
}
else 
{
 
if( scancode==(uint8_t)BUTTON_mV ) { printf(" mV   ");  SetOutInputMode(TOKEN_Out_mV);  return;} //;   15_2  
if( scancode==(uint8_t)BUTTON_mkV ) { printf(" uV   "); SetOutInputMode( TOKEN_Out_mkV );  return;}//;   15_2 
if( scancode==(uint8_t)BUTTON_dBV ) { printf(" -dBV   ");SetOutInputMode(TOKEN_Out_dB);  return;} //;   15_2  
}
 
if( scancode==(uint8_t) BUTTON_6dB ) {  printf(" +6dB   ");  if (CheckModeAM==0)    { TurnOn6dB(); }  return; }//;   11  
//CaseDefault: 
if(StepMode==1) {  printf(" if step mode    ");    ChangeFreqOneStep() ;   NormalizeFreq(); return; }   ;//  12_3,   
  ChangeStepParam( );      // if encoder event (Int1) , if   no button were pressed (from Int2)    
 
 
 
 
  return ; //to point1             
}
 
/* ******************** */
 
    
 
 
void ParseInterrupts()
{
LabelPoint2:
 printf("\nParse Interrupts , point2 ");
//;   2     
// AnalyseInterrupt_InputData() ;
 
 
if((IntFlags==INTERUPT3_BYTEMASK) ) {   IntFlags=0;   ParseGPIBByte(); Flag[0]=0;    return;  } //;   goto LabelPoint7 
if((IntFlags==INTERUPT2_BYTEMASK) ) {   IntFlags=0;  uint8_t scancode=(uint8_t)GetScanCodeValue() ;   ParseCode(scancode) ;     return; } //;     LabelPoint8
//if((IntFlags==INTERUPT1_BYTEMASK) ) 
IntFlags=0;
if( GetByteGCd()==0)  {  Reverse=0; } else {  Reverse=1; }
 
 
 //if int 1
 if((Flag[0]&FREQ_BYTEMASK)!=0  ) {  NormalizeFreq()  ;    return;    /* 12_1 */      }//  
 if((Flag[0]&FM_BYTEMASK)!=0 ) { NormalizeFM()  ;       return; /*  13_1 */      } 
 if((Flag[0]&AM_BYTEMASK)!=0 ) { NormalizeAMCoef() ;       return; /*  14_1 */      }  
 
 
 
NormalizeOutput1();  
 
/* 15_1 */
return;
}
 
 
 
/* *********************** */
 
 
uint8_t selectedflag=0;
uint8_t selectedreg=0;
 
 
void CheckFlags1(){
 
 
if( selectedreg!=0 ) { Flag[selectedreg]&=( uint8_t) ~( ( uint8_t) selectedflag); }   
selectedreg=0;  selectedflag=0; 
 
 
 
 
 
if((Flag[1]&MASK_FLAG_PARSECODE_FM)!=0){   ParseCodesFM() ;  ParseCodesHFO() ;  selectedflag= MASK_FLAG_PARSECODE_FM ;  selectedreg=1;  return ; }   
if((Flag[1]&MASK_FLAG_PARSECODE_AM)!=0) {  ParseCodesAM();  selectedflag= MASK_FLAG_PARSECODE_AM ; selectedreg=1; return   ; }
if((Flag[1]&MASK_FLAG_PARSECODE_OUT)!=0){  ParseCodesOutDACAttMode() ; ParseStaticCommands() ; selectedflag= MASK_FLAG_PARSECODE_OUT ; selectedreg=1;  return   ; }
if((Flag[1]&MASK_FLAG_PARSECODE_FREQ)!=0){ ParseCodesDVDC() ;  ParseCodesHFO() ; ParseStaticCommands(); CheckFMMax() ; selectedflag= MASK_FLAG_PARSECODE_FREQ;  selectedreg=1;   return ;  }
 
if((Flag[2]&MASK_FLAG_INC_STEP)!=0) { IncStep();  selectedflag= MASK_FLAG_INC_STEP; selectedreg=2;   return   ; } //3 
if((Flag[2]&MASK_FLAG_DEC_STEP)!=0) { DecStep();  selectedflag= MASK_FLAG_DEC_STEP; selectedreg=2;   return     ; } 
 
if((Flag[3]&MASK_FLAG_TURN_OFF)!=0) { TurnOffUnusedModes(); selectedflag= MASK_FLAG_TURN_OFF;  selectedreg=3; return ;  }   
if((Flag[3]&MASK_FLAG_DISP_ERROR)!=0) { DisplayErrorFM();   selectedflag= MASK_FLAG_DISP_ERROR;  selectedreg=3;     return ; }
if((Flag[3]&MASK_FLAG_DISP_FM)!=0)  { DisplayFMValue();     selectedflag= MASK_FLAG_DISP_FM ;   selectedreg=3;       return ;  }
if((Flag[3]&MASK_FLAG_DISP_AM)!=0) { DisplayAMValue();      selectedflag= MASK_FLAG_DISP_AM;   selectedreg=3;       return ;  }
if((Flag[3]&MASK_FLAG_DISP_OUT)!=0) { DisplayOutValue();    selectedflag= MASK_FLAG_DISP_OUT;  selectedreg=3;    return ; }
if((Flag[3]&MASK_FLAG_DISP_FREQ)!=0) { DisplayFreqValue();  selectedflag= MASK_FLAG_DISP_FREQ ;  selectedreg=3;   return   ; }
if((Flag[3]&MASK_BLINK_OFF)!=0)  {   SendBlinkOff();  selectedflag= MASK_BLINK_OFF; selectedreg=3; return  ; } //4
if((Flag[3]&MASK_FLAG_BLINK_CODE)!=0)  { SendBlinkCode(); selectedflag= MASK_FLAG_BLINK_CODE; selectedreg=3; return  ; }
 
 
if((Flag[4]&MASK_FLAG_MODE)!=0)  { SendModeCodes();  selectedflag=MASK_FLAG_MODE; selectedreg=4; return   ; }
if((Flag[4]&MASK_FLAG_STATICCMD)!=0)  { SendStaticCommands();   selectedflag=MASK_FLAG_STATICCMD; selectedreg=4;  return   ; }
if((Flag[4]&MASK_FLAG_LFO)!=0)  {  SendLFOCodes();   selectedflag=MASK_FLAG_LFO; selectedreg=4;  return   ; }
if((Flag[4]&MASK_FLAG_FM_CODE)!=0) { SendFMCodes();  selectedflag=MASK_FLAG_FM_CODE;  selectedreg=4;    return  ; }
if((Flag[4]&MASK_FLAG_AM_CODE)!=0)  { SendAMCodes();  selectedflag=MASK_FLAG_AM_CODE; selectedreg=4; return   ;}
 
if((Flag[4]&MASK_FLAG_ATT_CODE)!=0) {SendAttCodes();  selectedflag=MASK_FLAG_ATT_CODE; selectedreg=4;  return ; } //5
if((Flag[4]&MASK_FLAG_HFO_CODE)!=0) { SendHFOCodes();  selectedflag=MASK_FLAG_HFO_CODE; selectedreg=4;     return ; }
if((Flag[4]&MASK_FLAG_DVDC_CODE)!=0)  { SendDVDCCodes(); selectedflag=MASK_FLAG_DVDC_CODE;  selectedreg=4; return  ; }
 
GetByteFromStackIfStackNotClear( );
 
 
 
return    ; // goto  LabelPoint1 
} 
 
 
 
//; jump to this subroutine in the main() after  init subroutines 
 
void InitFlags()
{
    //fix for turn on 100.0000 MHz (blink on ), 1000. uV , FM off, Am Off , 6dB off, Out On   , step Off, step=0 kHz, by cursor (fix )
    //  GetDVDC,GetHFOCode(and send it  );   GetDAC Vref, Get Attcodes ,sent codes   
    //  SendStatic commands , parse and  send mode codes   
    // set mode f
Flag[0]=  TOKEN_F;  
Flag[1] |=0; 
Flag[2]=0; 
Flag[3]|=0;
Flag[4]|=0;//MASK_FLAG_LFO;
 //SetDutyRegF();   
    
    
}
 
 
void  main_sub ()
{
cli();   
 InitFlags();
  
LabelPoint1:
 
 
if((Flag[1]!=0)||(Flag[2]!=0) || (Flag[3]!=0)|| (Flag[4]!=0) )      /*     parse mode  flags      */
{     
 
    
  CheckFlags1();  //  32
   /*  for loop evaluation if debug        */
 goto LabelPoint1;
 
}
 
 
/* if duty reg=0 */
 // SendMemWrPulse( ); fix  for  flag 
  
  sei();    //GIE is for evaluation 
LabelNoInterrupts:
    
if (IntFlags==0) {  /*SetAddrWait(); sleep(); */      goto      LabelNoInterrupts;          }  // ;  loop while no interrupts , if interrupts IntFlags<>0  by ISR ()
/* if interrupt was expected  */  
cli();  /*  disable interrupt during intrrupt parsing     */
ParseInterrupts();  //goto  LabelPoint2;  return after  mode input
 
goto  LabelPoint1;
 
 
return  ;
}
Добавлено через 8 минут
Code
1
2
3
4
5
6
7
carry  [0] [1]  [1]  [0]   +
dig1   [0] [0]  [1]  [8]   +
dig2   [0] [0]  [8]  [7]
result [0] [1]  [0]  [5]  
                      res[i]=dig1[i]+dig2[i]+carry[i]; 
                      if (res[i] > 9) carry[i+1]=1 ;  res[i]-=  res[i]-10  
                      else  res[i] =res[i], carry[i+1]=0 ;
Добавлено через 2 часа 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
#include <stdio.h>
#include <stdint.h>
#include <conio.h>
#include <math.h>
 
 
int main()
{
//printf (" Input n0 ");
int nmax=3;
//scanf("%d", &nmax);
 
int tmpdigit[7] ;
int value[7];
 
 
int commapos=3; //for output 
 
 
tmpdigit[6]=0;
tmpdigit[5]=0;
tmpdigit[4]=0;
tmpdigit[3]=0;
tmpdigit[2]=0;
tmpdigit[1]=3;
tmpdigit[0]=2;
 
value[6]=0;
value[5]=0;
value[4]=0;
value[3]=0;
value[2]=0;
value[1]=0;
value[0]=1;
 
 
printf ("\n data ");
for(int i=nmax;  i>=0 ; i-=1 )  { printf (" %d" ,  (int)tmpdigit[i]);  }
 
printf ("\n step  ");
for(int i=nmax;  i>=0 ; i-=1 )  { printf (" %d" ,  (int)value[i]);  }
 
 
 LabelIncStep:
 
label1:
for (uint8_t i=0; i<(uint8_t)nmax;i++) { tmpdigit[i]+=(value[i] ); if (tmpdigit[i]>9){ tmpdigit[i+1]+=1;  tmpdigit[i]-=10; }  }
 
//printf("  %d ", (int)tmpdigit[nmax-1]);
 
 
 
 
if(( tmpdigit[nmax] >=1 )&&( (tmpdigit[nmax-1]!=0)||(tmpdigit[nmax-2]!=0) ||(tmpdigit[nmax-3]!=0)))
 
{
 commapos-=1;
printf ("\n   change decimal dot pos. or  mode , call  add_step, commapos =%d ", commapos); 
 
tmpdigit[0]=tmpdigit[1] ;   
tmpdigit[1]=tmpdigit[2];   
tmpdigit[2]=tmpdigit[3];   
tmpdigit[3]=tmpdigit[4];   
tmpdigit[4]=0;     //in use          
tmpdigit[5]=0;
tmpdigit[6]=0;
goto label1;
}
 
 
LabelResult:
 
printf ("\n ");
for(int i=nmax;  i>=0 ; i-=1 )  { printf (" %d" ,  (int)tmpdigit[i]);  }
 
 
getch();
goto label1;
return 0 ;
}

Уточнить название (точки ) запятой в программе (хотя по "лептике" индикатора для символов она запятая ). Пока это условно , а не ст очки зрения английского языка, для дескриптора, чтобы отличалась от системных переменных .

Добавлено через 2 минуты
С вычитанием быть бдительным , у нас тип массива uint8_t .

Добавлено через 1 час 47 минут
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
#include <stdio.h>
#include <stdint.h>
#include <conio.h>
#include <math.h>
 
 
int main()
{
//printf (" Input n0 ");
int nmax=3;
//scanf("%d", &nmax);
 
uint8_t tmpdigit[7] ;
uint8_t value[7];
 
 
int commapos=3; //for output 
 
 
tmpdigit[6]=0;
tmpdigit[5]=0;
tmpdigit[4]=0;
tmpdigit[3]=1;
tmpdigit[2]=0;
tmpdigit[1]=0;
tmpdigit[0]=0;
 
value[6]=0;
value[5]=0;
value[4]=0;
value[3]=0;
value[2]=0;
value[1]=9;
value[0]=0;
 
 
printf ("\n data ");
for(int i=nmax;  i>=0 ; i-=1 )  { printf (" %d" ,  (int)tmpdigit[i]);  }
 
printf ("\n step  ");
for(int i=nmax;  i>=0 ; i-=1 )  { printf (" %d" ,  (int)value[i]);  }
 
 
 LabelIncStep:
 
label1:
    
    
    
//for (uint8_t i=0; i<(uint8_t)nmax;i++) { tmpdigit[i]+=(value[i] ); if (tmpdigit[i]>9){ tmpdigit[i+1]+=1;  tmpdigit[i]-=10; }  }
 
//printf("  %d ", (int)tmpdigit[nmax-1]);
 
 
/*
 
if(( tmpdigit[nmax] >=1 )&&( (tmpdigit[nmax-1]!=0)||(tmpdigit[nmax-2]!=0) ||(tmpdigit[nmax-3]!=0)))
 
{
 commapos-=1;
printf ("\n   change decimal dot pos. or  mode , call  add_step, commapos =%d ", commapos); 
 
tmpdigit[0]=tmpdigit[1] ;   
tmpdigit[1]=tmpdigit[2];   
tmpdigit[2]=tmpdigit[3];   
tmpdigit[3]=tmpdigit[4];   
tmpdigit[4]=0;     //in use          
tmpdigit[5]=0;
tmpdigit[6]=0;
goto label1;
}
*/
/*
  
 
   [0][10][10][10]                    1-2-0 err -> 10+1-(2-0) =9 , tmpdig[i] +=10-borrow[i]-(step[i] ), 
 
   [1][0][0][1] tmpdig  -             0-0-1 err -> 10+0-(0-1) =9     
   [0][0][0][2] step    -             0-0-1 err -> 10+0-(0-1) =9
   [0][1][1][1][0] borrow                1-0-1 =0 ok  -> 
   [0][9][9][9] res
 
 
                                tmpdigit-=(step[i]+borrow[i])
   [0][10][10][10]                    1-2-0 err -> { 10-0-(2-0) =2 , tmpdig[i] res =((tmpdig[i]+10-borrow[i])-step[i]) ,borrow[i+1]=1; }  
 
   [1][0][0][1] tmpdig  -             0-0-1 err -> 10+0-(0-1) =9     
   [0][0][0][9] step    -             0-0-1 err -> 10+0-(0-1) =9
[0][1][1][1][0] borrow                1-0-1 =0 ok  -> 
   [0][9][9][2] res
   
   
//borrow[0]=0;
uint8_t borrow =0;
for (uint8_t i=0;i<=nmax ; i++) {  
if(tmpdigit>=(step[i]+borrow)){ tmpdigit-=(step[i]+borrow); borrow=0; } else { tmpdig[i] +=((10-borrow)-step[i]) , borrow=1; }
 
}
 
   
   
   if(tmpdigit>=(step[i]+borrow[i])){  tmpdigit-=(step[i]+borrow[i]); borrow[i+1]=0; } else { tmpdig[i] +=((10-borrow[i])-step[i]) , borrow[1]=1; }
   
   
   
 
  if(tmpdigit[i]<step[i]) { 
  
  
   tmpdig[i]-=1;    tmpdig[i]+=(10-step[i] ;)     }
  
  
  
 
*/
 
 
 LabelDecStep:
 
uint8_t borrow =0;
for (int i=0; i<=nmax ; i++) {  
if(tmpdigit[i]>=(value[i]+borrow)){ tmpdigit[i]-=(value[i]+borrow); borrow=0; } else { tmpdigit[i] +=((10-borrow)-value[i]) , borrow=1; }
}   
if(borrow==1) { printf ("  Error "); }
 
//0101
if(((uint8_t) tmpdigit[3] ==(uint8_t) 0 )&&((uint8_t) tmpdigit[2]<=(uint8_t) 1) ) 
 
 
{
    
     printf ("  change "); 
}
 
 
 
 
 
 
 
 
LabelResult:
 
printf ("\n ");
for(int i=nmax;  i>=0 ; i-=1 )  { printf (" %d" ,  (int)tmpdigit[i]);  }
 
 
getch();
goto label1;
return 0 ;
}


Code
1
2
3
4
5
6
7
8
9
10
11
12
13
 data  1 0 0 0
 step   0 0 9 0
  0 9 1 0
  0 8 2 0
  0 7 3 0
  0 6 4 0
  0 5 5 0
  0 4 6 0
  0 3 7 0
  0 2 8 0  change
  0 1 9 0  change
  0 1 0 0  change
  0 0 1 0  Error
Добавлено через 4 минуты
на 101 и 1000 ловить на переключении

Добавлено через 3 часа 48 минут
там неудобно ставить условие на <=101 по цифрам при шаге больше 1 младшего разряда , а сообщение выдается перед следующим отсчетом ( 190-100)
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
06.04.2020, 22:35  [ТС]
Программа немного иначе реагирует на обработку прерывания 1 , а также имеет особенности реакции на кнопки больше, меньше в режиме шаг (дефолтная процедура, но с флажком ). Проблема с кодами вращения против часовой стрелки ( см JK- триггер и обработчик для прерывания 1, когда чередующиеся нули и единицы не должны путаться по маске с кодами клавиш, возможно , нужно программу опроса передней панели по прерыванию 1 иначе написать , чтобы выдавала только 0 или 1 , не путающиеся с скан-кодами клавиатуры ).
Вложения
Тип файла: zip setstep_parserfix.zip (1.13 Мб, 10 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.04.2020, 22:35

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
200
Ответ Создать тему
Новые блоги и статьи
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru