Для отладки программы использовал 16х2-дисплей. Т.к. программа написана, необходимо убрать этот дисплей.
Чтобы это можно было сделать быстро, везде, где он используется, писал так:
Код
if (LCD_YES)
{
lcd_puts("Не важно что")
}
{
lcd_puts("Не важно что")
}
и в самом начале листинга соотвественно
Код
define LCD_YES 1
где можно быстро включать-выключать дисплей.
Суть вот в чем - ни разу я его не отключал (да и зачем было?), программа написана, пришло время поставить вместо единицы нолик, что и было сделано. И тут программа перестала работать.
Код
int main(void)
{
Init(); // инициализация портов, таймеров и др.
RecipientComplete = 0; // обнуляем флаг приемки данных
PORTC &= ~(1<<SIM900D_ON); // Включаем SIM900D - сажаем на "0" выход для открытия транзистора
PORTC |= (1<<PWR_KEY);
PORTC &= ~(1<<PWR_KEY);
while(1)
{
nop();
if (RecipientComplete == 1) // Если пришла посылка от SIM900D
{
ReceiveAnalysis(rx_buffer); // Анализируем
}
nop();
}
}
{
Init(); // инициализация портов, таймеров и др.
RecipientComplete = 0; // обнуляем флаг приемки данных
PORTC &= ~(1<<SIM900D_ON); // Включаем SIM900D - сажаем на "0" выход для открытия транзистора
PORTC |= (1<<PWR_KEY);
PORTC &= ~(1<<PWR_KEY);
while(1)
{
nop();
if (RecipientComplete == 1) // Если пришла посылка от SIM900D
{
ReceiveAnalysis(rx_buffer); // Анализируем
}
nop();
}
}
Шерстя по ассемблерному коду, увидел, что перед while(1) появился такой код:
Код
945: PORTC &= ~(1<<PWR_KEY);
+0000059C: 98AF CBI 0x15,7 Clear bit in I/O register
952: nop();
+0000059D: 0000 NOP No operation
953: nop();
+0000059E: 0000 NOP No operation
958: nop();
+0000059F: 0000 NOP No operation
+000005A0: CFFC RJMP PC-0x0003 Relative jump
958: nop();
+0000059C: 98AF CBI 0x15,7 Clear bit in I/O register
952: nop();
+0000059D: 0000 NOP No operation
953: nop();
+0000059E: 0000 NOP No operation
958: nop();
+0000059F: 0000 NOP No operation
+000005A0: CFFC RJMP PC-0x0003 Relative jump
958: nop();
самого while() нету, да собственно и не нужен, т.к. RJMP PC-0x0003 зацикливает программу на месте между nop'ами.
Почему такое происходит, и как от этого избавиться?