Сейчас на форуме: Dart Raiden, bedop66938, morgot (+6 невидимых) |
eXeL@B —› Электроника —› PIC 16F877 настройка USART |
Посл.ответ | Сообщение |
|
Создано: 28 октября 2011 19:34 · Поправил: cosinus · Личное сообщение · #1 Доброго времени суток форумчане. Имею код на Cи Code:
Микроконтроллер подлючен к компьютеру через ST232. Так же на порте PORTE на ножке RE2 "висит" кнопка. При нажатии на которую получаю на ножке RE2 ноль, после чего выводится на терминалку "Hello World" файл rs232.h Code:
Всё прекрасно работает. Решил переписать этот код на ассемблере, так как код не мой и в синтаксисе Си я не разбираюсь. (Этот код мне написали, чтобы заинтересовать в программировании "железных рук" и продемонстрировать работу МК) Вообщем загружаю hex-файл прошивки в эмулятор ( PIC Simulator IDE ) и обложившись мануалами начал трассировать. В итоге вот что у меня получилось: Code:
После компиляции и "заливки" прошивки, заветная строчка НЕ прилетает на терминалку. Вот собственно просьба, подскажите где я допустил ошибку? И помогите перевести "СИшный" код в ASM. Думаю что ошибка в инициализации USART, но тыщу раз просматривал в эмуляторе и никак не могу увидеть. Конечно код... Code:
... можно представить в виде Code:
Но при трассировке в MPLAB (и на живом железе тоже), команды типа Code:
"взводится" только одна ножка порта (а точнее по очереди), потому и выбран был вышеуказанный способ. Потому как думал это "недочёт" микроконтроллеров и трабла в инициализации USART могла в этих командах. PS. на ножках RA0-RA2 у меня висят светодиодики, и их я в коде не указал из-за экономии места. И именно для этих светодиодов включено прерывание от приёмника... дабы принять цифру "1" и зажечь светодиод RA0. И также в коде не указан обработчик прерываний (но он есть) Или быть может у меня дизассемблер неправильно работает, или одно из двух т.к. строки исходника.... Code:
...превращаются в Code:
То есть по сути всё ровно, только не понятно как находясь в банке 1, можно обращаться к данным в банке 0 ? Ведь регистр ADCON0 находится в 0-ом банке. А так же фигурируют адреса PORTA и PORTE, когда должны быть адреса TRISA (85h)и TRISE(89h). И вообще 6h для ADCON1 предназначено. |
|
Создано: 29 октября 2011 07:43 · Поправил: cosinus · Личное сообщение · #2 Разобрался с дизассемблером, оказывается он некорректно работает. Code:
Обратив внимание на опкоды, увидел следущее: 0011 019F обозначает стереть регистр, адрес которого 9F чему соответствует ADCON1. Точно также и с командой по адресу 0015: 0185 - которая очищает регистр адрес которого 85h чему соответсвует TRISA, а вовсе не PORTA как показывает дизассемблер. Исшо адресс 0017 определён не верно - опкод 0089 обозначает, что надо переслать число из аккамулятора (WREG) в 89h. А по адресу 89h как раз находится TRISE. up: Оказалось что дизассемблер НЕ отслеживает изменения банка памяти, вследствие чего выдаёт такие "недоразумения". |
|
Создано: 29 октября 2011 23:46 · Личное сообщение · #3 Разобрался с проблемой. Оказалось, что у меня (в asm-коде) не корректная обработка прерываний. А точнее выход из прерывания с восстановлением WREG и STATUS. Отключив все прерывания (INTCON, PIE\GIE), заветная строчка вывелась на терминал. Прерывание от приёмника USART было включено. Так как у меня на ножках порта А "висят" светодиоды, и в зависимости от цифры посланной МК - зажигался светодиод. А при нажатии на кнопку (PORTE, RE2) выводилась строка. Но то что дизассемблеры в MPLAB IDE и в PIC Simulator IDE не отслеживают изменения банка памяти - факт. Будте осторожны | Сообщение посчитали полезным: Bad_guy |
eXeL@B —› Электроника —› PIC 16F877 настройка USART |
Эта тема закрыта. Ответы больше не принимаются. |