Цитата(tag @ Mar 26 2008, 14:50)

...а всимуляторе ничего странного не наблюдаете? Код посмотреть можно?
Цитата(alux @ Mar 26 2008, 11:22)

Попробовал в симуляторе вставить diffPressure = (Vin((float)temp_ul)/SPAN)*mm_Hg; в начало программы (в main). Вычисление заняло пару тактов.
Вот кусок листинга:
73 int main()
\ main:
74 {double temp_ul = 0x800000;
75 diffPressure = (Vin(temp_ul)/SPAN)*mm_Hg;
\ 00000000 E010 LDI R17, 0
\ 00000002 .... LDI R30, LOW(diffPressure)
\ 00000004 .... LDI R31, (diffPressure) >> 8
\ 00000006 8310 ST Z, R17
\ 00000008 8311 STD Z+1, R17
\ 0000000A 8312 STD Z+2, R17
\ 0000000C 8313 STD Z+3, R17
Из него видно, что по адресу, где находится переменная diffPressure загружается просчитанное значение 0 (для значения АЦП = 0х800000).
А вот листинг для значения АЦП = 0х000000:
Код
73 int main()
\ main:
74 {double temp_ul = 0x000000;
75 diffPressure = (Vin(temp_ul)/SPAN)*mm_Hg;
\ 00000000 E503 LDI R16, 83
\ 00000002 EB1B LDI R17, 187
\ 00000004 E727 LDI R18, 119
\ 00000006 EB3E LDI R19, 190
\ 00000008 .... LDI R30, LOW(diffPressure)
\ 0000000A .... LDI R31, (diffPressure) >> 8
\ 0000000C 8300 ST Z, R16
\ 0000000E 8311 STD Z+1, R17
\ 00000010 8322 STD Z+2, R18
\ 00000012 8333 STD Z+3, R19
Вопрос. Почему в этом случае (temp_ul = 0) программа работает?
Реально полностью программу не симулировал. Для этого нужно написать макросы для симуляции прерываний и переферии. Может это как-то связано с работой ОС. Макрос запускается из процесса, который имеет собственный стек. И каким-то образом этот макрос нарушает работу ОС. Это так, мысли вслух...
.................................
PS. Объясните мне, пожалуйста , следующее. Почему, если перед вызовом макроса тупо присвоить аргументу
adc_value какое-нибудь значение, то все работает !!! А если adc_value присваивать реальное значение АЦП:
Код
adc_value = ad7799_read_data();
, то не работает (виснет). При этом проблемы с
ad7799_read_data(); нет: если не вызывать макрос, а просто выводить значение АЦП, то все нормально выводится на экран ЖКИ