Как связать ПК с контроллером ATmega

Ранее я делал схему для связи любого ПК с МК. Теперь рассмотрим как все это выглядит со стороны контроллера и со стороны ПК.

Сторона контроллера

2013-03-29 22.36.32

Для контроллера это простой UART. Когда компьютер посылает какие-либо данные контроллер вызывает прерывание и дальше мы обрабатываемым эти данные. Для этого лучше написать 2 простые функции.

void USART_Init(){
	//UCSRA=(1<<U2X);
	UCSR0B=(1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0)|(1<<TXB80)|(1<<RXB80);
	//UCSRC=(1<<UCPOL);
	UBRR0H=0;//
	UBRR0L=1;//bound
	//TXD/PD1 - Output
	DDRD |= (1<<PD1);
}
void transmitUART(unsigned char data_){
	while( !(UCSR0A&(1<<UDRE0)) );
	UDR0 = data_;
}

И все остальное можно обрабатывать в прерывании примерно так

ISR(USART_RX_vect){
	transmitUART(UDR0);
	switch(usartBuffer){
		case 0x31:
			if(n==0){
				PORTB |= (1<<PB1);
				PORTB &= ~(1<<PB2);
				n=1;
			}else{
				PORTB |= (1<<PB2);
				PORTB &= ~(1<<PB1);
				n=0;
			}
		break;
		default:
			// DEFAULT OP
		break;
	}
}

Что-бы общение было хоть как-то осмысленным принимаем что первый принятый байт посылки - команда, а дальше действуем по желаемой модели. Например команда 0×31 ( ASCII = 1 ) будет переключать светодиоды на контроллере.

Вот и все, теперь можно переходить к ПО для ПК.

Сторона ПК

Снимок3

Тут я выбираю, наверное, самое простое решение. Опен соурс SharpDevelop, очень удобен и все необходимое включено, при том без танцев с бубном.

И так, C# это совсем не тоже самое что С/С++, но все же Си.

Нам нужна будет библиотека работающая с периферией, называется она так

using System.IO.Ports;

Дальше создается экземпляр класса, настраиваем его и можно отправлять посылки.

public static SerialPort serialPort1 = new SerialPort();
serialPort1.PortName = "COM4"; //Указываем наш порт
serialPort1.BaudRate = 256000;//9600; //указываем скорость.
serialPort1.DataBits = 8; 
serialPort1.Open(); //Открываем порт.

//Событие вызовется когда получены данные
serialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler_);

//Посылаем контроллеру информацию
serialPort1.WriteLine("1");//0x31

Всяческие приблуды в виде оконного приложения и обработки нажатия на кнопку не буду рассматривать.

 

PS: Подытожу. На ПК запускается приложение в котором описана логика взаимодействия пользователя с периферийным устройством, это приложение посылает/принимает информацию от устройства.