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

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

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

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

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

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

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

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

228
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
06.04.2020, 22:48  [ТС] 201
Дописать программы обработки переполнения , исправить некоторые баги с флагами и логикой.
0
Вложения
Тип файла: zip setstep_parserfix1.zip (1.13 Мб, 3 просмотров)
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
07.04.2020, 19:50  [ТС] 202
Исправить принцип размещения программ в модулях, оптимизировать дефайны(пока они условные ).
C++
1
2
3
void SetCompFreq1kHz(){   CurrentState.StaticCMDbits&=~(STATICCMDMASK_1kHz) ; }  
void SetCompFreq1_25kHz() { CurrentState.StaticCMDbits|=STATICCMDMASK_1kHz ; }  
 и так дальше для других статических команд (потом проверить на корректность инверсии для схемы включения )
Проблема с беззнаковыми восьмибитными числами (1 байт ): при вычитании с нулем проблема (при постинкременте возле нуля переходит в 255 и считает бесконечно , или исправить тип , или добавить арифметики , у нас счетчик реальных цифр другой и наоборот при выводе )
C++
1
for (uint8_t i=0; i<tmpcount;  i++ ) { printf("  %.01x",(int)tmpdigits[6-i]); if ((6-i )==tmpcommapos){ printf("."); }   }
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
 void AppendDigitBufer( uint8_t numb,uint8_t byte1  )
 {
    
if(tmpcount< numb ) { 
  tmpcommapos+=1;     
  for (uint8_t i=numb-1 ;i> 0; i-- ) {  tmpdigits[i]=tmpdigits[i-1];   } //shift left old bytes 
  tmpdigits[0]=byte1;
  tmpcount++;
  
}
 
 }
 
  
/*
//max 4 digits
 tmpdigits[3]=tmpdigits[2]; i=numb-1 
 tmpdigits[2]=tmpdigits[1]; 
 tmpdigits[1]=tmpdigits[0]; i=1
 
 
//max 2 digits
 
 tmpdigits[1]=tmpdigits[0]; i=numb-1 
 
//max 3 digits
 tmpdigits[2]=tmpdigits[1]; i=numb-1  
 tmpdigits[1]=tmpdigits[0]; i=1
 
  //max 7 digits 
 tmpdigits[6]=tmpdigits[5]; 
 tmpdigits[5]=tmpdigits[4]; 
 tmpdigits[4]=tmpdigits[3]; 
 tmpdigits[3]=tmpdigits[2]; 
 tmpdigits[2]=tmpdigits[1]; 
 tmpdigits[1]=tmpdigits[0];
 
 */
 
 
 
 
 
 
 
 void DecodeKeybNum( uint8_t byte )
 {
 uint8_t byte1=0; 
     
if (byte==BUTTON_0)   { byte1=0; goto LabelInputnthDigit;  }
if (byte==BUTTON_1)   { byte1=1; goto LabelInputnthDigit;  }
if (byte==BUTTON_2)   { byte1=2; goto LabelInputnthDigit;  } 
if (byte==BUTTON_3)   { byte1=3; goto LabelInputnthDigit ; }
if (byte==BUTTON_4)   { byte1=4; goto LabelInputnthDigit;  }
if (byte==BUTTON_5)   { byte1=5; goto LabelInputnthDigit; }
if (byte==BUTTON_6)   { byte1=6; goto LabelInputnthDigit ; }
if (byte==BUTTON_7)   { byte1=7; goto LabelInputnthDigit; }
if (byte==BUTTON_8)   { byte1=8; goto LabelInputnthDigit; }
if (byte==BUTTON_9)   { byte1=9; goto LabelInputnthDigit; }
if (byte==BUTTON_COMMA) { tmpcommapos=tmpcount; CommaSet=1;  return;  } //fix  if count =num 
return; 
  
LabelInputnthDigit:
if((Flag[0]&FREQ_BYTEMASK)!=0){ AppendDigitBufer(7, byte1);}
if((Flag[0]&FM_BYTEMASK)!=0){   AppendDigitBufer(3, byte1);} 
if((Flag[0]&AM_BYTEMASK)!=0){   AppendDigitBufer(2, byte1);} 
if((Flag[0]&OUT_BYTEMASK)!=0){  AppendDigitBufer(4, byte1);}
return;
}
 // добавлена переменная  байта скан-кода клавиатуры (по бит-маске от валкодера отфильтровать )
 void InputParamValue(uint8_t byte ){
//BlinkOff=1;
printf("\nInputParamValue() " ) ;
DecodeKeybNum(  byte );
Flag[3]|=MASK_BLINK_OFF;
 
if((Flag[0]&FREQ_BYTEMASK)!=0  ){Flag[3]|=MASK_FLAG_DISP_FREQ; }
if((Flag[0]&FM_BYTEMASK)!=0 ){ Flag[3]|=MASK_FLAG_DISP_FM; } 
if((Flag[0]&AM_BYTEMASK)!=0 ){ Flag[3]|=MASK_FLAG_DISP_AM; } 
if((Flag[0]&OUT_BYTEMASK)!=0 ) { Flag[3]|=MASK_FLAG_DISP_OUT; }
return;
  
}
Доработать для правильного отображения запятой и ограничения при вводе последнего знака при наборе .

Добавлено через 8 минут
Для консоли тестирования базовых функций модулей и отбора необходимых для реализации алгоритма подпрограмм так проще , но нам придется их шифроваться и добавлять оффсет режима (0 (адрес 0-6 это ячейки 6...0 ) для частоты, 7 для ЧМ (7...9 это,например, ячейки 2...0 буфера ) , 10 для АМ(адрес 10,11 это 1,0 ячейки ), выход - 12 (12-15 это ячейки 3-0 временного буфера цифр ) )
C++
1
 for (int i=6; i>=0;  i-- ) { printf("  %.01x",(int)tmpdigits[i]); if (( i )==tmpcommapos){ printf("."); }   }
Добавлено через 3 минуты
C++
1
 for (int8_t i=6; i>=0;  i-- ) { printf("  %.01x",(int)tmpdigits[i]); if (( i )==tmpcommapos){ printf("."); }   }
может моделировать восьмибитность переменной для отбора программ и даже использоваться для нашего процессора, но так медленнее (вывод пока условный).

Добавлено через 41 минуту
Программа ввода работает приблизительно так (еще багфиксиг некоторый выполнить )
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
 /*
 0 1
 1 2
 2 3
 3 4
 4 5
 5 6
 6 7 stop 
 
 if count ==numb  then stop ,use rule  
*/
 
 
 void AppendDigitBufer( uint8_t numb,uint8_t byte1  )
 {
    
if(tmpcount< numb ) { 
    
  for (uint8_t i=numb-1 ;i>=1; i-- ) {  tmpdigits[i]=tmpdigits[i-1];   } //shift left old bytes 
  tmpdigits[0]=byte1;  if ( CommaSet==0) {  tmpcommapos=0;  } else {  tmpcommapos+=1;   }
  tmpcount++;
  
}
 
 }
 
  
/*
//max 4 digits
 tmpdigits[3]=tmpdigits[2]; i=numb-1 
 tmpdigits[2]=tmpdigits[1]; 
 tmpdigits[1]=tmpdigits[0]; i=1
 
 
//max 2 digits
 
 tmpdigits[1]=tmpdigits[0]; i=numb-1 
 
//max 3 digits
 tmpdigits[2]=tmpdigits[1]; i=numb-1  
 tmpdigits[1]=tmpdigits[0]; i=1
 
  //max 7 digits 
 tmpdigits[6]=tmpdigits[5]; 
 tmpdigits[5]=tmpdigits[4]; 
 tmpdigits[4]=tmpdigits[3]; 
 tmpdigits[3]=tmpdigits[2]; 
 tmpdigits[2]=tmpdigits[1]; 
 tmpdigits[1]=tmpdigits[0];
 
 */
 
 
 
 
 
 
 
 void DecodeKeybNum( uint8_t byte )
 {
 uint8_t byte1=0; 
     
if (byte==BUTTON_0)   { byte1=0; goto LabelInputnthDigit;  }
if (byte==BUTTON_1)   { byte1=1; goto LabelInputnthDigit;  }
if (byte==BUTTON_2)   { byte1=2; goto LabelInputnthDigit;  } 
if (byte==BUTTON_3)   { byte1=3; goto LabelInputnthDigit ; }
if (byte==BUTTON_4)   { byte1=4; goto LabelInputnthDigit;  }
if (byte==BUTTON_5)   { byte1=5; goto LabelInputnthDigit; }
if (byte==BUTTON_6)   { byte1=6; goto LabelInputnthDigit ; }
if (byte==BUTTON_7)   { byte1=7; goto LabelInputnthDigit; }
if (byte==BUTTON_8)   { byte1=8; goto LabelInputnthDigit; }
if (byte==BUTTON_9)   { byte1=9; goto LabelInputnthDigit; }
if (byte==BUTTON_COMMA) {  CommaSet=1;   return;  } //fix  if count =num 
return; 
  
LabelInputnthDigit:
if((Flag[0]&FREQ_BYTEMASK)!=0){ AppendDigitBufer(7, byte1);}
if((Flag[0]&FM_BYTEMASK)!=0){   AppendDigitBufer(3, byte1);} 
if((Flag[0]&AM_BYTEMASK)!=0){   AppendDigitBufer(2, byte1);} 
if((Flag[0]&OUT_BYTEMASK)!=0){  AppendDigitBufer(4, byte1);}
return;
}
 
 void InputParamValue(uint8_t byte ){
//BlinkOff=1;
printf("\nInputParamValue() " ) ;
DecodeKeybNum(  byte );
Flag[3]|=MASK_BLINK_OFF;
 
if((Flag[0]&FREQ_BYTEMASK)!=0  ){Flag[3]|=MASK_FLAG_DISP_FREQ; }
if((Flag[0]&FM_BYTEMASK)!=0 ){ Flag[3]|=MASK_FLAG_DISP_FM; } 
if((Flag[0]&AM_BYTEMASK)!=0 ){ Flag[3]|=MASK_FLAG_DISP_AM; } 
if((Flag[0]&OUT_BYTEMASK)!=0 ) { Flag[3]|=MASK_FLAG_DISP_OUT; }
return;
  
}
Программа нормализации вводит только необходимое количество знаков после запятой и до запятой , заполняет нулями , если не столько знаков, сколько надо , игнорирует ввод, если за пределами , правильно расставляет запятую и переписывает символы в буфер структуры, обновляет временный регистр цифр и счетчик позиции запятой, ставит необходимые флажки .

Добавлено через 5 минут
C++
1
 for (int8_t i=tmpcount-1; i>=0;  i-- ) { printf("  %.01x",(int)tmpdigits[i]); if (( i )==tmpcommapos){ printf("."); }   }
Неиспользуемые знаки перед запятой (кроме одного нуля перед запятой) гасятся подпрограммой отправки символов гашения (сравнивает счетчик tmpcount с требуемым количеством цифр для режима (6 или 7, 3 , 2 и 4) , пока проблема, если он равен нулю , предусмотреть защиту , альтернативно написать эту программу ) .

Добавлено через 8 минут
При входе в режим и наборе первой цифры счетчик сбрасывается в значение. характерное для ввода первой цифры , после достижения последней цифры не инкрементируется, ввод не используется, после нажатия кнопки величины запускается нормализация , для кнопки режима сбрасывается в дефолтное значение ( оптимизировать идею под правильную работу прибора (погуглить, посмотреть на ютубе в интернете , но там иногда с неправильными самодельными прошивками бывают(чисто для эксперимента по возможности это сделать , на некоторых кафедрах такое проводили на списанном , например ) )).
0
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
07.04.2020, 20:59  [ТС] 203
Перенумеровал флажки и сменил нумерацию регистров,пока проблема со сбросом счетчика цифр набора при повторном входе в режим после набора всех цифр и размещением запятых , при смене режима не так кодируются цифры.
0
Вложения
Тип файла: zip fixswitch_input_commapos_bugs.zip (1.49 Мб, 3 просмотров)
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
08.04.2020, 01:33  [ТС] 204
ИМ у нас работает на f>=50 MHz , при перестройке вниз по частоте автовыключается, включается или ИМ (внутр., внеш., если f>=50 MHz ), или другие модуляции (ЧМ и АМ могут включаться одна внешняя , друга я внутренняя, пока любая ИМ выключена ) . Исправить программу выключения неиспользуемых модуляций, добавить выключение внешней ЧМ.

Добавлено через 1 минуту
Для Г4-176 эта программа другая,кажется, от 25 МГц, с отключение по диапазонам , со счетчиком ТВ модуляции , проблема ошибки светодиода.

Добавлено через 34 минуты
Код
(BandValue ==BAND_0) ... (BandValue ==BAND_33) ИМ разрешена
 
(BandValue ==BAND_34) ... (BandValue ==BAND_40) ИМ отключается
добавить флаг в программу определения поддиапазона.

Добавлено через 1 минуту
В Г4-176 другая нумерация и количество диапазонов , кроме этого он работает с умножителем на частотах от 640 до 1020 МГц.

Добавлено через 7 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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
void GetBand(uint8_t  freq[7]  , uint8_t  ModeFreq )
{
 
if (ModeFreq==1)
{
Freq_Value=(uint32_t) freq_fromdigits1( freq );     
printf("\n Getband Freq= %ld ", Freq_Value ) ;
if (( Freq_Value>=600000) && ( Freq_Value<=639999  )) { SetCompFreq1_25kHz() ; Band=BAND_0 ;  PM_BandOk=1;  return ; } 
if (( Freq_Value>=560000) && ( Freq_Value<=599999  )) { SetCompFreq1_25kHz() ; Band=BAND_1 ;  PM_BandOk=1;  return ; }   
if (( Freq_Value>=520000) && ( Freq_Value<=559999  )) { SetCompFreq1_25kHz() ; Band=BAND_2;   PM_BandOk=1;  return ; }  
if (( Freq_Value>=480000) && ( Freq_Value<=519999  )) { SetCompFreq1_25kHz() ; Band=BAND_3;   PM_BandOk=1;  return ; } 
if (( Freq_Value>=448000) && ( Freq_Value<=479999  )) { SetCompFreq1_25kHz() ; Band=BAND_4;   PM_BandOk=1;  return ; } 
if (( Freq_Value>=440000) && ( Freq_Value<=447999  )) { SetCompFreq1_25kHz() ; Band=BAND_5;   PM_BandOk=1;  return ; } 
if (( Freq_Value>=400000) && ( Freq_Value<=439999  )) { SetCompFreq1_25kHz() ; Band=BAND_6;   PM_BandOk=1;  return ; } 
if (( Freq_Value>=360000) && ( Freq_Value<=399999  )) { SetCompFreq1_25kHz() ; Band=BAND_7;   PM_BandOk=1;  return ; } 
if (( Freq_Value>=320000) && ( Freq_Value<=359999  )) { SetCompFreq1_25kHz() ; Band=BAND_8;   PM_BandOk=1;  return ; } 
 
if (( Freq_Value>=300000) && ( Freq_Value<=319999  )) { SetCompFreq1_25kHz() ; Band=BAND_9;   PM_BandOk=1;  return ; } 
if (( Freq_Value>=280000) && ( Freq_Value<=299999  )) { SetCompFreq1_25kHz() ; Band=BAND_10;  PM_BandOk=1;  return ; } 
if (( Freq_Value>=260000) && ( Freq_Value<=279999  )) { SetCompFreq1_25kHz() ; Band=BAND_11;  PM_BandOk=1;  return ; }   
if (( Freq_Value>=240000) && ( Freq_Value<=259999  )) { SetCompFreq1_25kHz() ; Band=BAND_12;  PM_BandOk=1;  return ; }  
if (( Freq_Value>=224000) && ( Freq_Value<=239999  )) { SetCompFreq1_25kHz() ; Band=BAND_13;  PM_BandOk=1;  return ; } 
if (( Freq_Value>=220000) && ( Freq_Value<=223999  )) { SetCompFreq1_25kHz() ; Band=BAND_14;  PM_BandOk=1;  return ; } 
if (( Freq_Value>=200000) && ( Freq_Value<=219999  )) { SetCompFreq1_25kHz() ; Band=BAND_15;  PM_BandOk=1;  return ; } 
if (( Freq_Value>=180000) && ( Freq_Value<=199999  )) { SetCompFreq1_25kHz() ; Band=BAND_16;  PM_BandOk=1;  return ; } 
if (( Freq_Value>=160000) && ( Freq_Value<=179999  )) { SetCompFreq1_25kHz() ; Band=BAND_17;  PM_BandOk=1;  return ; } 
 
}
else 
{
Freq_Value=(uint32_t) freq_fromdigits  ( freq );    
 printf("\n Getband Freq= %ld ", Freq_Value ) ;
if ((  Freq_Value>=1500000 ) && (  Freq_Value<=1599999 )) { SetCompFreq1kHz();  Band=BAND_18; PM_BandOk=1;    return ;} 
if ((  Freq_Value>=1400000 ) && (  Freq_Value<=1499999 )) { SetCompFreq1kHz();  Band=BAND_19; PM_BandOk=1;    return ;}         
if ((  Freq_Value>=1300000 ) && (  Freq_Value<=1399999 )) { SetCompFreq1kHz();  Band=BAND_20; PM_BandOk=1;    return ;} 
if ((  Freq_Value>=1200000 ) && (  Freq_Value<=1299999 )) { SetCompFreq1kHz();  Band=BAND_21; PM_BandOk=1;    return ;}   
if ((  Freq_Value>=1120000 ) && (  Freq_Value<=1199999 )) { SetCompFreq1kHz();  Band=BAND_22; PM_BandOk=1;    return ;}  
if ((  Freq_Value>=1100000 ) && (  Freq_Value<=1119999 )) { SetCompFreq1kHz();  Band=BAND_23; PM_BandOk=1;    return ;} 
if ((  Freq_Value>=1000000 ) && (  Freq_Value<=1099999 )) { SetCompFreq1kHz();  Band=BAND_24; PM_BandOk=1;    return ;} 
if ((  Freq_Value>=900000  ) && (  Freq_Value<=999999 )) { SetCompFreq1kHz();   Band=BAND_25; PM_BandOk=1;    return ;} 
if ((  Freq_Value>=800000  ) && (  Freq_Value<=899999 )) { SetCompFreq1kHz();   Band=BAND_26; PM_BandOk=1;    return ; } 
 
if ((  Freq_Value>=750000 ) && (  Freq_Value<=799999 )) { SetCompFreq1kHz();  Band=BAND_27;  PM_BandOk=1;     return ; } 
if ((  Freq_Value>=700000 ) && (  Freq_Value<=749999 )) { SetCompFreq1kHz();  Band=BAND_28;  PM_BandOk=1;     return ; } 
if ((  Freq_Value>=650000 ) && (  Freq_Value<=699999 )) { SetCompFreq1kHz();  Band=BAND_29;  PM_BandOk=1;     return ; } 
if ((  Freq_Value>=600000 ) && (  Freq_Value<=649999 )) { SetCompFreq1kHz();  Band=BAND_30;  PM_BandOk=1;     return ; } 
if ((  Freq_Value>=560000 ) && (  Freq_Value<=599999 )) { SetCompFreq1kHz();  Band=BAND_31;  PM_BandOk=1;     return ; }   
if ((  Freq_Value>=550000 ) && (  Freq_Value<=559999 )) { SetCompFreq1kHz();  Band=BAND_32;  PM_BandOk=1;     return ; }  
if ((  Freq_Value>=500000 ) && (  Freq_Value<=549999 )) { SetCompFreq1kHz();  Band=BAND_33;  PM_BandOk=1;     return ; } 
if ((  Freq_Value>=450000 ) && (  Freq_Value<=499999 )) { SetCompFreq1kHz();  Band=BAND_34;  PM_BandOk=0;     return ; } 
if ((  Freq_Value>=400000 ) && (  Freq_Value<=449999 )) { SetCompFreq1kHz();  Band=BAND_35;  PM_BandOk=0;     return ; } 
 
if ((  Freq_Value>=280000 ) && (  Freq_Value<=399999 )) { SetCompFreq1kHz();  Band=BAND_36;  PM_BandOk=0;     return ; } 
if ((  Freq_Value>=200000 ) && (  Freq_Value<=279999 )) { SetCompFreq1kHz();  Band=BAND_37;  PM_BandOk=0;     return ; } 
 
if ((  Freq_Value>=140000 ) && (  Freq_Value<=199999 )) { SetCompFreq1kHz();  Band=BAND_38;  PM_BandOk=0;     return ; } 
 
if (( Freq_Value>=120000 ) && (  Freq_Value<=139999 )) { SetCompFreq1kHz();   Band=BAND_39;  PM_BandOk=0;     return ; }  
if (( Freq_Value>=1000   ) && (  Freq_Value<=119999 )) { SetCompFreq1kHz();   Band=BAND_40;  PM_BandOk=0;     return ; } 
            
}
return ;
}
 /* ********************
Добавлено через 46 минут
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
void  TurnOnFM (){ 
if(PrepExtMod==0) { SetStaticCMD_IntFMOn(); } else { SetStaticCMD_ExtFMOn(); }     
 
Flag[1]|=MASK_FLAG_PARSECODE_FM;
Flag[3]|=MASK_FLAG_STATICCMD;
Flag[3]|=MASK_FLAG_MODE;
}
 
 
 
void  TurnOnAM (){ 
if(PrepExtMod==0){ SetStaticCMD_IntAMOn(); } else { SetStaticCMD_ExtAMOn(); }     
Flag[1]|=MASK_FLAG_PARSECODE_AM;
Flag[3]|=MASK_FLAG_STATICCMD;
Flag[3]|=MASK_FLAG_MODE;
}
 
 
void  TurnOnPM (){  //if f>=50 MHz , turn off other modulations 
 if(PM_BandOk==0) { return ; } 
 
if(PrepExtMod==0){ SetStaticCMD_IntPMOn(); } else { SetStaticCMD_ExtPMOn(); } 
SetStaticCMD_IntFMOff();  //fix 
SetStaticCMD_ExtFMOff();
SetStaticCMD_IntAMOff();
SetStaticCMD_ExtAMOff(); 
Flag[3]|=MASK_FLAG_STATICCMD;
Flag[3]|=MASK_FLAG_MODE;
}
 
//fix 
void  TurnOffModulation(){ 
/*   check duty reg , turn off by duty reg  */
if((FlagMode&FM_BYTEMASK)!=0 ){ if(PrepExtMod==0) {SetStaticCMD_IntFMOff(); } else { SetStaticCMD_ExtFMOff();  }  } 
if((FlagMode&AM_BYTEMASK)!=0 ){ if(PrepExtMod==0) {SetStaticCMD_IntAMOff();}  else { SetStaticCMD_ExtAMOff();  }  }
if((FlagMode&PM_BYTEMASK)!=0 ){ SetStaticCMD_PMoff(); }
Flag[3]|=MASK_FLAG_STATICCMD;
Flag[3]|=MASK_FLAG_MODE;
}
 
 
 
#define DIGIT_OFF 0x0b
#define DIGIT_ERR 0x0a
void TurnOffAM_Digits()
{   
    //fix inversion of the address problem for your subroutine 
SendBitsRAM(0x0a , DIGIT_OFF , 0  ) ;
SendBitsRAM(0x0b , DIGIT_OFF , 0  ) ;
 Flag[2]|=MASK_FLAG_DISP_AM;  //fix     
}
 
void TurnOffFM_Digits()
{
    //fix inversion of the address problem for your subroutine
SendBitsRAM(0x07 , DIGIT_OFF , 0  ) ;
SendBitsRAM(0x08 , DIGIT_OFF , 0  ) ;   
SendBitsRAM(0x09 , DIGIT_OFF , 0  ) ;   
Flag[2]|=MASK_FLAG_DISP_FM; //fix   
}
 
void SendFM_DigitsErr()
{
    //fix inversion of the address problem for your subroutine
SendBitsRAM(0x07 , DIGIT_ERR , 0  ) ;
SendBitsRAM(0x08 , DIGIT_ERR , 0  ) ;   
SendBitsRAM(0x09 , DIGIT_ERR , 0  ) ;   
Flag[2]|=MASK_FLAG_DISP_FM;     
}
 
void  TurnOffUnusedModes(){ 
printf("\n TurnOff Digits of the unused modes()" ) ;
 
if(((CurrentState.StaticCMDbits&STATICCMDMASK_AM)!=0)&&((CurrentState.StaticCMDbits&STATICCMDMASK_notAMext)==0)) { TurnOffAM_Digits();   } 
if(((CurrentState.StaticCMDbits&STATICCMDMASK_FM)!=0)&&((CurrentState.StaticCMDbits&STATICCMDMASK_notFMext)==0)) { TurnOffFM_Digits();   } 
if(((CurrentState.StaticCMDbits&STATICCMDMASK_PM)==0)&&((CurrentState.StaticCMDbits& STATICCMDMASK_notPMext )!=0)){ TurnOffFM_Digits(); TurnOffAM_Digits();   } 
 
}
возможные варианты программ обработки режимов (после выполнения ставят в очередь отправку статических команд и режимов установкой флажков с выходом в элементы главного обработчика очереди команд ).

Добавлено через 1 час 44 минуты
При включении модуляций нельзя включит одновременно две внутренние или две внешние модуляции , одна из них выключается при включении режима, одна от внешнего , а другая внутреннего генератора НЧ может включаться одновременно, кроме ИМ (или одна из ИМ, или остальные или выключены). При выключении внутренних модуляций посылать выкл ГНЧ.

Добавлено через 19 минут
С обработчиком выключения выхода и кнопок влево, вправо посмотреть вариант размещения обработчика в
C++
1
2
3
4
DecodeKeybNum( uint8_t byte )
 
или просто в 
InputParamValue(uint8_t byte )
Для КОП ввести альтернативный дешифратор очереди байтов стека команды (без ОД "запятая" ) из списка тех, которыми управляют (пробелы можно в стек не писать ,а вырезать ), управляющий флажками дежурного регистра флажков аналогично кнопкам, но иначе .
Цифровые байты и децимальную точку обрабатывать аналогично кодам клавиатуры , только с другими токенами .


Цифры частоты проверять по три старших до запятой (обрезав ненужные ) на не превышение результирующего числа от них 640 , после этого на равно и больше 160 для включения режима 3 цифры до запятой и 3 после запятой(и частота 1,25 кГц ) , если меньше, то частота сравнения 1 кГц(не более 3 цифр до запятой и 4 после запятой), если число из первых трех цифр равно нулю , проверять на неравенство нулю первой цифры после запятой (не менее 0.1000 МГц ) , иначе отбой . лишние знаки после запятой для частот начиная с 160 МГц и более обрезать и не вводить , правильно переписывая байты цифр в результирующий массив .

На 3333333. отбой при нажатии МГц, восстанавливать из памяти предыдущее успешно установленное значение (из структуры ), до этого вводится по цифре при нажатии с крайнего правого разряда (tmpdigit[0] после исправления порядка символов ) , нули перед ним не светятся, если не запятая .
639,9999 МГц - > вводится 639.999 МГц
10000 кГц - > вводится 10.0000 МГц.
89.99999 MHz->89.9999 MHz
0.09 MHz ->escape input
10.02 MHz->10.0200 MHz.

Добавлено через 22 минуты
Можно упростить некоторые программы переключения диапазонов , вычисляя по некоторым цифрам в различных подрежимах гридликовые числа, и немного изменив условия, сравнивая с ними иначе, повысить быстродействие, но для коэффициента деления все рано нужно предвычисленное для одного из режимов ДФКД (1 или 1,25 кГц) число (деленное на 1 или на 10 методом смещения на одну цифру массива байтов кодов цифр).

Смарт-алгоритм ввода ЧМ(девиации в кГц, 3 цифры ) , зависимого от значения, положения запятой и поддиапазона через 5 единиц младшего разряда и округления , а также его нормализации еще дорабатывается, но аналогичен вводу цифр частоты.
0
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
09.04.2020, 01:32  [ТС] 205
Дорабатывать обработчики команд индикации в subroutines.h и других ,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
uint8_t CheckButtonsNumericKeypad(uint8_t byte )
{
if( byte==(uint8_t) BUTTON_OUT_OFF ) {   printf(" out off  ");  OutputOnOff(); Flag[3]|=MASK_FLAG_MODE|MASK_FLAG_ATT_CODE;  return 0x01 ; } 
if( byte==(uint8_t) BUTTON_LEFT)    {   printf(" < ");   if(StepMode==0)    { Flag[0]|=MASK_FLAG_INC_STEP; return 0x01;  }   else { Reverse=1; return 0x00;   } } 
if( byte==(uint8_t) BUTTON_RIGHT) {   printf(" >  ");  if(StepMode==0) { Flag[0]|=MASK_FLAG_DEC_STEP; return 0x01 ;   }   else {  Reverse=0; return 0x00;   } } 
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(byte);
return 0x01;
}
 
...
 
 
 
void ParseCode( uint8_t scancode1)
{
//;        8_1  
 printf("\ncall ParseKeyb ,FlagMode=%x" ,(int)FlagMode   );
 
 
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 ( (FlagMode&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   ");  SetOutEnterMode(TOKEN_Out_mV);  return;} //;   15_2  
if( scancode==(uint8_t)BUTTON_mkV ) { printf(" uV   "); SetOutEnterMode( TOKEN_Out_mkV );  return;}//;   15_2 
if( scancode==(uint8_t)BUTTON_dBV ) { printf(" -dBV   ");SetOutEnterMode(TOKEN_Out_dB);  return;} //;   15_2  
}
 
if( scancode==(uint8_t)BUTTON_6dB ) {  printf(" +6dB   ");    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)  ,fix   
 
 
 
 
  return ; //to point1             
}
Добавлено через 11 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void      TurnOn6dB(){
 
if((FlagMode&AM_BYTEMASK)!=0 ) {  CurrentState.Output6dB=0; /* Flag[3]|=MASK_FLAG_STATICCMD; */ }
else { CurrentState.Output6dB= ~CurrentState.Output6dB;  }
 printf("\n Output +6dB on    send pin 23 change for output +6dB , \nCurrentState.Output6dB=%x   ", CurrentState.Output6dB) ;
 SendPin23Cmd(CurrentState.Output6dB); 
 
 /* ************************ */
 // in bit Out6dB on Inform =1 ( nInform=0) led is on  
 // if bit Out6dB in the BitsOut is set ,  nInform=0,  led is on
if(CurrentState.Output6dB==0) { BitsOut&=~(MODE_BITMASK_OUT_6dB);   } else  {BitsOut|= (MODE_BITMASK_OUT_6dB);   } 
 
 Flag[3]|=MASK_FLAG_MODE;
 return ; 
 }  //fix
Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void      OutputOnOff() { 
printf("\n Output_on=~Output_on   ") ; 
CurrentState.OutputOff=~CurrentState.OutputOff; 
if(CurrentState.OutputOff==0) { BitsOut&=~(MODE_BITMASK_OUT_OFF);   } else {BitsOut|= (MODE_BITMASK_OUT_OFF);   } 
//Flag[3]|=MASK_FLAG_MODE|MASK_FLAG_ATT_CODE; 
// in bit Out off  on Inform =1 ( nInform=0) led Out off is on
// if bit OutputOff in the BitsOut is set,   led Out off is turned on
/* 
; 8   no      LSB   
; 4   no   
; 2   no
; 1 Out 
; 8 +6dB
; 4 uV
; 2 mV
; 1 dBV      MSB
 
*/
 
 
 
} /*  fix  */
Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
void      OutputOn() { 
printf("\n Output On ") ;     
CurrentState.OutputOff=0x00;
BitsOut&=~(MODE_BITMASK_OUT_OFF);  //turn off led
Flag[3]|=MASK_FLAG_MODE;
return; 
 }
Добавлено через 5 минут
Прописать управление битами индикации режимов режимов ( для выхода , +6 дБ, модуляции, ГНЧ ).

Добавлено через 2 часа 1 минуту
В программах отправки кодов в платы ГЗЧ и светодиодов режимов разные коды , ввести еще одну переменную для номера ГЗЧ в плате ГЗЧ
C++
1
2
3
4
5
6
  uint8_t BitsOut=0x00;  //LED OutOff off, LED  6 dB off
  uint8_t BitsModul=0x00;//LED modulations off 
  uint8_t BitsLFO=0x00;  //disable LEDs LFO
  
  uint8_t LFOEnabled=0;  //Enabled internal LFO bit
  uint8_t BitsLFOOsc; // preset to  1 kHz osc
Добавлено через 1 минуту
Переменные размещать в ОЗУ (общие для всех подпрограмм ).

Добавлено через 2 часа 40 минут
Можно прикинуть на программе, моделирующей ввод (на обычных скан-кодах, как и для КОП ), дописать, ввести условия.

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
#include <stdio.h>
#include <stdint.h>
#include <math.h>
typedef unsigned char byte;
 
uint8_t  freq[8];
 
uint8_t  tmpcount=0;
uint8_t  tmpdigits[7];
uint8_t  tmpcommapos=0;
uint8_t  CommaSet=0;
 
uint16_t GetValuefrom3Digits( uint8_t dig3, uint8_t dig2 , uint8_t dig1 )
{
uint16_t result=0;
result+=(uint16_t) dig1;
for (uint8_t i=0;i<dig2;i++ ) { result+=10; }
for (uint8_t i=0;i<dig3;i++ ) { result+=100; }
return result ; 
}   
    
 
 void AppendDigitBufer( uint8_t numb,uint8_t byte1  )
 {
    
if(tmpcount< numb ) { 
for (uint8_t i=numb-1 ;i>=1; i-- ) {  tmpdigits[i]=tmpdigits[i-1];   } 
tmpdigits[0]=byte1; 
if ( CommaSet==0) {tmpcommapos=0;} 
else { tmpcommapos+=1; if(tmpcount==0) { tmpdigits[1]=0;   tmpcount++; } } 
tmpcount++;
}
return;
}
 
 void DecodeKeybNum( uint8_t byte )
 {
uint8_t byte1=0; 
     
if (byte==0x30)   { byte1=0; goto LabelInputnthDigit;  } //emulating of the scancode  
if (byte==0x31)   { byte1=1; goto LabelInputnthDigit;  }
if (byte==0x32)   { byte1=2; goto LabelInputnthDigit;  } 
if (byte==0x33)   { byte1=3; goto LabelInputnthDigit ; }
if (byte==0x34)   { byte1=4; goto LabelInputnthDigit;  }
if (byte==0x35)   { byte1=5; goto LabelInputnthDigit; }
if (byte==0x36)   { byte1=6; goto LabelInputnthDigit ; }
if (byte==0x37)   { byte1=7; goto LabelInputnthDigit; }
if (byte==0x38)   { byte1=8; goto LabelInputnthDigit; }
if (byte==0x39)   { byte1=9; goto LabelInputnthDigit; }
if (byte==0x2e)  {  CommaSet=1;   return;  } //fix  if count =num 
return; 
  
LabelInputnthDigit:
 AppendDigitBufer(7, byte1); 
 
return;
}
 
 void InputParamValue(uint8_t byte ){
 
DecodeKeybNum(  byte );
 
return;
  
}
/*
1 2 3. 4 5 6  
  [ 1 ]  [ 2 ]  [ 3 .]  [ 4 ]  [ 5 ]  [ 6 ]
 tmpcount=6  tmpcommapos=3
123456789
 
Input char :1
Input char :2
Input char :3
Input char :4
Input char :5
Input char :6
Input char :7
Input char :8
Input char :9
Input char :x
  [ 1 ]  [ 2 ]  [ 3 ]  [ 4 ]  [ 5 ]  [ 6 ]  [ 7 .]
 tmpcount=7  tmpcommapos=0 
 
 
 Input char :1
Input char :2
Input char :.
Input char :3
Input char :x
  [ 1 ]  [ 2 .]  [ 3 ] //[0]
 tmpcount=3  tmpcommapos=1   
 
 ndigbeforecomma=tmpcount-tmpcommapos;  <=3
 
 Input char :.
Input char :1
Input char :2
Input char :3
Input char :x
  [ 0 .]  [ 1 ]  [ 2 ]  [ 3 ]  //[0]
 tmpcount=4  tmpcommapos=3
 
*/
int main()
 
{
uint8_t ch =0;
 
 
while(ch!='x')
{
char  ch1;
printf("Input char :"); 
scanf ("%s",  &ch1);
ch=(uint8_t) ch1 ;
InputParamValue(ch );   
      
}
 
for (int  i=tmpcount-1;i>=0; i--) { printf ("  [ %d " , tmpdigits[i]) ;  if (tmpcommapos==i) {printf (".") ;}  printf ("]") ;             }
 
 
printf("\n tmpcount=%d  tmpcommapos=%d ", tmpcount, tmpcommapos ) ;
 
 
 
 
 
 
return 0;
 
}
Добавлено через 4 часа 51 минуту
Для работы программы нормализации потребуется дополнительный временный массив на 7 байт , счетчики и временные переменные, которые нужно будет обнулять при наборе с начала (после включения нового режима , отбоя , повторного ввода после ранее нажатой кнопки величины ).

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
#include <stdio.h>
#include <stdint.h>
#include <math.h>
#include <conio.h>
typedef unsigned char byte;
 
uint8_t  freq[8];
 
uint8_t  tmpcount=0;
uint8_t  tmpdigits[7] ;
uint8_t  tmpcommapos=0;
uint8_t  CommaSet=0;
 
uint16_t GetValuefrom3Digits( uint8_t dig3, uint8_t dig2 , uint8_t dig1 )
{
uint16_t result=0;
for (uint8_t i=0;i<dig1;i++ ) { result+=1 ; } 
for (uint8_t i=0;i<dig2;i++ ) { result+=10; }
for (uint8_t i=0;i<dig3;i++ ) { result+=100; }
return result ; 
}   
    
 
 void AppendDigitBufer( uint8_t numb,uint8_t byte1  )
 {
    
if(tmpcount< numb ) { 
for (uint8_t i=numb-1 ;i>=1; i-- ) {  tmpdigits[i]=tmpdigits[i-1];   } 
tmpdigits[0]=byte1; 
if ( CommaSet==0) {tmpcommapos=0;} 
else { tmpcommapos+=1; if(tmpcount==0) { tmpdigits[1]=0;   tmpcount++; } } 
tmpcount++;
}
return;
}
 
 void DecodeKeybNum( uint8_t byte )
 {
uint8_t byte1=0; 
     
if (byte==0x30)   { byte1=0; goto LabelInputnthDigit;  } //emulating of the scancode  
if (byte==0x31)   { byte1=1; goto LabelInputnthDigit;  }
if (byte==0x32)   { byte1=2; goto LabelInputnthDigit;  } 
if (byte==0x33)   { byte1=3; goto LabelInputnthDigit ; }
if (byte==0x34)   { byte1=4; goto LabelInputnthDigit;  }
if (byte==0x35)   { byte1=5; goto LabelInputnthDigit; }
if (byte==0x36)   { byte1=6; goto LabelInputnthDigit ; }
if (byte==0x37)   { byte1=7; goto LabelInputnthDigit; }
if (byte==0x38)   { byte1=8; goto LabelInputnthDigit; }
if (byte==0x39)   { byte1=9; goto LabelInputnthDigit; }
if (byte==0x2e)  {  CommaSet=1;   return;  } //fix  if count =num 
return; 
  
LabelInputnthDigit:
 AppendDigitBufer(7, byte1); 
 
return;
}
 
 void InputParamValue(uint8_t byte ){
 
DecodeKeybNum(  byte );
 
return;
  
}
/*
1 2 3. 4 5 6  
  [ 1 ]  [ 2 ]  [ 3 .]  [ 4 ]  [ 5 ]  [ 6 ]
 tmpcount=6  tmpcommapos=3
123456789
 
Input char :1
Input char :2
Input char :3
Input char :4
Input char :5
Input char :6
Input char :7
Input char :8
Input char :9
Input char :x
  [ 1 ]  [ 2 ]  [ 3 ]  [ 4 ]  [ 5 ]  [ 6 ]  [ 7 .]
 tmpcount=7  tmpcommapos=0 
 
for (i=tmpcount ; i< numb ; i++   )  
 
 
 
 Input char :1
Input char :2
Input char :.
Input char :3
Input char :x
     2        1        0
     5       4        3      2     1   0
  [ 1 ]  [ 2 .]  [ 3 ] //[0] [0] [0]
 tmpcount=3  tmpcommapos=1  ; 4-1=3 , 3-1=2    
 
 ndigbefore=tmpcount-tmpcommapos;  <=3
 
 Input char :.
Input char :1
Input char :2
Input char :3
Input char :x
  [ 0 .]  [ 1 ]  [ 2 ]  [ 3 ]  //[0]
 tmpcount=4  tmpcommapos=3
 
 
 
     6       5     4      3      2       1      0
   [ 0 ]  [ 0 ]  [ 1 ]  [ 2 ]  [ 3 .]  [ 4 ]  [ 5 ]
 tmpcount=5  tmpcommapos=2
  
 
      6      5      4       3      2      1      0
   [ 1 ]  [ 2 ]  [ 3 .]  [ 4 ]  [ 5 ]  [ 0 ]  [ 0 ]          
 tmpcount=7  tmpcommapos=4                             
                                                         
                                                          
                                                           if (tmpcount> 6)   { x[6]=x[tmpcommapos+2] } else {x[6]=0; }   
                                                           if (tmpcount> 5)   { x[5]=x[tmpcommapos+1]} else {x[5]=0; }
                                                           x[4]=x[tmpcommapos]   
                                                           if(tmpcommapos-1 >=0) { x[3]= x[tmpcommapos-1];}  else {x[3]=0 ;}    
                                                           if(tmpcommapos-2 >=0) { x[2]= x[tmpcommapos-2];}  else {x[2]=0 ;}      
                                                           if(tmpcommapos-3 >=0) { x[1]= x[tmpcommapos-3];}  else {x[1]=0 ;}  
                                                           if(tmpcommapos-4 >=0) { x[0]= x[tmpcommapos-4];}  else {x[0]=0 ;}  
                                                             tmpcommapos=4;
 
     6      5      4       3      2      1      0
   [ 1 ]  [ 2 ]  [ 3 .]  [ 4 ]  [ 5 ]  [ 6 ]  [ 7 ] 
 tmpcount=7  tmpcommapos=4
 
  
     6      5       4     3       2     1      0  
   [ 0 ]  [ 0 ]  [ 0 ]  [ 6 ]  [ 3 ]  [ 9 .]  [ 9 ]    x[5]=x[tmpcommapos+2], x[4]=x[tmpcommapos+1], x[3]=x[tmpcommapos]
                                                       x[2]=x[tmpcommapos-1]  x[1]=x[tmpcommapos-2]    x[0]=0     
 tmpcount=4  tmpcommapos=1
 
     6      5       4     3       2     1      0  
   [ 0 ]  [ 6 ]  [ 3 ]  [ 9. ]  [ 9 ]  [ 9 ]  [ 9 ]   
 
  [ 0 ]  [ 6 ]  [ 3 ]  [ 9 .]  [ 9 ]  [ 9 ]  [ 9 ]
 tmpcount=6  tmpcommapos=3
*/
int main()
 
{
    
label1: 
    
uint8_t ch =0;
 
//reset after turn on new  mode or escape 
 tmpcount=0;
 CommaSet=0;
 tmpcommapos=0;
 
while(ch!='x')
{
char  ch1;
printf("Input char :"); 
scanf ("%s",  &ch1);
ch=(uint8_t) ch1 ;
InputParamValue(ch );   
      
}
 
 
 
/*
  [ 2 .]  [ 3 ]  [ 2 ]  [ 1 ]  [ 5 ]  [ 4 ]  [ 2 ]       
 tmpcount=7  tmpcommapos=6
  [ 0 ]  [ 0 ]  [ 2 .]  [ 3 ]  [ 2 ]  [ 1 ]  [ 5 ]  
 tmpcount=7  tmpcommapos=4                                 tmpdigits[6]=0; tmpdigits[5]=0; tmpdigits[4]=tmpdigits[tmpcommapos ]; 
 
                                                           tmpdigits[3]=tmpdigits[tmpcommapos-1 ];          0 -err   ,      input 0   
                                                           tmpdigits[2]=tmpdigits[tmpcommapos-2 ];         1-err, 0 -err   , input 0
                                                           tmpdigits[1]=tmpdigits[tmpcommapos-3 ]; 2-err , 1-err, 0 -err
                                                           tmpdigits[0]=tmpdigits[tmpcommapos-4 ]; 3-err, 2-err, 1-err , 0-err  
     6       5     4      3      2       1      0
   [ 0 ]  [ 0 ]  [ 1 ]  [ 2 ]  [ 3 .]  [ 4 ]  [ 5 ]  
 tmpcount=5  tmpcommapos=2  numb of digits after comma 
 
       6      5      4       3      2      1      0       дополненный нулями слева ,  
   [ 1 ]  [ 2 ]  [ 3 .]  [ 4 ]  [ 5 ]  [ 0 ]  [ 0 ]      с старшего  разряда (tmpcount-1) -> в 6 й ,    tmpcount  раз  сверху      
 tmpcount=7  tmpcommapos=4                               
 
  [ 1 .]  [ 2 ]  [ 3 ]  [ 4 ]  [ 5 ]  [ 6 ]  [ 7 ]
 tmpcount=7  tmpcommapos=6 , numbdig=1
 
  
*/
 
 
uint8_t numbdig=(tmpcount-tmpcommapos);
uint8_t numbaftercomma =tmpcommapos;
#define ndigmax 7
 
 for (int  i=6;i>=0; i--) { printf ("  [ %d " , tmpdigits[i]) ;  if (tmpcommapos==i) {printf (".") ;}  printf ("]") ;   }
printf("\n tmpcount=%d  tmpcommapos=%d , numbdig=%d , numb after=%d \n", tmpcount, tmpcommapos, numbdig , numbaftercomma ) ;
 
   uint8_t tmparray[7]; 
   if((numbdig>3)||(numbdig==0)) { printf ("\n Escape entering ");  goto label_escape ; }
   if(numbaftercomma>4) { numbaftercomma=4; }
   if(numbdig==3) {  if((tmpcommapos+2) <7 )  { tmparray[6]=tmpdigits[tmpcommapos+2] ; }  }   else { tmparray[6]=0;  }
   if(numbdig>=2) {  if((tmpcommapos+1) <7 )  { tmparray[5]=tmpdigits[tmpcommapos+1] ; }  }   else { tmparray[5]=0;  }
   tmparray[4]=tmpdigits[tmpcommapos];   
   if(numbaftercomma>=1) { tmparray[3]=tmpdigits[tmpcommapos-1];  }   else {  tmparray[3]=0; }
   if(numbaftercomma>=2) { tmparray[2]=tmpdigits[tmpcommapos-2];  }   else {  tmparray[2]=0; }
   if(numbaftercomma>=3) { tmparray[1]=tmpdigits[tmpcommapos-3];  }   else {  tmparray[1]=0; } 
   if(numbaftercomma==4) { tmparray[0]=tmpdigits[tmpcommapos-4];  }   else {  tmparray[0]=0; } 
   tmpcommapos=4;
 
uint16_t digitsbefore;
digitsbefore=GetValuefrom3Digits( tmparray[6] , tmparray[5] , tmparray[4]);
 printf(" digits=%d ",digitsbefore );
if(digitsbefore>=640 ) { printf ("\n Escape entering ");  goto label_escape ; }
if((digitsbefore==0 )&&(tmparray[3]==0)) { printf ("\n Escape entering ");  goto label_escape ; }
 
if(digitsbefore>=160 ) {  printf ("\nMode 1,25 kHz");    for (uint8_t i=0; i<6; i++)  { tmpdigits[i]  =tmparray[i+1];    } tmpdigits[6] =0;  tmpcommapos=3; tmpcount=6 ;          }
else {  printf ("\nMode 1  kHz");   for (uint8_t i=0; i<7; i++)  {tmpdigits[i]  =tmparray[i];  } tmpcommapos=4; tmpcount=7 ;  }
 
 
 
 
 
 
//for (int  i=tmpcount-1;i>=0; i--) { printf ("  [ %d " , tmpdigits[i]) ;  if (tmpcommapos==i) {printf (".") ;}  printf ("]") ;   }
 
 for (int  i=tmpcount-1;i>=0; i--) { printf ("  [ %d " , tmpdigits[i]) ;  if (tmpcommapos==i) {printf (".") ;}  printf ("]") ;   }
printf("\n tmpcount=%d  tmpcommapos=%d \n", tmpcount, tmpcommapos ) ;
 
 
 label_escape:
    
 goto label1;
 
 
return 0;
 
}
Добавлено через 1 минуту
При ошибке программа восстанавливает из структуры предыдущее правильно установленное значение.

Добавлено через 5 минут
Хотелось бы сделать программу компактнее, с меньшим количеством переменных (подпрограмма для программы нормализации выносится в отдельную функцию , а внутренние переменные, кроме временного массива буфера индикации уничтожаются , до этого они могут влиять на переполнение стека ( стек (от конца к началу, см. вершину стека ) "перекрывает" область хранения переменных в ОЗУ ) ). С 1К (2К) СОЗУ эта вероятность зависит только от способа программирования и нас может удовлетворить .
0
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
10.04.2020, 02:28  [ТС] 206
В Мега16-ю плохо помещается со всеми программами нормализации .
С ATMega32a реально , но тактовая до 16 МГц (с учетом внутреннего предделителя , о отключенного делителя на 8 ), а при 20 МГц реальнее могло работать . У Мантрида тоже 16 МГц выбрали . Здесь это на пределе (-16PU не -20PU и не - PU и не -AU ).
Код
ATMega32a : 
...
c:\program files (x86)\atmel\studio\7.0\toolchain\avr8\avr8-gnu-toolchain\avr\include\util\delay.h(92,3): warning: #warning "F_CPU not defined for <util/delay.h>" [-Wcpp]
		 # warning "F_CPU not defined for <util/delay.h>"
		   ^
		In file included from .././main.c:17:0:
		.././mainparser.h: In function 'ParseInterrupts':
C:\Users\yarpz\Desktop\progs2\Gccapp6\Gccapp1\mainparser.h(175,2): warning: label 'LabelPoint2' defined but not used [-Wunused-label]
		  LabelPoint2:
		  ^
		.././mainparser.h: In function 'DecodeGPIBBytes':
C:\Users\yarpz\Desktop\progs2\Gccapp6\Gccapp1\mainparser.h(51,1): warning: control reaches end of non-void function [-Wreturn-type]
		 uint8_t DecodeGPIBBytes(uint8_t StackByte){ ; }
		 ^
		Building target: Gccapp1.elf
		Invoking: AVR/GNU Linker : 5.4.0
		"C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-gcc.exe" -o Gccapp1.elf  main.o   -Wl,-Map="Gccapp1.map" -Wl,--start-group -Wl,-lm  -Wl,--end-group -Wl,--gc-sections -mmcu=atmega32a -B "C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.2.209\gcc\dev\atmega32a"  
		Finished building target: Gccapp1.elf
		"C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-objcopy.exe" -O ihex -R .eeprom -R .fuse -R .lock -R .signature -R .user_signatures  "Gccapp1.elf" "Gccapp1.hex"
		"C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-objcopy.exe" -j .eeprom  --set-section-flags=.eeprom=alloc,load --change-section-lma .eeprom=0  --no-change-warnings -O ihex "Gccapp1.elf" "Gccapp1.eep" || exit 0
		"C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-objdump.exe" -h -S "Gccapp1.elf" > "Gccapp1.lss"
		"C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-objcopy.exe" -O srec -R .eeprom -R .fuse -R .lock -R .signature -R .user_signatures "Gccapp1.elf" "Gccapp1.srec"
		"C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-size.exe" "Gccapp1.elf"
		   text	   data	    bss	    dec	    hex	filename
		  13016	    118	    470	  13604	   3524	Gccapp1.elf
	Done executing task "RunCompilerTask".
	Using "RunOutputFileVerifyTask" task from assembly "C:\Program Files (x86)\Atmel\Studio\7.0\Extensions\Application\AvrGCC.dll".
	Task "RunOutputFileVerifyTask"
				Program Memory Usage 	:	13134 bytes   40,1 % Full
				Data Memory Usage 		:	588 bytes   28,7 % Full
	Done executing task "RunOutputFileVerifyTask".
Добавлено через 38 минут
На тему предделителя на 4 и отключенного предделителя на 8 перед ним еще уточнить архитектуру ("отфонарно" среденепотолочно ,с худшим случаем, с прицелом на PIC и другие процессоры, но может быть правильнее, лучше посмотреть даташит на выбранный процессор ). Если тактовая кратна 5 МГц (10, 15 (,20) МГц ) , это правильнее по помехам (в пределах полосы помех от ОГ ) .


Код
MCUCR – MCU Control Register
Bit 7 – SE: Sleep Enable
SM2 SM1 SM0 Sleep Mode
0 0 0 Idle
0 0 1 ADC Noise Reduction
0 1 0 Power-down
0 1 1 Power-save
1 0 0 Reserved
1 0 1 Reserved
1 1 0 Standby(1)
1 1 1 Extended Standby(1)

void WDT_off(void)
{
/* reset WDT */
_WDR();
/* Write logical one to WDTOE and WDE */
WDTCR |= (1<<WDTOE) | (1<<WDE);
/* Turn off WDT */
WDTCR = 0x00;
}

C Code Example
_SEI(); /* set global interrupt enable */
_SLEEP(); /* enter sleep, waiting for interrupt */ ввести в    loop forever  , добавить флаги пробуждения по прерыванию в программу инициализации прерываний  
/* note: will enter sleep before any pending interrupt(s) */
Добавлено через 3 минуты
На адрес ожидания мультиплексор адресов синхроимпульсов ставить до цикла с командой перехода в "спящий" режим перед разрешением прерываний и "вечным циклом" ожидания прерываний .

Добавлено через 7 минут
Бывает еще способ записи .
Код
 PORTx |= _BV(bit); 

PORTx &= ~_BV(bit);
Какой автоматически без инлайнового ассемблера cbi ,sbi делает для выводов это на ассемблере также ,хотя при оптимизации кода иногда это делает даже обычный способ PORTx |=(1<<bitnum) , но он обычно использует дизъюнкцию (конъюнкцию с инверсной ) с маской, набранной по битам , а это медленнее ?

Добавлено через 2 минуты
С инлайновыми вставкам седьмая атмел студия (1931 сборка ) в Си иногда глючит .

Добавлено через 21 минуту
http://www.engblaze.com/hush-l... de-basics/

Добавлено через 2 часа 33 минуты
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
#include <stdio.h>
#include <stdint.h>
#include <math.h>
#include <conio.h>
typedef unsigned char byte;
 
 
 
uint8_t  tmpcount=0;
uint8_t  tmpdigits[3] ;
uint8_t  tmpcommapos=0;
uint8_t  CommaSet=0;
 
uint16_t GetValuefrom3Digits( uint8_t dig3, uint8_t dig2 , uint8_t dig1 )
{
uint16_t result=0;
for (uint8_t i=0;i<dig1;i++ ) { result+=1 ; } 
for (uint8_t i=0;i<dig2;i++ ) { result+=10; }
for (uint8_t i=0;i<dig3;i++ ) { result+=100; }
return result ; 
}
 
void ResetCounters()
{   
 tmpcount=0;
 CommaSet=0;
 tmpcommapos=0; 
 tmpdigits[0]=0;
 tmpdigits[1]=0;
 tmpdigits[2]=0;
 
 
}
 void AppendDigitBufer( uint8_t numb,uint8_t byte1  )
 {
    
if(tmpcount< numb ) { 
for (uint8_t i=numb-1 ;i>=1; i-- ) {  tmpdigits[i]=tmpdigits[i-1];   } 
tmpdigits[0]=byte1; 
if ( CommaSet==0) {tmpcommapos=0;} 
else { tmpcommapos+=1; if(tmpcount==0) { tmpdigits[1]=0;   tmpcount++; } } 
tmpcount++;
}
return;
}
 
 
 void DecodeKeybNum( uint8_t byte )
 {
uint8_t byte1=0; 
     
if (byte==0x30)   { byte1=0; goto LabelInputnthDigit;  } //emulating of the scancode  
if (byte==0x31)   { byte1=1; goto LabelInputnthDigit;  }
if (byte==0x32)   { byte1=2; goto LabelInputnthDigit;  } 
if (byte==0x33)   { byte1=3; goto LabelInputnthDigit ; }
if (byte==0x34)   { byte1=4; goto LabelInputnthDigit;  }
if (byte==0x35)   { byte1=5; goto LabelInputnthDigit; }
if (byte==0x36)   { byte1=6; goto LabelInputnthDigit ; }
if (byte==0x37)   { byte1=7; goto LabelInputnthDigit; }
if (byte==0x38)   { byte1=8; goto LabelInputnthDigit; }
if (byte==0x39)   { byte1=9; goto LabelInputnthDigit; }
if (byte==0x2e)  {  CommaSet=1;   return;  } //fix  if count =num 
return; 
  
LabelInputnthDigit:
 AppendDigitBufer(3, byte1); 
 
return;
}
 
 void InputParamValue(uint8_t byte ){
 
DecodeKeybNum(  byte );
 
return;
  
} 
uint8_t maxnum_band =500;      //320 -> 995, 160->500 ,80-> 250 , 40-> 101, 20->50 , 10->  99.5
uint8_t maxnum_comma=0;
 
 
void NormFM1()
{
 
 
uint8_t numbdig=(tmpcount-tmpcommapos);
uint8_t numbaftercomma =tmpcommapos;
 
 
#define ndigmax 3
 
 for (int  i=2;i>=0; i--) { printf ("  [ %d " , tmpdigits[i]) ;  if (tmpcommapos==i) {printf (".") ;}  printf ("]") ;   }
 printf("\n tmpcount=%d  tmpcommapos=%d , numbdig=%d , numb after=%d \n", tmpcount, tmpcommapos, numbdig , numbaftercomma ) ;
 
  
 
if((tmpdigits[2]>=9)&&(tmpdigits[1]>=9)&&(tmpdigits[0]>5)) {  tmpdigits[2]=9;  tmpdigits[1]=9;  tmpdigits[0]=5;  }
for (uint8_t i=0;i<2;i++) { 
if (tmpdigits[2]==0) { tmpcommapos++; if(tmpcommapos>2) {tmpcommapos=2;} else {tmpdigits[2]=tmpdigits[1]; tmpdigits[1]=tmpdigits[0]; tmpdigits[0]=0;}   }   
}
if (tmpdigits[0]>=5) { tmpdigits[0]=5;  } else { tmpdigits[0]=0;  }  //fix 
 
//CheckFMBandLimits();
 
  
for (int  i=2;i>=0; i--) { printf ("  [ %d " , tmpdigits[i]) ;  if (tmpcommapos==i) {printf (".") ;}  printf ("]") ;   }
return;
 label_escapefm:
printf("\n get previous value, commmapos ,  freqmode \n"  ) ;
    
return;
}
 
 
 
 
/*
0.05->0.05
 
   1
  12
  12.
12.5
  
   1
   1.
 1.2  ->1.20  
  
1.2  - 1.20
126 -> 125.
991 ->990.
 
 
*/
 
int main()
 
{
    
label1: 
    
uint8_t ch =0;
 
//reset after turn on new  mode or escape 
ResetCounters();
 
while(ch!=',')
{
char  ch1;
printf("\nInput char :"); 
scanf ("%s",  &ch1);
ch=(uint8_t) ch1 ;
InputParamValue(ch );   
      
}
 
 NormFM1();
    
 goto label1;
 
 
return 0;
 
}
Добавлено через 1 час 18 минут
Пример принципа работы некоторых основных элементов подпрограммы нормализации ЧМ (до 50 , 0 кГц, для 995 кГц maxnum_band =995 (тип двухбайтный ), maxnum_comma=0 ) :
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
#include <stdio.h>
#include <stdint.h>
#include <math.h>
#include <conio.h>
typedef unsigned char byte;
 
 
 
uint8_t  tmpcount=0;
uint8_t  tmpdigits[7] ;
uint8_t  tmpcommapos=0;
uint8_t  CommaSet=0;
 
uint16_t GetValuefrom3Digits( uint8_t dig3, uint8_t dig2 , uint8_t dig1 )
{
uint16_t result=0;
for (uint8_t i=0;i<dig1;i++ ) { result+=1 ; } 
for (uint8_t i=0;i<dig2;i++ ) { result+=10; }
for (uint8_t i=0;i<dig3;i++ ) { result+=100; }
return result ; 
}
 
void ResetCounters()
{   
 tmpcount=0;
 CommaSet=0;
 tmpcommapos=0; 
 //tmpdigits[0]=0;
 //tmpdigits[1]=0;
 //tmpdigits[2]=0;
 
 
}
 void AppendDigitBufer( uint8_t numb,uint8_t byte1  )
 {
    
if(tmpcount< numb ) { 
for (uint8_t i=numb-1 ;i>=1; i-- ) {  tmpdigits[i]=tmpdigits[i-1];   } 
tmpdigits[0]=byte1; 
if (CommaSet==0) {tmpcommapos=0;} 
else { tmpcommapos+=1; if(tmpcount==0) { tmpdigits[1]=0;   tmpcount++; } } 
tmpcount++;
}
return;
}
 
 
 void DecodeKeybNum( uint8_t byte )
 {
uint8_t byte1=0; 
     
if (byte==0x30)   { byte1=0; goto LabelInputnthDigit;  } //emulating of the scancode  
if (byte==0x31)   { byte1=1; goto LabelInputnthDigit;  }
if (byte==0x32)   { byte1=2; goto LabelInputnthDigit;  } 
if (byte==0x33)   { byte1=3; goto LabelInputnthDigit ; }
if (byte==0x34)   { byte1=4; goto LabelInputnthDigit;  }
if (byte==0x35)   { byte1=5; goto LabelInputnthDigit; }
if (byte==0x36)   { byte1=6; goto LabelInputnthDigit ; }
if (byte==0x37)   { byte1=7; goto LabelInputnthDigit; }
if (byte==0x38)   { byte1=8; goto LabelInputnthDigit; }
if (byte==0x39)   { byte1=9; goto LabelInputnthDigit; }
if (byte==0x2e)  {  CommaSet=1;   return;  } //fix  if count =num 
return; 
  
LabelInputnthDigit:
 AppendDigitBufer(3, byte1); 
 
return;
}
 
 void InputParamValue(uint8_t byte ){
 
DecodeKeybNum(  byte );
 
return;
  
} 
uint16_t maxnum_band =500  ;      //320 -> 995, 160->500 ,80-> 250 , 40-> 101, 20->50 , 10->  99.5
uint8_t maxnum_comma=1;
//50.0
//500.
//100.
 
uint8_t CheckFMBandLimits(uint8_t comma, uint8_t  maxfmcommapos)
{
if(comma>maxfmcommapos) {return 0; }
 
if(GetValuefrom3Digits( tmpdigits[2], tmpdigits[1] , tmpdigits[0] )>maxnum_band) { return 1; } else  
{ if(comma>=maxfmcommapos) {return 0; } else   {return 1; } }
 
return 0 ;  
}
 
void NormFM1()
{
 
 
uint8_t numbdig=(tmpcount-tmpcommapos);
uint8_t numbaftercomma =tmpcommapos;
 
 
#define ndigmax 3
 
 for (int  i=2;i>=0; i--) { printf ("  [ %d " , tmpdigits[i]) ;  if (tmpcommapos==i) {printf (".") ;}  printf ("]") ;   }
 printf("\n tmpcount=%d  tmpcommapos=%d , numbdig=%d , numb after=%d \n", tmpcount, tmpcommapos, numbdig , numbaftercomma ) ;
 
  
for(uint8_t i2=tmpcount; i2<3; i2++) { tmpdigits[i2]=0; }
if((tmpdigits[2]>=9)&&(tmpdigits[1]>=9)&&(tmpdigits[0]>5)) { tmpdigits[2]=9;  tmpdigits[1]=9;  tmpdigits[0]=5;  }
for (uint8_t i=0;i<2;i++) { 
if (tmpdigits[2]==0) { tmpcommapos++; if(tmpcommapos>2) {tmpcommapos=2;} else {tmpdigits[2]=tmpdigits[1]; tmpdigits[1]=tmpdigits[0]; tmpdigits[0]=0; }   }   
}
if (tmpdigits[0]>=5) { tmpdigits[0]=5;  } else { tmpdigits[0]=0;  }  //fix 
 
if (CheckFMBandLimits(tmpcommapos, maxnum_comma)==1)  { printf("\n  set   ---  ,   input cancelling   \n"  ) ;    return;  }  //set flag error indication 
 
  
for (int i=2;i>=0; i--) { printf ("  [ %d ", tmpdigits[i]);  if (tmpcommapos==i) {printf (".") ;}  printf ("]") ; }
 
return;
}
 
 
 
 
/*
0.05->0.05
 
   1
  12
  12.
12.5
  
   1
   1.
 1.2  ->1.20  
  
1.2  - 1.20
126 -> 125.
991 ->990.
 
 
*/
 
int main()
 
{
    
label1: 
    
uint8_t ch =0;
 
//reset after turn on new  mode or escape 
ResetCounters();
 
while(ch!=',')
{
char  ch1;
printf("\nInput char :"); 
scanf ("%s",  &ch1);
ch=(uint8_t) ch1 ;
InputParamValue(ch );   
      
}
 
 NormFM1();
    
 goto label1;
 
 
return 0;
 
}
Возможно, в ней еще скрытые баги (при вводе чисел соседнего предела меньше по цифрам чем верхний предел , 0.05 кГц ) или есть более быстрая и устойчивая к сбоям программа , правильнее использующая регистры процессора и флэш программ .

Добавлено через 3 часа 13 минут
Программа нормализации выхода в режиме мВ, при меньше или равно 1.000 мВ вызывает обработку 1000 мкВ другой подпрограммой (функцией)

Код
#include <stdio.h>
#include <stdint.h>
#include <math.h>
#include <conio.h>
typedef unsigned char byte;

 

uint8_t  tmpcount=0;
uint8_t  tmpdigits[7] ;
uint8_t  tmpcommapos=0;
uint8_t  CommaSet=0;

uint16_t GetValuefrom3Digits( uint8_t dig3, uint8_t dig2 , uint8_t dig1 )
{
uint16_t result=0;
for (uint8_t i=0;i<dig1;i++ ) { result+=1 ; } 
for (uint8_t i=0;i<dig2;i++ ) { result+=10; }
for (uint8_t i=0;i<dig3;i++ ) { result+=100; }
return result ; 
}

void ResetCounters ()
{	
 tmpcount=0;
 CommaSet=0;
 tmpcommapos=0;	
  tmpdigits[0]=0;
  tmpdigits[1]=0;
  tmpdigits[2]=0;
   tmpdigits[3]=0;
 
}
 void AppendDigitBufer( uint8_t numb,uint8_t byte1  )
 {
 	
if(tmpcount< numb ) { 
for (uint8_t i=numb-1 ;i>=1; i-- ) {  tmpdigits[i]=tmpdigits[i-1];   } 
tmpdigits[0]=byte1; 
if (CommaSet==0) {tmpcommapos=0;} 
else { tmpcommapos+=1; if(tmpcount==0) { tmpdigits[1]=0;   tmpcount++; } } 
tmpcount++;
}
return;
}


 void DecodeKeybNum( uint8_t byte )
 {
uint8_t byte1=0; 
 	 
if (byte==0x30)   { byte1=0; goto LabelInputnthDigit;  } //emulating of the scancode  
if (byte==0x31)   { byte1=1; goto LabelInputnthDigit;  }
if (byte==0x32)   { byte1=2; goto LabelInputnthDigit;  } 
if (byte==0x33)   { byte1=3; goto LabelInputnthDigit ; }
if (byte==0x34)   { byte1=4; goto LabelInputnthDigit;  }
if (byte==0x35)   { byte1=5; goto LabelInputnthDigit; }
if (byte==0x36)   { byte1=6; goto LabelInputnthDigit ; }
if (byte==0x37)   { byte1=7; goto LabelInputnthDigit; }
if (byte==0x38)   { byte1=8; goto LabelInputnthDigit; }
if (byte==0x39)   { byte1=9; goto LabelInputnthDigit; }
if (byte==0x2e)  {  CommaSet=1;   return;  } //fix  if count =num 
return; 
  
LabelInputnthDigit:
 AppendDigitBufer(4, byte1); 
 
return;
}
 
 void InputParamValue(uint8_t byte ){
 
DecodeKeybNum(  byte );
 
return;
  
} 
 
 
uint8_t CheckOutBandLimits(uint8_t comma, uint8_t  maxfmcommapos)
{
if(comma>maxfmcommapos) {return 0; }

//if(GetValuefrom3Digits( tmpdigits[2], tmpdigits[1] , tmpdigits[0] )>maxnum_band) { return 1; } else  
{ if(comma>=maxfmcommapos) {return 0; } else   {return 1; } }

return 0 ; 	
}

/*
1 0 0 0     mV 
    ...
  1 0 1     mV  down   inc count,  digit[0]=0,  up dec count , digit[0]=1
1 0 0.0     mV  
    ...
  1 0.1     mV
1 0.0 0     mV
    ...
  1.0 1     mV    change mode 

1 0 0 0.    mkV (uV)
   ...
  1 0 1.    mkV
1 0 0. 0    mkV
  ...
  1 0. 1    mkV
1 0. 0 0    mkV   
  ...
  1. 0 1    mkV
1.0 0  0    mkV
...
0.1 0  0    mkV 
   
0.0 3  2    mkV  

*/







void NormOutmV()
{


uint8_t numbdig=(tmpcount-tmpcommapos);
uint8_t numbaftercomma =tmpcommapos;


#define ndigmax 4

 for (int  i=3;i>=0; i--) { printf ("  [ %d " , tmpdigits[i]) ;  if (tmpcommapos==i) {printf (".") ;}  printf ("]") ;   }
 printf("\n tmpcount=%d  tmpcommapos=%d , numbdig=%d , numb after=%d \n", tmpcount, tmpcommapos, numbdig , numbaftercomma ) ;
 
  
for(uint8_t i2=tmpcount; i2<4; i2++) { tmpdigits[i2]=0; } 
 
 
 for (uint8_t i=0;i<3;i++) {  
if (tmpdigits[3]==0) { tmpcommapos++; 
if(tmpcommapos>3) {tmpcommapos=3; } 
else { tmpdigits[3]=tmpdigits[2]; tmpdigits[2]=tmpdigits[1]; tmpdigits[1]=tmpdigits[0]; tmpdigits[0]=0;   tmpcount++;        }   }   
}

 for (int i=3;i>=0; i--) { printf ("  [ %d ", tmpdigits[i]);  if (tmpcommapos==i) {printf (".") ;}  printf ("]") ; }
printf("\n tmpcount=%d  tmpcommapos=%d , numbdig=%d , numb after=%d \n", tmpcount, tmpcommapos, numbdig , numbaftercomma ) ;
if  (tmpdigits[3]!=0)
{
if ((tmpdigits[3]>1)||(tmpdigits[2]!=0)||(tmpdigits[1]!=0)||(tmpdigits[0]!=0) ) 
  {

 if(tmpcommapos>0) {  tmpdigits[0]=tmpdigits[1];  tmpdigits[1]=tmpdigits[2];  tmpdigits[2]=tmpdigits[3];  tmpdigits[3]=0; tmpcommapos-=1;   tmpcount=3;   } 
 else {tmpdigits[0]=0;  tmpdigits[1]=0;  tmpdigits[2]=0;  tmpdigits[3]=1; tmpcommapos=0;  tmpcount=4;   }
  }
if (tmpcommapos==3) { tmpcommapos=0; tmpcount=4; printf ("Run  uV mode");   }
}

  


 
 for (int i=3;i>=0; i--) { printf ("  [ %d ", tmpdigits[i]);  if (tmpcommapos==i) {printf (".") ;}  printf ("]") ; }
//for (int i=tmpcount-1;i>=0; i--) { printf ("  [ %d ", tmpdigits[i]);  if (tmpcommapos==i) {printf (".") ;}  printf ("]") ; }
 printf("\n tmpcount=%d  tmpcommapos=%d , numbdig=%d , numb after=%d \n", tmpcount, tmpcommapos, numbdig , numbaftercomma ) ;
  for (int i=tmpcount-1;i>=0; i--) { printf ("  [ %d ", tmpdigits[i]);  if (tmpcommapos==i) {printf (".") ;}  printf ("]") ; }
 printf("\n tmpcount=%d  tmpcommapos=%d , numbdig=%d , numb after=%d \n", tmpcount, tmpcommapos, numbdig , numbaftercomma ) ;
 
return;
}


 

int main()

{
	
label1:	
	
uint8_t ch =0;

//reset after turn on new  mode or escape 
ResetCounters();

while(ch!=',')
{
char  ch1;
printf("\nInput char :"); 
scanf ("%s",  &ch1);
ch=(uint8_t) ch1 ;
InputParamValue(ch );	
	  
}

 NormOutmV();
 	
 goto label1;
 

return 0;

}
Добавлено через 3 минуты
нижний предел в линейном режиме 0,032 мкВ. в логарифмическом 149,9 (-дбВ (отн. 1 В) или ослабление относительно 1 В, дБ , если с плюсом ), приводит к формату 1 знак после запятой и от 1 до 3 знаков перед запятой , для программ в незначащих ячейках нули, но они не оторбражаются.

Добавлено через 20 минут
При инкременте от 100.0 мВ до 100.1 мВ происходит инкремент до 101. мВ и изменение количества знаков , а также шага (через 1 мВ вместо 0.1 мВ) , при возврате назад ручкой шаг остается инкрементированным на 1 позицию влево, его можно уменьшить кнопкой стрелки вправо , на других по аналогии , свыше 1000 мВ не вводится (ограничивается , или кажется, отбой при вводе ).

Добавлено через 8 минут
Условие перехода на микровольты для 1,000 мВ и меньше , нажатии мВ для напряжений меньше 1 мВ доработать .

Добавлено через 14 минут
Уточнить , нужен ли отбой ввода или округление на 1001 и больше мВ при вводе .
Для "микровольтного" режима во второй почти аналогичной программе другие ограничители снизу и переход на "милливольтную" ,если больше 1000 мкВ в микровольтах со смещением запятой .
Можно и две в одну с флажками ввести для компактности , но так сложнее для регистров, а так - для флэшки .
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
void NormOutmV()
{
 
 
uint8_t numbdig=(tmpcount-tmpcommapos);
uint8_t numbaftercomma =tmpcommapos;
 
 
#define ndigmax 4
 
 for (int  i=3;i>=0; i--) { printf ("  [ %d " , tmpdigits[i]) ;  if (tmpcommapos==i) {printf (".") ;}  printf ("]") ;   }
 printf("\n tmpcount=%d  tmpcommapos=%d , numbdig=%d , numb after=%d \n", tmpcount, tmpcommapos, numbdig , numbaftercomma ) ;
 
  
for(uint8_t i2=tmpcount; i2<4; i2++) { tmpdigits[i2]=0; } 
 
 
 for (uint8_t i=0;i<3;i++) {  
if (tmpdigits[3]==0) { tmpcommapos++; 
if(tmpcommapos>3) {tmpcommapos=3; } 
else { tmpdigits[3]=tmpdigits[2]; tmpdigits[2]=tmpdigits[1]; tmpdigits[1]=tmpdigits[0]; tmpdigits[0]=0;   tmpcount++;        }   }   
}
 
 for (int i=3;i>=0; i--) { printf ("  [ %d ", tmpdigits[i]);  if (tmpcommapos==i) {printf (".") ;}  printf ("]") ; }
printf("\n tmpcount=%d  tmpcommapos=%d , numbdig=%d , numb after=%d \n", tmpcount, tmpcommapos, numbdig , numbaftercomma ) ;
if  (tmpdigits[3]!=0)
{
if ((tmpdigits[3]>1)||(tmpdigits[2]!=0)||(tmpdigits[1]!=0)||(tmpdigits[0]!=0) ) 
  {
 
 if(tmpcommapos>0) {  tmpdigits[0]=tmpdigits[1];  tmpdigits[1]=tmpdigits[2];  tmpdigits[2]=tmpdigits[3];  tmpdigits[3]=0; tmpcommapos-=1;   tmpcount=3;   } 
 else {tmpdigits[0]=0;  tmpdigits[1]=0;  tmpdigits[2]=0;  tmpdigits[3]=1; tmpcommapos=0;  tmpcount=4;   }
  }
 
}
 
if  ((tmpdigits[3]<2 )&& (tmpcommapos==3))
{
    tmpcommapos=0; printf("\n\n Run Norm_mkV mode \n");
    NormOutmkV();
    
}
 
 
 for (int i=3;i>=0; i--) { printf ("  [ %d ", tmpdigits[i]);  if (tmpcommapos==i) {printf (".") ;}  printf ("]") ; }
//for (int i=tmpcount-1;i>=0; i--) { printf ("  [ %d ", tmpdigits[i]);  if (tmpcommapos==i) {printf (".") ;}  printf ("]") ; }
 printf("\n tmpcount=%d  tmpcommapos=%d , numbdig=%d , numb after=%d \n", tmpcount, tmpcommapos, numbdig , numbaftercomma ) ;
  for (int i=tmpcount-1;i>=0; i--) { printf ("  [ %d ", tmpdigits[i]);  if (tmpcommapos==i) {printf (".") ;}  printf ("]") ; }
 printf("\n tmpcount=%d  tmpcommapos=%d , numbdig=%d , numb after=%d \n", tmpcount, tmpcommapos, numbdig , numbaftercomma ) ;
 
return;
}
Для логарифмического режима отдельная программа , переключаются по флажку.

Программы нормализации для мВ и мкВ взаимосвязаны при перестройке .

Добавлено через 44 минуты
Дорабатывать условие для ввода 2000, 3000, ...

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
 for (int i=3;i>=0; i--) { printf ("  [ %d ", tmpdigits[i]);  if (tmpcommapos==i) {printf (".") ;}  printf ("]") ; }
printf("\n tmpcount=%d  tmpcommapos=%d , numbdig=%d , numb after=%d \n", tmpcount, tmpcommapos, numbdig , numbaftercomma ) ;
 
if(tmpcommapos>0) {
if  ((tmpdigits[3]!=0)&&((tmpdigits[3]>1)||(tmpdigits[2]!=0)||(tmpdigits[1]!=0)||(tmpdigits[0]!=0)) ){
tmpdigits[0]=tmpdigits[1];  tmpdigits[1]=tmpdigits[2];  tmpdigits[2]=tmpdigits[3];  tmpdigits[3]=0; tmpcommapos-=1;   tmpcount=3; 
//shift  
}}
 
 
if((tmpcommapos==0)&&(tmpdigits[3]!=0)) { 
if((tmpdigits[3]!=0)||(tmpdigits[2]!=0)||(tmpdigits[1]!=0)||(tmpdigits[0]!=0) ){
tmpdigits[0]=0;  tmpdigits[1]=0;  tmpdigits[2]=0;  tmpdigits[3]=1; tmpcommapos=0;  tmpcount=4;  
    //owerflow >1V,  input default value ( cancel )
}}
 
 
 
 
if  ((tmpdigits[3]<2 )&& (tmpcommapos==3))
{
    tmpcommapos=0; tmpcount=4;   printf("\n\n Run Norm_mkV mode \n");
//  NormOutmkV();  parse as  uV , fix  tmpcount, tmpcommapos  problem 
    
}
Добавлено через 12 минут
Устранить баг с количеством и цифр и запятой.
0
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
10.04.2020, 04:14  [ТС] 207
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
#include <stdio.h>
#include <stdint.h>
#include <math.h>
#include <conio.h>
typedef unsigned char byte;
 
 
 
uint8_t  tmpcount=0;
uint8_t  tmpdigits[7] ;
uint8_t  tmpcommapos=0;
uint8_t  CommaSet=0;
 
uint16_t GetValuefrom3Digits( uint8_t dig3, uint8_t dig2 , uint8_t dig1 )
{
uint16_t result=0;
for (uint8_t i=0;i<dig1;i++ ) { result+=1 ; } 
for (uint8_t i=0;i<dig2;i++ ) { result+=10; }
for (uint8_t i=0;i<dig3;i++ ) { result+=100; }
return result ; 
}
 
void ResetCounters ()
{   
 tmpcount=0;
 CommaSet=0;
 tmpcommapos=0; 
  tmpdigits[0]=0;
  tmpdigits[1]=0;
  tmpdigits[2]=0;
   tmpdigits[3]=0;
 
}
 void AppendDigitBufer( uint8_t numb,uint8_t byte1  )
 {
    
if(tmpcount< numb ) { 
for (uint8_t i=numb-1 ;i>=1; i-- ) {  tmpdigits[i]=tmpdigits[i-1];   } 
tmpdigits[0]=byte1; 
if (CommaSet==0) {tmpcommapos=0;} 
else { tmpcommapos+=1; if(tmpcount==0) { tmpdigits[1]=0;   tmpcount++; } } 
tmpcount++;
}
return;
}
 
 
 void DecodeKeybNum( uint8_t byte )
 {
uint8_t byte1=0; 
     
if (byte==0x30)   { byte1=0; goto LabelInputnthDigit;  } //emulating of the scancode  
if (byte==0x31)   { byte1=1; goto LabelInputnthDigit;  }
if (byte==0x32)   { byte1=2; goto LabelInputnthDigit;  } 
if (byte==0x33)   { byte1=3; goto LabelInputnthDigit ; }
if (byte==0x34)   { byte1=4; goto LabelInputnthDigit;  }
if (byte==0x35)   { byte1=5; goto LabelInputnthDigit; }
if (byte==0x36)   { byte1=6; goto LabelInputnthDigit ; }
if (byte==0x37)   { byte1=7; goto LabelInputnthDigit; }
if (byte==0x38)   { byte1=8; goto LabelInputnthDigit; }
if (byte==0x39)   { byte1=9; goto LabelInputnthDigit; }
if (byte==0x2e)  {  CommaSet=1;   return;  } //fix  if count =num 
return; 
  
LabelInputnthDigit:
 AppendDigitBufer(4, byte1); 
 
return;
}
 
 void InputParamValue(uint8_t byte ){
 
DecodeKeybNum(  byte );
 
return;
  
} 
 
 
uint8_t CheckOutBandLimits(uint8_t comma, uint8_t  maxfmcommapos)
{
if(comma>maxfmcommapos) {return 0; }
 
//if(GetValuefrom3Digits( tmpdigits[2], tmpdigits[1] , tmpdigits[0] )>maxnum_band) { return 1; } else  
{ if(comma>=maxfmcommapos) {return 0; } else   {return 1; } }
 
return 0 ;  
}
 
/*
1 0 0 0     mV 
    ...
  1 0 1     mV  down   inc count,  digit[0]=0,  up dec count , digit[0]=1
1 0 0.0     mV  
    ...
  1 0.1     mV
1 0.0 0     mV
    ...
  1.0 1     mV    change mode 
 
1 0 0 0.    mkV (uV)
   ...
  1 0 1.    mkV
1 0 0. 0    mkV
  ...
  1 0. 1    mkV
1 0. 0 0    mkV   
  ...
  1. 0 1    mkV
1.0 0  0    mkV
...
0.1 0  0    mkV 
   
0.0 3  2    mkV  
 
*/
 
 
 
void NormOutmV();
 
void NormOutmkV()
{
 
 
uint8_t numbdig=(tmpcount-tmpcommapos);
uint8_t numbaftercomma =tmpcommapos;
 
 
#define ndigmax 4
 
 for (int  i=3;i>=0; i--) { printf ("  [ %d " , tmpdigits[i]) ;  if (tmpcommapos==i) {printf (".") ;}  printf ("]") ;   }
 printf("\nmkv mode tmpcount=%d  tmpcommapos=%d , numbdig=%d , numb after=%d \n", tmpcount, tmpcommapos, numbdig , numbaftercomma ) ;
 
  
for(uint8_t i2=tmpcount; i2<4; i2++) { tmpdigits[i2]=0; } 
 
 
for (uint8_t i=0;i<3;i++) {  
if (tmpdigits[3]==0) {  tmpcommapos++; 
if(tmpcommapos>3) {tmpcommapos=3; }  
else { 
tmpdigits[3]=tmpdigits[2]; tmpdigits[2]=tmpdigits[1]; tmpdigits[1]=tmpdigits[0]; tmpdigits[0]=0;   
tmpcount++ ;  if(tmpcount>4 )  {tmpcount=4;} 
 
} }
     
}  
 for (int i=3;i>=0; i--) { printf ("  [ %d ", tmpdigits[i]);  if (tmpcommapos==i) {printf (".") ;}  printf ("]") ; }
printf("\nmkv mode tmpcount=%d  tmpcommapos=%d , numbdig=%d , numb after=%d \n", tmpcount, tmpcommapos, numbdig , numbaftercomma ) ;
 
if(tmpcommapos>0) {
if  ((tmpdigits[3]!=0)&&((tmpdigits[3]>1)||(tmpdigits[2]!=0)||(tmpdigits[1]!=0)||(tmpdigits[0]!=0)) ){
tmpdigits[0]=tmpdigits[1];  tmpdigits[1]=tmpdigits[2];  tmpdigits[2]=tmpdigits[3];  tmpdigits[3]=0; tmpcommapos-=1;   tmpcount=3; 
//shift 
}}
 
if((tmpcommapos==0)&&(tmpdigits[3]!=0)) {
 
if((tmpdigits[3]!=0)&((tmpdigits[2]!=0)||(tmpdigits[1]!=0)||(tmpdigits[0]!=0) )){
 tmpcommapos =3; tmpcount=4; 
 
 if (tmpdigits[0]!=0){ tmpdigits[1]+=1; tmpdigits[0] =0;  }
    printf("\n\n ***Run Norm_mV mode , change step step \n");
    //  step*=10 
   NormOutmV();   
    
    //owerflow >1mV
}} 
  
if  ((tmpdigits[3]==0 )&&(tmpdigits[2]==0)&&(tmpdigits[1]<=3)&&(tmpcommapos==3)){
if  ((tmpdigits[0]<3 ) || (tmpdigits[1]<3 )){
 
    tmpcommapos=3; tmpcount=4;   printf("\n\n Run 0.032 uV \n");
    tmpdigits[3]=0;tmpdigits[2]=0; tmpdigits[1]=3;   tmpdigits[0]=2;   
    
}}
 
 
 
 for (int i=3;i>=0; i--) { printf ("  [ %d ", tmpdigits[i]);  if (tmpcommapos==i) {printf (".") ;}  printf ("]") ; }
//for (int i=tmpcount-1;i>=0; i--) { printf ("  [ %d ", tmpdigits[i]);  if (tmpcommapos==i) {printf (".") ;}  printf ("]") ; }
 printf("\nmkv mode tmpcount=%d  tmpcommapos=%d , numbdig=%d , numb after=%d \n", tmpcount, tmpcommapos, numbdig , numbaftercomma ) ;
  for (int i=tmpcount-1;i>=0; i--) { printf ("  [ %d ", tmpdigits[i]);  if (tmpcommapos==i) {printf (".") ;}  printf ("]") ; }
 printf("\nmkv mode tmpcount=%d  tmpcommapos=%d , numbdig=%d , numb after=%d \n", tmpcount, tmpcommapos, numbdig , numbaftercomma ) ;
 
return;
}
 
  
 
 
 
void NormOutmV()
{
 
 
uint8_t numbdig=(tmpcount-tmpcommapos);
uint8_t numbaftercomma =tmpcommapos;
 
 
#define ndigmax 4
 
 for (int  i=3;i>=0; i--) { printf ("  [ %d " , tmpdigits[i]) ;  if (tmpcommapos==i) {printf (".") ;}  printf ("]") ;   }
 printf("\nmv tmpcount=%d  tmpcommapos=%d , numbdig=%d , numb after=%d \n", tmpcount, tmpcommapos, numbdig , numbaftercomma ) ;
 
  
for(uint8_t i2=tmpcount; i2<4; i2++) { tmpdigits[i2]=0; } 
 
 
for (uint8_t i=0;i<3;i++) {  
if (tmpdigits[3]==0) {  tmpcommapos++; 
if(tmpcommapos>3) {tmpcommapos=3; }  
else { 
tmpdigits[3]=tmpdigits[2]; tmpdigits[2]=tmpdigits[1]; tmpdigits[1]=tmpdigits[0]; tmpdigits[0]=0;   
tmpcount++ ;  if(tmpcount>4 )  {tmpcount=4;} 
 
} }
     
}  
/*
 for (uint8_t i=0;i<3;i++) {  
if (tmpdigits[3]==0) { tmpcommapos++; 
if(tmpcommapos>3) {tmpcommapos=3; } 
else { tmpdigits[3]=tmpdigits[2]; tmpdigits[2]=tmpdigits[1]; tmpdigits[1]=tmpdigits[0]; tmpdigits[0]=0;   tmpcount++;   }   }   
}
 
 
*/
 
 for (int i=3;i>=0; i--) { printf ("  [ %d ", tmpdigits[i]);  if (tmpcommapos==i) {printf (".") ;}  printf ("]") ; }
printf("\nmv mode tmpcount=%d  tmpcommapos=%d , numbdig=%d , numb after=%d \n", tmpcount, tmpcommapos, numbdig , numbaftercomma ) ;
 
if(tmpcommapos>0) {
if  ((tmpdigits[3]!=0)&&((tmpdigits[3]>1)||(tmpdigits[2]!=0)||(tmpdigits[1]!=0)||(tmpdigits[0]!=0)) ){
tmpdigits[0]=tmpdigits[1];  tmpdigits[1]=tmpdigits[2];  tmpdigits[2]=tmpdigits[3];  tmpdigits[3]=0; tmpcommapos-=1;   tmpcount=3; 
//shift 
}}
 
 
if((tmpcommapos==0)&&(tmpdigits[3]!=0)) { 
if((tmpdigits[3]!=0)||(tmpdigits[2]!=0)||(tmpdigits[1]!=0)||(tmpdigits[0]!=0) ){
tmpdigits[0]=0;  tmpdigits[1]=0;  tmpdigits[2]=0;  tmpdigits[3]=1; tmpcommapos=0;  tmpcount=4;  
    //if owerflow 1V , return (set default value 1000. mV )
}}
 
 
//if <=1.000 mV
if  ((tmpdigits[3]<2 )&&(tmpcommapos==3))
{
 
    tmpcommapos=0; tmpcount=4;   printf("\n\n ***Run Norm_mkV mode \n");
  // step/=10   
     NormOutmkV();
    
}
 
 
 for (int i=3;i>=0; i--) { printf ("  [ %d ", tmpdigits[i]);  if (tmpcommapos==i) {printf (".") ;}  printf ("]") ; }
//for (int i=tmpcount-1;i>=0; i--) { printf ("  [ %d ", tmpdigits[i]);  if (tmpcommapos==i) {printf (".") ;}  printf ("]") ; }
 printf("\nmv mode tmpcount=%d  tmpcommapos=%d , numbdig=%d , numb after=%d \n", tmpcount, tmpcommapos, numbdig , numbaftercomma ) ;
  for (int i=tmpcount-1;i>=0; i--) { printf ("  [ %d ", tmpdigits[i]);  if (tmpcommapos==i) {printf (".") ;}  printf ("]") ; }
 printf("\nmv mode tmpcount=%d  tmpcommapos=%d , numbdig=%d , numb after=%d \n", tmpcount, tmpcommapos, numbdig , numbaftercomma ) ;
 
return;
}
 
 
 
 
int main()
 
{
    
label1: 
    
uint8_t ch =0;
 
//reset after turn on new  mode or escape 
ResetCounters();
 
while(ch!=',')
{
char  ch1;
printf("\nInput char :"); 
scanf ("%s",  &ch1);
ch=(uint8_t) ch1 ;
InputParamValue(ch );   
      
}
 
 NormOutmkV();
    
 goto label1;
 
 
return 0;
 
}
Добавлено через 1 минуту
Устранить баги с шагом и "возбуждением" 1,000 мВ- 1000 мкВ, приделать правильное округление в "микровольтной" программе .
0
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
10.04.2020, 04:19  [ТС] 208
Приделать нормализацию, устранить баги с шагом , кодами, флажками, немного изменить взаимодействие подпрограмм .
0
Вложения
Тип файла: zip normalsubs_fix.zip (2.08 Мб, 6 просмотров)
Модератор
8195 / 6067 / 809
Регистрация: 14.02.2011
Сообщений: 21,034
10.04.2020, 08:44 209
Цитата Сообщение от USERPC01 Посмотреть сообщение
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void DecodeKeybNum( uint8_t byte )
 {
uint8_t byte1=0; 
if (byte==0x30)   { byte1=0; goto LabelInputnthDigit;  } //emulating of the scancode  
if (byte==0x31)   { byte1=1; goto LabelInputnthDigit;  }
if (byte==0x32)   { byte1=2; goto LabelInputnthDigit;  } 
if (byte==0x33)   { byte1=3; goto LabelInputnthDigit ; }
if (byte==0x34)   { byte1=4; goto LabelInputnthDigit;  }
if (byte==0x35)   { byte1=5; goto LabelInputnthDigit; }
if (byte==0x36)   { byte1=6; goto LabelInputnthDigit ; }
if (byte==0x37)   { byte1=7; goto LabelInputnthDigit; }
if (byte==0x38)   { byte1=8; goto LabelInputnthDigit; }
if (byte==0x39)   { byte1=9; goto LabelInputnthDigit; }
if (byte==0x2e)  {  CommaSet=1;   return;  } //fix  if count =num 
return; 
LabelInputnthDigit:
 AppendDigitBufer(4, byte1); 
return;
}
в чем сакральный смысл написания такого монстра, да еще и с гото, вместо минимального
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void DecodeKeybNum( uint8_t byte )
 {
uint8_t byte1=0; 
switch(byte)
 {
  case 0x30: //emulating of the scancode  
  case 0x31:
  case 0x32:
  case 0x33:
  case 0x34:
  case 0x35:
  case 0x36:
  case 0x37:
  case 0x38:
  case 0x39:
          AppendDigitBufer(4, byte1); 
          break;
 
case 0x2e:   //fix  if count =num 
         CommaSet=1;
}
 
}
0
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
10.04.2020, 20:32  [ТС] 210
Смысл в моделировании работы с аналогичными в программе МК типами данных и синтаксисом. Там switch-case сильно использует стек и медленно работает . А последовательно простые условия на сравнение компилируются подобно ассемблерным и используют минимум регистров . В компьютерной программе моделируется возможность совместимости с форматом данных , хотя там другие коды .

Добавлено через 3 часа 15 минут
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
 void DecodeGPIBNum( uint8_t byte )
 {
uint8_t byte1=0; 
     
if (byte==0x30)   { byte1=0; goto LabelInputnthDigit;  } //emulating of the scancode  
if (byte==0x31)   { byte1=1; goto LabelInputnthDigit;  }
if (byte==0x32)   { byte1=2; goto LabelInputnthDigit;  } 
if (byte==0x33)   { byte1=3; goto LabelInputnthDigit ; }
if (byte==0x34)   { byte1=4; goto LabelInputnthDigit;  }
if (byte==0x35)   { byte1=5; goto LabelInputnthDigit; }
if (byte==0x36)   { byte1=6; goto LabelInputnthDigit ; }
if (byte==0x37)   { byte1=7; goto LabelInputnthDigit; }
if (byte==0x38)   { byte1=8; goto LabelInputnthDigit; }
if (byte==0x39)   { byte1=9; goto LabelInputnthDigit; }
if (byte==0x2e)  {  CommaSet=1;   return;  } //fix  if count =num 
return; 
 
LabelInputnthDigit:
if((FlagMode&FREQ_BYTEMASK)!=0){ AppendDigitBufer(7, byte1);}
if((FlagMode&FM_BYTEMASK)!=0){   AppendDigitBufer(3, byte1);} 
if((FlagMode&AM_BYTEMASK)!=0){   AppendDigitBufer(2, byte1);} 
if((FlagMode&OUT_BYTEMASK)!=0){  AppendDigitBufer(4, byte1);}
 
return;
}
 
  void InputParamValueGPIB(uint8_t byte ){  //fix
//BlinkOff=1;
printf("\nInputParamValue() " ) ;
DecodeGPIBNum(  byte );
Flag[2]|=MASK_BLINK_OFF;
 
if((FlagMode&FREQ_BYTEMASK)!=0  ){Flag[2]|=MASK_FLAG_DISP_FREQ; }
if((FlagMode&FM_BYTEMASK)!=0 ){ Flag[2]|=MASK_FLAG_DISP_FM; } 
if((FlagMode&AM_BYTEMASK)!=0 ){ Flag[2]|=MASK_FLAG_DISP_AM; } 
if((FlagMode&OUT_BYTEMASK)!=0 ) { Flag[2]|=MASK_FLAG_DISP_OUT; }
return;
  
}
 
 
 
 
 
 
/* ********************* GPIB subroutines ************************* */
 
uint8_t GetGPIBByte ()
{
uint8_t char;
printf("\n Input byte GPIB");  //for evaluation , use GetByteLD() 
scanf("%c", &char);
return (uint8_t) char; 
} 
 
 
 
 
uint8_t  RegCmd1=0;
uint8_t  GPIBStack[10];
uint8_t  GPIBStackcount=0;
uint8_t  FlagGetComma=0;
uint8_t  FlagNextChar=1 ;  
uint8_t  FlagArgcount=0; 
 
 
 
 
void GetModeLFO_GPIB(uint8_t  mode_lf   )
{
 
if (mode_lf ==0x30) { SetFreqLFO_Num(0 );   return  ;     }
if (mode_lf ==0x31) { SetFreqLFO_Num(1 );    return  ;    }
if (mode_lf ==0x32) { SetFreqLFO_Num(2 );    return  ;    }
if (mode_lf ==0x33) { SetFreqLFO_Num(3 );    return  ;    }
if (mode_lf ==0x34) { SetFreqLFO_Num(4 );    return  ;    }
if (mode_lf ==0x35) { SetFreqLFO_Num(5 );    return  ;    }
if (mode_lf ==0x36) { SetFreqLFO_Num(6 );    return  ;    }
if (mode_lf ==0x37) { SetFreqLFO_Num(7 );    return  ;    }
if (mode_lf ==0x38) {    return  ;   }
if (mode_lf ==0x39) {    return  ;   } 
return  ;
}
 
 
 
 
uint8_t  DoOnNewByteGPIB ( )
{
 
 
uint8_t byte=GetGPIBByte (); 
//SendDataAcceptedStrobe();  //fix 
 
/* 'space' */
 if (byte==0x20)  {   return 0;   }
 
/*  ','  end of command */                 
 if (byte==0x2c) {  return 1;    } 
/*  '.'  */ 
 if (byte==0x2e) { goto  LabelPushToStackGPIB; }
/*  '0'...'9'   */ 
 if ((byte>=0x30)&&(byte<=0x39)) {  goto  LabelPushToStackGPIB;   }
/*0x22, A,B,C,D,E,F, H,I,K,L,M,N,O */
 if ( (byte==0x22)||(byte==0x49) || (byte==0x48) || ((byte>=0x41)&&(byte<=0x46)) ||((byte>=0x4B) &&(byte<=0x4F)))   
{  goto  LabelPushToStackGPIB; }
 
 return 0; 
 
LabelPushToStackGPIB:
//[A][1][2][3][.][4][5][6][7]  9 chars max without 'space' and ','
if (GPIBStackcount>=9)  {   return 0;  }  /*  if  "stack"   overflow    */
 
GPIBStack[GPIBStackcount]=byte;  printf("\n Push byte to  stack  %c, n=%d  ", GPIBStack[StackBytesCount], StackBytesCount  );
GPIBStackcount+=1; 
 return 0; 
}
 
 
 
 
/* *********************** */
 
#define MODE_F 0x01  //0x01
#define MODE_FM 0x02 //0x02
#define MODE_AM 0x04 //0x04
#define MODE_PM 0x08 //0x08
#define MODE_MOD_OFF 0x10 //0x10
#define MODE_OUT 0x20 //0x20 
#define MODE_PREP_EXT_MOD 0x40 //0x40 
#define MODE_PRESETLFQ  0x80
 
void SetFlagsGetArgsWithDot()
{
FlagGetComma=1; FlagNextChar=1 ;   Argcount=0; 
}
 
void SetFlagsGetArgsNoDot()
{
FlagGetComma=0; FlagNextChar=1 ;   Argcount=0; 
}
 
 
void SetFlagsNoArgs()
{
FlagGetComma=0; FlagNextChar=0 ;   Argcount=0; 
}
 
 
void CheckMaxNumDigStack(){
uint8_t numdig=0;
if(RegCmd1==MODE_OUT) {   numdig=4; }
if(RegCmd1==MODE_F) {   numdig=7; }
if(RegCmd1==MODE_FM) {   numdig=3; }
if(RegCmd1==MODE_AM) {   numdig=2; }
 
if (Argcount>=numdig) { SetFlagsNoArgs(); }
 
}
 
void InputDigitsGPIB()
{
if (RegCmd1==MODE_PRESETLFQ)  { GetModeLFO_GPIB(stackbyte);   RegCmd1=0;   FlagNextChar=0; return; } 
if (RegCmd1==MODE_OUT) {  printf(" out "); ResetCounters() ; OutputOn(); SetDutyRegOut();RegCmd1= 0;     } 
CheckMaxNumDigStack();
if (FlagNextChar==1) {     InputParamValue( stackbyte );  Argcount+=1;   return;   }
}
 
 
void ParseCommand(uint8_t    stackbyte)
{
 
/* '0'...'9' */
if ((stackbyte>=0x30)&&(stackbyte<=0x39)) {
InputDigitsGPIB();
return; 
}
 
 
/* A      freq  , for example "A520.100,B80." or "A520.100," <=7 digits + comma */
if(stackbyte==0x41) {  SetFlagsGetArgsWithDot(); RegCmd1=MODE_F;   
ResetCounters() ;  SetDutyRegF_gpib();      return; }
 
 
/* C    end of  NB, NC,    begin of CE         , FM, kHz , <=3  digits  */  
if(stackbyte==0x43){  SetFlagsGetArgsWithDot();  RegCmd1=MODE_FM;
 printf(" fm  ");  /* ResetCounters() ;  TurnOnFM (); SetDutyRegFM();  */
return;  }
 
/* B    end of  NB, NC,    begin of BE        AM,% for example  "B80." or "B80," , <=2 digits */
if(stackbyte==0x42){  SetFlagsGetArgsWithDot();  RegCmd1=MODE_AM;
printf(" AM  "); /* ResetCounters() ; TurnOnAM(); SetDutyRegAM(); */
return;  }
 
/* D   PM on ; off for ND  */
if(stackbyte==0x44){  SetFlagsNoArgs(); RegCmd1=0;  printf(" pm  "); ResetCounters() ; TurnOnPM(); SetDutyRegPM(); return; }
 
 
/* E  PM off, end for BE,CE */
if(stackbyte==0x45){ SetFlagsNoArgs(); ResetCounters() ; TurnOffModulation();     RegCmd1=0;   return;  }
 
 
/* N , for example "NB,","NB20,",  "NС,","ND" ,"NC100,"  */
if(stackbyte==0x4e){ SetFlagsGetArgsWithDot();        RegCmd1=MODE_PREP_EXT_MOD;   PrepExtMod=0; 
//PrepareExtModulation () ;    
return;  }   
 
 
/* H  6 dB off        */     
if(stackbyte==0x48){ SetFlagsNoArgs();  RegCmd1=0;      printf(" +6dB   ");  TurnOff6dB();  return; }
 
 /* L           output, mV, <=3.5 digits + comma  , as Output */
if((stackbyte==0x4C)||(stackbyte==0x22)){  SetFlagsGetArgsWithDot(); RegCmd1=MODE_OUT; 
printf(" mV   ");  /* SetOutEnterMode(TOKEN_Out_mV);   */
return; }
 
/* M  , for example,"M10.00,"  as Output  */                
if(stackbyte==0x4D){   SetFlagsGetArgsWithDot();
RegCmd1=MODE_OUT;    
printf(" uV   "); /* SetOutEnterMode( TOKEN_Out_mkV ); */ 
 return; }
 
/*  K   turn on output , if  only K , turn on output , as Output */ 
if(stackbyte==0x4B){  SetFlagsGetArgsWithDot();
 RegCmd1=MODE_OUT ;    
 printf(" -dBV , turn on output   "); /* SetOutEnterMode(TOKEN_Out_dB); */                                   
return; } //fix
 
/* O   turn on 6 dB  */
if(stackbyte==0x4F){ SetFlagsNoArgs();    RegCmd1=0;      printf(" +6dB   ");  TurnOn6dB();  return; }  
 
 /* F   F internal ,for example "F1,"  */
if(stackbyte==0x46){  SetFlagsGetArgsNoDot(); RegCmd1=MODE_PRESRETLFQ;   return; }
 
 /* I   turn off output */
if(stackbyte==0x49) { SetFlagsNoArgs();  RegCmd1=0;   printf(" out off  ");  OutputOff();  return;}                 
 
SetFlagsNoArgs();  RegCmd1=0;     //fix
 
return; 
}
 
 
 
void ReadStackCMD()
{
if(GPIBStackcount!=0){for (uint8_t nstack=0 ; nstack<GPIBStackcount ; nstack++ ) { ParseCommand( GPIBStack[nstack]); } }
for (uint8_t nstack=0 ; nstack<9 ; nstack++ )  { GPIBStack[nstack]=0; }
GPIBStackcount=0;
return;  //goto point 1 
}
Добавлено через 3 минуты
Некоторые соображения на тему декодера КОП и стека , байты вводить в терминах положительной логики ( принимая биты с последовательной ЛД (внутренняя последовательная с платы адаптера КОП , коммутация мультиплексора на соответствующий вход платы ЭВМ ) их инвертировать при дополнении ими байта ).

Добавлено через 1 час 51 минуту
Добавить обработчик нормализации частоты в кГц (через шаг или через адаптивный к положению запятой и числу цифр сдвиг и изменение положения запятой с последующей нормализацией как частота в МГц или отдельный обработчик) , фильтрацию команды осуществлять в программе обработки скан-кодов по флажку режима частоты для кнопки кГц .
Код
       99 kHz отбой набора, предыдущее значение частоты на табло 
     100,1 кГц 0,1001  МГц
     100    kHz 0.1000  MHz
   273.1  kHz  0.2731 MHz
    1001 kHz   1.0010 MHz
   1001.2 kHz 1.0012 MHz
  10000 kHz 10.0000 MHz
100000 kHz 100.0000 MHz * (может ли? кажется, может )

В инструкции немного иначе сказано , возможно есть альтернативные возможности сделать это компактнее или эффективнее, удовлетворяющие требованиям инструкции .
0
Модератор
8195 / 6067 / 809
Регистрация: 14.02.2011
Сообщений: 21,034
10.04.2020, 20:37 211
Цитата Сообщение от USERPC01 Посмотреть сообщение
с аналогичными в программе МК типами данных и синтаксисом. Там switch-case сильно использует стек и медленно работает .
Позволю не согласиться
все реальные программы использовали таблицу переходов, в результате быстордействие одинаковое для всех веток, в отличии от кучи if, где быстродействие зависит от значения
0
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
11.04.2020, 02:25  [ТС] 212
Правильный ли смысл на диаграмме блока "Режим Шаг ? если нет , то Смена дискрета изменения параметров", лист 10 ?

Там, судя по выражению, обработчик кнопок влево - вправо , если режим шаг выключен (IncStep(), DecStep() )?
При решиме Шаг вкл. кнопки инкрементируют-декрементируют частоту на 1 шаг (с отсальными величинами, кажется не работает или только по валкодеру в мигающем разряде на 1 ( для ЧМ 1 или 5) меняет ).

Тогда обработчик инкремента - декремента на 1 на шаг мигающего разряда по валкодеру в начале (когда нет сообщений) ? Можно и после обработки прерывания 1 отдельной программой засунуть .

Добавлено через 2 часа 44 минуты
Обработчик декремента- инкремента может быть следующий (нужно ввести в программе для режимов ЧМ,АМ, выхода и частоты обработчики переполнения при инкременте и декременте со сдвигом цифр и запятой и последующей нормализацией ):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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
//setstep.h
//#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>
 
extern uint8_t tmpdigits[8];
/* ************************ */
uint8_t  StepDigit(uint8_t i)
{
 if((i==0)&&((FlagMode&0x02)!=0)){  if(i==StepDig) {return 0x05 ;} else  {return 0x00 ;}   }
 if(i==StepDig) {return 0x01 ;} else  {return 0x00 ;} 
    
}
void IncParamOneStep(){ printf("\n Increment    : Param +=StepDigit(%d)  " , StepDig) ; 
uint8_t nmax=7; //2, 1 
 if((FlagMode&0x01)!=0  ) { nmax=7;  }
 if((FlagMode&0x02)!=0 ) { nmax=3;  }
 if((FlagMode&0x04)!=0 ) { nmax=2;  }
 if((FlagMode&0x20)!=0 ) { nmax=4;  }
 
printf ("\n ;");   for(int i=nmax-1 ;  i>=0 ; i-=1 )  { printf (" %d" ,  (int)tmpdigits[i]);  }
for (uint8_t i=0; i<(uint8_t)nmax  ;i++) { tmpdigits[i]+= StepDigit(i);  if (tmpdigits[i]>9){ tmpdigits[i+1]+=1;  tmpdigits[i]-=10; }  }
printf ("\n ;"); 
for(int i=nmax-1; i>=0 ; i-=1 )  { printf (" %d" ,  (int)tmpdigits[i]);  }
 
}
/* ************************ */
 
void DecParamOneStep(){
 printf("\n Decrement  : : Param -=StepDigit(%d)  " , StepDig) ; 
 
uint8_t nmax=7; //2, 1 
 if((FlagMode&0x01)!=0  ) { nmax=7;  }
 if((FlagMode&0x02)!=0 ) { nmax=4;  }
 if((FlagMode&0x04)!=0 ) { nmax=2;  }
 if((FlagMode&0x20)!=0 ) { nmax=4;  }
printf ("\n ;param=");  for(int i=nmax-1; i>=0 ; i-=1 )  { printf (" %d" ,  (int)tmpdigits[i]);  }
  
uint8_t borrow =0;
for (uint8_t i=0;i< nmax ; i++) {  
if(tmpdigits[i]>=(StepDigit(i) +borrow)){ tmpdigits[i]-=(StepDigit(i) +borrow); borrow=0; } 
else { tmpdigits[i] +=((10-borrow)-StepDigit(i) ) , borrow=1; }
}
 printf ("\n ;param= ");
for(int i=nmax-1;  i>=0 ; i-=1 )  { printf (" %d" ,  (int)tmpdigits[i]);  }
 
}
 
/*   ****************** */
 
void IncStep(){
uint8_t StepMax1=7; //2, 1 
 if((FlagMode&0x01)!=0  ) { StepMax1=6;  }
 if((FlagMode&0x02)!=0 ) { StepMax1=2;  }
 if((FlagMode&0x04)!=0 ) { StepMax1=1;  }
 if((FlagMode&0x20)!=0 ) { StepMax1=3;  }
 StepDig +=1; 
if(StepDig>=StepMax1)   {StepDig =StepMax1; }
printf("\nIncStep: StepDig=%d  " ,(int)StepDig) ; 
 
}
 
void DecStep(){
if (StepDig>0) {StepDig -=1; } else { StepDig =0; }
printf("\nDecStep : StepDig=%d  " ,(int)StepDig ) ; 
}
/* ************************ */
void ChangeFreqOneStep(uint8_t scancode1 ){   
printf("\nInc freq : Freq+=Step " ) ;  
printf ("  ; step=");  for(int i=7; i>=0 ; i-=1 )  { printf (" %d" ,  (int)Step[i]);  }
uint8_t nmax=7; //2, 1 
if( scancode1==(uint8_t)BUTTON_LEFT )  { printf(" <  ");  Reverse= 0;    }
if( scancode1==(uint8_t)BUTTON_RIGHT ) { printf(" > ");   Reverse= 1;    }
 
tmpcount=7;
 
if(Reverse==0){ for (uint8_t i=0; i<(uint8_t)nmax ;i++) { tmpdigits[i]+=(Step[i] ); if (tmpdigits[i]>9){ tmpdigits[i+1]+=1;  tmpdigits[i]-=10; }  } }
else 
{  
 
uint8_t borrow =0;  
for (int i=0; i<=nmax ; i++) {  if(tmpdigits[i]>=(Step[i]+borrow) ){ tmpdigits[i]-=(Step[i]+borrow); borrow=0; } 
else { tmpdigits[i] +=((10-borrow)-Step[i]) , borrow=1; }}
 
}
}
 
void ChangeValueOneStepOnEncoder()
{
 
if(Reverse==0) {  IncParamOneStep(); }  else  {  DecParamOneStep(); }
return; 
}
 
void ChangeStepParam(uint8_t  scancode ){  //printf("\nChange  Param : inc/dec one Step :" ) ; 
 
 
 
if( scancode==(uint8_t) BUTTON_LEFT )  { printf(" Change  Param : inc/dec one Step : <  ");  Flag[0]|=MASK_FLAG_INC_STEP;  return;  }
if( scancode==(uint8_t) BUTTON_RIGHT ) { printf(" Change  Param : inc/dec one Step : > ");   Flag[0]|=MASK_FLAG_DEC_STEP;  return;  }
  
  //ChangeValueOneStepOnEncoder();
return;
 
}
Добавлено через 48 секунд
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
void SetDutyRegF(){  FlagMode =TOKEN_F;  StepMode=0;    Flag[2] |=MASK_FLAG_DISP_FREQ| MASK_FLAG_BLINK_CODE; ResetCounters() ;  printf("SetDutyReg : DutyReg=0x%.02x  ",(int)FlagMode ) ;  return;  }   
void SetDutyRegFM(){ FlagMode =TOKEN_FM; StepMode=0;    Flag[2] |=MASK_FLAG_DISP_FM| MASK_FLAG_BLINK_CODE;    ResetCounters() ;printf("SetDutyReg : DutyReg=0x%.02x  ",(int)FlagMode ) ;  return;  }    
void SetDutyRegAM(){ FlagMode =TOKEN_AM; StepMode=0;    Flag[2] |=MASK_FLAG_DISP_AM| MASK_FLAG_BLINK_CODE; ResetCounters() ; printf("SetDutyReg : DutyReg=0x%.02x  ",(int)FlagMode ) ;  return;  }  
void SetDutyRegPM(){ FlagMode =TOKEN_PM; StepMode=0;    Flag[3] |=MASK_FLAG_MODE| MASK_FLAG_STATICCMD;  ResetCounters() ; printf("SetDutyReg : DutyReg=0x%.02x  ",(int)FlagMode ) ;  return;  } 
void SetDutyRegOut(){ FlagMode =TOKEN_OUT; StepMode=0;  Flag[2] |=MASK_FLAG_DISP_OUT| MASK_FLAG_BLINK_CODE  ;  ResetCounters() ; printf("SetDutyReg : DutyReg=0x%.02x  ",(int)FlagMode ) ;  return;  }  
void SetDutyRegModOff(){ FlagMode =TOKEN_MOD_OFF;  StepMode=0;  Flag[2] |=MASK_FLAG_TURN_OFF ;   ResetCounters() ;  printf("SetDutyReg : DutyReg=0x%.02x  ",(int)FlagMode ) ;  return;  }   
 
 
 
void ParseButtonsOut( uint8_t scancode1 )
{
 if( scancode1==(uint8_t)BUTTON_mV ) { printf(" mV   ");  SetOutEnterMode(TOKEN_Out_mV);  return;} //;   15_2  
 if( scancode1==(uint8_t)BUTTON_mkV ) { printf(" uV   "); SetOutEnterMode( TOKEN_Out_mkV );  return;}//;   15_2 
 if( scancode1==(uint8_t)BUTTON_dBV ) { printf(" -dBV   ");SetOutEnterMode(TOKEN_Out_dB);  return;} //;   15_2  
return; 
    
}
 
 
void ParseButtonsFreq_FM_AM(uint8_t scancode1)
{
if( scancode1==(uint8_t)BUTTON_MHz ) { printf(" MHZ   "); NormalizeFreq(); return; }//;  10  
 
if( scancode1==(uint8_t)BUTTON_kHz ) {  
if((FlagMode&BUTTON_F )==0)  { printf("    kHZ   "); NormalizeFreqkHz();   } 
else { printf(" kHz   ");  if (CheckStepModeOn()!=0){ NormalizeStep();  return; } else { NormalizeFM();  return;} } 
 
}//;  macro,  13_2 or to 1 
if( scancode1==(uint8_t)BUTTON_PERCENT ) { printf(" %%   ");    NormalizeAMCoef(); return; }  //;   14_2    
return; 
}
  //LabelPoint8:
 
 
 
void ParseCode( uint8_t scancode1)
{
//;        8_1  
 printf("\ncall ParseKeyb ,FlagMode=%x" ,(int)FlagMode   );
 
 
uint8_t scancode =( scancode1&BITMASK_KEYBOARD);
 printf ("\nKeyb Byte    = 0x%.02x  **\n",scancode);
 
if( scancode==(uint8_t) BUTTON_OUT_OFF ) {   printf(" out off  ");  OutputOnOff(); Flag[3]|=MASK_FLAG_MODE|MASK_FLAG_ATT_CODE;  return  ; } 
 
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_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((FlagMode&OUT_BYTEMASK)==0){ ParseButtonsFreq_FM_AM( scancode);} else { ParseButtonsOut( scancode  );  }
if(scancode==(uint8_t)BUTTON_6dB ) {  printf(" +6dB   ");    TurnOn6dB();   return; }//;   11  
//CaseDefault: 
if(StepMode==1) {  printf(" if step mode  "); ChangeFreqOneStep(scancode) ;   NormalizeFreq(); return; }   ;//  12_3,   
ChangeStepParam(scancode);       
 
 
scancode=0;
 
  return ; //to point1             
}
 
/* ******************** */
 
    
 
 
void ParseInterrupts()
{
LabelPoint2:
 printf("\nParse Interrupts , point2 ");
//;   2     
// AnalyseInterrupt_InputData() ;
 
 
if((IntFlags==INTERUPT3_BYTEMASK) ) {   IntFlags=0;   ParseGPIBByte(); FlagMode=0;    return;  } //;   goto LabelPoint7 
if((IntFlags==INTERUPT2_BYTEMASK) ) {   IntFlags=0;  uint8_t scancode=(uint8_t)GetScanCodeValue() ;   ParseCode(scancode) ;     return; } //;     LabelPoint8
 
// if int1 
IntFlags=0;   IntFlags=0;  uint8_t scancode=(uint8_t)  GetScanCodeValueEncoder() ;  
if( scancode==0)  {  Reverse=0; } else {  Reverse=1; }
  ChangeValueOneStepOnEncoder();  
 
 
 
 //if int 1
 if((FlagMode&FREQ_BYTEMASK)!=0  ) {  NormalizeFreq()  ;    return;    /* 12_1 */      }//  
 if((FlagMode&FM_BYTEMASK)!=0 ) { NormalizeFM()  ;       return; /*  13_1 */      } 
 if((FlagMode&AM_BYTEMASK)!=0 ) { NormalizeAMCoef() ;       return; /*  14_1 */      }  
 
 
 
NormalizeOutput1();  
 
/* 15_1 */
return;
}
 
 
 
/* *********************** */
 
 
uint8_t selectedflag=0;
uint8_t selectedreg=0;
 
 
void CheckFlags1(){
 
 //if Flag 0 Flag0&=0xff 
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[0]&MASK_FLAG_INC_STEP)!=0) { IncStep();  selectedflag= MASK_FLAG_INC_STEP; selectedreg=0;   return   ; } //3 
if((Flag[0]&MASK_FLAG_DEC_STEP)!=0) { DecStep();  selectedflag= MASK_FLAG_DEC_STEP; selectedreg=0;   return     ; } 
 
if((Flag[2]&MASK_FLAG_TURN_OFF)!=0) { TurnOffUnusedModes(); selectedflag= MASK_FLAG_TURN_OFF;  selectedreg=2; return ;  }   
if((Flag[2]&MASK_FLAG_DISP_ERROR)!=0) { DisplayErrorFM();   selectedflag= MASK_FLAG_DISP_ERROR;  selectedreg=2;     return ; }
if((Flag[2]&MASK_FLAG_DISP_FM)!=0)  { DisplayFMValue();     selectedflag= MASK_FLAG_DISP_FM ;   selectedreg=2;       return ;  }
if((Flag[2]&MASK_FLAG_DISP_AM)!=0) { DisplayAMValue();      selectedflag= MASK_FLAG_DISP_AM;   selectedreg=2;       return ;  }
if((Flag[2]&MASK_FLAG_DISP_OUT)!=0) { DisplayOutValue();    selectedflag= MASK_FLAG_DISP_OUT;  selectedreg=2;    return ; }
if((Flag[2]&MASK_FLAG_DISP_FREQ)!=0) { DisplayFreqValue();  selectedflag= MASK_FLAG_DISP_FREQ ;  selectedreg=2;   return   ; }
if((Flag[2]&MASK_BLINK_OFF)!=0)  {   SendBlinkOff();  selectedflag= MASK_BLINK_OFF; selectedreg=2; return  ; } //4
if((Flag[2]&MASK_FLAG_BLINK_CODE)!=0)  { SendBlinkCode(); selectedflag= MASK_FLAG_BLINK_CODE; selectedreg=2; return  ; }
 
 
if((Flag[3]&MASK_FLAG_MODE)!=0)  { SendModeCodes();  selectedflag=MASK_FLAG_MODE; selectedreg=3; return   ; }
if((Flag[3]&MASK_FLAG_STATICCMD)!=0)  { SendStaticCommands();   selectedflag=MASK_FLAG_STATICCMD; selectedreg=3;  return   ; }
if((Flag[3]&MASK_FLAG_LFO)!=0)  {  SendLFOCodes();   selectedflag=MASK_FLAG_LFO; selectedreg=3;  return   ; }
if((Flag[3]&MASK_FLAG_FM_CODE)!=0) { SendFMCodes();  selectedflag=MASK_FLAG_FM_CODE;  selectedreg=3;    return  ; }
if((Flag[3]&MASK_FLAG_AM_CODE)!=0)  { SendAMCodes();  selectedflag=MASK_FLAG_AM_CODE; selectedreg=3; return   ;}
 
if((Flag[3]&MASK_FLAG_ATT_CODE)!=0) {SendAttCodes();  selectedflag=MASK_FLAG_ATT_CODE; selectedreg=3;  return ; } //5
if((Flag[3]&MASK_FLAG_HFO_CODE)!=0) { SendHFOCodes();  selectedflag=MASK_FLAG_HFO_CODE; selectedreg=3;     return ; }
if((Flag[3]&MASK_FLAG_DVDC_CODE)!=0)  { SendDVDCCodes(); selectedflag=MASK_FLAG_DVDC_CODE;  selectedreg=3; 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
FlagMode=  TOKEN_F;  
Flag[0]=0; 
Flag[1]=0; 
Flag[2]=0;
Flag[3]=0;//MASK_FLAG_LFO;
 //SetDutyRegF();   
 
}
 
 
void  main_sub ()
{
cli();   
InitStruct();
InitFlags();
  
LabelPoint1:
 
 
if((Flag[0]!=0)||(Flag[1]!=0)|| (Flag[2]!=0)|| (Flag[3]!=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  ;
}
Добавлено через 2 часа 15 минут
http://www.cplusplus.com/refer... g/memmove/ бывает и с memmove, но там тип перегруженный(у нас нужен однобайтный, занимающий 1 байт в памяти ).

Добавлено через 6 секунд
http://www.cplusplus.com/refer... g/memmove/ бывает и с memmove, но там тип перегруженный(у нас нужен однобайтный, занимающий 1 байт в памяти ).
0
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
11.04.2020, 18:39  [ТС] 213
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
void NormOut_minusdBV()
{
uint8_t numbdig=(tmpcount-tmpcommapos);
uint8_t numbaftercomma =tmpcommapos;
   for (int i=tmpcount-1;i>=0; i--) { printf ("  [ %d ", tmpdigits[i]);  if (tmpcommapos==i) {printf (".") ;}  printf ("]") ; }
 printf("\n-dBv mode tmpcount=%d  tmpcommapos=%d , numbdig=%d , numb after=%d \n", tmpcount, tmpcommapos, numbdig , numbaftercomma ) ;
uint8_t tmparray[4];
 
    
  if(tmpcommapos+2<4){  tmparray[3]=tmpdigits[tmpcommapos+2];} else {tmparray[3]=0;}
  if(tmpcommapos+1<4){  tmparray[2]=tmpdigits[tmpcommapos+1];} else {tmparray[2]=0;}
  tmparray[1]=tmpdigits[tmpcommapos];
  if(tmpcommapos!=0) { tmparray[0]=tmpdigits[tmpcommapos-1];} else   {tmparray[0]=0;}
  tmpcommapos=1; tmpcount=4; 
  
 if ((tmparray[3]>=1)&& ((tmparray[2]>4)||(tmparray[3]>1))) { tmparray[3]=1; tmparray[2]=4; tmparray[1]=9; tmparray[0]=9;   tmpcommapos=1; tmpcount=4;    }
 if(tmparray[3]==0){ if (tmparray[2]==0){ tmpcount=2; } else { tmpcount=3; }}
 for(uint8_t i=0;i<4;i++){tmpdigits[i]=tmparray[i]; }
 
 
  
   for (int i=tmpcount-1;i>=0; i--) { printf ("  [ %d ", tmparray[i]);  if (tmpcommapos==i) {printf (".") ;}  printf ("]") ; }
 printf("\n-dBV mode tmpcount=%d  tmpcommapos=%d , numbdig=%d , numb after=%d \n", tmpcount, tmpcommapos, numbdig , numbaftercomma ) ;  
}
Добавлено через 27 минут
Особенности отбоя набора при вводе с клавиатуры ослабления свыше 149.9 дБ еще уточняются , но при уменьшении уровня
в логарифмическом свыше -149,9 дБВ (минус краской написан на передней панели, показывается только число ) и изменении других величин до значений свыше граничных по инкременту/декременту происходит подстановка дефолтных граничных значений вместо результата (дальше не изменяется). Особенность индикации запятых при наборе и после нормализации в оригинальном изделии немного другая , в нашей программе еще оптимизируется (там баги с индикацией , пока смоделировать на консольной программе на Си++ , правильно ввести переход на следующий предел при переполнении по инкременту/декременту , доработать переключение режимов, индикацию, отправку кодов.
0
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
15.04.2020, 22:02  [ТС] 214
Дорабатывать программу, используя следующие правила.
При вводе частоты максимальный мигающий разряд единицы мегагерц до 160 МГц и десятки мегагерц начиная с 160 МГц.
При включении режима в начале мерцающий разряд единиц мегагерц в числе 100.0000 МГц.
Максимальный мигающий разряд АМ (0 % по умолчанию и гашение незначащего нуля в старшем разряде ) всегда единицы процентов.
Округление последнего разряда ЧМ : при вводе цифры 0...2 вводится 0 , при вводе 3...7 вводится 5, при вводе 8...9 вводится 0 и добавляется единица в соседнем разряде.
При включении ЧМ максимальный мерцающий разряд 3 цифра слева, число 0.00 кГц.
Мерцающий по умолчанию разряд ЧМ - 3 цифра слева от младшего разряда.
При наборе ЧМ больше допустимой для частоты происходит отбой и воостановление предыдущего введенного значения (из структуры).
При наборе больше 995 кГц набирается 995 кГц для частот с максимальной девиацией 995 кГц.
При перестройке частоты , например 40->39 MHz , например , для девиации 60...100 кГц в зоне ЧМ появляются 3 проччерка,
если перестроить обратно валкодером 39->40 MHz, восстанавливается введенное (например, 60...100 кГц) значение ,если на 39 МГц при этом нажать режим ЧМ , вместо прочерков записывается максимальное для режима значение ЧМ ( для 39 МГц - 50 кГц).
Максимальная набираемая ЧМ на диапазоне до 100 кГц - 125 кГц.
При наборе запятая во всех режимах высвечивается в крайнем правом разряде справа до нажатия запятой.
Максимальный мигающий разряд выхода третий , начиная с крайнего правого (предпоследний старший).
"Юстификция" цифр правая (младший разряд всегда крайний правый).
После включения выхода включается мерцание во втором справа разряде.
При наборе 1001 мкВ...1009 мкВ происходит отбой,
при наборе , например , 2009 мкВ происходит отбой , при двойке набираются не более 3 цифр.
При наборе свыше 1000 мВ происходит отмена набора , восстановление предыдущего значения.
При наборе менее 0.032 мкВ происходит отбой набора .
При наборе ослабления свыше 149.9 дБ происходит отбой.
При увеличении валкодером на единицу младшего разряда , например , 100.0 мВ происходит переключение на 101 мВ и гашение нуля слева, при уменьшении 101 мВ на единицу выводится 100.0 мВ и переключается запятая.
При увеличении на 1 1000 мкВ включаетя режим мВ и отображается 1.01 мВ, при уменьшении 1.01 мВ включается режим мкВ и выводится 1000 мкВ.
После нажатия "Шаг" выводится 0.0 кГц, если еще раз нажать шаг, то отображается частота с выключенным мерцанием до выбора режима.
При вводе шага с клавиатуры после нажатия "Шаг "и завершения через "кГц" максимальный шаг 999,9 кГц,
при наборе 1 кГц и нажатии кГц устанавливается 1,0 кГц, при вводе шага 100 кГц вводится шаг 100.0 кГц.
После ввода шага он запоминается и д включения режимов (частоты ,выхода, модуляции ) отключено мерцание,
управление кнопками влево, вправо уменьшает/увеличивает частоту на значение шага в пределах 0,1000-639,999 МГц.
При выключении модуляции включается режим частоты и мерцание (например в единицах мегагерц).

При наборе частоты в килогерцах максимальное значение 1599999 кГц , при наборе в килогерцах частоты свыше 160 МГц происходит отмена набора и восстановление предыдущего удачно введенного значения частоты.

Добавлено через 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
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
#include <stdio.h>
#include <stdint.h>
#include <math.h>
#include <conio.h>
typedef unsigned char byte;
 
 
 
uint8_t  tmpcount=0;
uint8_t  tmpdigits[7] ;
uint8_t  tmpcommapos=0;
uint8_t  CommaSet=0;
 
uint16_t GetValuefrom3Digits( uint8_t dig3, uint8_t dig2 , uint8_t dig1 )
{
uint16_t result=0;
for (uint8_t i=0;i<dig1;i++ ) { result+=1 ; } 
for (uint8_t i=0;i<dig2;i++ ) { result+=10; }
for (uint8_t i=0;i<dig3;i++ ) { result+=100; }
return result ; 
}
 
void ResetCounters ()
{   
 tmpcount=0;
 CommaSet=0;
 tmpcommapos=0; 
  tmpdigits[0]=0;
  tmpdigits[1]=0;
  tmpdigits[2]=0;
   tmpdigits[3]=0;
 
}
 void AppendDigitBufer( uint8_t numb,uint8_t byte1  )
 {
    
if(tmpcount< numb ) { 
for (uint8_t i=numb-1 ;i>=1; i-- ) {  tmpdigits[i]=tmpdigits[i-1];   } 
tmpdigits[0]=byte1; 
if (CommaSet==0) {tmpcommapos=0;} 
else { tmpcommapos+=1; if(tmpcount==0) { tmpdigits[1]=0;   tmpcount++; } } 
tmpcount++;
}
return;
}
 
 
 void DecodeKeybNum( uint8_t byte )
 {
uint8_t byte1=0; 
     
if (byte==0x30)   { byte1=0; goto LabelInputnthDigit;  } //emulating of the scancode  
if (byte==0x31)   { byte1=1; goto LabelInputnthDigit;  }
if (byte==0x32)   { byte1=2; goto LabelInputnthDigit;  } 
if (byte==0x33)   { byte1=3; goto LabelInputnthDigit ; }
if (byte==0x34)   { byte1=4; goto LabelInputnthDigit;  }
if (byte==0x35)   { byte1=5; goto LabelInputnthDigit; }
if (byte==0x36)   { byte1=6; goto LabelInputnthDigit ; }
if (byte==0x37)   { byte1=7; goto LabelInputnthDigit; }
if (byte==0x38)   { byte1=8; goto LabelInputnthDigit; }
if (byte==0x39)   { byte1=9; goto LabelInputnthDigit; }
if (byte==0x2e)  {  CommaSet=1;   return;  } //fix  if count =num 
return; 
  
LabelInputnthDigit:
 AppendDigitBufer(4, byte1); 
 
return;
}
 
 void InputParamValue(uint8_t byte ){
 
DecodeKeybNum(  byte );
 
return;
  
} 
 
 
 
 
 
/*
void SetMinValue()
{
 tmpdigits[3]=0;tmpdigits[2]=0; tmpdigits[1]=3;      tmpdigits[0]=2;
 tmpcommapos=3; tmpcount=4;  
} 
void SetMaxValue()
{
 tmpdigits[3]=1;tmpdigits[2]=0; tmpdigits[1]=0;      tmpdigits[0]=0;
 tmpcommapos=0; tmpcount=4;  
} 
*/
 
void SetZerosBefore(uint8_t ndigmax)
{
for(uint8_t i2=tmpcount; i2<ndigmax; i2++) { tmpdigits[i2]=0; }     
} 
 
void Shift1DigitLeftWithComma(uint8_t ndigmax)
{
for(uint8_t i=(ndigmax-1); i>0; i--) { tmpdigits[i]=tmpdigits[i-1]; }
tmpdigits[0]=0; 
tmpcount++ ;  
if(tmpcount>ndigmax )  { tmpcount=ndigmax;} 
 
}
 
void Shift1DigitRightComma(uint8_t ndigmax)
{
for(uint8_t i=0; i<(ndigmax-1); i++) { tmpdigits[i]=tmpdigits[i+1]; }     
tmpdigits[(ndigmax-1)]=0; 
 
tmpcommapos-=1; 
//tmpcount=3;   
}
 
 
 
 
void NormStepkHz()
{
uint8_t numbdig=(tmpcount-tmpcommapos);
uint8_t numbaftercomma =tmpcommapos;
   for (int i=tmpcount-1;i>=0; i--) { printf ("  [ %d ", tmpdigits[i]);  if (tmpcommapos==i) {printf (".") ;}  printf ("]") ; }
 printf("\nstep mode tmpcount=%d  tmpcommapos=%d , numbdig=%d , numb after=%d \n", tmpcount, tmpcommapos, numbdig , numbaftercomma ) ;
uint8_t tmparray[4];
 
    
  if(tmpcommapos+2<4){  tmparray[3]=tmpdigits[tmpcommapos+2];} else {tmparray[3]=0;}
  if(tmpcommapos+1<4){  tmparray[2]=tmpdigits[tmpcommapos+1];} else {tmparray[2]=0;}
  tmparray[1]=tmpdigits[tmpcommapos];
  if(tmpcommapos!=0) { tmparray[0]=tmpdigits[tmpcommapos-1];} else   {tmparray[0]=0;}
  tmpcommapos=1; tmpcount=4; 
  
 
 
 if(tmparray[3]==0){ if (tmparray[2]==0){ tmpcount=2; } else { tmpcount=3; }}
 for(uint8_t i=0;i<4;i++){tmpdigits[i]=tmparray[i]; }
 
 
  
   for (int i=tmpcount-1;i>=0; i--) { printf ("  [ %d ", tmparray[i]);  if (tmpcommapos==i) {printf (".") ;}  printf ("]") ; }
 printf("\nstep mode tmpcount=%d  tmpcommapos=%d , numbdig=%d , numb after=%d \n", tmpcount, tmpcommapos, numbdig , numbaftercomma ) ;  
}
 
 
int main()
 
{
    
label1: 
    
uint8_t ch =0;
 
//reset after turn on new  mode or escape 
ResetCounters();
 
while(ch!=',')
{
char  ch1;
printf("\nInput char :"); 
scanf ("%s",  &ch1);
ch=(uint8_t) ch1 ;
InputParamValue(ch );   
      
}
 
  
    NormStepkHz();
 goto label1;
 
 
return 0;
 
}
Добавлено через 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
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
#include <stdio.h>
#include <stdint.h>
#include <math.h>
#include <conio.h>
typedef unsigned char byte;
 
 
 
uint8_t  tmpcount=0;
uint8_t  tmpdigits[7] ;
uint8_t  tmpcommapos=0;
uint8_t  CommaSet=0;
 
uint16_t GetValuefrom3Digits( uint8_t dig3, uint8_t dig2 , uint8_t dig1 )
{
uint16_t result=0;
for (uint8_t i=0;i<dig1;i++ ) { result+=1 ; } 
for (uint8_t i=0;i<dig2;i++ ) { result+=10; }
for (uint8_t i=0;i<dig3;i++ ) { result+=100; }
return result ; 
}
 
void ResetCounters ()
{   
 tmpcount=0;
 CommaSet=0;
 tmpcommapos=0; 
 //tmpdigits[0]=0;
 //tmpdigits[1]=0;
 //tmpdigits[2]=0;
 
 
}
 void AppendDigitBufer( uint8_t numb,uint8_t byte1  )
 {
    
if(tmpcount< numb ) { 
for (uint8_t i=numb-1 ;i>=1; i-- ) {  tmpdigits[i]=tmpdigits[i-1];   } 
tmpdigits[0]=byte1; 
if (CommaSet==0) {tmpcommapos=0;} 
else { tmpcommapos+=1; if(tmpcount==0) { tmpdigits[1]=0;   tmpcount++; } } 
tmpcount++;
}
return;
}
 
 
 void DecodeKeybNum( uint8_t byte )
 {
uint8_t byte1=0; 
     
if (byte==0x30)   { byte1=0; goto LabelInputnthDigit;  } //emulating of the scancode  
if (byte==0x31)   { byte1=1; goto LabelInputnthDigit;  }
if (byte==0x32)   { byte1=2; goto LabelInputnthDigit;  } 
if (byte==0x33)   { byte1=3; goto LabelInputnthDigit ; }
if (byte==0x34)   { byte1=4; goto LabelInputnthDigit;  }
if (byte==0x35)   { byte1=5; goto LabelInputnthDigit; }
if (byte==0x36)   { byte1=6; goto LabelInputnthDigit ; }
if (byte==0x37)   { byte1=7; goto LabelInputnthDigit; }
if (byte==0x38)   { byte1=8; goto LabelInputnthDigit; }
if (byte==0x39)   { byte1=9; goto LabelInputnthDigit; }
if (byte==0x2e)  {  CommaSet=1;   return;  } //fix  if count =num 
return; 
  
LabelInputnthDigit:
 AppendDigitBufer(3, byte1); 
 
return;
}
 
 void InputParamValue(uint8_t byte ){
 
DecodeKeybNum(  byte );
 
return;
  
} 
uint16_t maxnum_band =995  ;      //320 -> 995, 160->500 ,80-> 250 , 40-> 101, 20->50 , 10->  99.5
uint8_t maxnum_comma=0;
//50.0
//500.
//100.
 
uint8_t CheckFMBandLimits(uint8_t comma, uint8_t  maxfmcommapos)
{
if(comma>maxfmcommapos) {return 0; }
 
if(GetValuefrom3Digits( tmpdigits[2], tmpdigits[1] , tmpdigits[0] )>maxnum_band) { return 1; } else  
{ if(comma>=maxfmcommapos) {return 0; } else   {return 1; } }
 
return 0 ;  
}
 
void RoundFM()
{
    
if (tmpdigits[0]<=2) { tmpdigits[0]=0;  } 
if ((tmpdigits[0]>=3)&&(tmpdigits[0]<=7)) { tmpdigits[0]=5; }
if (tmpdigits[0]>=8) { tmpdigits[0]=0;
if (tmpdigits[1]<9 ) { tmpdigits[1]+=1 ; } else
{
if (tmpdigits[2]<9 ) { tmpdigits[2]+=1 ;  tmpdigits[1] =0 ; }  
else  { tmpdigits[2] =9 ;  tmpdigits[1] =9 ;   tmpdigits[1] =5 ;    }
}
    
}
 
}
 
 
void NormFM1()
{
 
 
uint8_t numbdig=(tmpcount-tmpcommapos);
uint8_t numbaftercomma =tmpcommapos;
 
 
#define ndigmax 3
 
 for (int  i=2;i>=0; i--) { printf ("  [ %d " , tmpdigits[i]) ;  if (tmpcommapos==i) {printf (".") ;}  printf ("]") ;   }
 printf("\n tmpcount=%d  tmpcommapos=%d , numbdig=%d , numb after=%d \n", tmpcount, tmpcommapos, numbdig , numbaftercomma ) ;
 
  
for(uint8_t i2=tmpcount; i2<3; i2++) { tmpdigits[i2]=0; }
if((tmpdigits[2]>=9)&&(tmpdigits[1]>=9)&&(tmpdigits[0]>5)) { tmpdigits[2]=9;  tmpdigits[1]=9;  tmpdigits[0]=5;  }
for (uint8_t i=0;i<2;i++) { 
if (tmpdigits[2]==0) { tmpcommapos++; if(tmpcommapos>2) {tmpcommapos=2;} else {tmpdigits[2]=tmpdigits[1]; tmpdigits[1]=tmpdigits[0]; tmpdigits[0]=0; }   }   
}
 
RoundFM();
 
if (CheckFMBandLimits(tmpcommapos, maxnum_comma)==1)  { printf("\n  set   ---  ,   input cancelling   \n"  ) ;    return;  }  //set flag error indication 
 
  
for (int i=2;i>=0; i--) { printf ("  [ %d ", tmpdigits[i]);  if (tmpcommapos==i) {printf (".") ;}  printf ("]") ; }
 
return;
}
 
 
 
 
/*
0.05->0.05
 
   1
  12
  12.
12.5
  
   1
   1.
 1.2  ->1.20  
  
1.2  - 1.20
126 -> 125.
991 ->990.
 
 
*/
 
int main()
 
{
    
label1: 
    
uint8_t ch =0;
 
//reset after turn on new  mode or escape 
ResetCounters();
 
while(ch!=',')
{
char  ch1;
printf("\nInput char :"); 
scanf ("%s",  &ch1);
ch=(uint8_t) ch1 ;
InputParamValue(ch );   
      
}
 
 NormFM1();
    
 goto label1;
 
 
return 0;
 
}
0
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
17.04.2020, 00:40  [ТС] 215
В режиме "Шаг" один дробный разряд не отображается , если частота >=160 MHz.
После включения режима "выход" мерцает второй справа разряд (tmpcommapos=0x01).
0
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
17.04.2020, 02:43  [ТС] 216
Нужно запоминать предыдущее текущее состояние курсора (мигающего разряда) для каждого режима , введя дополнительные переменные .
0
Вложения
Тип файла: zip fixnormalsubs_mainsub.zip (2.14 Мб, 4 просмотров)
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
19.04.2020, 07:37  [ТС] 217
Спящий режим организовывать в режиме Idle

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ISC01 = 1, ISC00 = 0
 
 
//before loop forever 
//определяем спящий режим  :   SM2-SM1-SM0 = 000 - режим Idle; 010 - PowerDown
   MCUCR|=(0<<SM2 )|(0<<SM1 )|(0<<SM0 )|(1<<SE); //MCUCR.SE = 1; разрешили спящий режим
    
 
 
...
 
//in the loop forever
 
 
asm("sleep");
// или sleep();
 
//пробуждение по прерыванию 0 (по срезу по   или по фронту с инверторами  )
0
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
19.04.2020, 09:41  [ТС] 218
В ATMEGA16A программа будет занимать не менее 89 % памяти программ и ;5 % ОЗУ, 0% ПЗУ данных, поэтому скорее всего не поместится .
0
Вложения
Тип файла: zip Gccapp1_testmemsize_bugsM16a.zip (215.2 Кб, 3 просмотров)
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
19.04.2020, 10:12  [ТС] 219
Писать под АТМЕГА32А .

Добавлено через 53 секунды
Максимальная частота кварца 16 МГц маловата .

Добавлено через 2 минуты
У Мантрида 16 МГц на MCS-51 + внешняя память , сильно мерцали светодиоды режимов при переключении , мелкие баги и
пока сырая программа, не оригинальная индикация запятых .

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

Добавлено через 26 минут
Можно и без программы с флажками построить, "распрямив" ход вызова подпрограмм по флажкам в последовательности вызова подпрограмм и внутренние очереди выполняемых подпрограмм , использовать множественное ветвление с внутренними переменными (так временные выработанные переменные не глобальные и используются временно, четче задано смысл действий , но это не по инструкции и может быть реализовано с проблемами ). С программой выдачи ИЗП и КОП, программой индикации и инкремента/декремента еще проблема (может потребоваться на 1 байт переноса больше в массиве и сложная логика ветвления , которая громоздкая и медленная, сбоенеустойчивая ).
0
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,042
19.04.2020, 19:41  [ТС] 220
siosubs.h требует доработки программ ввода-вывода и исправления адресов.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.04.2020, 19:41

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

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

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