fedyutler 0 Posted March 20 · Report post Здравствуйте. Не получается отправить по UDR char. Суть задачи в том чтобы измерить напряжение на ADC0 на atmega16 №1 и передать по USART на atmega16 №2, а затем вывести на LCD. Бьюсь уже несколько дней, но не выходит. Изучаю МК всего парунедель. Просто строку по символьно передать могу передать могу, а чтобы данные с ADC0 - нет. Кидает такие ошибки. PC=0x010C. [AVR USART] Writing to UDR while transmit operation is in progress. Data will be ignored. [PEREDATCHIK]. Всё что выводит- 0.00 Код: ПЕРЕДАТЧИК #include <mega16.h> #include <stdio.h> #include <delay.h> #include <stdlib.h> char ch; void MC_UNIT(void){ UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM); UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8); UCSRC=(1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL); UBRRH=0x00; UBRRL=0x33;} void setADC() { ADCSRA|=(1<<ADEN); ADMUX|=(1<<REFS0)|(1<<ADLAR); } char readADC(unsigned char i){ ADMUX|=i; ADCSRA|=(1<<ADSC); while(!(ADCSRA&(1<<ADIF))); ADCSRA|=(1<<ADIF); return ADCH; } void main(void) { MC_UNIT(); setADC(); #asm("sei") while (1){ ch= readADC(0); UDR=сh; } } ПРИЁМНИК #include <mega16.h> #include <alcd.h> #define DATA_REGISTER_EMPTY (1<<UDRE) #define RX_COMPLETE (1<<RXC) #define FRAMING_ERROR (1<<FE) #define PARITY_ERROR (1<<UPE) #define DATA_OVERRUN (1<<DOR) #define RX_BUFFER_SIZE 8 #include <stdio.h> #include <stdlib.h> char rx_buffer[RX_BUFFER_SIZE]; unsigned char str[9]=" "; unsigned char rx_wr_index=0,rx_counter=0; int volt; unsigned char ch; interrupt [USART_RXC] void usart_rx_isr(void) { char status,data; status=UCSRA; data=UDR; if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) { rx_buffer[rx_wr_index++]=data; if (++rx_counter == 0) { if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0; if (++rx_counter == RX_BUFFER_SIZE) rx_counter=0; } ch=data; } } void main(void) { UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM); UCSRB=(1<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (1<<RXEN) | (0<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8); UCSRC=(1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL); UBRRH=0x00; UBRRL=0x33; lcd_init(16); #asm("sei") while (1) { volt = (int)ch*5/1023; lcd_gotoxy(0,0); ftoa(volt,2,str); lcd_puts(str); } } Спасибо Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Arlleex 1 Posted March 21 · Report post Перед записью очередных данных в UDR нужно дождаться его опустошения, т.е. ожидать, пока бит UDRE не установится. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
fedyutler 0 Posted March 21 · Report post 2 часа назад, Arlleex сказал: Перед записью очередных данных в UDR нужно дождаться его опустошения, т.е. ожидать, пока бит UDRE не установится. А что нужно изменить в коде? Не особо понимаю. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Arlleex 1 Posted March 21 · Report post Вставить перед записью в UDR цикл, который ожидает установку флага UDRE в UCSRA (вроде там этот флаг). Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
fedyutler 0 Posted March 21 · Report post 2 часа назад, Arlleex сказал: Вставить перед записью в UDR цикл, который ожидает установку флага UDRE в UCSRA (вроде там этот флаг). В первой программе в основной цикл это добавить? Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Arlleex 1 Posted March 21 · Report post Да. Это как минимум для того, чтобы отправка символов была целостной. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
fedyutler 0 Posted March 21 · Report post 1 час назад, Arlleex сказал: Да. Это как минимум для того, чтобы отправка символов была целостной. А можно конкретнее? Напишите строчки какие добавить пожалуйста. А то что-то туго понимаю. В интернете не особо получилось найти. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
SSerge 0 Posted March 21 · Report post 2 часа назад, fedyutler сказал: А можно конкретнее? Напишите строчки какие добавить пожалуйста. А то что-то туго понимаю. В интернете не особо получилось найти. Или не особо хотелось? http://ww1.microchip.com/downloads/en/devicedoc/doc2466.pdf на стр 151 и 154 есть примеры кода для передачи и приёма. Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...