Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

2 dshabrov: ТАК программы писать не надо. Надо вот так(+)

Отправлено MBedder 27 ноября 2008 г. 19:57



;### <-- Мои комментарии.

;### Замечания по оформлению и организации текста:
;### Пользуйся кнопкой ТАВ.
;### Команды ВСЕГДА начинай ТАВом.
;### Метки ВСЕГДА начинай в начале строки и завершай двоеточием.
;### Метки в коде ВСЕГДА располагай на отдельной строке.
;### Комментарии от точки с запятой отделяй пробелом.
;### Всегда считай, что ассемблер чувствителен к регистру символов, т.е. A != a.
;### Свои имена старайся давать в нижнем или смешанном регистре, оставляя верхний
;### для имен и меток, определенных в инклуде или зарезервированных.
;### Используй универсальную шестнадцатиричную форму записи - 0x7ABC, а не 7ABCh.
;### Группируй родственные блоки данных/команд, от других отделяй пустой строкой
;### и/или строкой прочерков.
;----------------------------------------------------------------------------------

;----------------------------------------------------------------------------------
;### Включай директиву $PL (65535), чтобы листинг не разбивался на страницы:
$PL (65535)

;### Включай директиву $NOMOD51, чтобы не было проблем с duplicate symbols:
$NOMOD51

$NOLIST
#include <at89c51xd2.h>
$LIST
;----------------------------------------------------------------------------------

;----------------------------------------------------------------------------------
;### cs equ P2.3 ; линия выбоpа микpосхемы = CS, 10
;### mosi equ P2.2 ; линии = Din, 11 ; p2.4 - макет ; p2.2
;### ...

;### Пользуйся не бестиповым equ, а соответствующим типом декларируемых переменных -
;### - иначе ни о какой вменяемой отладке в дебаггере можешь и не мечтать:
sbit cs = P2^3 ; линия выбоpа микpосхемы = CS, 10
sbit mosi = P2^2 ; линии = Din, 11 ; p2.4 - макет ; p2.2
sbit miso = P2^1 ; поpта = Dout,12 ; p2.5 - макет ; p2.1
sbit sck = P2^0 ; SPI = CLK, 13 ; p2.2 - макет ; p2.0
;----------------------------------------------------------------------------------

;----------------------------------------------------------------------------------
;### ;Сохраняемые ячейки
;### pus equ 20h.0 ; бит новичок / эксперт
;### serv equ 20h.1 ; бит режима настроек
;### ...

;### По-людски это делается так:
;### Резервирование Bit Addressable RAM (BRAM) под битовые переменные.
;### Использование бестипового equ и указание абсолютных адресов для этого - ЛАМЕРСТВО!
;### Директива DBIT резервирует N бит в бит-адресуемом сегменте, автоматически назначая адреса:
BSEG ;### Область BRAM для бит-адресуемых данных
pus: dbit 1 ; бит новичок / эксперт
serv: dbit 1 ; бит режима настроек

Left: dbit 1 ; бит признака вращения энкодера влево
Right: dbit 1 ; бит признака вращения энкодера вправо
Dzdec: dbit 1 ; бит запрета анализа сигнала от энкодера

Strob: dbit 1 ; строб вывода информации на ЖКИ
Strob1s: dbit 1 ; секундный строб

Knobf: dbit 1 ; бит признака нажатия кнопки
Knobl: dbit 1 ; бит признака долгого нажатия кнопки

Moving: dbit 1 ; бит признака движения
PIC: dbit 1 ; отслеживание в канале поворотника изменения уровня
;----------------------------------------------------------------------------------

;----------------------------------------------------------------------------------
;### Status equ 22h ; ячейка статуса программы
;### ComState equ 23h ; статус обработчика COM порта
;### ...

;### По-людски это делается так:
;### Резервирование Data RAM (DRAM) под байтовые переменные.
;### Использование бестипового equ и указание абсолютных адресов для этого - ЛАМЕРСТВО!
;### Директива DS резервирует N байт в текущем сегменте, автоматически назначая адреса:
;### Резервирование DRAM под байтовые переменные:
;### Использование бестипового equ и указание абсолютных адресов для этого - ЛАМЕРСТВО!
DSEG AT 0x30 ;### Область DRAM
Status: ds 1 ; ячейка статуса программы
ComState: ds 1 ; статус обработчика COM порта

Beep: ds 1 ; таймер звукового сигнала
ddd: ds 1 ; таймер 150мс
t1s: ds 1 ; таймер 1с

KnobCnt: ds 1 ; счетчик времени нажатия кнопки
Lite: ds 1 ; память яркости подсветки

; Время в пути. Обрабатывается с секундным интервалом от таймера 2. Общее время
; считается в ячейках CHAS:MINUT:SECUND. Время в движении считается в ячейках
; CHASM:MINUTM:SECUNDM если бит Moving установлен. Время в стоянке считается в
; ячейках CHASS:MINUTS:SECUNDS если бит Moving сброшен.
chas: ds 1 ; счетчик
minut: ds 1 ; времени
secund: ds 1 ; поездки

chass: ds 1 ; счетчик
minuts: ds 1 ; времени
secunds: ds 1 ; простоя

chasm: ds 1 ; счетчик
minutm: ds 1 ; времени
secundm: ds 1 ; в пути

; Подсчет расхода. Расход в секунду. Счетчик MLSECC увеличивается в прерывании
; по расходу. Раз в секунду (прерывание от таймера 2) значение MLSECC переписы-
; вается в MLSECM и MLSECC обнуляется. Значение в мл. Расход по расстоянию.
; Счетчик MLDISTC увеличивается в прерывании по расходу. В прерывании от датчика
; скорости обрабатывается счетчик дистанции RASHDST. По обнулению счетчика
; дистанции значение MLDISTC переписывается в MLDISTM. MLDISTC обнуляется и
; счетчик RASHDST инициализируется вновь.
R16D: ds 1 ; счетчик делитель импульсов расхода
mlsecc: ds 1 ; расход в секунду. Счетчик
mlsecm: ds 1 ; расход в секунду. Память

mldistc: ds 1 ; расход по дистанции. Счетчик
mldistm: ds 1 ; расход по дистанции. Память

rashdst: ds 1 ; дистанция для подсчета расхода
rashodl: ds 1 ; общий расход в мл. Младший байт
rashodh: ds 1 ; общий расход в мл. Старший байт

; Напряжение бортсети. Измеряется вначале основного процесса. К измеренному
; значению прибавляется корректирующее значение UCORR Запоминаются текущее
; значение и вычесленный максимум и минимум.
Utek: ds 1 ; текущее значение напряжения бортсети
Umin: ds 1 ; минимальное значение напряжения бортсети
Umax: ds 1 ; максимальное значение напряжения бортсети
Ucorr: ds 1 ; коррекция измеренного напряжения БС

; Рассояние и скорость. Пройденное рассояние считается в метрах трехбайтовым
; счетчиком DIST3:2:1. Для подсчета скорости число импульсов в секунду
; накапливается в SPSECH:SPSECL. Раз в секунду (прерывание от таймера 2) результат
; переписывается SPSECH:SPSECL -> SPEEDH:SPEEDL. Ячейки SPSECH:SPSECL обнуляются.
; Раз в секунду (прерывание от таймера 2) значение SPEEDH:SPEEDL проверяется на
; максимум и максимальное значение запоминается в SPMAXL:SPMAXH. Все значени
; скорости в импульсах для повышения точности расчета.
V6S: ds 1 ; счетчик делитель импульсов расстояния
dist1: ds 1 ; пройденное рассотяние. Младший байт
dist2: ds 1 ; пройденное рассотяние. Средний байт
dist3: ds 1 ; пройденное рассотяние. Старший байт

spsecl: ds 1 ; счкетчик пройденых импульсов младший байт
spsech: ds 1 ; счкетчик пройденых импульсов старший байт

speedl: ds 1 ; ячейка подсчета скорости старший байт
speedh: ds 1 ; ячейка подсчета скорости старший байт

spmaxl: ds 1 ; ячейка подсчета максимальной скорости младший байт
spmaxh: ds 1 ; ячейка подсчета максимальной скорости старший байт

; Передача и прием по COM порту.
CntRx: ds 1 ; адрес буфера приема XRAM
WaitCom: ds 1 ; таймер ожадания

;### bufish equ 4ah ; буфеp шестнадцатиpичных отобpажаемых данных
;### mem equ bufish+4 ; +4 пpи четыpех шестнадцатиpичных pазpядов
;### bufout equ mem+1 ; выходной буфер преобразвания

;### По-людски это делается так:
bufish: ds 4 ; буфеp шестнадцатиpичных отобpажаемых данных
mem: ds 1 ; +4 пpи четыpех шестнадцатиpичных pазpядов
bufout: ds 1 ; выходной буфер преобразвания
;----------------------------------------------------------------------------------

;----------------------------------------------------------------------------------
CSEG AT 0 ; Область кода во Flash
;### jmp m0 ; обход адpесов прерываний (int0,03H,p3.2)
;### Команды переходов нужно укорачивать (JMP->AJMP->SJMP).
;### Меткам надо давать осмысленные названия:
sjmp main ; обход адpесов прерываний (int0,03H,p3.2)

ORG 3 ; внешнее прерывание 0 (int0 3H,p3.2)
ajmp Ex_int0 ; Расстояние.

ORG 0x0B ; адpес пpеpывания по таймеpу 0
ajmp tr0_int ; точка входа в прерывание по таймеру 0(0bh)

ORG 0x13 ; внешнее прерывание 1 (int1,13H,p3.3)
ajmp Ex_int1 ; Расход.

ORG 0x23 ; прерывание по приему и передаче
jbc RI,ComRx ; прерывание по приему - переход
sjmp ComRx1 ; прерывание по передаче - переход

ComRx:
push 0 ; прием: сохранить
push ACC ; изменяемые регистры

mov r0,CntRx ; загрузить счетчик адреса для косвенной адресации
mov a,SBUF ; принятый байт
movx @r0,a ; записать в XRAM принятый байт
inc CntRx ; следующий адрес буфера приема в XRAM

pop ACC ; восстановить
pop 0 ; изменяемые регистры

ComRx1:
reti ;
;----------------------------------------------------------------------------------

;----------------------------------------------------------------------------------
main:
; ...
;----------------------------------------------------------------------------------

;----------------------------------------------------------------------------------
Ex_int0:
; ...
;----------------------------------------------------------------------------------

;----------------------------------------------------------------------------------
tr0_int:
; ...
;----------------------------------------------------------------------------------

;----------------------------------------------------------------------------------
Ex_int1:
; ...
;----------------------------------------------------------------------------------

END
;----------------------------------------------------------------------------------



Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
увеличьте 6 на 2:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru