Змінюй хід війни! Допомагай ЗСУ!

Прошу помощи в написании программы под МК Intel 8051

🟡 23:44 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • 🟡 23:44 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #21
  • 🟡 23:44 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #22
RUH, а тебе зачем? Кристалл хорош, спору нет, но как бы слегка устарел :D

Пасиб! :) У меня, возможно, скоро, будет большой проект на кристалле, у которого ядро на 8051.. Увы.. Морально себя подготавливаю на морально устаревшее.. :)
 
  • 🟡 23:44 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #23
Надеюсь, ты на Си будешь писать? ;) Хотя там и АСМ простой как двери.
Ну и на AVR с PICом ни капли не похож :D
Да, на Си. :) Но ассемблерные вставки никто не отменял жеж. :D
Уже и Keil себе поставил. :)
 
  • 🟡 23:44 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #24
Не вижу направления сдвига. В условии хоть сказано? :D Я, честно говоря, и с границей не понял.
Обе единицы сдвигаются в одну сторону, или левая влево, а правая вправо. Спросит ведь препод, как в другую сторону повернуть ;)
Насколько я поняла, левая влево, а правая -- вправо. Но непонятно, их нужно сдвигать обе на 1 разряд одновременно или же по очереди, сдвинув их в крайних разряд по очереди. Ну что ж, все равно надо делать задание. Так что будем пытаться. Всем спасибо за помощь :)
 
  • 🟡 23:44 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #25
Пасиб! :) У меня, возможно, скоро, будет большой проект на кристалле, у которого ядро на 8051.. Увы.. Морально себя подготавливаю на морально устаревшее.. :)

х51 не сильно морально устаревшее:) Вот, к примеру

⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.
 
  • 🟡 23:44 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #26
воспоминаний z80 псто
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.
 
  • 🟡 23:44 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #27
Главное с мнемоникой адресации разобраться, остальное приложится ;)

mov A,Rr - загрузка из регистра
mov A,@Rr - загрузка по индексу
mov A,direct - загрузка с прямого адреса
mov A,#data - загрузка непосредственно из тела команды

В любом случае число справа - 8бит. Потерял собачку или хеш - сиди думай хоть весь день. Компилятору по барабану что компилить =)
Ну и не забывать, что регистров четыре банка, тактовая частота делится на 12, а условные переходы +- 127 адресов.
----------------------------------------
Набросал вот такой экспромт. Наверняка с ошибками, да и синтаксис не подойдет к имеющимся компиляторам :D

Две особенности:
-числа не сдвигаются, а берутся из таблицы. Это дает бОльшую универсальность. Можно легко менять направление сдвига (меняя числа по метке patterns),
и число шагов (константа shift_number).
-опрос входа P3.6 самый примитивный, без подавления дребезга. Пока 0 - числа выводятся, 4ак только 1 - таймер останавливается. Отсчет времени начинается с начала при каждом событии на входе (вызывается timer0_int)

dseg
;Вычисление периода прерываний таймера 5мС (5000 мкС) для генератора 10МГц
;65536-5000E-6/[(1/10E6)*12]=65536-4166.(6)~=65536-4167=61369=EFB9h
;можно добавить компенсацию времени оклика на прерывание, но это уже тонкости
;если изучалось - стоит сделать. нет - ненужно "умничать". можно при защите упомянуть, что есть вот такой недостаток

;константы

time_base_low equ B9h
time_base_high equ EFh
shift_number equ 4
outport equ P2
event_input equ P3.6


org 30h

;счетчик сдвигов
shift_counter: ds 1

cseg

org 0000h

jmp init


org 000Bh

jmp timer0_int

;----------------------------------------
;уже готовые числа (маски) для непосредственного вывода в порт
patterns:

db 10000001b
db 01000010b
db 00100100b
db 00011000b
;----------------------------------------

;----------------------------------------
;инициализация таймера0, режим - 16бит таймер
timer0_int:

mov TL0,#time_base_low
mov TH0,#time_base_high

call do_shift

reti
;----------------------------------------

;----------------------------------------
;старт программы: инициализация счетчика сдвигов, вывод в порт первого числа и разрешение прерываний
init:
setb P3.6
mov step_counter,#step_number
call do_shift
mov IE,#10000010b

main:
;простой опрос входа P3.6 (без подавления дребезга) если вход =0 запускается таймер и ожидается переход в 1
;если 1 - таймер останавливается и ожидается переход в 0
check_input:

jnb event_input,timer_start
clr TR0
jmp check_input

timer_start:

call timer0_init
setb TR0
jnb event_input,$
jmp check_input
;----------------------------------------

;----------------------------------------
do_shift:

push ACC
push PSW
push DPL
push DPH

mov A,shift_counter
mov DPTR,#patterns
movc A,@A+DPTR
mov outport,A

djnz shift_counter,no_last_shift
mov shift_counter,#shift_number

no_last_shift:

pop PDH
pop DPL
pop PSW
pop ACC

ret
;----------------------------------------

;----------------------------------------
timer0_init:

mov TL0,#time_base_low
mov TH0,#time_base_high

mov TMOD,#00000001b

ret
;----------------------------------------

;----------------------------------------

А, еще, девушка вряд ли написала бы слово "кварц" =) Если только оно не написано в задании.
Но это ерунда. Размялся немного. Может и мне придется стариной тряхнуть.

$MOD51

dseg

;Вычисление периода прерываний таймера 5мС (5000 мкС) для генератора 10МГц
;65536-5000E-6/[(1/10E6)*12]=65536-4166.(6)~=65536-4167=61369=EFB9h
;можно добавить компенсацию времени оклика на прерывание, но это уже тонкости
;если изучалось - стоит сделать. нет - ненужно "умничать". можно при защите упомянуть, что есть вот такой недостаток

;константы

time_base_low equ 0B9h
time_base_high equ 0EFh
shift_number equ 4
outport equ P2
event_input equ P3.6


org 30h

;счетчик сдвигов
shift_counter: ds 1

cseg

org 0000h

jmp init


org 000Bh

jmp timer0_int

;----------------------------------------
;уже готовые числа (маски) для непосредственного вывода в порт
patterns:

db 10000001b
db 01000010b
db 00100100b
db 00011000b
;----------------------------------------

org 0030h

;----------------------------------------
;инициализация таймера0, режим - 16бит таймер
timer0_int:

mov TL0,#time_base_low
mov TH0,#time_base_high

call do_shift

reti
;----------------------------------------

;----------------------------------------
;старт программы: инициализация счетчика сдвигов, вывод в порт первого числа и разрешение прерываний
init:
setb P3.6
mov shift_counter,#shift_number
call do_shift
mov IE,#10000010b

main:
;простой опрос входа P3.6 (без подавления дребезга) если вход =0 запускается таймер и ожидается переход в 1
;если 1 - таймер останавливается и ожидается переход в 0
check_input:

jnb event_input,timer_start
clr TR0
jmp check_input

timer_start:

call timer0_init
setb TR0
jnb event_input,$
jmp check_input
;----------------------------------------

;----------------------------------------
do_shift:

push ACC
push PSW
push DPL
push DPH

mov A,shift_counter
mov DPTR,#patterns
movc A,@A+DPTR
mov outport,A

djnz shift_counter,no_last_shift
mov shift_counter,#shift_number

no_last_shift:

pop DPH
pop DPL
pop PSW
pop ACC

ret
;----------------------------------------

;----------------------------------------
timer0_init:

mov TL0,#time_base_low
mov TH0,#time_base_high

mov TMOD,#00000001b

ret
;----------------------------------------

;----------------------------------------

END

PRIM01 PAGE 1

1 $MOD51
2
---- 3 dseg
4
5 ;Вычисление периода прерываний таймера 5мС (5000 мкС) для генератора 10МГц
6 ;65536-5000E-6/[(1/10E6)*12]=65536-4166.(6)~=65536-4167=61369=EFB9h
7 ;можно добавить компенсацию времени оклика на прерывание, но это уже тонкости
8 ;если изучалось - стоит сделать. нет - ненужно "умничать". можно при защите упомянуть, что е
сть вот такой недостаток
9
10 ;константы
11
00B9 12 time_base_low equ 0B9h
00EF 13 time_base_high equ 0EFh
0004 14 shift_number equ 4
00A0 15 outport equ P2
00B6 16 event_input equ P3.6
17
18
0030 19 org 30h
20
21 ;счетчик сдвигов
0030 22 shift_counter: ds 1
23
---- 24 cseg
25
0000 26 org 0000h
27
0000 02003A 28 jmp init
29
30
000B 31 org 000Bh
32
000B 020030 33 jmp timer0_int
34
35 ;----------------------------------------
36 ;уже готовые числа (маски) для непосредственного вывода в порт
000E 37 patterns:
38
000E 81 39 db 10000001b
000F 42 40 db 01000010b
0010 24 41 db 00100100b
0011 18 42 db 00011000b
43 ;----------------------------------------
44
0030 45 org 0030h
46
47 ;----------------------------------------
48 ;инициализация таймера0, режим - 16бит таймер
0030 49 timer0_int:
50
0030 758AB9 51 mov TL0,#time_base_low
0033 758CEF 52 mov TH0,#time_base_high
53
0036 120056 54 call do_shift
55
0039 32 56 reti
57 ;----------------------------------------
PRIM01 PAGE 2

58
59 ;----------------------------------------
60 ;старт программы: инициализация счетчика сдвигов, вывод в порт первого числа и разрешение пр
ерываний
003A 61 init:
003A D2B6 62 setb P3.6
003C 753004 63 mov shift_counter,#shift_number
003F 120056 64 call do_shift
0042 75A882 65 mov IE,#10000010b
66
0045 67 main:
68 ;простой опрос входа P3.6 (без подавления дребезга) если вход =0 запускается таймер и ожидае
тся переход в 1
69 ;если 1 - таймер останавливается и ожидается переход в 0
0045 70 check_input:
71
0045 30B604 72 jnb event_input,timer_start
0048 C28C 73 clr TR0
004A 80F9 74 jmp check_input
75
004C 76 timer_start:
77
004C 120075 78 call timer0_init
004F D28C 79 setb TR0
0051 30B6FD 80 jnb event_input,$
0054 80EF 81 jmp check_input
82 ;----------------------------------------
83
84 ;----------------------------------------
0056 85 do_shift:
86
0056 C0E0 87 push ACC
0058 C0D0 88 push PSW
005A C082 89 push DPL
005C C083 90 push DPH
91
005E E530 92 mov A,shift_counter
0060 90000E 93 mov DPTR,#patterns
0063 93 94 movc A,@A+DPTR
0064 F5A0 95 mov outport,A
96
0066 D53003 97 djnz shift_counter,no_last_shift
0069 753004 98 mov shift_counter,#shift_number
99
006C 100 no_last_shift:
101
006C D083 102 pop DPH
006E D082 103 pop DPL
0070 D0D0 104 pop PSW
0072 D0E0 105 pop ACC
106
0074 22 107 ret
108 ;----------------------------------------
109
110 ;----------------------------------------
0075 111 timer0_init:
112
0075 758AB9 113 mov TL0,#time_base_low
PRIM01 PAGE 3

0078 758CEF 114 mov TH0,#time_base_high
115
007B 758901 116 mov TMOD,#00000001b
117
007E 22 118 ret
119 ;----------------------------------------
120
121 ;----------------------------------------
122
123 END

VERSION 1.2h ASSEMBLY COMPLETE, 0 ERRORS FOUND
PRIM01 PAGE 4

ACC. . . . . . . . . . . . . . . D ADDR 00E0H PREDEFINED
CHECK_INPUT. . . . . . . . . . . C ADDR 0045H
DO_SHIFT . . . . . . . . . . . . C ADDR 0056H
DPH. . . . . . . . . . . . . . . D ADDR 0083H PREDEFINED
DPL. . . . . . . . . . . . . . . D ADDR 0082H PREDEFINED
EVENT_INPUT. . . . . . . . . . . NUMB 00B6H
IE . . . . . . . . . . . . . . . D ADDR 00A8H PREDEFINED
INIT . . . . . . . . . . . . . . C ADDR 003AH
MAIN . . . . . . . . . . . . . . C ADDR 0045H NOT USED
NO_LAST_SHIFT. . . . . . . . . . C ADDR 006CH
OUTPORT. . . . . . . . . . . . . NUMB 00A0H
P2 . . . . . . . . . . . . . . . D ADDR 00A0H PREDEFINED
P3 . . . . . . . . . . . . . . . D ADDR 00B0H PREDEFINED
PATTERNS . . . . . . . . . . . . C ADDR 000EH
PSW. . . . . . . . . . . . . . . D ADDR 00D0H PREDEFINED
SHIFT_COUNTER. . . . . . . . . . D ADDR 0030H
SHIFT_NUMBER . . . . . . . . . . NUMB 0004H
TH0. . . . . . . . . . . . . . . D ADDR 008CH PREDEFINED
TIMER0_INIT. . . . . . . . . . . C ADDR 0075H
TIMER0_INT . . . . . . . . . . . C ADDR 0030H
TIMER_START. . . . . . . . . . . C ADDR 004CH
TIME_BASE_HIGH . . . . . . . . . NUMB 00EFH
TIME_BASE_LOW. . . . . . . . . . NUMB 00B9H
TL0. . . . . . . . . . . . . . . D ADDR 008AH PREDEFINED
TMOD . . . . . . . . . . . . . . D ADDR 0089H PREDEFINED
TR0. . . . . . . . . . . . . . . B ADDR 008CH PREDEFINED
 
Останнє редагування:
  • 🟡 23:44 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #28
х51 не сильно морально устаревшее:) Вот, к примеру

⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.

Господин Тимура знает дилеров СиЛабс на Украине? :D
PS Приходилось через китай пробивать их i2C тюнеры, потому как на уркаине глушь..
 
  • 🟡 23:44 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #29
А слона-то не приметил никто ;)
Нулевой элемент таблицы недоступен. Указатель следует инициализировать так:

mov DPTR,#patterns-1

или просто добавить любое число вверху таблицы

patterns:
db 11111111b
db 10000001b
db 01000010b
db 00100100b
db 00011000b


Работает? ;) Право сдать лабу оставим, все же, ТСу :D

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


А чего - начал (если по МК на МЦС48), и уже в 96 под 1816ВЕ31 дизассемблир и ассемблир вручную вовсю. С 98 у мну наконец появилсо свой компухтер, проц кирюха ПР233, 32метра памяти, и 4-х гиговый винт. Немало по тем временам:)


Кстати - больше смотрел на распределение памяти, и чтоб паттерны не налезли на зону следующего преравания:) орг 0030ш то мой:)

Господин Тимура знает дилеров СиЛабс на Украине? :D
PS Приходилось через китай пробивать их i2C тюнеры, потому как на уркаине глушь..

8051f в поиск на кошкодроме - и будет те 8 страниц результата. На первой - усе "Есть на складе в Харькове"

Про МК вопрос вроде был???
 
  • 🟡 23:44 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #30
возможно поздновастенько, но вот компилятор с отладчиком - бесплатный
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.

на клятий москальский мови :D
- для лаб - милое дело
 
  • 🟡 23:44 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #31
Я за xHDL в данном конкртном случае .
 
Назад
Зверху Знизу