somoytovysh26
|
|
1 | |
передача по UART 8 байт03.04.2013, 17:43. Показов 5470. Ответов 13
Метки нет (Все метки)
Добрый день всем! Задача такая:
- передать 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 |
03.04.2013, 17:43 | |
Ответы с готовыми решениями:
13
Как в симуляторе "принять" байт по UART? Принять через uart байт и записать его в память Передача по UART (ATMega8) UART передача нескольких переменных Передача информации с ПК по RS232 на UART ATmega2313 |
0 / 0 / 0
Регистрация: 19.07.2010
Сообщений: 270
|
|
03.04.2013, 17:55 | 2 |
Что сразу бросилось в глаза где SEI?
0
|
somoytovysh26
|
|
03.04.2013, 18:03 | 3 |
Сообщение от Driomyr
|
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
0
|
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
|
|
03.04.2013, 18:12 | 7 |
Сообщение от somoytovysh26
А у вас прерывания по приему разрешены. Или нет?
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
03.04.2013, 20:01 | 8 |
Сообщение от somoytovysh26
Код
DDRD = 0x02;
Сообщение от somoytovysh26
0
|
somoytovysh26
|
|
03.04.2013, 20:40 | 9 |
Сообщение от OtyxPM
Код
DDRD = 0x02;
Сообщение от 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
|
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
|
|
03.04.2013, 22:19 | 12 |
Код
uart_init: ;Прерывания запрещены,прием-передача разрешены 1<<RXCIE Осталось только скопировать.
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 | |
03.04.2013, 22:29 | |
Помогаю со студенческими работами здесь
14
Передача и сортировка разнотипных данных по UART AVR, mega32, cvavr, uart, передача данных Передача 10-разрядного результата измерения АЦП по UART Передача сообщения через UART для Atmega 328P ATS90S8535. Считывание, суммирование и передача данных через UART Прием и передача данных через UART интерфейс. Atmega32A Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |