Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.02.2012, 21:36   #1
noxior
Пользователь
 
Регистрация: 27.11.2011
Сообщений: 28
По умолчанию непонимаю задачу

есть задача по ассемблеру на мкс51
В устройстве имеется два индикатора – красный и зеленый, а также кнопка. Необходимо
разработать программное обеспечение, которое обеспечивало бы управление индикаторами по сигналу с кнопки. Оба индикатора работают в «мигающем» режиме с периодом 1С. Скважность импульсов зеленого индикатора постоянна и равна 5. Скважность красного индикатора определяется состоянием кнопки, в исходном состоянии кнопки – скважность равна 5, а в нажатом состоянии кнопки – скважность равна 2. Начало свечения красного и зеленного индикаторов должно быть синхронным. Тактовая частота генератора микроконтроллера – 12МГц. Точность формирования временных интервалов не хуже 0.1С.

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

sjmp prestart
org 000BH
ljmp InterruptT0
org 0030H
prestart:
mov p1, #0
mov tmod, #00000001b
mov tl0, #0B0h ;#0cbh
mov th0, #3ch
mov ie, #10000010b
mov sp, #60h
mov r0, #16
mov r1, #16
sjmp start
start:
setb tr0
lcall subprogram
sjmp start
subprogram:
cjne r0, #0, next ; Для зелёной лампы
mov r0, #16
next: cjne r0, #16, next2
setb p1.0
next2: cjne r0, #12, next3
clr p1.0

next3:
jb p1.2, ButOn ; Переход если кнопка нажата
cjne r1, #0, way ; Для красной лампы
mov r1, #16
way: cjne r1, #16, way2
setb p1.1
way2: cjne r1, #12, way3
clr p1.1
way3: sjmp subprogram
ButOn:
cjne r1, #0, way11
mov r1, #16
way11: cjne r1, #16, way22
setb p1.1
way22: cjne r1, #8, way3
clr p1.1
sjmp way3

InterruptT0:
mov tl0, #0B0h;#0cbh
mov th0, #3Ch
dec r0
dec r1
reti
noxior вне форума Ответить с цитированием
Старый 15.02.2012, 21:55   #2
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

1) В какой среде писали программу?
2) Какой у вас микроконтроллер 8051 или 8052?

Сам имею:
1) среда Keil_51
2) микроконтроллер at89s52 (MCS-51, 8052)

у семейства 8052 есть удобный таймер T2. На нем можно будет мигать диодом и его же использовать в режиме захвата (для кнопки).

У Юрия Магды по таймерам хорошо написано в книге: "Микроконтроллеры серии 8051. Практический подход". Из этой книги взял код и немного переработал:
Код:
NAME MAIN
    T2CON EQU 0C8h
    TH2 EQU 0CDh
    TL2 EQU 0CCh
    PROG SEGMENT CODE
    CSEG AT 0
    USING 0
    JMP start

t0ISR:
    ORG 0Bh
    CLR TF0
    DJNZ R2, skip
    MOV R2, #50
    DJNZ R1, skip
    MOV R1, #10
    CPL P1.0
skip:
    MOV TH0, #0DBh
    MOV TL0, #0F2h
    RETI

T2Isr:
    ORG 2Bh
    JBC T2CON.6, captured
    CLR T2CON.7
    DJNZ R0, quit
    MOV R0, #100
    CPL P1.2
    JMP quit
captured:
    CPL P1.3
quit:
    RETI
    RSEG PROG
start:
    MOV P1, #0F2h
    ; T2
    MOV R0, #100
    MOV TH2, #0h
    MOV TL2, #0h
    SETB T2CON.0
    CLR T2CON.1
    SETB T2CON.3
    SETB IE.5

    ; T0
    MOV R1, #10
    MOV R2, #50
    MOV TH0, #0DBh
    MOV TL0, #0F2h
    MOV TMOD, #1h
    SETB ET0

    SETB EA
    SETB T2CON.2
    SETB TCON.4
    JMP $
END
Таймер T0 используется для мигания диодом подключённым к P1.0. T2 - для мигания диодом на P1.2. И этот же таймер используется для отлавливания перепадов (кнопка) с единицы на ноль на выводе P1.1 (ещё надо реализовать перепад с нуля на единицу). Можно будет использовать эту программу, как заготовку. Времена не рассчитывал (попробуйте сами). Зато на железе (макетке) попробовал, работает. Подумайте, как программу до конца довести. Что осталось сделать? Как лучше сделать? К примеру, можно уменьшить код, если использовать таймеры в режиме авто-перезагрузки.

В вашей программе не разбирался. Но заметил, что сall у вас есть, а ret'a для него нет. И обработчик прерывания по переполнению T0 не по тому адресу (надо 0BH, а не 30H). И где вы таймер T0 запустили?

Последний раз редактировалось 8Observer8; 15.02.2012 в 22:03.
8Observer8 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Непонимаю почему не работает(Паскаль) Cas01 Помощь студентам 6 12.05.2011 01:57
непонимаю.. feesta Помощь студентам 1 10.04.2011 02:45
C непонимаю почему такой output. Luxe0n Помощь студентам 8 10.03.2011 19:47
непонимаю как сделать эту задачу может листинг мне нужен(решение) Юра Кадников Помощь студентам 0 05.01.2011 19:59
Непонимаю условие задачи.... Карась Помощь студентам 2 28.11.2007 17:41