Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Программа для микроконтроллера
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Страницы: 1, 2
Aleksandr_KPI
Подскажите почему компилятор не видит некоторые регистры специальных функций: EMI0CF, XBR, P1MDOUT. В то же время нормально воспринимает TH, TL, TCON... При компиляции выдает ошибку UNDEFINE SIMBOL. А вот если обратится к регистру по адресу то все нормально работает, только потом читать код трудно становится. В среде Keil uVision четко выбираю свой микроконтроллер (Silicon Laboretories C8051F020) да и переферия правильно отображается.
Палыч
Цитата(Aleksandr_KPI @ Jun 16 2010, 15:22) *
Подскажите почему компилятор не видит некоторые регистры специальных функций
Наверное, потому, что нет
#include <cygnal\c8051F020.h>
Aleksandr_KPI
А как быть если программа на ассемблере?
Палыч
Цитата(Aleksandr_KPI @ Jun 16 2010, 18:53) *
А как быть если программа на ассемблере?
И для ассемблера есть директива $INCLUDE (файл.ink). Подходящий подключаемый файл найдите в Keil\C51\ASM
Aleksandr_KPI
Спасибо все нашел, только в случае с keil uVision нужно еще перед дерективой $INCLUDE прописать $nomod51, которая отключит регистры объявленные по умолчанию. Если этого не сделать будет конфликт с вновь объявляемыми.

1.Подскажите, в чем разница между режимами Open-Drain и Push-Pull. Читал http://www.proz.com/kudoz/english_to_russi...ll.html#1000368, мало что понятно, а больше не нашел. Я так понял это два варианта настройки портов МК в выходном режиме.

2. Прочитал такую вещь

Цитата
Обычные команды чтения порта (например, MOV A,P2) реализуют ввод информации только с внешних выводов порта. В соответствующие регистры-фиксаторы при этом предварительно должны быть записаны "1", чем обеспечивается настройка линий порта на ввод.


Где находится регистры-фиксаторы порта и как к ним обратится. Нужно смотреть в сторону регистра специальных функций или я не прав?
Палыч
Цитата(Aleksandr_KPI @ Jun 17 2010, 13:30) *
нужно еще перед дерективой $INCLUDE прописать $nomod51
Или в опциях проекта (Options -> A51) убрать галку "Define 8051 SFR Names"

Ваши вопросы, как я понял, касаются ввода-вывода в/из параллельные порты МК51? "На пальцах" это, примерно, так:
Вывод. Выводимое значение помещается в регистр. Ноль в соответствующем разряде открывает ключ, соединяющий "ногу" МК с "землёй": на ноге - низкий уровень. Единица - запирает ключ ("отрывает" от земли), но нога соединена (внутри МК, конечно) через резистор с большим сопротивлением (pullup, подтягивающий резистор) к источнику питания, который в отсутствии "притягивания" извне ноги к земле и большого сопротивления внешней нагрузки на ноге, создаёт на ноге высокий уровень.
Ввод. Информация "снимается" непосредственно с ноги МК. Нолик читается если мы вывели на ногу низкий уровень (выдали 0; открыли ключ, соединяющий ногу с землёй) или низкий уровень "навалился" на ногу с выхода другой м/с, соединенном с ногой МК. В противном случае - читается единица (т.е. ноль как-бы "приоритетнее"). Поэтому в МК51 для чтения с портов (Р0, Р1 и т.д.) нужно выдать в порт единицы (или не выводить ничего - после сброса там и так единицы).
Aleksandr_KPI
Цитата
Или в опциях проекта (Options -> A51) убрать галку "Define 8051 SFR Names"


Тоже верно smile.gif .


В принципе что касается ввода-вывода понятно, а как быть с Open-Drain и Push-Pull. В даташите на контролер написано
Цитата
The output mode of port pin can be configured as either Open-Drain or Push-Pull;


Существует регистр к примеру P1MDOUT для порта Р1, который настраивает его в режим Open-Drain или Push-Pull, а в чем разница между ними?
Палыч
Цитата(Aleksandr_KPI @ Jun 17 2010, 15:50) *
Open-Drain или Push-Pull, а в чем разница между ними?
То, что я описал выше - реализовано в классическом 8051 - это Open Drain. В Push-Pull: два ключа - один соединяет ногу с землей, другой - с питанием; открыт всегда один из них в зависимости от выданного значения.
Aleksandr_KPI
Цитата
В Push-Pull: два ключа - один соединяет ногу с землей, другой - с питанием; открыт всегда один из них в зависимости от выданного значения.

Не совсем понял разницу, зачем вводить два ключа,что это дает?
Dog Pawlowa
Цитата(Aleksandr_KPI @ Jun 18 2010, 15:01) *
что это дает?

Скорость.
Палыч
Цитата(Aleksandr_KPI @ Jun 18 2010, 15:01) *
зачем вводить два ключа,что это дает?
Как было сказано выше: создание высокого уровня на ноге при Open Drain осуществяется с помощью pullup с "большим" сопративлением. Это приводит к тому, что скорость нарастания уровня сигнала может оказаться недостаточной для некоторых случаев применения МК. Чтобы спасти ситуацию и предусмотрели возможность переключения на Push-Pull (второй ключ, обычно, просто "закорачивает" pullup).
Aleksandr_KPI
Тоесть скорость выдачи данных через порт? А метод чтения и записи порта остается прежним?


Палыч
Цитата(Aleksandr_KPI @ Jun 18 2010, 15:44) *
А метод чтения и записи порта остается прежним?
Если под "метод чтения и записи" Вы подразумеваете "те же порты", то - да. Но, с чтением при Push-Pull, наверное ничего не выйдет (разве в МК51 есть регистр направления информации для параллельных портов?), т.е. то что выдали - то и считаете ("пересилить" высокий уровень сигнала на ноге внешним сигналом с низким уровнем без потери работоспособности выхода МК не удастся). Как я себе понимаю: Push-Pull включают только при работе порта на вывод.
Aleksandr_KPI
Разбираю работу примера программы из пакета 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
Палыч
Цитата(Aleksandr_KPI @ Jul 23 2010, 14:43) *
Команда orl P1MDOUT,#40h настраивает порт в режим выхода, а зачем его настраивают на вход: команда orl P1MDIN, #40h.

Чтобы в паре с верхним ключем работал Pull-up
Aleksandr_KPI
Иными словами 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). Правильно ли я настроил порты? Хочу прошить микроконтроллер и не охота его случайно спалить.
Mastercutor
Цитата(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 $ или еще что.


И еще.

"Минус" программы - нет выхода из цикла, если ПЛИС так и не будет загружена (например, какая-либо аппаратная неисправность).
Было бы неплохо сделать оповещение оператора в случае НЕЗАГРУЗКИ ПЛИС (даже самому потом проще будет в глюках разбираться).
Палыч
Цитата(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).
Mastercutor
Цитата(Палыч @ 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).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.