Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 03.01.2018
Сообщений: 14
1

[MCS-51] Передать пакет данных через UART при помощи прерывания

15.12.2020, 14:05. Просмотров 994. Ответов 12

Доброго времени суток!
Требуется любая помощь в решении задачи считывания/передачи через последовательный порт UART через прерывания, вроде бы уже что-то есть, но кажется что-то не то, МК должен сначала по прерыванию считать 200 байт данных с ПК, а по окончанию сразу передать 11 байт (несколько переменных, записанных ранее) на ПК. Записанные данные от ПК также ещё надо записать во внешнюю ОЗУ, вот что есть пока что...

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
PUART:  ; Обработчик прерывания от порта UART
    PUSH    PSW
    PUSH    ACC
    SETB    P3.6
    RUART           ; ?????
;   ...         ; Программа прерывания
OUTUART: POP    ACC     ; Выход из подрограммы прерывания PUART
    POP PSW
    RETI            ; Выход (возврат в основной цикл) из подрограммы прерывания
 
RUART:  CLR A           ; Read
    JB  TI, TRUART
    DJNZ    CTPC, RUART1
    MOV RDPTRH, #80H
    MOV RDPTRL, #00H
    MOV CTPC, #200
    MOV SBUF, X1
    MOV VAR1, #X1
    CLR F0
    RET
RUART1: MOV DPL, RDPTRL
    MOV DPH, RDPTRH
    MOV DPL, SBUF
    MOV DPH, SBUF
    INC DPTR
    MOV RDPTRH, DPH
    MOV RDPTRL, DPL
    RET
TRUART: mov A, F0           ; Translate
    JB  A, OUTUART
    MOV A, var1
    SUBB    A, X1
    JB  A, TRUART1
    MOV SBUF, X1
    MOV var1, #X1
    RET
TRUART1:                                ; Что-то
Используется MCU 8051 IDE, если это важно.
Впервые использую ассемблер, буду рад любой помощи.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.12.2020, 14:05
Ответы с готовыми решениями:

(MCS-51) Выполнить прием из внешней памяти данных 20 байт и передать через последовательный порт в режиме 3
Как я понял, помогают тут и так с неохотой. А под такую ерундовину, как МСS-51 – это вообще абзац. ...

Получаю неполный пакет данных по UART
Доброго времени суток! На форме есть компонент SerialPort (38400 bod, Read/Write Time-out 100msec)...

Возможность передать при помощи определения #define двух численных значений через запятую?
//------------------------------------ примерный вид кода ----------------- // определение...

Зависает МК при одновременной отправки данных через UART
Если нажимать на кнопки порта В по очереди то всё нормально. А если нажать одновременно по одной...

12
158 / 146 / 14
Регистрация: 03.02.2012
Сообщений: 703
Записей в блоге: 1
15.12.2020, 22:21 2
Прерывания 8051

АРХИТЕКТУРАМИКРОКОНТРОЛЛЕРА INEL 8051 учебное пособие
0
0 / 0 / 0
Регистрация: 03.01.2018
Сообщений: 14
16.12.2020, 04:37  [ТС] 3
Спасибо за перенос темы, через пару дней уже сдавать задание, что-то понятно, что-то нет, но на чтение всей книги, кажется, времени не хватит, нужно ещё дописать программу и оформить..
0
950 / 580 / 96
Регистрация: 15.05.2012
Сообщений: 3,384
16.12.2020, 11:04 4
Цитата Сообщение от Armlet Посмотреть сообщение
сначала по прерыванию
От какого источника?
0
0 / 0 / 0
Регистрация: 03.01.2018
Сообщений: 14
16.12.2020, 12:01  [ТС] 5
По RI и TI, сначала RI должен придти, поэтому сначала будет приём от ПК.
Немного изменил код, может стало лучше:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
mov PCON, #0    ; SMOD = 0, сброс всего PCON
    mov TH1, #24h   ; Скорость передачи, по варианту 1600 бод => 0.8 кГц, f_рез = 11.059 МГц.
    setb    P3.0        ; Приём данных от последовательного порта
    setb    TR1     
;============Прерывания===============================
PUART:  ; Обработчик прерывания от порта UART
    PUSH    PSW
    PUSH    ACC
    SETB    P3.6
    CALL    RUART           ; ?????
    CALL    OUTUART
;   ...         ; Программа прерывания
OUTUART: POP    ACC     ; Выход из подрограммы прерывания PUART
    POP PSW
    RETI            ; Выход (возврат в основной цикл) из подрограммы прерывания
 
;===============================================================================
RUART:  JB  TI, TRUART  ; Read
    DJNZ    CTPC, RUART1
    MOV RDPTRH, #80H
    MOV RDPTRL, #00H
    MOV CTPC, #200
    MOV SBUF, X1
    MOV VAR1, #X1
    CLR F0
    CALL    TREND
RUART1: MOV DPL, RDPTRL
    MOV DPH, RDPTRH
    MOV DPL, SBUF
    MOV DPH, SBUF
    INC DPTR
    MOV RDPTRH, DPH
    MOV RDPTRL, DPL
    CALL    TREND
TRUART: JB  F0, TREND   ; Transmit
    MOV SBUF, X1
    MOV SBUF, X2
    MOV SBUF, Y
    MOV SBUF, Y1
    MOV SBUF, Y2
    MOV SBUF, A1F_N
    MOV SBUF, A1F_H
    MOV SBUF, A1F_L
    MOV SBUF, Uo_N
    MOV SBUF, Uo_H
    MOV SBUF, Uo_L
    SETB    F0
    CALL    TREND
;   MOV A, var1
;   SUBB    A, X1
;   JB  A, TRUART1
;   MOV SBUF, X1
;   MOV var1, #X1
TREND:  RET
0
568 / 385 / 104
Регистрация: 07.05.2013
Сообщений: 1,364
Записей в блоге: 1
17.12.2020, 14:09 6
Цитата Сообщение от Armlet Посмотреть сообщение
MOV SBUF, X1
    MOV SBUF, X2
Что же такое творите, пересылка байта же времени требует, а у вас никаких ожиданий нет в коде.

Assembler
1
2
                mov     sbuf,a
tx1:            jnb     ti,tx1
Добавлено через 10 минут
да, и бит потом сбрасывать надо:

Assembler
1
        clr ti
0
пофигист широкого профиля
4274 / 2798 / 791
Регистрация: 15.07.2013
Сообщений: 16,227
19.12.2020, 01:56 7
vantfiles, ну и где же тут заданная в задаче работа через прерывание?
Тупо сидим в цикле
Assembler
1
tx1:            jnb     ti,tx1
ждём когда можно будет передавать очередной байт. И ничем полезным не занимаемся!

Добавлено через 6 минут
Armlet, меня смущают конструкции типа
Assembler
1
MOV SBUF, X1
и
Assembler
1
2
    MOV SBUF, X1
    MOV VAR1, #X1
0
0 / 0 / 0
Регистрация: 03.01.2018
Сообщений: 14
19.12.2020, 11:56  [ТС] 8
Вроде бы тут должны данные записываться в оперативную память, но кажется что-то не так, похоже на передачу первой переменной из тех, что надо передать после приёма...

Добавлено через 3 часа 35 минут
также сейчас пытаюсь подключить клавиатуру 4x4, но по заданию они с одного порта идут и не совсем понятно, можно ли как-то разделить старшие и младшие 4 бита? Во всех объяснениях в интернете говорят о 2 разных портах.
0
568 / 385 / 104
Регистрация: 07.05.2013
Сообщений: 1,364
Записей в блоге: 1
19.12.2020, 12:13 9
Цитата Сообщение от northener Посмотреть сообщение
vantfiles, ну и где же тут заданная в задаче работа через прерывание?
На прерывание лучше вешать прием, а передачу крутить в главном цикле, в нем все равно больше заниматься нечем.

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

Добавлено через 8 минут
хотя, конечно, можно и передачу сделать через прерывание, но для этого понадобится буфер, в котором будет лежать передаваемое, а это доп-память, а ее и так мало
0
пофигист широкого профиля
4274 / 2798 / 791
Регистрация: 15.07.2013
Сообщений: 16,227
19.12.2020, 15:40 10
Цитата Сообщение от vantfiles Посмотреть сообщение
но для этого понадобится буфер, в котором будет лежать передаваемое, а это доп-память, а ее и так мало
Цитата Сообщение от Armlet Посмотреть сообщение
по окончанию сразу передать 11 байт
Неужели нет места для 11 байт?
0
568 / 385 / 104
Регистрация: 07.05.2013
Сообщений: 1,364
Записей в блоге: 1
19.12.2020, 16:54 11
Цитата Сообщение от northener Посмотреть сообщение
Неужели нет места для 11 байт?
на практике бывает, что нет.

зы: я не теоретик, я делюсь собственным опытом.
0
пофигист широкого профиля
4274 / 2798 / 791
Регистрация: 15.07.2013
Сообщений: 16,227
20.12.2020, 02:45 12
Цитата Сообщение от vantfiles Посмотреть сообщение
на практике бывает, что нет.
Это и странно если вы заявляете что
Цитата Сообщение от vantfiles Посмотреть сообщение
передачу крутить в главном цикле, в нем все равно больше заниматься нечем.
Ну не спорю. Возможно у вас и была такая ситуация.
Но вот у меня есть несколько программ для AT89Сx051, где производится работа и в главном цикле и во внешних прерываниях и в прерываниях порта. И вроде как проблем с памятью нет.
0
568 / 385 / 104
Регистрация: 07.05.2013
Сообщений: 1,364
Записей в блоге: 1
20.12.2020, 13:04 13
я упустил из вида, что у ТС в задании есть внешнее ОЗУ...
просто at89f2051 для этой задачи достаточен
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.12.2020, 13:04

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Прерывание таймером при приёме и передаче данных через UART
Разрабатываю программу для RS485 на базе контроллера STM32F100xx. Ступор настал когда нужно входные...

(MCS-51) Програмирование UART
Помогите сделать задачку...незнаю как( Проанализировать принято через коммуникационный интерфейс...

Счётчик витков на компьютере при помощи модуля USB-UART
Доброго времени суток, прикидываю сейчас для себя варианты реализации счётчика витков, счётчик...

(MCS-51) Передача символа по uart
Привет. Начал изучать ассемблер для микроконтроллеров mcs 51. Не могу понять, как записать...

Как передать пакет irp через WriteFile?
Здравствуйте. Подскажите, как из user-mode программы отправлять драйверу irp-пакеты через...

Atmega + UART + прерывания
Добрый день! Интересует такая задача. Хочется использовать в Atmega прерывания USORT_UDRE_vect и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.