Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Chip115 »

Всем привет!
Вот тут уже мозг сломал с С8051F410.
В общем надо опросить 3 кнопки. Повесил я их на порт 1 в младшую тетраду. Причем также юзаю АЦП и вывод vref также на P1.2 .
Получается кнопки занимают P1.0, P1.1, P1.3. Причем порты у меня подтянуты к vcc резисторами в 1 кОм, а кнопки посажены между пином и землей так, что при нажатии будет 0 иначе 1.
Проблема в том, что после инициализации порта у меня пин прижимается к земле и так остается там лежать.

Код: Выделить всё

        P1MDOUT = 0xF0;     
        P1MDIN = 0xFB;
        P1 = 0x04;
        P1SKIP = 0x04; 
     
        XBR1 =  0x40; 

Где я ошибся?
В приложении куски схемы, и скрин инициализации, а также кусок доки.
Вложения
кусокДоки.PNG
(188.7 КБ) 657 скачиваний
контроллер.PNG
(30.71 КБ) 319 скачиваний
КлавиатураИДисплей.PNG
(31.49 КБ) 675 скачиваний
Инициализация.PNG
(39.74 КБ) 665 скачиваний
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
CherepVM
Родился
Сообщения: 17
Зарегистрирован: Пт окт 26, 2012 13:34:22
Откуда: Украина, Черновицкая обл.
Контактная информация:

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение CherepVM »

Приветик!

Я юзаю C8051F320 и для опроса линий порта в матрице делаю пропуск этих линий(PinSkip). Всё работает чики-пики, никогда проблем небыло. Не пропускаю только те линии которые надо использовать для UART, SPI, CP0... и т.д.
Попробуйте у себя тож сделать пропуск Р1.0, Р1.1, Р1.3( P1SKIP = 0x0F;)..., может поможет.
И ещё...., для этих линий/пинов делаю OpenDrain.
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Chip115 »

Не помогло.
Блин. Вечно проблемы с этими портами. Вообще не могу понять одно. У нас регистры MDOUT и MDIN отвечают за то, что порт будет работать как открытый сток или пуш-пул, а так же аналоговый или цифровой. Но принцип остался тот же - если записываем в порт, значит выводим инфу. Если читаем - значит вводим. т.е. мы не настраиваем жестко (как в атмеле например) какой у нас вход, а какой выход. Так?
Почему тогда после того, как я сделаю вот так P1=(P1|0x70)&0xEF , а потом пытаюсь прочесть кнопки

Код: Выделить всё

sbit Up = P1^3;
sbit Dwn = P1^0;
sbit Sys = P1^1;
if (Up==0||Dwn==0||Sys==0)
            {
              //delay_50us(400);
              LED=1;
             }
             else LED=0;
 

на пине, где кнопка "поселяется" нуль. В данном случае меня не интересует старшая тетрада. Но в результате лог. И у меня в младшей тетраде получается 0111b. Почему нуль застревает в пине, когда я читаю состояние порта и там железно должна быть единица, так как он подтянут? Или этот нуль выставляется контроллером и он же считывается и мк попадает в вечный цикл?
Вижу выход в побитовом управлении портом. Но не хочется нагружать код конструкциями типа sbit DIGIT_0 = P1^4;
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
CherepVM
Родился
Сообщения: 17
Зарегистрирован: Пт окт 26, 2012 13:34:22
Откуда: Украина, Черновицкая обл.
Контактная информация:

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение CherepVM »

Так это проблема с одной кнопкой или с тремя?
Робко так спрошу...., а может кнопка залипла или залипуха в монтажке?
А при ресете, до инициализации, на пинах МК, там где кнопки, есть 3,3В?

Вижу выход в побитовом управлении портом. Но не хочется нагружать код конструкциями типа sbit DIGIT_0 = P1^4;
Ну для диагностики, стоит попробовать и таким методом опроса. Я вообще-то так и делаю, но проги пишу только на асме.
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3780
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Ser60 »

Для конфигурирования порта C8051 на чтение надо:
1. Сконфигурировать пин порта на Open Drain и режим Digital. При этом верхний выходной транзистор потра будет отключен. У Вас на картинке конфигуратора сделано неправильно.
2. Поставить галку в Pin Skip. При этом пин порта будет задействован под I/O. У Вас также галки на картинке не стоят. Это значит, что Crossbar соединит выводы порта с соответствующей периферией. Но если в XBR0 нули, то выводы периферии также не задействованы.
3. Важно: и что не сделано у Вас в коде: записать единицы в биты порта P1, сконфигурированных на вход. При этом нижний выходной транзистор отключится и весь выходной драйвер не будет влиять на ввод значений. У Вас в коде пинах P1.0, P1.1, P1.3 стоят нули!

Кстати, подтягивающие резисторы на кнопки не нужны, если разрешить внутренние подтяжки в регистре XBR1.
gyoopi
Родился
Сообщения: 7
Зарегистрирован: Пн ноя 12, 2012 19:40:29

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение gyoopi »

Я начинаю изучать МК по книге "Занимательно о микроконтроллерах".
И там говорят о МК MCS-51. Может кто-то держал эту книгу в руках ( и даже читал ), поэтому задаю вам пару вопросов, чтобы потом не появилась куча: Подойдут ли эти МК? (хоть и написано MCS 51, а из-за незнания терзают сомнения).

Надо читать книгу внимательнее ! Урок самому себе )
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3780
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Ser60 »

Я эту книгу не читал, но не вижу препятствий. Все, что там написано применимо и к силабовским МК. Однако, чего там нет - это описание некоторых специфических периферийных модулей (например SmaRTClock таймер), которые есть только в C8051. Другой важный и специфический блок, без которого ничего не будет работать в C8051 и которого нет ни в каком другом М51 - это коммутатор ресурсов (Crossbar, или Xbar). Однако, имеются и книги на русском по семейству C8051. Порекомендовать могу книгу Гладштейна. Она вполне сойдет на первых порах, однако после ее публикации фирма выпустила массу новых МК, которые в книге не упомянуты. Но после ее прочтения будет вполне реально разобаться с ними по ДШ. Ну и мы тут помочь сможем.
http://www.ozon.ru/context/detail/id/3795608/
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15546
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение BOB51 »

Если по силапсям... Попадаются и доки на русском, и книжки:
О.Николайчук
х51-совместимые микроконтроллеры фирмы Cygnal. - М.: ООО "ИД СКИМЕН", 2002.
к примеру...
:beer:
CherepVM
Родился
Сообщения: 17
Зарегистрирован: Пт окт 26, 2012 13:34:22
Откуда: Украина, Черновицкая обл.
Контактная информация:

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение CherepVM »

Здраствуйте!

Chip115, проблема с кнопками у вас резрешилась? Не знаю как кому, а мне интересно чем закончилась "эпопея" с кнопочками. :roll:

У меня тож возник вопросик.
Имеется схема(вложение "DKZ-CPU"), в которой есть резисторные(R6...R11) делители напряжения внутреннего ИОН, для опоры сомпараторов CP0 и CP1. Пока не впаял R7, напруга Vref=2,44В, но после его впайки, напруга ИОН упала аж на 0,2В :shock: .
Нагрузка, с всеми делителями, на ИОН составляет около 1,3мА..., неужели это так критично? Интересно, каким током можна нагружать внутрешний ИОН, шоб его напруга не выходила за пределы номинальной(2,44В)?
Из инфы по даташиту понять немогу :dont_know: . Там есть только параметр "Ток короткого замыкания через вывод VRef", макс. = 10мА.
Пока проблему решил, сделав внешний ИОН на TL431.
Вложения
DKZ-CPU.JPG
(71.84 КБ) 640 скачиваний
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Gudd-Head »

CherepVM писал(а):Из инфы по даташиту понять не могу

:facepalm:
Load Regulation — (Load = 0 to 200 μA to GND) — 1.5 ppm/μA
Ишь чего захотели, ещё и встроенную опору делить.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
CherepVM
Родился
Сообщения: 17
Зарегистрирован: Пт окт 26, 2012 13:34:22
Откуда: Украина, Черновицкая обл.
Контактная информация:

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение CherepVM »

Ага, вот какой парметр объясняет это...., спасибо :beer: , буду теперь знать.
У меня русский даташит на F320, и там этот параметр звучит "Нестабильность тока по нагрузке"..., как-бы не совсем понятно о чём речь. Вот если бы было "Нестабильность напруги по нагрузке" - совсем другое дело. Но конешно, тут всё зависит от знаний программёра...., мои ещё скудны..., бум стремиться к их накоплению и правильному пониманию.

Ишь чего захотели, ещё и встроенную опору делить.
:oops:
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Gudd-Head »

CherepVM писал(а):У меня русский даташит

Это корень зла.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Selot
Родился
Сообщения: 6
Зарегистрирован: Пт ноя 23, 2012 18:51:47

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Selot »

Всем привет. Нужна кое-какая помощь :) Есть асм, мк51, 3 семисегментных индикатора и 12 кнопок (0-9, сброс, минус). Нужно, чтобы по нажатию кнопок соответствующие числа записывались по очереди на индикаторы. Т.е. нажал "1", на первом индикаторе "1" высветелось, затем нажал "5", на втором индикаторе "5" появилось, с третьим аналогично. Проблема в том, что я не могу никак додуматься, как программно менять очередность вывода в порты. :( Писать однотипный код на каждый из 3х портов - мало хорошего, поэтому ищу решение получше. Р1 у меня принимает сигналы с кнопок; Р0, Р2, Р3 - подключены к 1, 2, 3 индикатору соответственно.
ПС. могу скинуть схемку из протеуса и код, если понадобится.
CherepVM
Родился
Сообщения: 17
Зарегистрирован: Пт окт 26, 2012 13:34:22
Откуда: Украина, Черновицкая обл.
Контактная информация:

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение CherepVM »

Здраствуйте!

Если нужно сделать именно так как вы описали, то первое, что приходит в голову..., использование команды сравнения: cjne R1,#номер индикатора. R1 содержит номер индикатора и сравнивается с константой #номер индикатора, если совпало, то вывод в нужный порт, не совпало - переход на сравнение с другим значением константы. Напрмер такая подпрограммка:

Код: Выделить всё

;========================;
;Вход:    A  - байт для вывода на семисегментный индикатор.
;         R1 - счетчик или номер индикатора.

out_Ind:
;..........................;
          cjne R1,#3,mmm$  ;проверяем значение счетчика номера индикатора...
mmm$:     jnC  exit$       ;если R1>=3, то выход...
;..........................;иначе - делаем анализ...
          cjne R1,#0,next1$;если R1<>0, то далее...
          mov  P0,A        ;иначе - вывод в первый индикатор и
          ret              ;выход.
;..........................;
next1$:   cjne R1,#1,next2$;если R1<>1, то далее...
          mov  P2,A        ;иначе - вывод в второй индикатор и
          ret              ;выход.
;..........................;
next3$:   cjne R1,#2,exit$ ;если R1<>2, то выход...
          mov  P3,A        ;иначе - вывод в третий индикатор и
exit$:    ret              ;выход
;..........................;
;========================;

Можна использовать таблицу переходов, но это эффективно если есть много значений для сравнения.
CherepVM
Родился
Сообщения: 17
Зарегистрирован: Пт окт 26, 2012 13:34:22
Откуда: Украина, Черновицкая обл.
Контактная информация:

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение CherepVM »

И ещё...., если там где будет использоваться эта подпрограммка есть использование флага С, то делаем PUSH PSW, потом CALL out_Ind, а после неё - POP PSW.
Selot
Родился
Сообщения: 6
Зарегистрирован: Пт ноя 23, 2012 18:51:47

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Selot »

Спасибо. Но я уже пробовал использовать подобную конструкцию. При нажатии любой кнопки инкрементировал регистр, сравнивал его итд. В мыслях я у себя прокручивал алгоритм: нажатие кнопки формирует логическую единицу на бите Р1.0, к примеру, программа эту единицу обрабатывает, засовывая в порт Р0 код цифры и инкрементирует R1, чтобы на следущее нажатие выводить в другой порт. А на деле оказалось, что пока мы нажимаем кнопку, инкремент срабатывает несколько раз и цифра выводится на 3 индикатора сразу :shock:
Прикреплю скрин схемки, на всякий.
Вложения
proteus.jpg
(113.05 КБ) 654 скачивания
CherepVM
Родился
Сообщения: 17
Зарегистрирован: Пт окт 26, 2012 13:34:22
Откуда: Украина, Черновицкая обл.
Контактная информация:

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение CherepVM »

Дребезг контактов программно "глушите"? Похоже что нет, бо....
....А на деле оказалось, что пока мы нажимаем кнопку, инкремент срабатывает несколько раз....
. Или неверно обрабатываете нажатие кнопок.
Selot
Родился
Сообщения: 6
Зарегистрирован: Пт ноя 23, 2012 18:51:47

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Selot »

Вот мой быдло-код:

Код: Выделить всё

org 0
   jmp   start0
org 100h
set7:   MOV P0, #11111000b ;7
      jmp start
set8:   MOV P0, #10000000b ;8
      jmp start
set9:   MOV P0, #10010000b ;9
      jmp start
set0:   MOV P0, #11000000b ;0
      jmp start
setMin:   MOV P0, #10111111b ; Minus
      jmp start
setRes:   MOV P0, #11111111b ; Reset
      jmp start   
      
set1:   MOV P0, #11111001b ;1
      jmp start
set2:   MOV P0, #10100100b ;2
      jmp start
set3:   MOV P0, #10110000b ;3
      jmp start
set4:   MOV P0, #10011001b ;4
      jmp start
set5:   MOV P0, #10010010b ;5
      jmp start
set6:   MOV P0, #10000010b ;6
      jmp start
start0:      
      MOV R2, #0
start:   CLR P1.0
      CLR P1.1
      CLR P1.2
      CLR P1.3
      CLR P1.4
      CLR P1.5
      CLR P1.7
            
      MOV C, P1.7
      ANL C, P1.0
      JC set7

      MOV C, P1.7
      ANL C, P1.1
      JC set8

      MOV C, P1.7
      ANL C, P1.2
      JC   set9

      MOV C, P1.7
      ANL C, P1.4
      JC   set0
      
      MOV C, P1.7
      ANL C, P1.3
      JC   setRes

      MOV C, P1.7
      ANL C, P1.5
      JC   setMin
      
      JB    P1.0, set1
      JB    P1.1, set2
      JB    P1.2, set3
      JB    P1.3, set4
      JB    P1.4, set5
      JB    P1.5, set6
END

Рад услышать критику.
Этот код только на 1 индикатор выводит.
CherepVM
Родился
Сообщения: 17
Зарегистрирован: Пт окт 26, 2012 13:34:22
Откуда: Украина, Черновицкая обл.
Контактная информация:

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение CherepVM »

У меня есть плохая привычка...., жуть как не люблю копаться в чужем коде(тем боле когда нет подробных коментариев), мне проще сесть и самому написать/реализовать какой-то алгоритм, чем расшифровывать как он реализован в чужем коде.
Но..., как по мне, при работе с кнопками, группой кнопок, в программе их обслуживания должны быть как минимум две... три подпрограммы: 1.отслеживение нажатие кнопки; 2.отслеживание отпускания кнопки; 3.формирование кода кнопки. Именно в первых двух подпрограммах и формируется антидребезг.
В вашем коде(бегло просмотрел) я не видел цикла ожидания, ну хотя бы, отпускания уже нажатой кнопки. После разпознания кнопки, инкремент номера индикатора нужно делать после того как дождались отпускания нажатой кнопки. Тогда инкрементирование номера индикатора уже не будет безконтрольным.
Selot
Родился
Сообщения: 6
Зарегистрирован: Пт ноя 23, 2012 18:51:47

Re: Мелкие вопросы по МК-51 а-ка MCS-51, ASM и не только..

Сообщение Selot »

Цикл ожидания это что-то типа такого?

Код: Выделить всё

mov r0, #50
cc:
nop
djnz r0, cc
Ответить

Вернуться в «Разные вопросы по МК»