Перейти к содержанию

Uart / Usart На Ассемблере


Юстас

Рекомендуемые сообщения

А библиотеку можно будет заюзать только для ATmega8 или же это будет полноценная библиотека для всего семейства? Просто с таймерами везде по своему
Да, без проблем должно везде работать... где есть вход внешнего прерывания INT0, и таймер 8-ми битный T0...

Единственное может на каких то контроллерах надо будет имена портов или фагов поправить...

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

  • Ответов 218
  • Создана
  • Последний ответ

Топ авторов темы

Топ авторов темы

Изображения в теме

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Не... погорячился я со сроками :)...

Вчера не дали делом занятся, ща уже сил нет :)...

Так что наверное придется подождать...

Ну тебе можно пока и так применить, у тебя же не двусторонний обмен данными... так что вставляй в один контроллер передающую часть, в другой приемную...

А как будет готово, поправить минутное дело...

Хотя... может сегодня и добью :crazy: .....

Изменено пользователем shads
Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

В будущем конечно буду делать двухсторонний обмен, вообще идея у меня серьёзная, управление двигателем внутреннего сгорания и узлами автомобиля по радиоканалу. У пользователя будет в руках модуль управления с ЖК-экраном, на котором будут отображаться всё происходящее в авто в реальном времени. Но это только идея и буду разрабатывать постепенно, одновременно с самообразованием. Да и контроллер в будущем будет выбран серьёзный, соответствующий данным требованиям.

Ссылка на комментарий
Поделиться на другие сайты

Радиоканал не самая надежная штука, запросто может не принять нужную команду или принять ненужную. Никакие коррекции ошибок не дадут 100% гарантии. Вы уверены, что неверная команда не приведет к чему-то плохому?

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

shads, думаю осилю, просто время надо. Пол года, год но всё равно осилю. Завтра подготовлю вопросик по TIMER_COUNTER_0, прерывание по переполнению, обработка процедуры по вектору прерывания TOV0, правильно или нет название вектора забыл. Завтра конкретно всё опишу, сейчас на боковую пора.

COKPOWEHEU, в принимающем МК, будут зашиты все команды для сравнения от передающего МК, если такая команда истинна, то принимающий МК обрабатывает эту команду и посылает на пульт ответ об успехе.

Можно будет написать процедуры, которые запретят опасное сочетание команд.

На шаткий путь я конечно вступил, но оно того стоит. Кстати например в некоторых МК STM32, есть уже встроенные RF-модуль, надо это тему пошевелить.

Изменено пользователем Юстас
Ссылка на комментарий
Поделиться на другие сайты

Радиоканал не самая надежная штука, запросто может ........ принять ненужную команду.
Насчет этого - вряд ли...

НЕпринять - это запросто (да и то, решаемо)... а вот принять НЕнужную - не... для этого CRC есть...

Да и весь мир уже далеко ушел в робототехнике (в т.ч. и на колесах)... а мы все боимся принять не то :)...

Ссылка на комментарий
Поделиться на другие сайты

Да и весь мир уже далеко ушел в робототехнике (в т.ч. и на колесах)... а мы все боимся принять не то
Оно конечно, но любительские условия плюс опасная техника.
Насчет этого - вряд ли...

НЕпринять - это запросто (да и то, решаемо)... а вот принять НЕнужную - не... для этого CRC есть...

Другая ситуация - команда запуска прошла, команда остановки - нет. Мало ли, загородили путь сигналу чем-то, или просто антенна от вибрации отвалилась, или батарейки в пульте сели. Я не говорю, что это неразрешимо: помимо "робототехники всего мира" есть достаточно обычные вайфаи и тому подобное с защитой от ошибок и гарантией доставки.

Но в любительском устройстве нереально изначально предусмотреть все. А сбой может быть опасен.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

COKPOWEHEU, волков бояться, в лес не ходить да и жизнь она сама по себе штука опасная. Программно же можно решить всё, даже на случай потери сигнала можно написать код останова. Допустим на модели отдельным МК постоянно мониториться уровень модулирующего сигнала. Если уровень падает ниже критического, автоматически посылается сигнал на прерывание на основной МК и МК сразу бросает всё, и выполняет процедуру останова всей модели. Так что всё решаемо, была бы фантазия :D .

Кстати, я всё больше склоняюсь к тому, что 8-бит AVR, меня всё меньше устраивает в данном замысле. А вот ARM Cortex M3 а именно STM32xxxxx самое оно, там богатая начинка и весьма подходящая. :)

Ссылка на комментарий
Поделиться на другие сайты

Дописал общую на прием и передачу библиотеку манчестера...

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

Можно задавать длину пилот сигнала от 1 до 16 бит, длину заголовка от 1 до 16 символов, длину буфера данных от 1 до 255 байт,

можно выбирать скорость от 800 б\с до 16 кб\с, ну и все подкреплено подсчетом CRC...

Есть дилемка одна... я сейчас использую один 8-ми разрядный таймер Т0, и из за этого в верхней части частот, возникают небольшие отклонения скорости передачи из-за дубовости 8-ми разрядного таймера...

Стоит ли задействовать 16-ти разрядный Т1 ?

Или низких частот достаточно (до 10кб\с)

Ссылка на комментарий
Поделиться на другие сайты

пытался вникнуть хотябы в инициализацию UART, весь мозг вынес, а толку чуть.

Ассемблер начал изучать буквально 2-3 месяца назад.

жизнь она сама по себе штука опасная
Отчасти именно поэтому.

Дописал общую на прием и передачу библиотеку манчестера...

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

Ради интереса, оно когда настраивается, на этапе компиляции или в процессе работы?

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

shads, можно смело TIMER1 задействовать, так как прога уже 1 кило весит смысла экономить уже нет, какмень будет уже как минимум с двумя таймерами. И если делать, так делать от души :D

Я тут во время самообучения как-то спустя рукава отнёсся к таймерам, вот теперь оно мне и аукнулось. Вроде всё понимаю, да видимо не всё. Вот привожу эксперементальный код прерывания по переполнению TIMER0 в ATiny2313, что-то я не до конца провожу инициализацию, не фурычит :D

.include "2313def.inc"

.cseg

rjmp RESET

.org 0x06 ; адрес прерывания по переполнению

rjmp TIM0

RESET:

; === настраиваем вершину стека ===

.def temp = r16

ldi temp, RAMEND

out SPL, temp

; === Порты ===

ldi temp, 0xFF

out DDRD, temp

out DDRB, temp

clr temp

out PORTB, temp

out PORTD, temp

;=== инициализация таймер 0 ===

ldi temp, (1<<TOIE0) ; разрешаем прерывание таймера по переполнению

out TIMSK, temp

ldi temp, 0x05 ; предделитель 1/1024

out TCCR0, temp

clr temp ; обнуляем таймер

out TCNT0, temp

CIKLE:

sei ; запускаем таймер

nop

nop ; сдесь типа что нибуд очень полезное

rjmp CIKLE

TIM0:

rjmp LED_MIG

nop ; сдесь типа тоже что нибуд полезное

reti

; === а сдесь вообще такое важное, что даже прерывания запрещаю :)))) ===

LED_MIG:

cli

sbis PORTB, 0

sbi PORTB, 0

cbi PORTB, 0

sei

reti

Изменено пользователем Юстас
Ссылка на комментарий
Поделиться на другие сайты

Самое важное и... с ошибкой. :)

Ранова-то вам к STM32. Да и задачка вся легко уместится в Atmega16.

Дык я пока и не говорил, что я гурру программирования МК :) А STM32, это всего лишь дело времени. Генадий, вы сильны в Ассемблере?

Ссылка на комментарий
Поделиться на другие сайты

Во-первых, я уже указал, что в теле LED_MIG есть ошибка. PORTB.0 не будет включаться для визуального реагирования глазом. Он будет вспыхивать на пару (максимум) тактов МК и тут же гаснуть. Попробуйте пройти этот алгоритм по правилам МК, а не по своим желаниям. Если линия PORTB.0 установлена, то пропускаем команду SBI и переходим на CBI (линия опущена). А теперь пройдем еще раз, но с условием, что линия PORTB.0 опущена. МК выставит ее в высокое состояние и опустит следующей командой вниз... И так будет с самого первого раза и до конца... вашего терпения, если конечно по условию инициализации порта эта линия не будет установлена в 1 по-умолчанию, тогда один раз мигнет и все вернется на круги своя. По правильности инициализации таймера, сразу не скажу (никогда не работал с Attiny2313, сразу перешел на Меги). Могу лишь сказать, что нужно выставить маску прерывания, установить предделитель и источник тактирования, поднять флаг глобального разрешения прерываний и... ждать наступления события. Замечу, применять SEI и CLI внутри программ-обработчиков прерываний не нужно, т.к. флаг опускается аппаратно (при вызове процедуры обработчика) и поднимается тоже аппаратно (при выходе из обработчика, после RETI).

Ссылка на комментарий
Поделиться на другие сайты

Пардон, мой косяк вот исправил:

.include "2313def.inc"

.cseg

rjmp RESET

.org 0x06 ; адрес прерывания по переполнению

rjmp TIM0

RESET:

; === настраиваем вершину стека ===

.def temp = r16

ldi temp, RAMEND

out SPL, temp

; === Порты ===

ldi temp, 0xFF

out DDRD, temp

out DDRB, temp

clr temp

out PORTB, temp

out PORTD, temp

;=== инициализация таймер 0 ===

ldi temp, (1<<TOIE0) ; маска прерываний, включаем прерывание по переполнению

out TIMSK, temp

ldi temp, 0x05 ; предделитель 1/1024

out TCCR0, temp

clr temp ; обнуляем таймер

out TCNT0, temp

CIKLE:

sei ; запускаем таймер

nop

nop ; сдесь типа что нибуд очень полезное

rjmp CIKLE

TIM0:

rjmp LED_MIG

nop ; сдесь типа тоже что нибуд полезное

reti

; === а сдесь вообще такое важное, что даже прерывания запрещаю ))) ===

LED_MIG:

cli

sbis PORTB, 0 ; если бит0 в PORTB в 1, то пропускаем следующую команду

sbi PORTB, 0 ; устанавливаем бит0 PORTB в 1

sbic PORTB, 0 ; если бит0 в PORTB в 0, то пропускаем следующую команду

cbi PORTB, 0 ; сбрасываем бит0 PORTB

sei

reti

Ссылка на комментарий
Поделиться на другие сайты

Так, я немного отвлекся. Продолжим. Проверять состояние выходной линии порта правильнее по регистру PINB, а не PORTB (sbic PINB.0). Замечание по поводу ветвления, если уж вы и решили выйти за пределы блока подпрограммы, то лучше вернуться обратно в блок (пусть даже в самый его конец). Так алгоритм будет намного понятнее. Это касается и LED_MIG, потому как вы никогда не вернетесь в тело TIM0 на строчку "nop ; сдесь типа тоже что нибуд полезное". Вы отрабатываете программу в симуляторе или на реальном устройстве?

Ссылка на комментарий
Поделиться на другие сайты

Ради интереса, оно когда настраивается, на этапе компиляции или в процессе работы?

А как лучше\правильнее сделать?

Как надо так и сделаю...

пока что на этапе компиляции... в хедере прописал:

#define MAN_SPEED 10000 /*800-32000 бит\сек - частота MANCHESTER сигнала*/
#define MAN_BUF_LENGTH 16 /*1-255 байта. размер буфера данных*/
#define MAN_TRSMT_PILOT_LEN 1 /*1-16 бит. Длина пилотного сигнала передаваемого пакета*/
#define MAN_IDENTIFIER "sh" /*1-16 латинских символов - строковой ИДЕНТИФИКАТОР ПАКЕТОВ.*/
#define MAN_IN_PIN PIND /*порт приема (должен быть порт INT0)*/
#define MAN_IN_LINE (1<<2) /*линия приема (должен быть вывод INT0)*/
#define MAN_OUT_DDR	 DDRC /*порт вывода сигнала MANCHESTER*/
#define MAN_OUT_PORT PORTC
#define MAN_OUT_LINE (1<<0) /*линия вывода сигнала MANCHESTER*/

код прерывания по переполнению TIMER0 в ATiny2313
А какая частота контроллера и какой частоты прерывание нужно?

У меня есть просто готовые варианты...

Изменено пользователем shads
Ссылка на комментарий
Поделиться на другие сайты

shads, да без разницы, мне бы с таймером найти общий язык. Главное разобраться с его настройками, инициализацией. Вот код подправил ещё, забастовка таймера продолжается.

.include "2313def.inc"

.cseg

rjmp RESET

.org 0x06 ; адрес прерывания по переполнению

rjmp TIM0

RESET:

; === настраиваем вершину стека ===

.def temp = r16

.def sthet = r17

ldi sthet, 10

ldi temp, RAMEND

out SPL, temp

; === Порты ===

ldi temp, 0xFF

out DDRD, temp

out DDRB, temp

clr temp

out PORTB, temp

out PORTD, temp

;=== инициализация таймер 0 ===

ldi temp, (1<<TOIE0) ; маска прерываний, включаем прерывание по переполнению

out TIMSK, temp

ldi temp, 0x05 ; предделитель 1/1024

out TCCR0, temp

clr temp ; обнуляем таймер

out TCNT0, temp

sei

CIKLE:

nop

rjmp CIKLE

TIM0:

dec sthet ; запускаем отсчёт прерываний

cpi sthet, 0 ; сравниваем

brne CIKLE ; если не 0, продалжаем крутиться в цикле

rjmp LED_MIG ; а если 0, тогда дёрнем светодиод

rjmp CIKLE ; возвращаемся в бесконечный цикл после процедуры LED_MIG:

; === а сдесь вообще такое важное, что даже прерывания запрещаю ))) ===

LED_MIG:

cli

sbis PINB, 0 ; если бит0 в PORTB в 1, то пропускаем следующую команду

sbi PINB, 0 ; устанавливаем бит0 PORTB в 1

sbic PINB, 0 ; если бит0 в PORTB в 0, то пропускаем следующую команду

cbi PINB, 0 ; сбрасываем бит0 PORTB

ldi sthet, 10

clr temp ; обнуляем таймер

out TCNT0, temp

sei

reti

Изменено пользователем Юстас
Ссылка на комментарий
Поделиться на другие сайты

Юстас, вы играете с огнем! Кто вас научил так извращаться над обработчиками прерываний? Выход должен быть только по команде reti и никаких прыжков типа brne и rjmp. Иначе ваш стек переполнится раньше, чем светодиод успеет зажечься. Киньте ваш проект полностью.

Изменено пользователем Геннадий
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...