Jump to content

    

USART ATmega16 с одного МК на другой МК

Recommended Posts

fedyutler

Здравствуйте. Не получается отправить по 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);
     
}
}

 

Спасибо

 

 

 

Снимок.PNG

Share this post


Link to post
Share on other sites

fedyutler
2 часа назад, Arlleex сказал:

Перед записью очередных данных в UDR нужно дождаться его опустошения, т.е. ожидать, пока бит UDRE не установится.

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

Share this post


Link to post
Share on other sites

fedyutler
2 часа назад, Arlleex сказал:

Вставить перед записью в UDR цикл, который ожидает установку флага UDRE в UCSRA (вроде там этот флаг).

В первой программе в основной цикл это добавить?

Screenshot_20220321-133151_Chrome.jpg

Share this post


Link to post
Share on other sites

fedyutler
1 час назад, Arlleex сказал:

Да. Это как минимум для того, чтобы отправка символов была целостной.

А можно конкретнее? Напишите строчки какие добавить пожалуйста. А то что-то туго понимаю. В интернете не особо получилось найти.

Share this post


Link to post
Share on other sites

SSerge
2 часа назад, fedyutler сказал:

А можно конкретнее? Напишите строчки какие добавить пожалуйста. А то что-то туго понимаю. В интернете не особо получилось найти.

Или не особо хотелось?

http://ww1.microchip.com/downloads/en/devicedoc/doc2466.pdf

на стр 151 и 154 есть примеры кода для передачи и приёма.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.