Задать вопрос
hitakiri
@hitakiri

Как передать данные из Arduino Mega в Atmega8A через UART?

Задача передать данные из Arduino Mega2560 в AVR микроконтроллер Atmega8A .
Нашел обратную задачу и она работает.

5ab247c6c74a7675578601.jpeg

Изначально писал руками по даташиту Atmega и материалам раз, два, три.

Пробовал использовать готовые библиотеки для Arduino и для Atmega.

Код Arduino:
unsigned char n;
void setup() {
  Serial1.begin(9600);
  pinMode(19,INPUT);//RXD pin is set for INPUT
  pinMode(18,OUTPUT);
}

void loop() {
//  if (Serial1.available()) {
    //for(n=100; n<= 255;n++){
    //Serial1.print(n, BIN);
      Serial1.print(0b00001000, BIN);
      delay(1000);
      //}
//  }

}

Код Atmega:
#define F_CPU 16000000UL

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
		unsigned char m;
		m = 7;
		portIni();
		LCDIni();
		setPos(0,0);
		//unsigned char n; // Переменная общего счётчика
		char buffer [64];
	
	DDRD |= (1 << PIND0);//PORTD pin0 as INPUT

	DDRC=0xFF;//PORTC as OUTPUT

	int UBRR_Value = 6; // 9600 baud rate

	UBRRH = (unsigned char) (UBRR_Value >> 8);

	UBRRL = (unsigned char) UBRR_Value;

	UCSRB = (1 << RXEN) | (1 << TXEN);
	//UCSRC = (1 << USBS) | (3 << UCSZ0);
	UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
	//UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE)|(TXCIE);
	
       /* Set frame format: 8data, 1stop bit */
	//UCSRC = (1<<URSEL)|(3<<UCSZ0);

	unsigned char receiveData;
	//sprintf(buffer, "Wait...", m);
	//LCDString(buffer);
	//_delay_ms(1000);

	while (1)
	{
		while (! (UCSRA & (1 << RXC)) );
		receiveData = UDR;
		if (receiveData >= 0x01){
			LCDClear();
			sprintf(buffer, "%3d", receiveData);
			LCDString(buffer);
			_delay_ms(2);
		} else {
			LCDClear();
			sprintf(buffer, "Wait...", m);
			LCDString(buffer);
			_delay_ms(1000);
		}
	}
}


Закомментированный код, специально не убирал, там параметры которые так же проверялись.

Результат один и тот же - передаёт некорректные данные. По отладчику протеуса основной проблемой является некорректное число бода.
Собственно вопрос как откорректировать\подобрать данный параметр или проблема в чём-то другом?
  • Вопрос задан
  • 256 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
@vanyamba-electronics
Вижу 2 ошибки.
DDRD &= ~(1 << PIND0); //PORTD pin0 as INPUT

UBRRH = 0;
UBRRL = 103;

Значение UBRR можно найти здесь.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы