snake7778 0 29 апреля, 2012 Опубликовано 29 апреля, 2012 · Жалоба Вот такая проблема не работает прерывание по UART Задача такая что на UART подаю цыфри и иони отображаються на индкаторе Подскажите как решить эту проблему $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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kovigor 5 29 апреля, 2012 Опубликовано 29 апреля, 2012 · Жалоба Вот такая проблема не работает прерывание по UART ... Нет возможности вникать в чужой исходник. Посмотрите книжку Урусова, Сташина и Мологонцевой, там все подробнейшим образом расписано: http://lord-n.narod.ru/walla.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Hmm 0 29 апреля, 2012 Опубликовано 29 апреля, 2012 · Жалоба Вот такая проблема не работает прерывание по UART Прерывания зачем? И где команда RETI? Подскажите как решить эту проблему Прочитать пару страниц книжки какой-нибудь :) 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 Может как-то так ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 30 апреля, 2012 Опубликовано 30 апреля, 2012 · Жалоба Вот такая проблема не работает прерывание по 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 уже лет двенадцать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться