|
|
  |
Оптимизация программы - бортовой компьютер на PIC16F73 |
|
|
|
Dec 21 2006, 13:37
|
Участник

Группа: Новичок
Сообщений: 16
Регистрация: 2-10-06
Пользователь №: 20 895

|
делаю бортовой компьютер на пике снимаю ацп значения с датчиков, соответственно в регистре adres остаются какие-то значения, мне нужно сопоставить эти значения с реальными показателями датчиков. делаю это следующим образом: делаю АЦП преобразование, а дальше - сравнение: Код ;*************************************************************************** ;********************Вывод значений с датчиков****************************** ;*************************************************************************** vivod_znachenii: vivod_davlenie:
movlw .210 subwf davl,0 btfss STATUS,0 movlw .7 movwf dav_vivod
movlw .192 subwf davl,0 btfss STATUS,0 movlw .6 movwf dav_vivod
movlw .189 subwf davl,0 btfss STATUS,0 movlw .5 movwf dav_vivod
movlw .183 subwf davl,0 btfss STATUS,0 movlw .4 movwf dav_vivod
movlw .174 subwf davl,0 btfss STATUS,0 movlw .3 movwf dav_vivod
movlw .163 subwf davl,0 btfss STATUS,0 movlw .2 movwf dav_vivod
movlw .156 subwf davl,0 btfss STATUS,0 movlw .1 movwf dav_vivod
movlw .152 subwf davl,0 btfss STATUS,0 movlw .0 movwf dav_vivod
movf dav_viviod,0 movwf data movlw DATABLE movwf rsselest call lcd_write датчиков у меня 4 и код оч громоздкий, каким образом можно оптимизировать код? препод что-то говорил про таблицу, а не пойму, пробовал с помощью PCL - не выходит
|
|
|
|
|
Dec 25 2006, 12:24
|
Участник

Группа: Новичок
Сообщений: 54
Регистрация: 14-12-06
Пользователь №: 23 498

|
Что же ты делаешь ? Ты последовательно портишь dav_vivod . У тебя проверка закончится последними строчками, что бы там ни было на входе.
|
|
|
|
|
Dec 25 2006, 13:31
|
Участник

Группа: Новичок
Сообщений: 54
Регистрация: 14-12-06
Пользователь №: 23 498

|
16f73 я не занимался, пишу на с.. но вот что выдал компилятор, когда я ввел массив.. 15 000E 0782 ADDWF PCL, F 16 000F 3407 RETLW 0x7 17 0010 3406 RETLW 0x6 18 0011 3405 RETLW 0x5 19 0012 3404 RETLW 0x4 20 0013 3403 RETLW 0x3 21 0014 3402 RETLW 0x2 22 0015 3401 RETLW 0x1 23 0016 3400 RETLW 0 24 0017 0782 ADDWF PCL, F 25 0018 34D2 RETLW 0xd2 26 0019 34C0 RETLW 0xc0 27 001A 34BD RETLW 0xbd 28 001B 34B7 RETLW 0xb7 29 001C 34AE RETLW 0xae 30 001D 34A3 RETLW 0xa3 31 001E 349C RETLW 0x9c 32 001F 3498 RETLW 0x98 // это твои 2 массива 1837 072C 3000 MOVLW 0 1838 072D 008A MOVWF PCLATH 1839 072E 082C MOVF z, W 1840 072F 2017 CALL 0x17 1841 0730 118A BCF PCLATH, 0x3 // вот выборка из массива с первым адресом 17 1842 0731 00AD MOVWF 0x2d 1843 0732 082B MOVF temp, W 1844 0733 022D SUBWF 0x2d, W 1845 0734 1803 BTFSC STATUS, 0 // дальше сравнение, неинтересно... 1846 0735 2F38 GOTO 0x738 1847 0736 082B MOVF temp, W 1848 0737 2F3D GOTO 0x73d // выборка из 2 массива 1849 0738 3000 MOVLW 0 1850 0739 008A MOVWF PCLATH 1851 073A 082C MOVF z, W 1852 073B 200E CALL 0xe 1853 073C 118A BCF PCLATH, 0x3 1854 073D 00AA MOVWF i // дальше проверка,все 8 чисел выбраны или нет 1855 073E 0AAC INCF z, F 1856 073F 3008 MOVLW 0x8 1857 0740 022C SUBWF z, W 1858 0741 1803 BTFSC STATUS, 0 У тебя проблемы с алгоритмом, то что видно навскидку... Вгрызаться в даташит 73 и смотреть, почему именно так идет выборка из таблицы, нет особого желания... Пиши на С, преподу дашь дизассемблированный исходник.
|
|
|
|
|
Dec 25 2006, 13:45
|
Местный
  
Группа: Свой
Сообщений: 460
Регистрация: 5-10-06
Из: Херсон
Пользователь №: 21 006

|
Цитата(Hellka @ Dec 21 2006, 14:37)  делаю бортовой компьютер на пике снимаю ацп значения с датчиков, соответственно в регистре adres остаются какие-то значения, мне нужно сопоставить эти значения с реальными показателями датчиков. делаю это следующим образом: делаю АЦП преобразование, а дальше - сравнение:
датчиков у меня 4 и код оч громоздкий, каким образом можно оптимизировать код? препод что-то говорил про таблицу, а не пойму, пробовал с помощью PCL - не выходит Приблизительно так для возврата значений Код ;---------------------------------------------------------------- ; Подпрограмма восстановления начальных ; значений регистров ;---------------------------------------------------------------- table_reg addwf PCL retlw k_reg_1; retlw k_reg_2; retlw k_reg_3; retlw k_reg_4; retlw k_reg_5; retlw k_reg_6; retlw k_reg_7; retlw k_reg_8; retlw k_reg_9; retlw k_reg_10; Для PIC16 есть ограничение на расположение таблицы и на размер А так для выполнения выбора типа case: Код table_out_bit addwf PCL goto b_1 goto b_2 goto b_3 b_1 bsf INDF, 0 ; return ; b_2 bsf INDF, 1 ; return ; b_3 bsf INDF, 2 ; return ;
|
|
|
|
|
Dec 25 2006, 14:25
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(Hellka @ Dec 21 2006, 13:37)  делаю бортовой компьютер на пике снимаю ацп значения с датчиков, соответственно в регистре adres остаются какие-то значения, мне нужно сопоставить эти значения с реальными показателями датчиков. делаю это следующим образом: делаю АЦП преобразование, а дальше - сравнение: Код skipped датчиков у меня 4 и код оч громоздкий, каким образом можно оптимизировать код? препод что-то говорил про таблицу, а не пойму, пробовал с помощью PCL - не выходит Смущает весьма нелинейная характеристика датчика давления: 0 - 152 1 - 156 2 - 163 3 - 174 4 - 183 5 - 189 6 - 192 7 - 210 Про вероятные неточности в алгоритме Вам уже сказали - по-видимому, предполагалось, что строки Код movlw .210 subwf davl, 0 btfss STATUS, 0 movlw .7 movwf dav_vivod ... будут выглядеть примерно так: Код movlw .210 subwf davl, w movlw .7 btfsc STATUS, 0 goto cmp_dav_done movlw .192 subwf davl, w movlw .6 btfsc STATUS, 0 goto cmp_dav_done ... movlw .156 subwf davl, w movlw .1 btfss STATUS, 0 movlw .0 cmp_dav_done: movwf data ... Указывать приемник "w" или "f" ей-ей нагляднее, чем "0" или "1". Если же характеристика датчика все-таки достаточно линейна (т.е. с достаточной точностью может быть описана выражением "dav_vivod = a*davl + b"), то задача сведется к нахождению на листе бумаги коэффициентов a и b и реализации соответствующего алгоритма. Хинт: в вычисления с плавающей запятой здесь впадАть не стОит  .
|
|
|
|
|
Dec 26 2006, 11:58
|
Группа: Новичок
Сообщений: 10
Регистрация: 8-06-06
Пользователь №: 17 885

|
VIVOD_DAVLENIE
MOVLW D'152';----МЕНЬШЕ 152? SUBWF DAVL,F;---ВЫЧЕСТЬ 152, СОХРАНИВ В РЕГИСТРЕ BTFSS STATUS,C RETLW D'0';---ДА, ЗАПИСАТЬ НА ВЫВОД 0
MOVLW D'210'-D'152';---БОЛЬШЕ 210? SUBWF DAVL,W;---В РЕГИСТРЕ НЕ СОХРАНЯТЬ BTFSC STATUS,C RETLW D'7';---ДА, ЗАПИСАТЬ НА ВЫВОД 7
RRF DAVL,W;---РАЗДЕЛИТЬ НА 2(ЕСЛИ НЕНУЖНА БОЛЬШАЯ ТОЧНОСТЬ) ADDWF PCL,F RETLW H'1';---152 RETLW H'1';---154 RETLW H'2';---156 RETLW H'2';---158 RETLW H'2';---160 RETLW H'2';---162 RETLW H'3';---164 RETLW H'3';---166 RETLW H'3';---168 ......... RETLW H'6';---204 RETLW H'6';---206 RETLW H'6';---208
Итого: 38 строк. Можно конечно DAVL делить не на 2, а на 4. Тогда будет 25 строки, но это уже определяется необходимой точностью. В исходном тексте (который с ошибкой) этот кусок тоже 38 строк.
Сообщение отредактировал AnyWay - Dec 26 2006, 12:01
|
|
|
|
|
Dec 26 2006, 14:02
|
Группа: Новичок
Сообщений: 10
Регистрация: 8-06-06
Пользователь №: 17 885

|
Можно конечно без таблицы обойтись, тогда преобразование займет 26 строк вместо 38:
vivod_davlenie CALL TABL movwf data movlw DATABLE movwf rsselest call lcd_write ........................
TABL MOVF DAVL,W ADDLW D'255'-D'210' BTFSC STATUS,C RETLW H'7';----ДИАПАЗОН 255 - 210
ADDLW D'210'-D'192' BTFSC STATUS,C RETLW H'7';----ДИАПАЗОН 210 - 192
ADDLW D'192'-D'189' BTFSC STATUS,C RETLW H'6';----ДИАПАЗОН 192 - 189
ADDLW D'189'-D'183' BTFSC STATUS,C RETLW H'5';----ДИАПАЗОН 189 - 183
ADDLW D'183'-D'174' BTFSC STATUS,C RETLW H'4';----ДИАПАЗОН 183 - 174
ADDLW D'174'-D'163' BTFSC STATUS,C RETLW H'3';----ДИАПАЗОН 174 - 163
ADDLW D'163'-D'156' BTFSC STATUS,C RETLW H'2';----ДИАПАЗОН 163 - 156
ADDLW D'156'-D'152' BTFSC STATUS,C RETLW H'1';----ДИАПАЗОН 156 - 152
RETLW H'0';----ДИАПАЗОН 152 - 0
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|