Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Оптимизация программы - бортовой компьютер на PIC16F73
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
Hellka
делаю бортовой компьютер на пике
снимаю ацп значения с датчиков, соответственно в регистре 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 - не выходит
urry1
Что же ты делаешь ?
Ты последовательно портишь dav_vivod . У тебя проверка закончится последними строчками, что бы там ни было на входе.
urry1
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 и смотреть, почему именно так идет выборка из таблицы,
нет особого желания... Пиши на С, преподу дашь дизассемблированный исходник. smile.gif
DL36
Цитата(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            ;
xemul
Цитата(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 и реализации соответствующего алгоритма.
Хинт: в вычисления с плавающей запятой здесь впадАть не стОитsmile.gif.
AnyWay
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
Можно конечно без таблицы обойтись, тогда преобразование займет 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
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.