Исходные данные:
- Микроконтроллер PIC16F887, скорость 16Мгц, слово конфигурации: _HS_OSC & _WDT_OFF & _LVP_OFF (то, что по умолчанию предлагается в MikroC в свойствах проекта)
- EUSART настроен на скорость 9600bps, асинхронный режим, стоповый бит один, четности и контроля за потоком нет (в общем стандартнее некуда)
- Компилятор MikroC 8.2.0.0 (также пробовался MikroC Pro 4.60)
- Proteus 7.5 SP3 b7401
Понадобилось мне для вышеозначенного PIC'a написать обмен данными по последовательному порту, причем реализовать это через прерывания. Собственно, то, что получилось, в приложении. И все чудесным образом работает в Proteus'е, однако, в реальности получается полная охинея (скриншот охинеи также в приложении). Там видно, что вместо слова Ping принимается белиберда. Собственно, отправляется тоже не то, что нажимается на клавиатуре компа.
У меня просьба помочь мне разобраться, почему в реальности все работает не так, как надо.
И еще вопрос в том, как правильно обрабатывать ошибки переполнения буфера приемника (бит RCSTA.OERR) и отсутствия стопового бита (бит RCSTA.FERR)? В смысле, в какой момент времени надо проверять эти биты (прямо в прерывании или в основной программе)?
Вкратце про программу:
Сначала настраиваются порты и LCD, затем инициализируется TMR0 с периодом срабатывания 1мс (потом с помощью него раз в секунду мигает светодиод RB3, отсылается слово "Ping" в терминал и выводится на вторую строчку LCD принятый по USART символ). Потом идет настройка EUSART, я сделал это совсем "вручную" по битам, чтобы лучше понимать, что там происходит. Если делать настройку EUSART библиотечной командой Usart_Init(9600), то эффект будет такой же. Затем ждем нажатия кнопки RA4 и запускаем бесконечный цикл.
По пришествии какого нибудь символа программа сразу же (в прерывании) отправляет его назад, попутно выводя его на LCD. Это для начала, потом хочется сделать прием нормальных ASCIIZ строк.
В принципе, я вроде написал очень подробные комментарии в коде, так что там все должно быть понятно.
Да, попутно возник еще один вопрос: почему в Proteus'е не мигает светодиод при использовании такой инверсии бита в порте (в реальности все мигает):
Код: Выделить всё
PORTB ^= (1 << 3);но если написать что-то вроде
Код: Выделить всё
value = ~value; // здесь value - это unsigned short value = 0;
PORTB.F3 = value;то все заработает и в Proteus'e, и в реальности? Это такой глюк симулятора, или я чего-то не понимаю?


