как связать два устройства по UART

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Масяня
Прорезались зубы
Сообщения: 231
Зарегистрирован: Вс мар 31, 2013 17:22:21
Откуда: Бурятия

Re: как связать два устройства по UART

Сообщение Масяня »

Что касается что я не стараюсь, то луче чем с имитировать нужный сигнал я не придумал, потому что с USART меня не кто не учил работать. Все что ниже, вам может показаться что это полный бред но на большее у меня не хватило знаний но терминал в протеусе распознает данные команды как команды по USART. :))
Спойлер#include <mega8.h>
#include <delay.h>

void main(void)
{

PORTB=0b11111111;
DDRB= 0x00;

PORTC=0b00111111;
DDRC= 0x00;

PORTD=0b01111111;
DDRD= 0b10000000;

while (1)
{
if (PINB.0==0) //Иммитируем сигнал (A)//
{
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(500);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_ms(500);
};
if (PINB.1==0) //Иммитируем сигнал (B)//
{
PORTD.7=0;
delay_us(200);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(400);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_ms(500);
};
if (PINB.2==0) //Иммитируем сигнал (C)//
{
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_us(200);
PORTD.7=0;
delay_us(400);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_ms(500);
};
if (PINB.3==0) //Иммитируем сигнал (D)//
{
PORTD.7=0;
delay_us(300);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(300);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_ms(500);
};
if (PINB.4==0) //Иммитируем сигнал (E)//
{
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(300);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_ms(500);
};
if (PINB.5==0) //Иммитируем сигнал (F)//
{
PORTD.7=0;
delay_us(200);
PORTD.7=1;
delay_us(200);
PORTD.7=0;
delay_us(300);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_ms(500);
};
if (PINB.6==0) //Иммитируем сигнал (G)//
{
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_us(300);
PORTD.7=0;
delay_us(300);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_ms(500);
};
if (PINB.7==0) //Иммитируем сигнал (H)//
{
PORTD.7=0;
delay_us(400);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(200);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_ms(500);
};
if (PINC.0==0) //Иммитируем сигнал (I)//
{
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(200);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(200);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_ms(500);
};
if (PINC.1==0) //Иммитируем сигнал (J)//
{
PORTD.7=0;
delay_us(200);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(200);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_ms(500);
};
if (PINC.2==0) //Иммитируем сигнал (K)//
{
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_us(200);
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(200);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_ms(500);
};
if (PINC.3==0) //Иммитируем сигнал (L)//
{
PORTD.7=0;
delay_us(300);
PORTD.7=1;
delay_us(200);
PORTD.7=0;
delay_us(200);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_ms(500);
};
if (PINC.4==0) //Иммитируем сигнал (M)//
{
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_us(200);
PORTD.7=0;
delay_us(200);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_ms(500);
};
if (PINC.5==0) //Иммитируем сигнал (N)//
{
PORTD.7=0;
delay_us(200);
PORTD.7=1;
delay_us(300);
PORTD.7=0;
delay_us(200);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_ms(500);
};
if (PIND.0==0) //Иммитируем сигнал (O)//
{
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_us(400);
PORTD.7=0;
delay_us(200);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_ms(500);
};
if (PIND.1==0) //Иммитируем сигнал (P)//
{
PORTD.7=0;
delay_us(500);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_ms(500);
};
if (PIND.2==0) //Иммитируем сигнал (Q)//
{
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(300);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_ms(500);
};
if (PIND.3==0) //Иммитируем сигнал (R)//
{
PORTD.7=0;
delay_us(200);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(200);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_ms(500);
};
if (PIND.4==0) //Иммитируем сигнал (S)//
{
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_us(200);
PORTD.7=0;
delay_us(200);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_ms(500);
};
if (PIND.5==0) //Иммитируем сигнал (T)//
{
PORTD.7=0;
delay_us(300);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_ms(500);
};
if (PIND.6==0) //Иммитируем сигнал (U)//
{
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_us(100);
PORTD.7=0;
delay_us(100);
PORTD.7=1;
delay_ms(500);
};
};
};
Когда кажется что ты все понял, оказывается что ты и половины не знаешь!
Реклама
Аватара пользователя
s_black
Мучитель микросхем
Сообщения: 411
Зарегистрирован: Вс авг 10, 2008 19:35:49
Откуда: Евпатория
Контактная информация:

Re: как связать два устройства по UART

Сообщение s_black »

Масяня писал(а):отправляет не то что надо а не понятные символы. можно пример с настроенным и работающем USART

Попробуйте почитать это - может поможет.
Реклама
Аватара пользователя
Масяня
Прорезались зубы
Сообщения: 231
Зарегистрирован: Вс мар 31, 2013 17:22:21
Откуда: Бурятия

Re: как связать два устройства по UART

Сообщение Масяня »

Спасибо, это уже что то, теперь я смог отправить 123 Hello. Но проблема в том что теперь это отправляется безостановочно и не контролируемо. :shock:
Спойлер/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Evaluation
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date : 09.06.2014
Author : Freeware, for evaluation and non-commercial use only
Company :
Comments:


Chip type : ATmega8
Program type : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/

#include <mega8.h>
#include <stdio.h>
#include <delay.h>
void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) );
/* Put data into buffer, sends the data */
UDR = data;
}

void main(void)
{
PORTB=0x00;
DDRB=0x00;

PORTC=0b00000010;
DDRC=0x00;

PORTD=0x00;
DDRD=0x00;


TCCR0=0x00;
TCNT0=0x00;

TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

MCUCR=0x00;

TIMSK=0x00;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;

ACSR=0x80;
SFIOR=0x00;

ADCSRA=0x00;

SPCR=0x00;

TWCR=0x00;

while (1)
{if(PINC1==0);
USART_Transmit('1');
delay_ms(300);
USART_Transmit('2');
delay_ms(300);
USART_Transmit('3');
delay_ms(300);
USART_Transmit(' ');
delay_ms(300);
USART_Transmit('H');
delay_ms(300);
USART_Transmit('e');
delay_ms(300);
USART_Transmit('l');
delay_ms(300);
USART_Transmit('l');
delay_ms(300);
USART_Transmit('o');
delay_ms(300);
USART_Transmit(' ');
delay_ms(1000);
}
{if(PINC1>>0);
}
}
Когда кажется что ты все понял, оказывается что ты и половины не знаешь!
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: как связать два устройства по UART

Сообщение Аlex »

Масяня писал(а):Но проблема в том что теперь это отправляется безостановочно и не контролируемо. :shock:
Какая же это проблема ?
Собственно, что написали, то и получили :

Код: Выделить всё

while(1){
 .....
 .....
}
:dont_know:
Или книги по языку мы тоже читать не любим, ибо это долго и муторно ? :roll:
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Масяня
Прорезались зубы
Сообщения: 231
Зарегистрирован: Вс мар 31, 2013 17:22:21
Откуда: Бурятия

Re: как связать два устройства по UART

Сообщение Масяня »

Читал не чего не понял а что понял тем и пользуюсь. Да к что мне делать.
Когда кажется что ты все понял, оказывается что ты и половины не знаешь!
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: как связать два устройства по UART

Сообщение Аlex »

Масяня писал(а):Да к что мне делать.
Читать до тех пор, пока не поймёте. Либо изучать всё постепенно и писать программы по своим силам.
Второй вариант более правильный.
Реклама
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

Re: как связать два устройства по UART

Сообщение Pink-Pank »

Масяня писал(а):Да к что мне делать.


Проблема в том, что Вы не понимаете, что делаете. Сам UART не сложный интерфейс, но для того, чтобы им управлять, необходимо знать некоторые основы. То, что Вы, используя готовую библиотеку, отправили в цикле символ по интерфейсу не сделало Вас человеком, разбирающимся в этом интерфейсе. Есть много книг по микроконтроллерам AVR, возьмите хотя бы одну и изучите от корки до корки. А если хотите освоить UART, то начните для начала с освоения посылки одиночного символа без всяких циклов. Причем, сделайте все настройки ручками, без использования библиотек и макросов. А уж потом беритесь за строки и посылки по нажатию кнопок. Кстати, выше правильно заметили, что обработка кнопок, которую Вы написали, не позволит Вам правильно работать с UARTом.
Fucking static initialization order fiasco
Аватара пользователя
Масяня
Прорезались зубы
Сообщения: 231
Зарегистрирован: Вс мар 31, 2013 17:22:21
Откуда: Бурятия

Re: как связать два устройства по UART

Сообщение Масяня »

Пожалуйста напишите правильную команду Плиз ну хоть одной кнопки.
Когда кажется что ты все понял, оказывается что ты и половины не знаешь!
Alkul
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Re: как связать два устройства по UART

Сообщение Alkul »

Масяня писал(а):Пожалуйста напишите правильную команду Плиз ну хоть одной кнопки.

Что такое "правильная команда одной кнопки"? Что эта команда должна делать?
boblan
Родился
Сообщения: 18
Зарегистрирован: Сб мар 16, 2013 07:52:58

Re: как связать два устройства по UART

Сообщение boblan »

Масяня писал(а):Есть Wav плеер ...

А какая цель создания такого прибора?
В коментах к статье есть ссылка на ветку http://www.radiokot.ru/forum/viewtopic. ... 5&start=40
ЗЫ. а ветка то первоисточником оказалась ;)
Последний раз редактировалось boblan Чт июн 12, 2014 08:41:56, всего редактировалось 1 раз.
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

Re: как связать два устройства по UART

Сообщение Pink-Pank »

Масяня писал(а):Пожалуйста напишите правильную команду


Поищите в интернете статьи про антидребезг кнопок - думаю, вам все сразу станет понятно и вы сами сможете написать правильную команду. для всех кнопок.
Fucking static initialization order fiasco
Ответить

Вернуться в «AVR»