Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ATMega 8535 стыковка с ПК через RS-232
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
dim_OK
Привет всем
А кто писал программу стыковки AVR с ПК, причём для AVR на асм-ре, а для ПК на Делфи?
В книжке читаю в примере "отправляем в порт строку 5А 21 00 00 00 00 7А
дальше коментируется 5А - стартовый байт"
не понимаю, вот этот стартовый байт всегда должен быть 5А или нет, может это конкретный пример (для конкретной проги)?
Вот часть кода для проги на Delphi:

begin
if not VaComm1.Active then VaComm1.Open;
sCMD:='5A'+Format(' %2.x',[cmRS]);
sum:=$5A+$21;
sCMD:=sCMD+' 00 00';
for J:=1 to 128 do begin
sum:= sum+I;
sCMD:= sCMD+Format(' %.2x',[J]);
end;
sCMD:= sCMD+A+Format(' %.2x',[12]);
sum:= sum+$12;
sCMD:=sCMD+Format(' %.2x',[Hi(sum)])+Format(' %.2x',[Lo(sum)]);
Edit1.Text :=sCMD;
VaComm1.WriteText(sCMD);
end;
end.


Строковая переменная sCMD и есть то что мы передаём на контророллер. Она формируется из стартового байта(5А) и байта команды(cmRS=$21). Непонятно зачем добавляются вот это '00 00'. То что цикл забивает 128 байт цифрами вроде понял, но итересует как вместо цифр забить конкретные данные. Да и вообще как изменить длину слова данных.
SasaVitebsk
Я писал и неоднократно.

Вы путаете.

RS232 - это чисто аппаратный протокол. Он определяет только разъёмы, сигналы, временные параметры. Ему совершенно безразлично что вы по этому разъёму передаёте.

По скольку rs232 полнодуплексный интерфейс неплохо защищённый от помех с небольшой протяжённостью, то иногда протоколы второго и более высокого уровня просто не применяют. Если же это требуется, то используют произвольные не очень сложные. Часто свои.

На один из таких, скорее всего вы и напоролись. Обычно ставится метка блока данных (из данных изымается или дублируется) размер пакета и контрольная сумма.

По delfi и rs232 неплохая книга Агурова "Последовательные интерфейсы ПК" на http://lord-n.narod.ru/walla.html
Dog Pawlowa
Цитата(dim_OK @ Feb 24 2007, 11:14) *
Привет всем
А кто писал программу стыковки AVR с ПК, причём для AVR на асм-ре, а для ПК на Делфи?

Вы определитесь, что Вы хотите передавать, и зачем... За Вас это никто не сделает.
Для начала, чтобы не воевать с двумя программами, используйте терминал на ПК, смотрите, что приходит от контроллера, а отправлять можно с клавиатуры.
Успехов
UniBomb
Да, автор книги конечно наворотил... Судя по всему, если не ошибаюсь, в данном примере используется протокол ModBus, где 5А - стартовый байт, а 21 - это команда кажись на запись всего того, что идёт после. dim_OK, все несколько проще. У этого компонента есть несколько функций для передачи и приёма данных. Эта функция передаёт данные, представленные в виде строки. Стартовые байты необязательны и предусмотрены самими протоколами. На начальных стадиях изучения лучше не заморачиваться на протоколы и передавать данные в удобочитаемом виде. Например так:

Код
String str:= "Прэвэд Мэдвэд!";
VaComm1.WriteText(str);
gormih
"Проверено электроникой" - 5A посылать совершенно не обязательно - можете что угодно посылать smile.gif

Интерфейс тупо ловит то, что Вы туда передаете и помещает в буфер. Главное объяснить аппаратной части что вы собираетесь его использвать - это инициализация.
dim_OK
Цитата(UniBomb @ Feb 24 2007, 23:56) *
не заморачиваться на протоколы и передавать данные в удобочитаемом виде. Например так:

Код
String str:= "Прэвэд Мэдвэд!";
VaComm1.WriteText(str);


Так ведь я так иделаю:

procedure TForm1.Button1Click(Sender: TObject);
begin
if not VaComm1.Active then VaComm1.Open;
sCMD:='0010010';
Edit1.Text :=sCMD;
VaComm1.WriteText(sCMD);
end;

В МК выталктваю на семисегментник, по идее на должна гореть "5", а горит ноль без сегмента F(т.е. слева вертикальный верхний).
UniBomb
dim_OK

Ну тут уже надо фтыкать программную часть мк. Смотреть как он воспринимает эти семь байт. Следует помнить, что у МК приёмный (а равно как и отправной, что по сути одно и тоже) размером с один байт.
dim_OK
Вот кусочек для МК:

**********************
LOOP:
clr r18;

rcall RECIVE

cbi UCSRB,pb4 ;Disable Receiver and Transmitter

out porta,r18 ;это
sbi portb,pb0 ;семисеоментник
sbi portb,pb1 ;

rjmp LOOP

RECIVE:
ldi r16,0x12
out UBRRH, r16
ldi r16, (1<<URSEL)|(0<<USBS)|(2<<UCSZ0) ;Set frame format: 7data, 1stop bit
out UCSRC,r16
ldi r16, (1<<RXEN) ;Enable Receiver and Transmitter
out UCSRB,r16
rec: sbis UCSRA,RXC ;ждать загрузки данных в буфер приёмника
rjmp rec
in r18,UDR
ret
**************
Раз протокола нет, то вроде бы больше ничего не нужно, но наверное я чего-то не понимаю.
Помогите плиз!!!
UniBomb
2 dim_OK

Ошибки в коде есть, но сейчас у меня нет сил их разгребать... Давай я завтра на роботе напишу кусок кода для мк с пояснениями))
DiMomite
вопрос немного наивный, но индикатор у тебя правильно подпаян?
Потому что и у "5" и у твоего "0 без F" должно гореть 5 сегментов. Может где напутал?
dim_OK
Цитата(UniBomb @ Feb 26 2007, 23:33) *
Ошибки в коде есть, но сейчас у меня нет сил их разгребать... Давай я завтра на роботе напишу кусок кода для мк с пояснениями))


Как там на счёт кода? a14.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.