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

Не Работает Uart


stas0

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

Работаю в AvrStudio 5. Есть две проблемы: не прописывается биты в UCSRC а также не реагирует на запись данных UDR. Возможно проблем в студии, но как по мне 5-я одна из работоспособных.

UartInit:
ldi r16, low(bauddivider)
out ubrrl, r16
ldi r16, high(bauddivider)
out ubrrh, r16
ldi r16, (1<<RXEN)|(1<<TXEN)
out UCSRB,r16
ldi r16, (1<<URSEL)|(1<<USBS)|(3<<UCSZ0)
out UCSRC,r16
ldi r16, 0xa
out udr, r16
ret

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

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

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

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

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

Симбиоз Си и ассма?))) попробуйте в Рон записывать просто числа, а в коментах уже писать что куда задвинули.

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

Не знаеш как? Спроси у Google'а !!!

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

Viktor26, не путайте человека, все он правильно делает. И запись регистров надо делать именно в таком виде, а вовсе не магическими числами, и разницы в количестве буферных регистров нет.

Жаль не известно что за контроллер, потому что у некоторых контроллеров регистры UCSRC и UBRRH объединены. Теоретически выбор, в какой из них идет запись, должен определяться 7 битом (если URSEL = 1, обращение к UCSRC), в других он переключает на SPI. Но практически вполне работает такой код. Может, дело в порядке обращения к регистрам?

; F_CPU - тактовая частота, по аналогии с gcc-avr, только в ассемблере ее надо указывать вручную
.equ UART_UBRR=F_CPU/8/UART_BAUD-1 ;вычисленное значение UBRRH:UBRRL ; есть способ добавить нормальное округление, но в данном случае это излишне
...
ldi temp,(1<<U2X)
uout UCSRA,temp
ldi temp,(1<<RXEN | 1<<TXEN)
uout UCSRB,temp
ldi temp,(1<<UCSZ1 | 1<<UCSZ0)
uout UCSRC,temp
ldi temp,low(UART_UBRR)
uout UBRRL,temp
ldi temp,high(UART_UBRR)
uout UBRRH,temp

uout (и симметричный ему uin) - макрсы для унификации доступа к настройкам, где бы они ни находились, в области регистров или в области ОЗУ.

.macro uout
   .if @0<0x40
       out @0,@1
   .else
       sts @0,@1
   .endif
.endm
.macro uin
   .if @1<0x40
       in @0,@1
   .else
       lds @0,@1
   .endif
.endm

Код был проверен и работоспособен на ATmega8 (где URSEL должен быть) и ATmega168 (где его быть не должно).

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

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

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

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

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

Не знаеш как? Спроси у Google'а !!!

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

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

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

У меня Atmega8. Как было упомянуто COKPOWEHEU, в 8 меге URSEL должен быть установлен.

ldi r16, (1 << URSEL) | (1<<UCSZ1 | 1<<UCSZ0)

В этом случае регистр попросту остается пустым, но если убрать из команды URSEL, биты запишутся в регист UCSRC и UBRRH. Но если это глюк студии, то в какой версии можно проверить программу?

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

Студия 4 (на счет более старших не пробовал), железо, Протеус (заодно там есть терминал, можно сразу проверить)

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

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

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

  • 3 недели спустя...

Здравствуйте, перешел на АСМ - е и сразу захотел поиграть c UART - ом и timer - ом, начинал с UART - а, но код не работает логика у него такое на пине PINA = 0x01 появится высокий уровень сигнала код должно слать букву, - а мои код шлет несколько букв (одно и тоже ) сразу. а прием вообще не работает, ну логика приема такое придет двойка зажечь порт = 0x02, а если другой символ гаснут тот же порт. Посмотрите пожалуйста код и подскажите где я допускаю ошибку.

.include "m8515def.INC"

.DEF TEMP = R16

;.DEF BUF_IN = R17

.EQU XTAL = 8000000

;.EQU BAUD = 9600

.EQU BAUDDIVIDER = 51 ;XTAL/(16 * BAUD) - 1

.DSEG ;=============================

.CSEG ;==============================

.ORG 0

RJMP init ;RESTE

RETI ;EXTR INTERRUPT 0

RETI ;EXTR INTERRUPT 1

RETI ; TIMER1 CAPT

RETI ; TIMER1 COMP A

RETI ; TIMER1 COMP B

RETI ; TIMER1 OVF

RETI ; TIMER0 OVF

RETI ; SPI, STC

RJMP RX_ ; USART RXC

RETI ; USART UDRE

RJMP TX_ ; USART TXC

RETI ; ANA_COMP

RETI ; INT2

RETI ; TIMER0 COMP

RETI ; EEPROM READY

RETI ; STORE PROGRAMM MEMORY REDY

;=====================================================

RX_:

SBIS UCSRA, RXC

RJMP RX_

IN TEMP, SREG

PUSH TEMP

IN TEMP, UDR

CPI TEMP, 0x02

BREQ ON

CBI PORTC, 0x02

RJMP end

ON:

SBI PORTC, 0x02

END:

POP TEMP

OUT SREG, TEMP

RETI

;----------------------------------------------------

TX_:

SBIS UCSRA, UDRE

RJMP TX_

IN TEMP, SREG

PUSH TEMP

IN TEMP, PINC

COM TEMP

OUT PORTC, TEMP

POP TEMP

OUT SREG, TEMP

RETI

;=============================================================

init: ; STACK

LDI TEMP, HIGH(RAMEND)

OUT SPH, TEMP

LDI TEMP, LOW(RAMEND)

OUT SPL, TEMP

; END STACK

LDI TEMP, 0b00000000

OUT DDRA, TEMP ; PORTA IN

LDI TEMP, 0b00000111

OUT DDRC, TEMP

LDI TEMP, 0b00000000

OUT PORTC, TEMP ;PORTC OUT

; ENT PORTS

; COMPARATOR

LDI TEMP, $80

OUT ACSR, TEMP

; END COMPARATOR

; UART

LDI TEMP, LOW(BAUDDIVIDER)

OUT UBRRL, TEMP

LDI TEMP, HIGH(BAUDDIVIDER)

OUT UBRRH, TEMP ; FREQUENCY

;LDI TEMP, 0x02

;OUT UCSRA, TEMP

LDI TEMP, 0b11011000 ;(1<<RXEN)|(1<<TXEN)|(1<<RXCIE)|(1<<TXCIE)|(0<<UDRIE)

OUT UCSRB, TEMP ; SEND RECIEVE ENABLED INTERR DISABLED

LDI TEMP, 0b00001110 ;(1<<URSEL)|(1<<USBS)|(3<<UCSZ0)

OUT UCSRC, TEMP ; FORMAT FRAME

; END UART

SEI

; MAIN PROCEDURE

MAIN:

SBIS PINA, $00

RJMP MAIN

LDI TEMP, 'M'

OUT UDR, TEMP

RJMP MAIN

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

CPI TEMP, 0x32 ,тогда на клавиатуре нажмите 2,а второе- подтяжка на портА,и проверка-отпущена ли кнопка,иначе непрерывная передача

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

Den2313 Спасибо тебе, CPI TEMP, 0x32 это помогло на приеме, Но не понял, это код ANSI который соответствует двойку? если это так, то тогда я не знал что сравнения происходить код клавиатурой а не на прямую двойку.

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

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

в протеусе включите ехо и hex display тогда буде видно какие символы передаешь ,между мк можно но между пк-мк код другой,есть в инете,про подтяжку понял а вот представь что кнопка нажата и отпущена за 1 сек,в течении этого времени идет передача (кнопка то нажата),против дребезга я использую паузу .Хотя смотря для чего задача-непрерывно давать букву или однократно.

uart_s.rar

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

Den2313 Спасибо за разъяснения буду знать о кодировке между МК и ПК и между МК и МК. Я думаю Вы правы дело именно в том что MK успевает передать данные не смотря на то что я пытаюсь быстро отпускать кнопку. Еще один вопрос, если программа запущено на компьютера и передает к МК цифру двойку - то есть программа передает двойку программно без нажатия на клавиатуре компьютера - каким форматом передать двойку к МК для сравнения как просто 2 или как 0х32?

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

com port toolkit -хорошая программа ,я ней управлял мк. Какая программа передает 2 ?, если через терминал то вам на мк придет 0х32-это код цифры 2 на клавиатуре,так и сравнивайте -с 0х32. Почитайте в инете про ascii клавиатуры

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

Планирую написать программу под Windows которая передаст к МК и примет с МК цифры, я планировал передать десятом формате цифры, но как Вы мне разъяснили такой метод для МК ошибочно. Спасибо Den2313 за таблицу ANSI.

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

если своя программа то можете передавать любые символы но лучше придерживаться стандарта,тогда можно с любого пк (стандартным терминалом) передать нужный код .Интереснее получается с labview,тоже самое зато "тумблеры" красивые

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

Спасибо Den2313 символы и цифры передам по Ansi - лучше так. Как Вы мне разъяснили Proteus - е хорошо видно коды клавиатуры, еще я заметил одну, на Proteus - е создал схему, ту же самую как на реальном, когда нажимаю на кнопку для поднятия уровень напряжения на PINa в терминале всегда появляется три одинаковые символы М М М (HEX 4D 4D 4D) а если чуть долго держать кнопку нажатой, символы удваивается, Вы правы это быстродействия МК, как Вы подсказали мне. Спасибо.

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

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

Я посмотрю файл - спасибо.

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

Спасибо Den2313 для задержкий использовать таймеры хорошое и правильное решение, но я придумал еще один, смысл в том что отслеживем состояние кнопки так, если кнопка нажата к регистру (напр; R17, R18) присвойт R17=1 ( R18 обнулим) а если отпушено присвойть R18=3, а если R17 = 1 & R18 = 3 делаем отправку, а под в программе обнуляем R17 = 0, на Proteus - е работает без ошибочно (Только две регистры R17 R18 нельзя использовать для других цель), а на реальном лучше как Вы отметили, лучше таймером пользоватся. В вашем коде токже я понял как правильно пользоватся с стеком, то есть сначало сохраняем SREG и потом все остальное. Спасибо Den2313.

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

Здравствуйте, упростил работу с кнопкой и не пользуюсь регистрам, так же если кнопку держать нажатом состоянии отправка все равно не сработает приведу код задержки:

MAIN:

IN TEMP, PINA ; SBIS тоже можно использовать для считывания состояния PINA

CPI TEMP, $01 ; Если на пинА высокий уровень, то есть кнопка нажато.

BREQ TRANS ; Переход

RJMP MAIN ; Если на пинА низкий уровень

TRANS:

SBIC PINA, $00 ; Если на PINA = $00 то есть кнопка отпущена, пропускаем RJMP TRANS

RJMP TRANS ; Если на PINA = $01 тогда переход

LDI TEMP, 0x48 ; Здесь отправка

OUT UDR, TEMP

RJMP MAIN

Конденсатор параллельно кнопкой надо вставить обязательно, потому что против дребезга этот код не работает. Этот код и Timer как описал Den2313 думаю решить большинство проблем с кнопкой.

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

Вы уверены, что значение PINA будет $01, а не какое-нибудь другое? Например $81.

Перед сравнением требуется либо очищать незначащие биты (приводить их к 0 маской 0000000Х), либо применить вместо cpi temp,$01 другую команду sbrs temp,0 (чтобы перейти на метку TRANS).

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

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

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

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

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

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

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

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

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

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

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

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