Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Assembler. Программирование МК. COM-порты  (Прочитано 15237 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« : 21-04-2010 09:22 » 

Добрый день! Собственно, проблема с COM-портом. По заданию, каждую милисекунду, нужно передать на порт COM некие несколькобайтовые данные.
Есть некие учебники Баранова, Голубцова, но даже с ними дело идет тяжело... Может кто-то знает, где можно найти информацию или прочитать о передаче данных на COM-порт, где более-менее легко понять теорию?
Даже если не будет ответов, задача будет в любом случае реализованной, но, просто, не хочеться убить час или несколько часов на несложную, думаю, проблему.
Буду очень благодарен.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 21-04-2010 09:30 » 

YevhenUA, если в МК нет спецмодуля, то придётся реализовать интерфейс rs232 http://ru.wikipedia.org/wiki/RS-232
Записан

Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 21-04-2010 09:33 » 

что тебе нужно?
получать данные на комп?

Легко.
Гипертерминал.
открываешь и смотришь в консоли, что тебе приходит с компорта. Ограничение - выводит только текстовые символы
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 21-04-2010 11:12 » 

YevhenUA, откуда передавать и куда?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 21-04-2010 13:24 » 

По заданию, каждую милисекунду, нужно передать на порт COM некие несколькобайтовые данные.

Для начала следовало бы определиться с реализуемостью этой затеи в принципе. А она зависит от скорости передатчика и конкретного количества байт на передачу.

Простая прикидка: скорость порта 115200 бит в секунду позволит за одну миллисекунду отправить не более 10-11 байт. На меньшей скорости, соответственно, меньше.

Если объем данных не позволяет уложиться в заданный интервал, дальше можно и не напрягаться - задача решения не имеет.
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #5 : 21-04-2010 14:05 » 

YevhenUA, если в МК нет спецмодуля, то придётся реализовать интерфейс rs232 http://ru.wikipedia.org/wiki/RS-232
Я знаю, что мне нужно реализовать интерфейс RS-232, у меня проблема была с тем, как это сделать.

что тебе нужно?
получать данные на комп?

Легко.
Гипертерминал.
открываешь и смотришь в консоли, что тебе приходит с компорта. Ограничение - выводит только текстовые символы
Я не мог посмотреть, что выводит - кода не было, выводящего данные в порт.

YevhenUA, откуда передавать и куда?
RXL, передавать с МК на порт COM

Простая прикидка: скорость порта 115200 бит в секунду позволит за одну миллисекунду отправить не более 10-11 байт. На меньшей скорости, соответственно, меньше.
Мне нужно передать всего-то 3-4 байта, так что скорости 57600, думаю, должно хватить.

...задача решения не имеет.
Как решение - взять другой контроллер; я не привязан к отдельной версии.

У меня сейчас иная проблема: не могу запустить код на выполнение, так как
Цитата
D:\Temp\TimerCOM\TimerCOM.asm(94): error: Invalid register
и таких ошибок 21 штука. Все они указывают на cpi или ldi. Хотя в документации AT90S2313 написано, что комманды поддерживаются. Быть такого не может С чем это может быть связано?
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 21-04-2010 14:15 » 

TimerCOM.asm

в студию
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #7 : 21-04-2010 14:33 » 

Код:
.include "2313def.inc"

.cseg

.org 0

rjmp RESET

; ЗМІННІ.
; Змінні часу.
.def timem  = r11 ; Час (в хв).
.def times  = r12 ; Час (в с).
.def timems = r13 ; Час (в мс).

; Змінні стану.
.def runed  = r14 ; Чи запущений таймер.
.def paused = r15 ; Чи знаходиться таймер в режимі паузи.

; Загальні змінні (що не ввійшли до попередніх блоків.
.def proc = r16 ; Змінна для різних маніпуляцій.
.def over = r17 ; Похибка часу.

; КОНСТАНТИ.
; Кнопки.
.equ play    = PD2 ; Кнопка "Старт".
.equ pause   = PD3 ; Кнопка "Пауза".
.equ stop    = PD4 ; Кнопка "Стоп"
.equ refresh = PD5 ; Кнопка "Перезапустити".
; Лінії передачі даних через COM-порт.
.equ TxD = PD1
; Прийом/передача слів.
.equ t9b = (1<<TXEN) + (1<<CHR9) ; Передача 9-бітних слів.
; Передача даних.
.equ FMB = $aa ; First message byte. ; Перший байт повідомлення.

RESET:
ldi proc,15
out WDTCR,proc ; Ініціалізація сторожового таймера:
; при відсутності команди скиду (wdr)
; через 2 с відбудеться перехід на
; переривання RESET.
wdr ; Скид сторожового таймера.

clr proc ; Очистка proc (proc = 0).
out DDRD,proc ; Лінії порта D - входи.
ser proc ; Встановлення в proc значення 0FF.
out PORTD,proc ; На всіх лініях порта D
; встановлення ВИСОКИХ рівнів.
out PIND,proc ; Операція для AVR Studio, щоб
; встановити на контактах порта
; D ВИСОКІ рівні; інакше
; відлагоджувач буде сприймати
; стан ліній порта D як одночасне
; натискання всіх чотирьох кнопок:
; "Старт", "Пауза", "Стоп" і
; "Перезапустити".

; Ініціалізація стека.
ldi proc,low(RAMEND)
out SPL,proc

main:
sbis PIND,play ; Пропуск наступної команди, якщо
; на лінії play (PD2) ВИСОКИЙ рівень.
rcall PlayTimer ; Виклик підпрограми PlayTimer.

sbis PIND,pause ; Пропуск наступної команди, якщо
; на лінії play (PD3) ВИСОКИЙ рівень.
rcall PauseTimer ; Виклик підпрограми PauseTimer.

sbis PIND,stop ; Пропуск наступної команди, якщо
; на лінії play (PD4) ВИСОКИЙ рівень.
rcall StopTimer ; Виклик підпрограми StopTimer.

sbis PIND,refresh ; Пропуск наступної команди, якщо
; на лінії play (PD5) ВИСОКИЙ рівень.
rcall ResetTimer ; Виклик підпрограми RestartTimer.

rcall IncTimer ; Нарощуємо значення таймера (звісно,
; якщо можна).

rjmp main ; Повернення в початок main'а.

; Підпрограма запуска таймера.
; ============================
PlayTimer:
ldi runed,1 ; Запис 1 у змінну стану запуску, що
; означає, що таймер запущено.

cpi paused,1 ; Перевірка, чи активовано режим паузи:
brne playTEnd ; якщо ні, то вихід з підпрограми;
ldi paused,0 ; інакше - деактивація режиму паузи.

playTEnd: ret ; Кінець підпрограми PlayTimer.

; Підпрограма обробки запиту на паузу.
; ====================================
PauseTimer:
cpi runed,1 ; Перевірка, чи запущено таймер;
brne pauseTEnd ; якщо ні, то вихід з підпрограми.

cpi paused,0 ; Стан запуску порівнюється з нулем:
breq notPaused ; якщо регістр дорівнює 0, то значить
; таймер не призупинено, отже, необхідно
; активувати паузу (перехід до мітки
; notPaused);
; інакше: вихід з режиму паузи:
ldi paused,0 ; встановлення значення змінної в 0
rjmp pauseTEnd ; і вихід з підпрограми.

notPaused: ldi paused,1 ; Запис в змінну паузи 1.

pauseTEnd: ret ; Кінець підпрограми PauseTimer.

; Підпрограма зупинки таймера.
; ============================
StopTimer:
ldi runed,0 ; У змінну стану запуску записується 0,
; що означає, що таймер зупинено.
ldi paused,0 ; Пауза теж прибирається.

ret ; Кінець підпрограми StopTimer.

; Підпрограма обнуління таймера.
; ==============================
ResetTimer:
; Обнуління таймера.
ldi timems,0
ldi times,0
ldi timem,0

ret ; Кінець підпрограми RestartTimer.

; Підпрограма нарощення часу.
; ===========================
IncTimer:
cpi runed,0 ; Перевірка, чи запущений таймер:
breq incTEnd ; якщо так, то - вихід з підпрограми.

cpi paused,0 ; Перевірка, чи не знаходиться таймер
; в режимі паузи:
breq incTEnd ; якщо так, то - вихід з підпрограми.

rcall SendTime ; Відсилання часу.
rcall Wait1ms ; Затримка в 1 мс.

inc timems ; Збільшення кількості мілісекунд.

; Досягнення секунди.
cpi timems,100 ; Перевірка, чи не досягнуто позначки
; нової секунди;
brlo incTEnd ; якщо ні, то - вихід з підпрограми;
inc times ; збільшення кількості секунд;
ldi timems,0 ; обнуління лічильника мілісекунд.

; Досягнення хвилини.
cpi times,60 ; Перевірка, чи не досягнуто позначки
; нової хвилини:
brlo incTEnd ; якщо ні, то - вихід з підпрограми;
inc timem ; збільшення кількості хвилин;
ldi times,0 ; обнуління лічильника секунд.
adiw over,8 ; Урахування похибки.

; Досягнення години.
cpi timem,60 ; Перевірка, чи не досягнуто позначки
; нової години:
brlo incTEnd ; якщо ні, то - вихід з підпрограми;
ldi timem,0 ; інакше - обнуління лічильника хвилин.

incTEnd: ret ; Кінець підпрограми IncTimer.

; Підпрограма затримки на 1 мс.
; =============================
Wait1ms:
wdr ; Скид сторожового таймера.

; Затримку в 1 мс.
ldi YL,low(13333)
ldi YH,high(13333)
waitCycle: sbiw YL,1 ; Від пари YH:YL віднімається 1.
brne waitCycle ; Якщо результат виконання останньої
; команди не рівне 0, то продовжити
; цикл.

ret ; Кінець підпрограми Wait.

; Підпрограма відсилання часу.
; ============================
SendTime:
ret ; Кінець підпрограми SendTime.

Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 21-04-2010 14:49 » 

а сколько регистров у МК?

зы вопрос отпал

Возник другой

покажи листинг вывода ошибки
« Последнее редактирование: 21-04-2010 14:54 от Sla » Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
lag
Участник

ru
Offline Offline

« Ответ #9 : 21-04-2010 15:16 » 

Цитата
D:\Temp\TimerCOM\TimerCOM.asm(94): error: Invalid register
и правильно!
команды ldi и cpi применяются только к старшим регистрам, т.е. r16-r31.

По командам посмотри:  http://www.gaw.ru/html.cgi/txt/doc/micros/avr/asm/start.htm
« Последнее редактирование: 21-04-2010 15:30 от lag » Записан
lag
Участник

ru
Offline Offline

« Ответ #10 : 21-04-2010 15:22 » 

Цитата
проблема с COM-портом
нет у этого контроллера СОМ-порта, есть USART, что однако не одно и тоже.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 21-04-2010 16:39 » new

Соответственно, нужен конвертер RS232C<->TTL. Например, MAX232 или что-то аналогичное. Линиями управления можно пренебречь и использовать трехпроводную схему (со стороны компа стоит замкнуть RTS-CTS и DTR-DSR-DCD).
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines