|
|
  |
Программа для микроконтроллера, Как работает код |
|
|
|
Apr 23 2010, 09:14
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(Aleksandr_KPI @ Apr 23 2010, 11:17)  Подскажите почему при выполнении следующего кода... В порте Р1 всегда установлены в единицу 4 и 5 биты. Если посмотреть на Ваш код, то легко увидеть, что регистр Р1 изменяется в двух местах Вашей программы: 1) в main заносится ноль 2) в прерывании заносится содержимое SBUF. Очевидно, что биты Р1.4 и Р1.5 и устанавливаются командой в прерывании (копируются из SBUF), а в SBUF эти биты установлены. Почему в SBUF эти биты установлены? Издалека сказать трудно... Но с этим SBUF - некоторая беда (разработчики МК немножко намудрили). Дело в том, что в МК два регистра под одним адресом и именем SBUF - один для принятых данных (приёмника - можно только читать), другой - для передаваемых данных (передатчика - можно только записывать в него). Помниться (а, может быть я - не прав), что в окошке Keil "Serial channel" изменяется как раз второй (для передачи) регистр SBUF. Если Вы отлаживая свою программу изменяли значение в этом окне, то в регистре SBUF, куда должны помещатся принятые данные (SBUF приёмника) - изменений не происходит. А копируете Вы в Р1 как раз SBUF приёмника. Чтобы изменить SBUF приёмника, нужно что-нибуть набрать в окне Keil "Serial Window". Ещё мне кажется, что Вы настроили неверно UART. В регистр SCON Вы заносите 50h: один бит -разрешает работу приёмника; второй - устанавливает режим работы. Имхо, Вы установили режим работы 2. Скорость работы UART в режиме 2 задаётся только тактовой частотой МК и не регулируется. Так и было задумано? Зачем тогда настройка таймера 2? PS. C настройками UART - всё верно: устанавливается режим 1. Это - я за давностью использования МК51 запамятовал...
|
|
|
|
|
Apr 23 2010, 10:49
|
Местный
  
Группа: Свой
Сообщений: 323
Регистрация: 25-08-09
Пользователь №: 52 032

|
Цитата Помниться (а, может быть я - не прав), что в окошке Keil "Serial channel" изменяется как раз второй (для передачи) регистр Окно "Serial channel" я открыл только для того что бы следить за изменением флагов прерываний передатчика и приемника последовательного порта и за ходом выполнения программы. Регистр SBUF при исполнении программы никак не изменяется (там постоянно висят нули) даже когда я захожу на вкладку последовательного порта и ввожу число, оно в нем не появляется. Цитата Если Вы отлаживая свою программу изменяли значение в этом окне, то в регистре SBUF, куда должны помещатся принятые данные (SBUF приёмника) - изменений не происходит. А копируете Вы в Р1 как раз SBUF приёмника. Чтобы изменить SBUF приёмника, нужно что-нибуть набрать в окне Keil "Serial Window". В этом окне я ничего не менял. В принципе то программа работает. Вводимое мной число (от 0 до 9) в вкладке последовательного порта, четко отображается с помощью первых 4 разрядов порта Р1. Вот только при этом загадочно "горят" 4 и 5 биты.
|
|
|
|
|
Apr 29 2010, 11:52
|
Местный
  
Группа: Свой
Сообщений: 323
Регистрация: 25-08-09
Пользователь №: 52 032

|
Подскажите почему программа выдает ошибку error A9: SYNTAX ERROR. Ругается на все строки, кроме первой. Программа для микроконтроллера AT89S8252. Часть кода: Код BYTE_ERR_IN EQU 02AH ERR_56M REG BYTE_ERR_IN.0 ERR_G1_4 REG BYTE_ERR_IN.1 ERR_SNPR56M REG BYTE_ERR_IN.2 SNPR_GHM REG BYTE_ERR_IN.3 ERR_SNPRK56M REG BYTE_ERR_IN.4 ERR_SNPRB56M REG BYTE_ERR_IN.5 ERR_OG REG BYTE_ERR_IN.6 ERR_NLCHM REG BYTE_ERR_IN.7
|
|
|
|
|
Jun 7 2010, 11:07
|
Местный
  
Группа: Свой
Сообщений: 323
Регистрация: 25-08-09
Пользователь №: 52 032

|
Подскажите, как код передает данные во внешнюю память: Код ERR_EXT_ADDR_OUT EQU 001H ...............
BYTE_ERR_OUT EQU 02CH KVITANCIA8 REG BYTE_ERR_OUT.1 LED_IND REG BYTE_ERR_OUT.2 WR_SETKA REG BYTE_ERR_OUT.6 WR_DDS REG BYTE_ERR_OUT.7
............... MOV R0,#ERR_EXT_ADDR_OUT MOV A,BYTE_ERR_OUT MOVX @R0,A Программа написана для AT89S8252. Сам код в принципе понятен, неясно как и где определяется что выдавать данные нужно через порт P0 к которому подключена 8 разрядная шина для обмена с внешней памятю. Прикрепил полный код. Извините что-то файл не прикрепился.
Сообщение отредактировал rezident - Jun 7 2010, 17:30
|
|
|
|
|
Jun 7 2010, 20:39
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(Aleksandr_KPI @ Jun 7 2010, 15:07)  Подскажите, как код передает данные во внешнюю память: Код MOV R0,#ERR_EXT_ADDR_OUT MOV A,BYTE_ERR_OUT MOVX @R0,A MOVX через косвенную адресацию поместит содержимое аккумулятора в ячейку памяти по адресу, хранящемуся в регистре R0. Поскольку этот регистр восьмибитный то и диапазон адресов невелик 0-255. При использовании MOVX интерфейс внешней памяти контроллера будет самостоятельно вырабатывать управляющие сигналы WR RD ALE в соответствии с даташитом на контроллер. Для понимания этого процесса советую почитать доку на Ваш контроллер и что-нибудь об параллельном интерфейсе 8085.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Jun 8 2010, 10:55
|
Местный
  
Группа: Свой
Сообщений: 323
Регистрация: 25-08-09
Пользователь №: 52 032

|
Цитата MOVX через косвенную адресацию поместит содержимое аккумулятора в ячейку памяти по адресу, хранящемуся в регистре R0. Это я понимаю. Почему передача данных ведется через порт P0, а не скажем через порт P1 или P2?
|
|
|
|
|
Jun 10 2010, 13:38
|
Местный
  
Группа: Свой
Сообщений: 323
Регистрация: 25-08-09
Пользователь №: 52 032

|
Цитата Потому, что разработчики МК51 так когда-то спроектировали работу МК с внешней памятью: адрес - на портах Р0 и Р2, данные - на Р0 У меня в данном примере данные и адрес передаются по одному порту P0. А как быть в другом случае, например мне нужно написать программу для передачи данных из МК в ПЛИС и наоборот. Имеется два порта Р6 и Р7 микроконтроллера C8051F020. По седьмому порту передаются данные по шестому адрес. Для передачи данных в ПЛИС тоже используется команда MOVX или можно просто передавать данные побайтно в порты? Я не совсем понял выражение : Цитата адрес - на портах Р0 и Р2 . Как использовать команду MOVX если адрес и данные на разных портах?
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|