проблема с HT PICC закроспостю, так как сахара и микрочип.су очень мало пересекаются:
PIC16F916, HTPICC 9.60 PL2
- такое впечатление, что линкер на каком-то этапе перестает строить дерево вызовов и из-за этого портит параметры, передаваемые в функцию:
(1) - вызываем функцию с параметром, параметр передается через W
1431: hs_ret = Handshake_Proc(HS_TYPE_PRG_REQ);
1D17 3000 MOVLW 0
1D18 160A BSF 0xa, 0x4
1D19 118A BCF 0xa, 0x3
1D1A 243F CALL 0x43f
(2) - вызываемая функция... извращался по всякому с локальными переменными..
185: HS_RET Handshake_Proc (HS_TYPE type)
186: {
187: #define HS_ASSERT(a) if ((a)) goto hs_return
188: #define HS_SUCCESS() to = 1; goto hs_return
189:
190: static HS_RET ret;
191: static U08 to;
192:
193: ret = HS_RET_ERR;
(3) - переданный параметр сохраняется по адресу 0x41 ->>>>>>
143F 0183 CLRF 0x3
1440 00C1 MOVWF 0x41
1441 30FF MOVLW 0xff
1442 00BF MOVWF 0x3f
194: HS_Stat.type = 0;
1443 1703 BSF 0x3, 0x6
1444 01BF CLRF 0x3f
195:
196: bsp_rf_en();
1445 160A BSF 0xa, 0x4
1446 158A BSF 0xa, 0x3
1447 215E CALL 0x15e
1448 160A BSF 0xa, 0x4
1449 118A BCF 0xa, 0x3
197:
198: to = (type & HS_TYPE_ACK_BIT || type & HS_TYPE_DATA_BIT) ? HS_REPLY_PRG_NUM : HS_REPLY_NOR_NUM;
144A 1D41 BTFSS 0x41, 0x2
144B 18C1 BTFSC 0x41, 0x1
144C 2C4F GOTO 0x44f
144D 3001 MOVLW 0x1
144E 2C50 GOTO 0x450
144F 301E MOVLW 0x1e
1450 00C0 MOVWF 0x40
199:
200: do
201: {
202: rf_strobe(SIDLE);
(4) - в функцию передается параметр через W - константа 0x36
1451 3036 MOVLW 0x36
1452 160A BSF 0xa, 0x4
1453 158A BSF 0xa, 0x3
1454 21C6 CALL 0x1c6
(5) - вызванная функция (листинг хай-тековский)
143 19C6 _rf_strobe
144 ; _data assigned to ?a_rf_strobe+0
145 0000 _rf_strobe$data set ?a_rf_strobe
146 ;_data stored from w
147 19C6 0183 clrf 3 ;select bank 0
148 19C7 00C1 movwf ?a_rf_strobe
149 ;bsp_rf.c: 74: void rf_strobe (U08 data)
150 19C8 1285 bcf 5,5 ;volatile
151 19C9 0841 movf ?a_rf_strobe,w
152 19CA 0093 movwf 19 ;volatile
(6) - что самое интересное:
?a_rf_strobe 0041
т.е. переданный параметр так же сохраняется по адресу 0x41, как и в функции-родителе.
И такое на каждом шагу. Есть еще веселее:
(1) - вызывается функция с двумя параметрами. Один передается через W, другой через 0x41
224: Handshake_Rec(HS_OUT1_SIZE, 0);
1497 01C1 CLRF 0x41
1498 300A MOVLW 0xa
1499 120A BCF 0xa, 0x4
149A 118A BCF 0xa, 0x3
149B 2780 CALL 0x780
(2) - вызываемая функция - параметр передаваемый через W сохраняется в 0x41:
130: static BOOL Handshake_Rec (U08 size_pr, BOOL to_pr)
131: {
132: static bank1 U08 i;
133: static bank1 U08 size;
134: static bank1 BOOL to;
135:
136: size = size_pr;
0780 0183 CLRF 0x3
0781 00C1 MOVWF 0x41 // <<<<<<<<<<<<<<<<<
0782 1683 BSF 0x3, 0x5
0783 00E7 MOVWF 0x67
В чем причина не могу понять... Проблема появилась, когда объем кода перевалил за 90%.
На микрочипе говорят, что что-то такое слышали. Можт отсюда кто слышал?
http://www.microch …/showthread.php?t=5202
Согласуйте импеданс!
-
- Проблема успешно разрешилась - Alex B.(26.02.2009 11:48, ссылка)