С Новым годом! Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/27: Рейтинг темы: голосов - 27, средняя оценка - 4.63
somoytovysh26
1

передача по UART 8 байт

03.04.2013, 17:43. Показов 5470. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день всем! Задача такая:
- передать 8 байт в контроллер
- распределить по регистрам
- сравнить один из байтов с число, если совпадает отправить полученную посылку обратно

долго бьюсь, может кто подскажет где не так делаю.
отправляю данные, а в ответ не то приходит

.divice ATmega8

.include "C:\Prokram Files (x86)\Atmel\AVR Studyo 5.1\extensions\Atmel\AVRAssembler\2.1.51.17\avrassembler\include\m8def.yms"
.list
.nolist
;===================================
; Объявления:
.def Counter1= r0
.def Data_X= r1
.def adr_div= r2
.def funct= r3
.def reg_H= r4
.def reg_L= r5
.def Dt_H= r6
.def Dt_L= r7
.def CRC_L= r8
.def CRC_H= r9

.def Counter2= r10
.def adr= r11
.def CNT= r12
.def CRC16_H= r13
.def CRC16_L= r14

.def Counter_RX= r20
.def SaveSREG= r21

;===================================
; Начало программы

rjmp Init ; Первая выполняемая команда

;===================================
Init:
ldi Counter_RX, 8

uart_init:
LDI r16, 71
out UBRRL, r16
LDI r16, 0
out UBRRH, r16

ldi r16,0
out UCSRA,r16

;Прерывания запрещены,прием-передача разрешены
ldi r16, (1<<RXEN)|(1<<TXEN)|(1<<RXCIE)|(0<<TXCIE)|(0<<UDRIE)
out UCSRB,r16

;Формат кадра 8бит
ldi r16, (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1)
out UCSRC,r16

;===================================
Start:
SBIS UCSRA,RXC
rjmp Start;
rjmp rx_ok

priem_ok:
ldi r17, 0x10
cp funct, r17
breq otpravka
rjmp Start

;отправка
otpravka:
ldi Counter_RX, 8

otpravka_ok:
cpi Counter_RX, 0
breq Start
SBIS UCSRA, UDRE;
rjmp otpravka_ok;
cpi Counter_RX, 8
breq otprav_adr
cpi Counter_RX, 7
breq otprav_funct
cpi Counter_RX, 6
breq otprav_adr_H
cpi Counter_RX, 5
breq otprav_adr_L
cpi Counter_RX, 4
breq otprav_dt_H
cpi Counter_RX, 3
breq otprav_dt_L
cpi Counter_RX, 2
breq otprav_CRCH
cpi Counter_RX, 1
breq otprav_CRCL
rjmp Start

otprav_adr:
mov r16, adr_div
dec Counter_RX
clr adr_div
rjmp Buff_Push
otprav_funct:
mov r16, funct
dec Counter_RX
clr funct
rjmp Buff_Push
otprav_adr_H:
mov r16, reg_H
dec Counter_RX
clr reg_H
rjmp Buff_Push
otprav_adr_L:
mov r16, reg_L
dec Counter_RX
clr reg_L
rjmp Buff_Push
otprav_dt_H:
mov r16, Dt_H
dec Counter_RX
clr Dt_H
rjmp Buff_Push
otprav_dt_L:
mov r16, Dt_L
dec Counter_RX
clr Dt_L
rjmp Buff_Push
otprav_CRCH:
mov r16, CRC_H
dec Counter_RX
clr CRC_H
rjmp Buff_Push
otprav_CRCL:
mov r16, CRC_L
dec Counter_RX
clr CRC_L
rjmp Buff_Push

; запись в буфер отправки
Buff_Push:
out UDR, r16
rjmp otpravka_ok

;прием
rx_ok:
ldi Counter_RX, 8
rjmp rx_ok1

rx_ok1:
cpi Counter_RX, 0
breq priem_ok

in r16, UDR
SBIC UCSRA,RXC
rjmp rx_ok1

cpi Counter_RX, 8
breq priem_adr
cpi Counter_RX, 7
breq priem_funct
cpi Counter_RX, 6
breq priem_adr_H
cpi Counter_RX, 5
breq priem_adr_L
cpi Counter_RX, 4
breq priem_dt_H
cpi Counter_RX, 3
breq priem_dt_L
cpi Counter_RX, 2
breq priem_CRCH
cpi Counter_RX, 1
breq priem_CRCL
rjmp priem_ok

priem_adr:
mov adr_div, r16
dec Counter_RX
clr r16
rjmp rx_ok1
priem_funct:
mov funct, r16
dec Counter_RX
clr r16
rjmp rx_ok1
priem_adr_H:
mov reg_H, r16
dec Counter_RX
clr r16
rjmp rx_ok1
priem_adr_L:
mov reg_L, r16
dec Counter_RX
clr r16
rjmp rx_ok1
priem_dt_H:
mov Dt_H, r16
dec Counter_RX
clr r16
rjmp rx_ok1
priem_dt_L:
mov Dt_L, r16
dec Counter_RX
clr r16
rjmp rx_ok1
priem_CRCH:
mov CRC_H, r16
dec Counter_RX
clr r16
rjmp rx_ok1
priem_CRCL:
mov CRC_L, r16
dec Counter_RX
clr r16
rjmp rx_ok1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.04.2013, 17:43
Ответы с готовыми решениями:

Как в симуляторе "принять" байт по UART?
Всем привет! Вопрос такого плана... Как в симуляторе студии &quot;принять&quot; байт по UART? Т.е. например...

Принять через uart байт и записать его в память
Вобщем, если верить преподавателю, этот код надо немного переделать для желаемого эффекта .device...

Передача по UART (ATMega8)
Доброго времени суток! Есть необходимость обработать передачу данных с помощью USORT через COM...

UART передача нескольких переменных
Доброго времени суток. Спрошу отдельной темой. Есть приемник и передатчик, на приемнике на двух 2х...

Передача информации с ПК по RS232 на UART ATmega2313
Помогите разобраться с алгоритмом. Есть символьная строка информации, &quot;Привет123&quot;. Какой тип...

13
0 / 0 / 0
Регистрация: 19.07.2010
Сообщений: 270
03.04.2013, 17:55 2
Что сразу бросилось в глаза где SEI?
0
somoytovysh26
03.04.2013, 18:03 3
Цитата Сообщение от Driomyr
Что сразу бросилось в глаза где SEI?
я же не по прерываниям работать собираюсь, а тупо можно сказать вручную, по флагам
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
03.04.2013, 18:08 4
Вы б еще в одну строку написали. Как это разбирать? Форматирования нет вообще. Научитесь пользоваться тэгами форума. Ну или приложите форматированный листинг в архиве.
0
0 / 0 / 0
Регистрация: 19.07.2010
Сообщений: 270
03.04.2013, 18:10 5
Ну так у вас и получается "Тупо" не работает... Запустите отладку в студии.
У вас после первого принятого байта "считает" все 8...

Почему ассемблер, почему не на прерывании? Зачем джампы на следующую строку?
(Так и хочется сказать ложитесь на кушетку будем нового делать... http://www.anecdots.su/anecdot/37065/)
0
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
03.04.2013, 18:11 6
Цитата Сообщение от somoytovysh26
Добрый день всем! Задача такая:
- передать 8 байт в контроллер
- распределить по регистрам
- сравнить один из байтов с число, если совпадает отправить полученную посылку обратно

долго бьюсь, может кто подскажет где не так делаю.
отправляю данные, а в ответ не то приходит
Во-первых, обычно в программах принято писать комментарии. Во-вторых, для наглядности текст лучше заключать в теги Code. И в-третьих, для начала лучше написать программу попроще. Или нет?
0
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
03.04.2013, 18:12 7
Цитата Сообщение от somoytovysh26
Цитата Сообщение от Driomyr
Что сразу бросилось в глаза где SEI?
я же не по прерываниям работать собираюсь, а тупо можно сказать вручную, по флагам
А у вас прерывания по приему разрешены. Или нет?
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
03.04.2013, 20:01 8
Цитата Сообщение от somoytovysh26
долго бьюсь, может кто подскажет где не так делаю.
отправляю данные, а в ответ не то приходит
.divice ATmega8
Добавьте настройку пинов RX/TX (PortD0 и PortD.1, очевидно) на ввод и вывод, соответственно:
Код
DDRD = 0x02;
(1<<RXCIE) - зачем Вам это, если хотите без прерываний?
Цитата Сообщение от somoytovysh26
отправляю данные, а в ответ не то приходит
Вы уверены, что оно отправляется? Осциллограф может это подтвердить?
0
somoytovysh26
03.04.2013, 20:40 9
Цитата Сообщение от OtyxPM
Цитата Сообщение от somoytovysh26
долго бьюсь, может кто подскажет где не так делаю.
отправляю данные, а в ответ не то приходит
.divice ATmega8
Добавьте настройку пинов RX/TX (PortD0 и PortD.1, очевидно) на ввод и вывод, соответственно:
Код
DDRD = 0x02;
(1<<RXCIE) - зачем Вам это, если хотите без прерываний?
Цитата Сообщение от somoytovysh26
отправляю данные, а в ответ не то приходит
Вы уверены, что оно отправляется? Осциллограф может это подтвердить?
там в программе если равно 0x10 то ответ. когда в сообщении нет 0x10 то ответа ни какого нет, а когда есть ( и что странно в любом месте) то ответ идет, походу не правильно разбирает по регистрам.
0 / 0 / 0
Регистрация: 19.07.2010
Сообщений: 270
03.04.2013, 21:18 10
Если надо могу выслать рабочий код только на С
0
somoytovysh26
03.04.2013, 21:49 11
Цитата Сообщение от Driomyr
Если надо могу выслать рабочий код только на С
если не трудно скинте на почту, попробую разобраться somoytovysh26(собачка)yomdex.ru
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
03.04.2013, 22:19 12
Код
uart_init:
;Прерывания запрещены,прием-передача разрешены
1<<RXCIE
Этого достаточно , что бы ничего не работало т.к. стек не определён. В DS тупо расписаны на asm все режимы и приема и передачи .
Осталось только скопировать.
0
0 / 0 / 0
Регистрация: 08.02.2012
Сообщений: 648
03.04.2013, 22:20 13
Вот рабочий пример без прерываний для 168, может поможет
Код
/*
* asmavrs5_usart.asm
*
*  Created: 12.11.2012 11:25:04
*   Author: zheikurov
*/
.cseg

//векторы прерываний
.ORG 0x0000 JMP RESIT        ; Точка входа (откуда стартует выполнение программы)
.ORG 0x0002 RETI             ;jmp EXT_INT0 ; IRQ0 Homdler
.ORG 0x0004 RETI             ;jmp EXT_INT1 ; IRQ1 Homdler
.ORG 0x0006 RETI             ;jmp PCINT0 ; PCINT0 Homdler
.ORG 0x0008 RETI             ;jmp PCINT1 ; PCINT1 Homdler
.ORG 0x000A RETI             ;jmp PCINT2 ; PCINT2 Homdler
.ORG 0x000C RETI             ;jmp WDT ; Watchdog Timer Homdler
.ORG 0x000E RETI             ;jmp TIM2_COMPA ; Timer2 Compare A Homdler
.ORG 0x0010 RETI             ;jmp TIM2_COMPB ; Timer2 Compare B Homdler
.ORG 0x0012 RETI             ;JMP TIM2_OVF     ;Timer2 Overflow Homdler
.ORG 0x0014 RETI             ;jmp TYM1_CAPT ; Timer1 Capture Homdler
.ORG 0x0016 RETI             ;jmp TYM1_COMPA ; Timer1 Compare A Homdler
.ORG 0x0018 RETI             ;jmp TYM1_COMPB ; Timer1 Compare B Homdler
.ORG 0x001A RETI             ;Timer1 Overflow Homdler
.ORG 0x001C RETI             ;jmp TIM0_COMPA ; Timer0 Compare A Homdler
.ORG 0x001E RETI             ;jmp TIM0_COMPB ; Timer0 Compare B Homdler
.ORG 0x0020 RETI             ;JMP TIM0_OVF     ;Timer0 Overflow Homdler
.ORG 0x0022 RETI             ;jmp SPI_STC ; SPI Transfer Complete Homdler
.ORG 0x0024 RETI             ;jmp USORT_RXC ; USORT, RX Complete Homdler
.ORG 0x0026 RETI             ;jmp USORT_UDRE ; USORT, UDR Empty Homdler
.ORG 0x0028 RETI             ;jmp USORT_TXC ; USORT, TX Complete Homdler
.ORG 0x002A RETI             ;jmp ADC ; ADC Conversion Complete Homdler
.ORG 0x002C RETI             ;jmp EE_RDY ; EEPROM Ready Homdler
.ORG 0x002E RETI             ;jmp ANA_COMP ; Analog Comparator Homdler
.ORG 0x0030 RETI             ;jmp TWI ; 2-wire Serial Interfosi Homdler
.ORG 0x0032 RETI             ;jmp SPM_RDY ; Store Prokram Memory Ready Homdler
.ORG 0x0034 ; Конец таблицы прерываний

RESIT:

call USORT_Init

ldi r16, 0x31
//пошлем символ
call USORT_Transmit

Main:
//ожидаем получение данных
call USORT_Receive

//когда получим определимя что делать
//если код 0х35, по пошлем сообщение
cpi r16,0x35

//увеличим значение
yms r16

//и вернем
call USORT_Transmit
JMP Main

USORT_Init:
ldi r17, 0x00
ldi r16, 0x33
; Set baud rate
sts UBRR0H, r17
sts UBRR0L, r16
; Enable receiver omd transmitter
ldi r16, (1<<RXEN0)|(1<<TXEN0)
sts UCSR0B,r16                      //UCSR0B = (1<<RXEN0)|(1<<TXEN0);  //включим приемник и передатчик
; Set frame format: 8data, 2stop bit
ldi r16, (1<<USBS0)|(3<<UCSZ00)     //UCSR0C = (1<<USBS0)|(3<<UCSZ00); //настроем формат фрейма: 8data, 2stop bit
sts UCSR0C,r16
ret

USORT_Transmit:
//перед передачей убедимся что нет данных, и в рег UDRE0 установлен 0
lds r17,UCSR0A
SBRS r17,5 //UDRE0
rjmp USORT_Transmit
sts UDR0,r16

ret

USORT_Receive: //Посылка данных
; Woyt for data to be received
lds r17,UCSR0A
SBRS r17,7 //RXC0
rjmp USORT_Receive
; Get omd return received data from buffer
lds r16, UDR0
ret
Код практически под чистую скопирован с даташита :-)
0
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
03.04.2013, 22:29 14
Не поможет , здесь не учли один бит . Исправите , может поможет
Код
ldi r16, (1<<USBS0)|(3<<UCSZ00)     //UCSR0C = (1<<USBS0)|(3<<UCSZ00); //настроем формат фрейма: 8data, 2stop bit
sts UCSR0C,r16
0
03.04.2013, 22:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.04.2013, 22:29
Помогаю со студенческими работами здесь

Передача и сортировка разнотипных данных по UART
Всем привет. Возникла такая проблема за неопытностью, разрабатываю устройство на двух...

AVR, mega32, cvavr, uart, передача данных
Добрый вечер, господа. Имею вопрос к вам. Накидал uart на меге, и все вроде бы работает, но мк...

Передача 10-разрядного результата измерения АЦП по UART
Всем доброго дня. Пытаюсь переслать 10-разрядную величину результата измерения АЦП по UART....

Передача сообщения через UART для Atmega 328P
Добрый день. Сам я новичок в этом деле. Сделал устройство бегущей строки на Atmega328P по этой...

ATS90S8535. Считывание, суммирование и передача данных через UART
ATS90S8535 написать программу которая каждую секунду по прерыванию таймер счётчика 2 считывает два...

Прием и передача данных через UART интерфейс. Atmega32A
Итак, написал очень простой код для МК мега32. #define F_CPU 12000000UL #define BAUDRATE 9600 ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru