|
|
  |
Программа для микроконтроллера, Как работает код |
|
|
|
Jul 23 2010, 10:43
|
Местный
  
Группа: Свой
Сообщений: 323
Регистрация: 25-08-09
Пользователь №: 52 032

|
Разбираю работу примера программы из пакета Silicon Laboratories IDE. Наткнулся на такой отрывок кода: Код ; Set P1.6 (LED) as digital output in push-pull mode. orl P1MDIN, #40h orl P1MDOUT,#40h Команда orl P1MDOUT,#40h настраивает порт в режим выхода, а зачем его настраивают на вход: команда orl P1MDIN, #40h. Весь код: Код $NOMOD51 $include (c8051f020.inc) ; Include register definition file.
GREEN_LED equ P1.6 ; Port I/O pin connected to sound generator.
cseg AT 0 ljmp Main ; Locate a jump to the start of code at ; the reset vector.
Blink segment CODE
rseg Blink ; Switch to this code segment. using 0 ; Specify register bank for the following ; program code.
Main: ; Disable the WDT. (IRQs not enabled at this point.) ; If interrupts were enabled, we would need to explicitly disable ; them so that the 2nd move to WDTCN occurs no more than four clock ; cycles after the first move to WDTCN.
mov WDTCN, #0DEh mov WDTCN, #0ADh
; Enable the Port I/O Crossbar mov XBR2, #40h
; Set P1.6 (LED) as digital output in push-pull mode. orl P1MDIN, #40h orl P1MDOUT,#40h
; Initialize LED to OFF clr GREEN_LED
; Simple delay loop. Loop2: mov R7, #03h Loop1: mov R6, #00h Loop0: mov R5, #00h djnz R5, $ djnz R6, Loop0 djnz R7, Loop1 cpl GREEN_LED ; Toggle LED. jmp Loop2 END
|
|
|
|
|
Jul 26 2010, 09:41
|
Местный
  
Группа: Свой
Сообщений: 323
Регистрация: 25-08-09
Пользователь №: 52 032

|
Иными словами 6 вывод порта 1 настраивается в режим выхода Push-Pull, а второй нижний ключ подтягивается к единице через резистор Pull-up? На основе этой программы написал свою. Код $include (c8051f020.inc)
Port_P3 EQU 0B0H PROGRAM BIT Port_P3.0 DONE BIT Port_P3.1 BIPP BIT Port_P3.2 TMP_CNT equ 030H BYTE_CNT equ 031H
cseg AT 0 ljmp Main ; Locate a jump to the start of code at ; the reset vector.
Blink segment CODE rseg Blink ; Switch to this code segment. using 0 ; Specify register bank for the following ; program code. Main:
mov WDTCN, #0DEh mov WDTCN, #0ADh
; Enable the Port I/O Crossbar mov XBR2, #40h
orl P3MDIN, #07h orl P3MDOUT,#05h
CLR BIPP INIT_XILINX: JB DONE,DONE_OK CLR PROGRAM CALL DELL_10MS SETB PROGRAM CALL DELL_100MS CALL DELL_100MS CALL DELL_100MS CALL DELL_100MS JB DONE,DONE_OK MOV BYTE_CNT,#100 IXL_LOOP: CALL DELL_100MS JB DONE,DONE_OK DJNZ BYTE_CNT,IXL_LOOP JMP INIT_XILINX DONE_OK: CALL DELL_100MS RET
DELL_100MS: CALL DELL_10MS CALL DELL_10MS CALL DELL_10MS CALL DELL_10MS CALL DELL_10MS CALL DELL_10MS CALL DELL_10MS CALL DELL_10MS CALL DELL_10MS DELL_10MS: CALL DELL_1MS CALL DELL_1MS CALL DELL_1MS CALL DELL_1MS CALL DELL_1MS CALL DELL_1MS CALL DELL_1MS CALL DELL_1MS CALL DELL_1MS DELL_1MS: MOV TMP_CNT,#250 DJNZ TMP_CNT,$ MOV TMP_CNT,#250 DJNZ TMP_CNT,$ RET END Задача программы: проверять состояние порта P3.1 и управлять сигналом разрешения начала программирования ПЛИС (порт P3.0). Правильно ли я настроил порты? Хочу прошить микроконтроллер и не охота его случайно спалить.
|
|
|
|
|
Jul 26 2010, 12:01
|
Группа: Новичок
Сообщений: 2
Регистрация: 9-10-09
Пользователь №: 52 837

|
Цитата(Aleksandr_KPI @ Jul 23 2010, 13:43)  Команда orl P1MDOUT,#40h настраивает порт в режим выхода, а зачем его настраивают на вход: команда orl P1MDIN, #40h. У этих контроллеров биты порта могут работать как в аналоговом режиме, так и в цифровом. Push-Pull работает только в цифровом. Поэтому, сначала устанавливают режим работы - цифровой, а затем включают Пуш-Пул. См. даташит. Цитата(Aleksandr_KPI @ Jul 26 2010, 12:41)  Иными словами 6 вывод порта 1 настраивается в режим выхода Push-Pull, а второй нижний ключ подтягивается к единице через резистор Pull-up?
На основе этой программы написал свою... Программа должна глючить. Первое, что бросилось в глаза - в метке DONE_OK, после CALL DELL_100MS, стоит RET. Выполнив эту команду, контроллер уйдет в "свободное плавание". На время отладки тут должен быть JMP $ или еще что. И еще. "Минус" программы - нет выхода из цикла, если ПЛИС так и не будет загружена (например, какая-либо аппаратная неисправность). Было бы неплохо сделать оповещение оператора в случае НЕЗАГРУЗКИ ПЛИС (даже самому потом проще будет в глюках разбираться).
Сообщение отредактировал Mastercutor - Jul 26 2010, 11:46
|
|
|
|
|
Jul 26 2010, 14:29
|

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

|
Цитата(Aleksandr_KPI @ Jul 26 2010, 13:41)  Иными словами 6 вывод порта 1 настраивается в режим выхода Push-Pull, а второй нижний ключ подтягивается к единице через резистор Pull-up? Цитата(Mastercutor @ Jul 26 2010, 16:01)  У этих контроллеров биты порта могут работать как в аналоговом режиме, так и в цифровом. Push-Pull работает только в цифровом. Поэтому, сначала устанавливают режим работы - цифровой, а затем включают Пуш-Пул. См. даташит. Смотрим DS: Регистр P1MDIN при записи в его разряды единицы переводит в режим "Цифровой ввод" соответствующую ногу порта Р1. На вывод этот регистр не влияет (за исключением подключения Pull-up - если не выбран "Цифровой ввод": Pull-up остаётся отключеным). В режиме "Цифровой ввод" к ноге может быть подключен Pull-up, но - не обязательно, есть ещё ряд условий для его подключения, например, XBR2.7. В режиме Push-Pull подключение Pull-up производится только если открыт верхний ключ (если открыт нижний ключ - Pull-up - отключен - см. рис.17.1).
|
|
|
|
|
Jul 27 2010, 08:11
|
Группа: Новичок
Сообщений: 2
Регистрация: 9-10-09
Пользователь №: 52 837

|
Цитата(Палыч @ Jul 26 2010, 17:29)  Смотрим DS: Регистр P1MDIN при записи в его разряды единицы переводит в режим "Цифровой ввод" соответствующую ногу порта Р1. На вывод этот регистр не влияет (за исключением подключения Pull-up - если не выбран "Цифровой ввод": Pull-up остаётся отключеным). В режиме "Цифровой ввод" к ноге может быть подключен Pull-up, но - не обязательно, есть ещё ряд условий для его подключения, например, XBR2.7. В режиме Push-Pull подключение Pull-up производится только если открыт верхний ключ (если открыт нижний ключ - Pull-up - отключен - см. рис.17.1). Все верно. P1MDIN определяет режим ввода порта P1 и кроме того управлет подтяжкой. Перевод бита этого регистра в "1" (цифровой вход) необходим для чтения состояния выхода. Если бит будет находится в "0" (аналоговый вход), то при чтении состояния выхода всегда будет возвращаться "0". XBR2.7 - глобальное разрешение/запрещение подтяжек (Pull-up).
Сообщение отредактировал Mastercutor - Jul 27 2010, 08:13
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|