Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет chistyakov ([info]chistyakov)
@ 2005-06-27 00:25:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Для тех, кто ценит настоящее программирование
Этот текст управляет всеми рулевыми машинками ДПЛА на нижнем уровне.
Это левый и правый элероны, руль высоты, газ, гиростабилизатор ТРАЛа и другие, если надо будет. Руль направления на наших самолётах не используется.
Программа работает по самому высокому приоритету по прерываниям от Таймера 0 (программирование по событиям:). Управляющее воздействие -- это длительность установки бита, непосредственно идущего на рулевую машинку, в высокий уровень.
Комментарии на английском, поскольку программа продавалась за границу. Учатся люди, хе-хе... Не всё же по окошкам мышкой чиркать, надо и головой кумекать.

asm
; get the servo cnfg and clear all the servo bits on the output port
mov r0, #_|NServoCnfg ;1
movx a, @r0 ;2
mov B, a ; save the cnfg in B ;1
cpl a ; invert the cnfg ;1
anl _|ServoLevels, a ; clears all the bits connected to servoes ;1
; get the pattern of the new servo bit and put it out
mov DPTR, #_|ServoOn ;2
mov r0, #_|NumServo ; address of NumServo ;1
movx a, @r0 ; NumServo itself ;2
movc a, @a+DPTR ; the next servo On could be ;2
anl a, B ; filter through the cnfg ;1
orl _|ServoLevels, a ; output the resulting pattern ;1
; increment and limit NumServo
movx a, @r0 ; NumServo itself ;2
mov B, a ; save current NumServo for a while in B ;1
inc a ;1
anl a, #00000111b ; limit NumServo "no more than 7" ;1
movx @r0, a ; save the new NumServo for the next time ;2
; get the servo command and load the timer
mov a, #2 ; while NumServo is in B ;1
mul aB ; 2*NumServo (Words!) ;1
add a, #_|Servo ; points to the new servo command ;1
mov r0, a ;1
movx a, @r0 ; Lo of the new servo command ;2
inc r0 ; points to Hi ;1
clr TR0 ;1
mov TL0, a ;1
movx a, @r0 ; Hi of the new servo command ;2
mov TH0, a ;1
setb TR0 ;1
end;//asm

Что есть что:

var // byte addressing!
//data for the servo control
NumServo:Byte;//the index of the current servo (we work with)
Servo:array[0..7]of Word;//the control words for loading in the T0 for the timing of the pulse durations:
NServoCnfg:Byte; //servos connected are marked as "1", not connected - as "0"
var
ServoLevels:Byte absolute P2; // Bits for output on the servo port

TR0, TH... -- стандартные идентификаторы mcs51 для Таймера 0.

Господ "программистов" просят... Ну, как обычно...

{+}


(Читать комментарии) - (Добавить комментарий)


[info]ex_chistyak@lj
2005-06-26 17:57 (ссылка)
Паскаль нужен, чтобы писать сложные программы с разветвлённой и многоуровневой логикой. А в этом примере никакой логики нет. Пришло прерывание -- программа по-скорому выбросила новые уровни команд и уснула.
А сложную логику на Ассемблере очень трудно проверить, читая текст, написанный несколько лет назад. На Паскале же -- элементарно.

(Ответить) (Уровень выше)


(Читать комментарии) -