реклама на сайте
подробности

 
 
5 страниц V  < 1 2 3 4 5 >  
Reply to this topicStart new topic
> Программа для микроконтроллера, Как работает код
Палыч
сообщение Apr 23 2010, 09:14
Сообщение #31


Гуру
******

Группа: Свой
Сообщений: 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 запамятовал...
Go to the top of the page
 
+Quote Post
Aleksandr_KPI
сообщение Apr 23 2010, 10:49
Сообщение #32


Местный
***

Группа: Свой
Сообщений: 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 биты.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 23 2010, 11:16
Сообщение #33


Гуру
******

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



Цитата(Aleksandr_KPI @ Apr 23 2010, 14:04) *
Регистр SBUF при исполнении программы никак не изменяется (там постоянно висят нули) даже когда я захожу на вкладку последовательного порта и ввожу число, оно в нем не появляется.
Я об этом и писал: отображается SBUF передатчика, но не приёмника (он вообще не отображается на окошках).

Цитата(Aleksandr_KPI @ Apr 23 2010, 14:04) *
В принципе то программа работает. Вводимое мной число (от 0 до 9) в вкладке последовательного порта, четко отображается с помощью первых 4 разрядов порта Р1. Вот только при этом загадочно "горят" 4 и 5 биты.
Кажется понимаю - в чём дело... Кагда Вы нажимаете на клавиатуре клавишу "1", находясь в окне "Serial Window" - то посылается байт (код ASCII), соответствующий символу "1". Этот байт имеет значение 31h. Клавиша "2" - код 32h, и т.д. Вот в разрядах 4 и 5 единички и висят.
Go to the top of the page
 
+Quote Post
Aleksandr_KPI
сообщение Apr 23 2010, 11:46
Сообщение #34


Местный
***

Группа: Свой
Сообщений: 323
Регистрация: 25-08-09
Пользователь №: 52 032



Да. Спасибо, Вы абсолютно правы. smile.gif
Go to the top of the page
 
+Quote Post
Aleksandr_KPI
сообщение Apr 28 2010, 12:07
Сообщение #35


Местный
***

Группа: Свой
Сообщений: 323
Регистрация: 25-08-09
Пользователь №: 52 032



Перешел из пакета keil uvision3 в keil uvision4 и возникла проблема с компиляцией проекта. Код в обоих случаях одинаковый, но при работе в 4 keil-е выдает ошибку C100. Суть ошибки: из части кода на Си вызывается процедура написана на ассемблере, при этом компилятор ругается на эту процедуру не видя ее. В keil uvision3 взаимное "виденье" двух частей кода обеспечивал сам пакет. Кто работает в keil uvision4 подскажите как устранить ошибку. На фото проект из keil uvision3 (рабочий). В keil uvision4 отсутствуют каталоги stdio.h и reg52.h в окне Project Workspce.
Go to the top of the page
 
+Quote Post
Aleksandr_KPI
сообщение Apr 29 2010, 11:52
Сообщение #36


Местный
***

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 29 2010, 12:26
Сообщение #37


Гуру
******

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



Не знаю - что Вы здесь задумали, но к битам байта ОЗУ с адресом 2Аh нельзя обращаться побитово.
Go to the top of the page
 
+Quote Post
Aleksandr_KPI
сообщение Apr 29 2010, 13:38
Сообщение #38


Местный
***

Группа: Свой
Сообщений: 323
Регистрация: 25-08-09
Пользователь №: 52 032



Программа не моя, попросили коечто изменить, выдали только листинг в WORD. Я его скопировал в Keil, а он выдал ошибки. Заменил REG на EQU (не знаю на сколько это правильно) и все заработало.
Go to the top of the page
 
+Quote Post
Aleksandr_KPI
сообщение Apr 30 2010, 14:03
Сообщение #39


Местный
***

Группа: Свой
Сообщений: 323
Регистрация: 25-08-09
Пользователь №: 52 032



Подскажите в чем может быть ошибка. Практически в конец программы добавляю вызов двух меток RESET_BOCH, RESET_BNCH и программа сразу же начинает работать не правильно. При пошаговой компиляции с строки 171 она переходит не на 172, а на 180 (на эти строки я ставлю метки, что бы не смотреть пошагово на задержку). Потом программа странным образом перезагружается с метки mein. И только после этого переходит с 171 она переходит на 172 строку. А дальше зависает в какомто непонятном цикле. Не могу понять как влияет добавление двух переходов на работу всей программы, к которым она даже на доходит. Если эти метки убрать, все работает нормально.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 30 2010, 14:39
Сообщение #40


Гуру
******

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



Цитата(Aleksandr_KPI @ Apr 30 2010, 18:03) *
Подскажите в чем может быть ошибка.
Имхо, под стек места мало отвели, причем место под стек перекрывается с адресами регистров общего назначения.

Ещё совет: если прикрепляете к сообщению текст программы - так и прикрепляйте ассемблерный файл (или если есть необходимость - файл листинга). Не надо создавать вордовский файл - он абсолютно нечитаем...
Go to the top of the page
 
+Quote Post
Aleksandr_KPI
сообщение Jun 7 2010, 11:07
Сообщение #41


Местный
***

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 7 2010, 20:39
Сообщение #42


неотягощённый злом
******

Группа: Свой
Сообщений: 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.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Aleksandr_KPI
сообщение Jun 8 2010, 10:55
Сообщение #43


Местный
***

Группа: Свой
Сообщений: 323
Регистрация: 25-08-09
Пользователь №: 52 032



Цитата
MOVX через косвенную адресацию поместит содержимое аккумулятора в ячейку памяти по адресу, хранящемуся в регистре R0.


Это я понимаю. Почему передача данных ведется через порт P0, а не скажем через порт P1 или P2?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 8 2010, 15:32
Сообщение #44


Гуру
******

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



Цитата(Aleksandr_KPI @ Jun 8 2010, 14:55) *
Почему передача данных ведется через порт P0, а не скажем через порт P1 или P2?
Потому, что разработчики МК51 так когда-то спроектировали работу МК с внешней памятью: адрес - на портах Р0 и Р2, данные - на Р0
Go to the top of the page
 
+Quote Post
Aleksandr_KPI
сообщение Jun 10 2010, 13:38
Сообщение #45


Местный
***

Группа: Свой
Сообщений: 323
Регистрация: 25-08-09
Пользователь №: 52 032



Цитата
Потому, что разработчики МК51 так когда-то спроектировали работу МК с внешней памятью: адрес - на портах Р0 и Р2, данные - на Р0


У меня в данном примере данные и адрес передаются по одному порту P0. А как быть в другом случае, например мне нужно написать программу для передачи данных из МК в ПЛИС и наоборот. Имеется два порта Р6 и Р7 микроконтроллера C8051F020. По седьмому порту передаются данные по шестому адрес. Для передачи данных в ПЛИС тоже используется команда MOVX или можно просто передавать данные побайтно в порты? Я не совсем понял выражение :
Цитата
адрес - на портах Р0 и Р2
. Как использовать команду MOVX если адрес и данные на разных портах?
Go to the top of the page
 
+Quote Post

5 страниц V  < 1 2 3 4 5 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 05:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01495 секунд с 7
ELECTRONIX ©2004-2016