Easyelectronics.ru

Электроника для всех
Текущее время: 26 фев 2021, 03:53

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 37 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Код для at89c51 в keil uvision
СообщениеДобавлено: 28 авг 2013, 00:25 
Только пришел

Зарегистрирован: 28 авг 2013, 00:06
Сообщения: 17
Доброго времени суток!

Я догадывался, что рано или поздно придется программировать. Этот день наступил. Необходимо написать программу для тестирования параметров данного мк. Писать решил на ассемблере. До этого писал пару программок в паскале аля п ничего не писал.
Хочу спросить, будет ли работать то, что я написал (это кусок того, что надо сделать)? Если нет, то какие ошибки здесь есть (то есть, это и так все одна большая ошибка..)?
Здесь проверяю напряжения высоких/низких уровней... где-то.. Адреса этих "где-то" взял в файле, где sfr разные (0x80,0x8E).
В чем суть. Мк ждет сигнала на одном из пинов порта 2 (0xA0). Когда фиксирует этот импульс, ищет в таклице команд нужную и переходит на выполнение этой команды в самом коде.
Я уверен, что работать не будет. Возможность проверить в деле будет только через неделю.

Спасибо.

Код:
NAME   AT89
sbit   Uoh      =   P2^2
sbit   Uol      =   P2^3
sbit   Uoh1   =   P2^4
sbit   Uol1   =   P2^5
port2_to_1   BIT      0xA0
         
WAITHIGH:   JB       0xA0,0               ; waiting for strobe on port 2
         LJMP WAITHIGH
WAITLOW:   JNB    0xA0,0
         LJMP WAITLOW
;MOV      DPTR,#0xA0                  ; save 1 or 0 to data pointer and looking for a command in the table
         LCALL   LOW(TABLE<<1)         ;looking for a command in the table
         LCALL   HIGH(TABLE<<1)
         SETB   port2_to_1

PORTHIGH:   CLR      0x90                  ;HIGH level on port 1,2,3
         CLR      0xA0
         CLR      0xB0
         SETB   0x90
         SETB   0xA0
         SETB   0xB0
         SETB   port2_to_1

PORTLOW:   CLR      0xA0                  ;LOW level on port 1,2,3
         CLR      0xA0
         CLR      0xB0
         SETB   port2_to_1
         
PORTHIGH1:   CLR      0x80                  ;HIGH level on port 0,ALE,PSEN
         CLR      0x8E                  ;set 0 to ALE
         SETB   0x80
         SETB   0x8E
         SETB   port2_to_1

PORTLOW1:   CLR      0xA0                  ;LOW level on port 0,ALE,PSEN
         CLR      0x8E
         SETB   port2_to_1         

TABLE:      DB   Uoh,LOW(PORTHIGH),HIGH(PORTHIGH),      Uol,LOW(PORTLOW),HIGH(PORTLOW)
         DB   Uoh1,LOW(PORTHIGH),HIGH(PORTHIGH),      Uol1,LOW(PORTLOW1),HIGH(PORTLOW1)
         END


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Код для at89c51 в keil uvision
СообщениеДобавлено: 28 авг 2013, 01:37 
Старожил
Аватара пользователя

Зарегистрирован: 30 янв 2010, 01:03
Сообщения: 650
Откуда: Херсон
Пиши P0, P1, P2, P3
Код:
         clr P1   ;CLR      0x90                  ;HIGH level on port 1,2,3
         clr P2   ;CLR      0xA0
         clr P3   ;CLR      0xB0
         setb P1.0  ;SETB   0x90
         setb P2.0  ;SETB   0xA0
         setb P3.0  ;SETB   0xB0


Почитай про комманды. LCALL, JB, JNB там вообще страшно смотреть.
При работе с метками не нужно их умножать на 2 (TABLE<<1 это для AVR).
Напиши своими словами алгоритм работы, найди нужные по смыслу (действию) комманды, и пиши прогу.
Всё получится.
Удачи!

_________________
Если руки золотые, то не важно с какого места они растут.
Изображение
Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Код для at89c51 в keil uvision
СообщениеДобавлено: 28 авг 2013, 10:29 
Только пришел

Зарегистрирован: 28 авг 2013, 00:06
Сообщения: 17
Если пишу Р0, Р1 и т.д, то при build target выдает ошибку at89c.a51(23): error A48: DATA-ADDRESS EXPECTED. Поэтому я и стал писать такие вот адреса.
TABLE<<1 - это здесь я умножаю на 2? Да, я смотрел пример для AVR и по комментариям того кода понял, что так выполняется поиск команды.
JB, JNB понял же.. Если бит установлен, то выполняем код далее. И наоборот. В коде для AVR это выглядит так:
Код:
WAITHIGH:   SBIS   PINB,0         ;ожидание строба команды
   RJMP   WAITHIGH
WAITLOW:   SBIC   PINB,0
   RJMP   WAITLOW


Алгоритм довольно прост. Я его для себя отдельно на листочке писал.
С внешнего устройства подаю импульс на пин N (на разный пин для каждого теста).
МК видит этот импульс и, допустим, выставляет напряжение высокого уровня на нужных мне портах (хорошо, если можно было бы написать "если импульс там-то, то делать то-то").
После этого подает импульс обратно во внешнее устройство о выполненном действии (внешнее устройство измерило напряжение).
Внешнее устройство дает команду вернуть все в исходное состояние.
МК возвращает все в исходное состояние.
Новая команда на пин N и так далее..

Из литературы читаю Keil Macro Assembler and Utilities, 8051 Microcontroller Instruction Set и даташит.

Ну я так понимаю, что я очень далек от истины?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Код для at89c51 в keil uvision
СообщениеДобавлено: 28 авг 2013, 12:47 
Только пришел

Зарегистрирован: 28 авг 2013, 00:06
Сообщения: 17
Повторное написание алгоритма помогло. Вроде как...
Поэтому написал прогу заново.
Так лучше?

Код:
NAME AT89

WAITHIGH:
JBC   P2^2,Uol
JBC   P2^3,Uol1
JBC   P2^4,Uoh
JBC   P2^5,Uoh1

READY_FLAG:      SETB           P1^4         ;Ready flag on pin 1.4.
         JBC      P1^5,RESET_ALL   ;If 1 on pin 1.5 then set 0 everywhere and
                        ;go to WAITHIGH.
            
RESET_ALL:           CLR      P1^4   ;0 on pin 1.4
         CLR      P1^5   ;0 on pin 1.5
         CLR      0x80   ;0 on port 0
         CLR      0x90   ;0 on port 1
         CLR      0xA0   ;0 on port 2
         CLR      0xB0   ;0 on port 3
         CLR      0x8E   ;0 on ALE
         CLR         ;0 on PSEN???
         LJMP   WAITHIGH
            


Uol:           CLR      0x90      ;0 on port 1,
      CLR      0xA0      ;port 2,
      CLR      0xB0      ;port 3.
      LJMP     READY_FLAG   ;set ready flag
      
Uol1:           CLR      0x80      ;0 on port 0,
      CLR      0x8E      ;ALE
                     ;PSEN???
      LJMP   READY_FLAG   ;set ready flag   
      
Uoh:           CLR      0x90      ;0 on port 1,
      CLR      0xA0      ;port 2,
      CLR      0xB0      ;port 3.
      SETB           0x90      ;1 on port 1,
      SETB           0xA0      ;port 2,
      SETB           0xB0      ;port 3.
      LJMP   READY_FLAG   ;set ready flag
      
Uoh1:           CLR      0x80      ;0 on port 0,
      CLR      0x8E      ;ALE
                  ;PSEN???
      SETB           0x80      ;1 on port 0,
      SETB           0x8E      ;ALE,
                  ;PSEN???
      LJMP   READY_FLAG   ;set ready flag
      
END


Есть вообще непонятные для меня вещи. Как установить на PSEN высокий/низкий уровень?
Очищая бит (CLR 0x80 ;0 on port 0,), я устанавливаю напряжение низкого уровня?
Как одним махом установить везде нули после выполнения команды? (Вместо попортового очищения).
Я так понимаю, что JBC P2^2,Uol и тд не будет работать? Застрянет на этой строчке?
Алгоритм.
Т- тестер, МК- микроконтроллер.
Т. Подает импульс на порт.
МК. Считывает импульс.
Выполняет команду.
Выставляет флаг готовности на пине 1.4
Т. Ожидает флага готовности.
Проводит измерение.
Подает импульс на пин 1.5, чтобы...
МК. Ждет импульса на пине 1.5
Очищает пин 1.4
Очищает порты, на которых выставлял параметры.
Ждет новый импульс, чтобы выполнить новую команду (Uol, Uol1,Uoh, Uoh1).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Код для at89c51 в keil uvision
СообщениеДобавлено: 28 авг 2013, 13:41 
Старожил
Аватара пользователя

Зарегистрирован: 30 янв 2010, 01:03
Сообщения: 650
Откуда: Херсон
C какими ключами идет запуск компилятора? И какого A51.exe или AX51.exe ?
Если AX51 Попробуй:
Код:
AX51.exe MYFILE.A51 MOD51

Если A51 Для твоего случая должно работать без параметров:
Код:
A51.exe MYFILE.A51

На крайний случай попробуй ASEM-51.
Вложение:
ASEMW.ZIP [45.64 Кб]
Скачиваний: 279

На выходе получишь сразу HEX. Запуск:
Код:
ASEMW.exe MYFILE.A51

Удачи!

_________________
Если руки золотые, то не важно с какого места они растут.
Изображение
Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Код для at89c51 в keil uvision
СообщениеДобавлено: 28 авг 2013, 13:55 
Только пришел

Зарегистрирован: 28 авг 2013, 00:06
Сообщения: 17
S_Alex писал(а):
C какими ключами идет запуск компилятора? И какого A51.exe или AX51.exe ?

В свойствах поставил галочку "генерировать hex файл".
Вот что вышло:


Вложения:
at89c.rar [204 байт]
Скачиваний: 269
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Код для at89c51 в keil uvision
СообщениеДобавлено: 28 авг 2013, 13:59 
Старожил
Аватара пользователя

Зарегистрирован: 30 янв 2010, 01:03
Сообщения: 650
Откуда: Херсон
Цитата:
Как установить на PSEN высокий/низкий уровень?

Это программно нельзя сделать. Нужно задействовать механизм работы с внешней ПЗУ, активировать сигнал EA.

Цитата:
PSEN — разрешение внешней памяти программ; выдается только при обращении к внешнему ПЗУ;
ALE — строб адреса внешней памяти;
ЕА — отключение внутренней программной память; уровень 0 на этом входе заставляет микроконтроллер выполнять программу только из внешнего ПЗУ; игнорируя внутреннее (если последнее имеется);

_________________
Если руки золотые, то не важно с какого места они растут.
Изображение
Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Код для at89c51 в keil uvision
СообщениеДобавлено: 28 авг 2013, 14:02 
Старожил
Аватара пользователя

Зарегистрирован: 30 янв 2010, 01:03
Сообщения: 650
Откуда: Херсон
Найди файл с расширением lst. Загляни в него может многое станет ясным.

_________________
Если руки золотые, то не важно с какого места они растут.
Изображение
Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Код для at89c51 в keil uvision
СообщениеДобавлено: 28 авг 2013, 14:05 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 4381
Откуда: г. Липецк
sery писал(а):
Есть вообще непонятные для меня вещи. Как установить на PSEN высокий/низкий уровень?

Никак, это служебный пин, стробируется при чтении внешней памяти программ.
sery писал(а):
Я так понимаю, что JBC P2^2,Uol и тд не будет работать?

Будет работать JBC P2.2,Uol
Остальное чересчур сумбурно, не понял.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Код для at89c51 в keil uvision
СообщениеДобавлено: 28 авг 2013, 14:11 
Только пришел

Зарегистрирован: 28 авг 2013, 00:06
Сообщения: 17
Ох сколько всего..

S_Alex писал(а):
Найди файл с расширением lst. Загляни в него может многое станет ясным.

Я так понимаю, в нем я вижу то, что показывается во время запуска отладчика? Не очень понятно, что там можно увидеть (пока что). Понятно, что там адреса разные написаны, но не более того.

anakost писал(а):
Будет работать JBC P2.2,Uol
Остальное чересчур сумбурно, не понял.

Мне надо, чтобы все, что указано в waithigh работало (ну, типа мониторить указанные пины). и, когда мк увидит импульс на одном из этих пинов, выполнить кусок кода.


Вложения:
Комментарий к файлу: LST
at89cv2.rar [1.21 Кб]
Скачиваний: 287
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Код для at89c51 в keil uvision
СообщениеДобавлено: 28 авг 2013, 14:16 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 4381
Откуда: г. Липецк
sery писал(а):
Мне надо, чтобы все, что указано в waithigh работало (ну, типа мониторить указанные пины). и, когда мк увидит импульс на одном из этих пинов, выполнить кусок кода.

Не сижу структуры самой программы, то что написано выполнится один раз. Где цикл? Типа этого:
Код:
Start:
...   
   AJMP   Start


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Код для at89c51 в keil uvision
СообщениеДобавлено: 28 авг 2013, 14:48 
Только пришел

Зарегистрирован: 28 авг 2013, 00:06
Сообщения: 17
anakost писал(а):
Не сижу структуры самой программы, то что написано выполнится один раз. Где цикл?

мм, одновременно с ответом такую же штуку решил сделать. Где-то после ajmp пишут в новой строке ret. надо ли здесь?
а как в остальном?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Код для at89c51 в keil uvision
СообщениеДобавлено: 28 авг 2013, 14:55 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 4381
Откуда: г. Липецк
Здесь не надо, RET это выход из подпрограммы. Чтобы туда зайти нужно инициализировать стек. Сейчас его нет. Да и вообще одни огрызки.
Цитата:
SETB P1.4 ;Ready flag on pin 1.4.

Это не чтение, а неправильная установка бита порта, белиберда одна.
Установите uVision, загрузите это, она вам все расскажет.
>> sery, удалять свои посты конечно дело ТС, но непонятно на что я сейчас отвечаю?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Код для at89c51 в keil uvision
СообщениеДобавлено: 28 авг 2013, 18:18 
Только пришел

Зарегистрирован: 28 авг 2013, 00:06
Сообщения: 17
Я не удалил ни одного поста.

Понятно, что это норм код, тем более, что первый раз такое делаю. Мне просто понять, будет ли работать то, что уже написано, чтобы уже ошибок в остальном коде не делать.

В uvision это сижу. Все компилируется прекрасно:
"Build target 'Target 1'
assembling at89cv2.a51...
linking...
Program Size: data=8.0 xdata=0 code=84
creating hex file from "at89c"...
"at89c" - 0 Error(s), 0 Warning(s)."

SETB P1.4 ;Ready flag on pin 1.4.
Это МК устанавливает (по крайней мере, я думаю, что он это так делает) высокий уровень, а тестер это видит и отдает команду на пин 1.5, чтобы мк все обнулил и ждал нового импульса на одном из пинов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Код для at89c51 в keil uvision
СообщениеДобавлено: 30 авг 2013, 12:30 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 4381
Откуда: г. Липецк
sery писал(а):
...>> SETB P1.4 ;Ready flag on pin 1.4.
Это МК устанавливает ...

Ready flag on pin 1.4 -> Читаем значение флага с пина 1.4
Для кого комментарии, для себя или для тестера?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Код для at89c51 в keil uvision
СообщениеДобавлено: 30 авг 2013, 12:54 
Старожил

Зарегистрирован: 15 янв 2013, 13:24
Сообщения: 5665
anakost писал(а):
sery писал(а):
...>> SETB P1.4 ;Ready flag on pin 1.4.
Это МК устанавливает ...
Ready flag on pin 1.4 -> Читаем значение флага с пина 1.4
Для кого комментарии, для себя или для тестера?
Вы спутали два английских слова. Ready flag - это не чтение флага, а флаг готовности. Алгоритм предусматривает такой выходной сигнал. Например, в другом месте:
Код:
LJMP     READY_FLAG   ;set ready flag


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Код для at89c51 в keil uvision
СообщениеДобавлено: 30 авг 2013, 13:18 
Только пришел

Зарегистрирован: 28 авг 2013, 00:06
Сообщения: 17
Цитата:
Вы спутали два английских слова. Ready flag - это не чтение флага, а флаг готовности. Алгоритм предусматривает такой выходной сигнал. Например, в другом месте:
Код:
LJMP READY_FLAG ;set ready flag


Да, именно так.

Посидев еще подрехтовал программу. Думается, что работать будет.
Код:
NAME AT89

ORG 0000h      ;memory start address 0000h

INITIALIZE:
MOV P0,#0ffh   ;write all ones to P0 to use as an input port
MOV P1,#00   ;all zeros to put P1,P2,P3 in a known output state
MOV P2,#00
MOV P3,#00

WAITHIGH:         ;ожидание напряжения высокого уровня на одном из пинов
JBC   P0.0,Uol
JBC   P0.1,Uol1
JBC   P0.2,Uoh
JBC   P0.3,Uoh1
JBC   P0.4,Ipd
LJMP   WAITHIGH ;если высокий уровень не обнаружен, то все еще ждем его
            
CLEAR_ALL:    MOV    P1,#00      ;all zeros to put P1,P2,P3 in a known output state
         MOV    P2,#00   
         MOV    P3,#00
         CLR   0x8E      ;0 on ALE
         LJMP   WAITHIGH ;после установки дефолтных значений ожидание выс.ур. для новой команды

Uol: MOV    P1,#00         ;0 on port 1,
      MOV    P2,#00         ;port 2,
      MOV    P3,#00         ;port 3.
      SETB    P0.0         ;set ready flag, тестер видит этот флаг и дает команду на пин, чтобы вернуть дефолтные значения и мк ждал новой команды
      JBC      P0.1,CLEAR_ALL
      
      
Uol1: MOV      P0,#00      ;0 on port  0
      MOV      0x8E,#00      ;0 on ALE
      SETB   P1.0                ;rdy flg
      JBC      P1.1,CLEAR_ALL   ;wtng for clrall
      
Uoh: MOV      P1,#0ffh      ;1 on port 1,
      MOV      P2,#0ffh      ;port 2,
      MOV      P3,#0ffh      ;port 3.
      SETB   P0.0
      JBC      P0.1,CLEAR_ALL
      
Uoh1: CLR      0x80      ;0 on port 0,
      CLR      0x8E      ;ALE
      SETB   0x80      ;1 on port 0,
      SETB   0x8E      ;ALE,

Ipd: MOV   PCON,1      ;entering pd mode (PD bit #1)
      SETB   P1.0      ;rdy flg

END


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Код для at89c51 в keil uvision
СообщениеДобавлено: 30 авг 2013, 14:48 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 4381
Откуда: г. Липецк
Дествительно с Ready flag ошибся.
Help у uVision очень хороший, в том числе и по ассемблеру. Там описано как создавать сегментированные переносимые программы. И структура стандартной программы давно известна. Для uVision и вашей программы она примерно такая:
Код:
NAME AT89

KEY0   BIT      P0.0            ; аппаратный флаг 0
KEY1   BIT      P0.1            ; аппаратный флаг 1
KEY2   BIT      P0.2            ; аппаратный флаг 2
KEY3   BIT      P0.3            ; аппаратный флаг 3
KEY4   BIT      P0.4            ; аппаратный флаг 4

; Обьявляем перемещаемые сегменты
VARS   SEGMENT   DATA                         ; данные
PROG   SEGMENT   CODE                         ; код

; Если нужно, определяем прораммные флаги
;FLAGS   SEGMENT BIT
;   RSEG   FLAGS
;MARK_K0:   DBIT   1               ; программный флаг 0

; Если нужно, определяем стек
;STACK   SEGMENT   IDATA
;   RSEG   STACK
;   DS      0x10           ; 16 байт

; Если нужно, обьявляем переменные в ОЗУ
;   RSEG   VARS
;Value0:   DS   1               ; резервируем байт данных по имени

; Начало сегмента кода
   CSEG  AT   0              ; адрес 0000
   USING   0              ; Регистровый банк 0
   RSEG   PROG
   
   AJMP   Start              ; на секцию инициализации

; -- Здесь обычно подпрограммы ----------------------------------------------
;CLEAR_ALL:
;Uol:
;Uol1:
;Uoh:
;Uoh1:
;Ipd:
; -------------------------------------------------------------------------------------
Start: ;"INITIALIZE"
;   MOV      SP, #STACK-1        ; инициализируем стек
;...   
Main: ; "WAITHIGH"
;...
   AJMP   Main
END

Как то так. Для AVR вместо Start пишут Reset, разницы нет.
P.S. У вас переменных нет, "VARS SEGMENT DATA" вам не нужен.
P.P.S вы не обьяснили бы эту строку: >> CLR 0x8E ;0 on ALE


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Код для at89c51 в keil uvision
СообщениеДобавлено: 30 авг 2013, 15:15 
Только пришел

Зарегистрирован: 28 авг 2013, 00:06
Сообщения: 17
Код:
?DT?myvar SEGMENT DATA ; define a SEGMENT of class DATA
RSEG ?DT?myvar
VALUE: DS 1 ; reserve 1 BYTE in DATA space

Переменные будут храниться в сегменте data?
value - это имя переменной?

PROG SEGMENT CODE -- вместо PROG мне надо написать AT89? (в хэлпе первым словом стоит имя программы).

CLR 0x8E ;0 on ALE -- я в Uoh1 выставляю на ALE высокий уровень (опять же, думается, что я так его выставлю). А после этого хочу вернуть его в ноль обратно такой вот командой.

KEY0 BIT P0.0
GREEN_LED BIT P1.2 ; GREEN LED on I/O PORT P1.2
Эти строчки равнозначны же? Тогда в коде мне писать SETB KEY0? В чем принципиальная разница между вашим и моим вариантом?

upd. разница в функционировании org и cseg. org для всего вообще, cseg чисто для данных, находящихся в сегменте code.
upd2. Зачем после CSEG писать
RSEG PROG ?
Нельзя сразу RSEG PROG?

Спасибо за помощь.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Код для at89c51 в keil uvision
СообщениеДобавлено: 30 авг 2013, 15:39 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 4381
Откуда: г. Липецк
Согласен, пример очень перемудрен, я так никогда не пишу. Обьявляем сегмент данных и резервируем байтовую переменную с именем Value0. В коде обращаемся просто по имени.
Код:
VARS   SEGMENT   DATA                         ; данные
   RSEG   VARS
Value0:   DS   1               ; резервируем байт данных по имени

PROG SEGMENT CODE это просто обявление програмного сегмента по имени. Бывает что программа собирается из нескольких кусков, и в каждом есть свой SEGMENT CODE. Никогда не пробовал называть сегмент именем программы, но думаю не получится.
>> выставляю на ALE высокий уровень - ALE это служебный строб и повлиять на его работу программными средствами не получится.
>> P0.0 или KEY0 BIT P0.0...В чем принципиальная разница между вашим и моим вариантом?
Принципиальной разницы нет, дело только в удобстве. Если P0.0 встречается в коде только один раз, несложно найти это место и исправить на другой пин. Если же 10 раз это уже напрягает.
Код:
; Начало сегмента кода
   CSEG  AT   0              ; начало кодового сегмента с адреса 0000
   USING   0              ; пока используем только регистровый банк 0
   RSEG   PROG          ; в начале кодового сегмента размещаем сегмент PROG


Последний раз редактировалось anakost 30 авг 2013, 16:17, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Код для at89c51 в keil uvision
СообщениеДобавлено: 30 авг 2013, 15:57 
Только пришел

Зарегистрирован: 28 авг 2013, 00:06
Сообщения: 17
Код:
KEY0   BIT      P0.0            ; аппаратный флаг 0
KEY1   BIT      P0.1            ; аппаратный флаг 1
KEY2   BIT      P0.2            ; аппаратный флаг 2
KEY3   BIT      P0.3            ; аппаратный флаг 3
KEY4   BIT      P0.4            ; аппаратный флаг 4

Мм, тут, кажется, недопонимание получилось.
Код:
JBC   P0.0,Uol
JBC   P0.1,Uol1
JBC   P0.2,Uoh
JBC   P0.3,Uoh1
JBC P0.4,Ipd

этим я жду сигнала на пинах, чтобы начать выполнение команд.

KEY0 BIT P0.0 и тд в вашем варианте - это мои SETB P0.0, SETB P1.0? Просто хочу быть уверен.

С ALE меня сбило то, что в даташите написаны значения низкого/высокого уровня на нем.

апдэйт. понял про KEY, P0

апдэйт2.
Код:
RSEG   PROG          ; в начале кодового сегмента размещаем сегмент PROG

Мозг не понимает смысл слова PROG в PROG SEGMENT CODE. Для меня сейчас это нечто, которое мы нигде не обозначили.


Последний раз редактировалось sery 30 авг 2013, 16:14, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Код для at89c51 в keil uvision
СообщениеДобавлено: 30 авг 2013, 16:03 
Только пришел

Зарегистрирован: 28 авг 2013, 00:06
Сообщения: 17
То есть получается, что в общем и целом логику программы я составил верно, а осталось нормально определять секцию программы, писать все в нормальном порядке, разделяя подпрограммы и основную часть?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Код для at89c51 в keil uvision
СообщениеДобавлено: 30 авг 2013, 16:16 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 4381
Откуда: г. Липецк
sery писал(а):
То есть получается, что в общем и целом логику программы я составил верно...

Про логику, а тем более работу еще рано говорить, надо тестировать. В том же Proteus. Я пока говорил только о правильном оформлении.
Вы можете написать:
Код:
WAITHIGH SEGMENT   CODE
   RSEG   WAITHIGH

Здесь "WAITHIGH" - имя сегмента, так понятнее?
Где нибудь в конце листинга (или в другом файле) может быть таблица с константами:
Код:
TABLE SEGMENT   CODE
   RSEG   TABLE

Первый сегмент всегда следует за строкой
Код:
   CSEG  AT   0              ; начало кодового сегмента с адреса 0000

Остальные компилятор размещает как ему удобнее.


Последний раз редактировалось anakost 30 авг 2013, 18:36, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Код для at89c51 в keil uvision
СообщениеДобавлено: 30 авг 2013, 18:26 
Только пришел

Зарегистрирован: 28 авг 2013, 00:06
Сообщения: 17
Ну waithigh здесь - определенный кусок кода. А PROG нигде не написано же, кроме того места. Ээээ... Секунду, имя сегмента? Ааааа, то есть это мы чисто символически называем так сегмент.
Но ведь The RSEG directive selects a generic segment that was previously declared using the SEGMENT directive. Waithigh у меня определено, что такое (ну под ним кроются строчки кода). Но под PROG же у меня ничего нет..


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Код для at89c51 в keil uvision
СообщениеДобавлено: 30 авг 2013, 18:33 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 4381
Откуда: г. Липецк
sery писал(а):
... Waithigh у меня определено, что такое (ну под ним кроются строчки кода). Но под PROG же у меня ничего нет..

Да определено, но ваша запись программы нестандартна, с ходу разобраться сложно. Я же привел стандартную запись, которую любой программист легко поймет.
По сути любая программа для МК имеет такой рабочий цикл:
Код:
Start: ;"INITIALIZE"
;   MOV      SP, #STACK-1        ; инициализируем стек
;...   
Main: ; "WAITHIGH"
;...
   AJMP   Main

Ну зачем для главного цикла придумывать свое название WAITHIGH?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 37 ]  На страницу 1, 2  След.


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB