реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> AT89c51 проблема с UART
snake7778
сообщение Apr 29 2012, 10:01
Сообщение #1





Группа: Новичок
Сообщений: 1
Регистрация: 29-04-12
Пользователь №: 71 633



Вот такая проблема не работает прерывание по UART

Задача такая что на UART подаю цыфри и иони отображаються на индкаторе

Подскажите как решить эту проблему


CODE
$include(mod51)

org 0000h
jmp start

org 0023h
jmp uart


start:

SETB EA
SETB ES

MOV P1, #0Ah

jmp start


UART: MOV SCON, #052h
MOV TMOD, #020h
MOV TH1, #0F3h

SETB TCON.6

CIN: JNB RI, CIN
MOV B, SBUF
CLR RI

COUT: JNB TI, COUT
CLR TI
MOV SBUF, B


MOV A, B
SUBB A, #031h
jz n_1

MOV A, B
SUBB A, #032h
jz n_2

MOV A, B
SUBB A, #033h
jz n_3

MOV A, B
SUBB A, #034h
jz n_4

MOV A, B
SUBB A, #035h
jz n_5

MOV A, B
SUBB A, #036h
jz n_6

JMP CIN


n_1:
MOV P1, #01h
JMP CIN

n_2:
MOV P1, #02h
JMP CIN

n_3:
MOV P1, #03h
JMP CIN

n_4:
MOV P1, #04h
JMP CIN

n_5:
MOV P1, #05h
JMP CIN

n_6:
MOV P1, #06h
JMP CIN


end
Go to the top of the page
 
+Quote Post
kovigor
сообщение Apr 29 2012, 10:15
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(snake7778 @ Apr 29 2012, 13:01) *
Вот такая проблема не работает прерывание по UART
...


Нет возможности вникать в чужой исходник. Посмотрите книжку Урусова, Сташина и Мологонцевой, там все подробнейшим образом расписано:

http://lord-n.narod.ru/walla.html
Go to the top of the page
 
+Quote Post
Hmm
сообщение Apr 29 2012, 21:31
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 329
Регистрация: 22-06-04
Пользователь №: 124



Цитата
Вот такая проблема не работает прерывание по UART
Прерывания зачем? И где команда RETI?
Цитата
Подскажите как решить эту проблему
Прочитать пару страниц книжки какой-нибудь sm.gif
Код
          org 0000h

    MOV SCON, #052h
    MOV TMOD, #020h
    MOV TH1, #0F3h
    SETB TR1
    MOV P1, #0Ah
    SETB EA

CIN:    JNB RI, CIN
    MOV B, SBUF
    CLR RI
    
COUT:   MOV SBUF, B
          JNB TI, $
    CLR TI

    MOV A, B
    SUBB A, #031h
    jz n_1

    MOV A, B
    SUBB A, #032h
    jz n_2    

    MOV A, B
    SUBB A, #033h
    jz n_3    

    MOV A, B
    SUBB A, #034h
    jz n_4

    MOV A, B
    SUBB A, #035h
    jz n_5    

    MOV A, B
    SUBB A, #036h
    jz n_6
         JMP CIN

n_1:
    MOV P1, #01h
        JMP CIN
n_2:
    MOV P1, #02h
         JMP CIN
n_3:
    MOV P1, #03h
         JMP CIN
n_4:
    MOV P1, #04h
         JMP CIN
n_5:
    MOV P1, #05h
         JMP CIN
n_6:
    MOV P1, #06h
         JMP CIN
end
Может как-то так ...


--------------------
Талант не пропить ...
Go to the top of the page
 
+Quote Post
ReAl
сообщение Apr 30 2012, 05:54
Сообщение #4


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(snake7778 @ Apr 29 2012, 13:01) *
Вот такая проблема не работает прерывание по UART

Код
start:
    SETB EA    
    SETB ES
    MOV P1, #0Ah
jmp start
Тут постоянно перезаписывается содержимое P1, так что даже если прерывание будет работать, всё равно это можно будет только осциллографом в виде коротких имупльсов увидеть, а не глазами или тестером. Но оно работать не будет — UART тут не настроен, а настраивается аж здесь:
Код
UART:    MOV SCON, #052h
    MOV TMOD, #020h
    MOV TH1, #0F3h

    SETB TCON.6

CIN:    JNB RI, CIN
    MOV B, SBUF
    CLR RI
...
Это как бы обработчик прерівания, но в нём зачем-то каждый раз переиницилизируется UART и дальше работа опросом, без прерываний вообще.
Хорошо, что без reti уровень приоритета не очищается и второе прерывание не пройдёт. Оно и первое не пройдёт, причина выше, но если бы UART был настроен в начале, то первое прошло бы. Но возвратов из прерываний нет, так что если бы второе и последующие прошли бы, то они быстро сожрали бы стек (который, кстати, желательно бы инициализировать за концом используемой под переменнные памяти, а не оставлять в месте и с размером по умолчанию).

Определитесь — в прерываниях работать нужно или достаточно цикла с опросом. Если прерывания, то надо бы и PSW да используемые регистры сохранять, и возврат делать.


Код
    MOV A, B
    SUBB A, #031h
    jz n_1

    MOV A, B
    SUBB A, #032h
    jz n_2    
...
n_1:
    MOV P1, #01h
JMP CIN
...
Ой мама... Ну во-первых, зачем вычитание с заёмом?
Во вторых — в таких случаях я обычно говорю «зачем тогда писать на ассемблере — С-компилятор лучше код сгенерирует». Защитники_ассемблера_от_меня при этом обижаются «тут тема про ассемблер, при чём тут С».
Если очень уж не хочется терять универсальность заменой проверки каждого варианта отдельно проверкой на диапазон мин-макс (031h-036h) и вычитание 030h, то хоть так:
Код
    MOV A, B

    CJNE  A, #031h, not_1
    MOV P1, #01h
    JMP CIN
not_1:
    CJNE  A, #032h, not_2
    MOV P1, #02h
     JMP CIN
not_2:
...
not_5:
    CJNE  A, #036h, CIN
    MOV P1, #06h
     JMP CIN
В два раза короче и в полтора раза быстрее, если мне не изменяет память, не тренировавшаяся на MCS51 уже лет двенадцать.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 14:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.01368 секунд с 7
ELECTRONIX ©2004-2016