|
|
  |
ATMega 8535 стыковка с ПК через RS-232 |
|
|
|
Feb 24 2007, 10:14
|

Группа: Новичок
Сообщений: 11
Регистрация: 24-02-07
Из: Воронеж
Пользователь №: 25 622

|
Привет всем А кто писал программу стыковки 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 байт цифрами вроде понял, но итересует как вместо цифр забить конкретные данные. Да и вообще как изменить длину слова данных.
|
|
|
|
|
Feb 24 2007, 21:17
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Я писал и неоднократно. Вы путаете. RS232 - это чисто аппаратный протокол. Он определяет только разъёмы, сигналы, временные параметры. Ему совершенно безразлично что вы по этому разъёму передаёте. По скольку rs232 полнодуплексный интерфейс неплохо защищённый от помех с небольшой протяжённостью, то иногда протоколы второго и более высокого уровня просто не применяют. Если же это требуется, то используют произвольные не очень сложные. Часто свои. На один из таких, скорее всего вы и напоролись. Обычно ставится метка блока данных (из данных изымается или дублируется) размер пакета и контрольная сумма. По delfi и rs232 неплохая книга Агурова "Последовательные интерфейсы ПК" на http://lord-n.narod.ru/walla.html
|
|
|
|
|
Feb 24 2007, 21:27
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(dim_OK @ Feb 24 2007, 11:14)  Привет всем А кто писал программу стыковки AVR с ПК, причём для AVR на асм-ре, а для ПК на Делфи? Вы определитесь, что Вы хотите передавать, и зачем... За Вас это никто не сделает. Для начала, чтобы не воевать с двумя программами, используйте терминал на ПК, смотрите, что приходит от контроллера, а отправлять можно с клавиатуры. Успехов
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Feb 24 2007, 23:56
|
Частый гость
 
Группа: Свой
Сообщений: 148
Регистрация: 26-05-05
Пользователь №: 5 416

|
Да, автор книги конечно наворотил... Судя по всему, если не ошибаюсь, в данном примере используется протокол ModBus, где 5А - стартовый байт, а 21 - это команда кажись на запись всего того, что идёт после. dim_OK, все несколько проще. У этого компонента есть несколько функций для передачи и приёма данных. Эта функция передаёт данные, представленные в виде строки. Стартовые байты необязательны и предусмотрены самими протоколами. На начальных стадиях изучения лучше не заморачиваться на протоколы и передавать данные в удобочитаемом виде. Например так: Код String str:= "Прэвэд Мэдвэд!"; VaComm1.WriteText(str);
|
|
|
|
|
Feb 25 2007, 10:04
|

Группа: Новичок
Сообщений: 11
Регистрация: 24-02-07
Из: Воронеж
Пользователь №: 25 622

|
Цитата(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(т.е. слева вертикальный верхний).
|
|
|
|
|
Feb 26 2007, 12:51
|

Группа: Новичок
Сообщений: 11
Регистрация: 24-02-07
Из: Воронеж
Пользователь №: 25 622

|
Вот кусочек для МК:
********************** 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 ************** Раз протокола нет, то вроде бы больше ничего не нужно, но наверное я чего-то не понимаю. Помогите плиз!!!
|
|
|
|
|
Feb 28 2007, 08:49
|

Группа: Новичок
Сообщений: 11
Регистрация: 24-02-07
Из: Воронеж
Пользователь №: 25 622

|
Цитата(UniBomb @ Feb 26 2007, 23:33)  Ошибки в коде есть, но сейчас у меня нет сил их разгребать... Давай я завтра на роботе напишу кусок кода для мк с пояснениями)) Как там на счёт кода?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|