передача данных по RS232

Тема в разделе "WASM.ELECTRONICS", создана пользователем scf37, 14 апр 2007.

  1. scf37

    scf37 New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    44
    Есть PIC16F84 (без встроенной поддержки RS232), на плате в разъёме DB9 распаяны только RD, TD (на порты микроконтроллера) и SG (соответственно, на землю)

    Можно ли в таких условиях хоть как-нибудь общаться с девайсом? В идеале, через CreateFileA....
     
  2. kropalik

    kropalik New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2005
    Сообщения:
    155
    Адрес:
    msk
    можно, только скорость порта будет
    сильно ограничена.
    X~=F/T
    X-скорость порта
    F-тактовая частота микроконтроллера
    (вроде 4MHz для PIC16F84)
    T-количество тактов на выполнение кода
    отправки бита.)
    с приемом аналогично. относительно удобно
    прикрутить RD на вход прерывания и мерить
    интервал между переходами 1->0.
    не забудь поставить преобразователь уровней
    (типа ADM202) между микроконтроллером и RS-232
    еще можно замкнуть в RS-232 CTS и RTS иначе
    терминалка может подумать что ничего отправлять
    не надо тк устройство не готово.
     
  3. scf37

    scf37 New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    44
    "Loopback plug" - это оно?
    http://www.beyondlogic.org/serial/loopback.gif
    Т.е. Windows-приложение при вызове ReadFile получит 8 битов, снятых с "TD" девайса с промежутком 1/X (X - выставленная скорость COM-порта)
    ?
     
  4. kropalik

    kropalik New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2005
    Сообщения:
    155
    Адрес:
    msk
    ага оно. только RD и TD не между собой соединиить
    а к микроконтроллеру.
    а вообще лучше забить на PIC и юзать какой нибудь
    простенький AVR (attiny2313) это дешевле
    зато 20Mhz, никакого гемороя с банками пеамяти
    и встроенный UART. вообще пока не встречал
    ситуацию где PIC лучше AVR.
     
  5. Andrik

    Andrik New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    19
    Если не очень хочется со всем этим возиться и нет времени пересаживаться на другие МК, можно взять PIC16F628. Он максимально схож pin-2-pin с PIC16F84, но при этом обладает дополнительной функциональностью и... если я не ошибаюсь, он дешевле.
     
  6. scf37

    scf37 New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    44
    Если кому интересно... Всё оказалось очень просто.
    Порт настраивается на требуемую скорость, весь контроль выключается:
    Код (Text):
    1.     DCB dcb;
    2.     memset(&dcb, 0, sizeof(dcb));
    3.     dcb.BaudRate = CBR_110;
    4.     dcb.ByteSize = 8;
    5.     dcb.DCBlength = sizeof(DCB);
    6.     dcb.fDtrControl = DTR_CONTROL_DISABLE;
    7.     dcb.fBinary = 1;
    8.     dcb.Parity = NOPARITY;
    9.     dcb.StopBits = ONESTOPBIT;
    Затем, для приёма или передачи:
    В неактивном состоянии на линии RD или TD должен стоять 1 (стоп-бит)
    затем передаётся один нулевой бит (старт-бит) и 8 бит данных. Длина бита вычисляется из скорости канала.
    Код для PIC16F84A (20 MHz):
    Код (Text):
    1. sleep45: ; sleeps for 4.5 ms - half bit length (1000 ms / 110 bod / 2)
    2.     movlw   0x1D
    3.     movwf   sleep_r1
    4. sleep45_1:
    5.     clrf    sleep_r2
    6. sleep45_2:
    7.     decfsz  sleep_r2
    8.     goto    sleep45_2
    9.     decfsz  sleep_r1
    10.     goto    sleep45_1
    11.     return
    12.  
    13. ;sends one byte from comm_reg
    14. sendbyte:
    15.     ; sending start-bit
    16.     bcf     PORTB, 2
    17.     call    sleep45
    18.     call    sleep45
    19.     bsf     STATUS, C
    20.     ;we need to send 8 data bits AND stop-bit, which is now loaded to C
    21. sendbyte_1l:
    22.     rrf     comm_reg
    23.     btfss   STATUS, C
    24.     bcf     PORTB, 2
    25.     btfsc   STATUS, C
    26.     bsf     PORTB, 2
    27.     call    sleep45
    28.     call    sleep45
    29.     clrw
    30.     addwf   comm_reg, w ;CF = 0, ZF = (commreg==0)
    31.     btfss   STATUS, Z ;comm_reg=0 means we've done!
    32.     goto    sendbyte_1l
    33.     return
    34.  
    35. ; receives one byte to comm_reg
    36. recvbyte:
    37.     btfsc   PORTB, 1  ; waiting for startbit (0)
    38.     goto    recvbyte
    39.     call    sleep45
    40.     call    sleep45
    41.     ;first data bit starts here
    42.     movlw   0x80 ; we're putting '1' to bit7. it will appear in CF after 8 shifts
    43.     movwf   comm_reg
    44. recvbyte_l1:
    45.     call    sleep45 ;skeeping halfbit
    46.     bcf     STATUS, C
    47.     btfsc   PORTB, 1  ; CF = PORTB1
    48.     bsf     STATUS, C
    49.     rrf     comm_reg
    50.     btfsc   STATUS, C ;if initial '0x01' in CF now then we've done
    51.     goto    recvbyte_exit
    52.     call    sleep45 ;skeeping second halfbit
    53.     goto    recvbyte_l1
    54. recvbyte_exit:
    55.     call    sleep45 ;second half of last bit
    56.     call    sleep45 ;stopbit
    57.     call    sleep45
    58.     return
     
  7. kropalik

    kropalik New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2005
    Сообщения:
    155
    Адрес:
    msk
    замечательно. только в процессе передачи (и приема тоже)
    процессор будет заниматься только этим (большую часть
    времени в функции sleep45). причем прерывания тоже
    придется запретить ато будут ошибки при передаче.
    логичнее сделать как раз код отправки очередного бита
    в обработчике прерывания от таймера. тогда все остальное
    будет работать независимо.
     
  8. scf37

    scf37 New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    44
    kropalik
    Логичней и красивее, но сложнее, а мне требуется только простое взаимодействие вопрос-ответ.
    Не стоит вкладывать слишком много сил в курсовой проект, ибо всё равно никто это не оценит :)
     
  9. 0x00786F72

    0x00786F72 New Member

    Публикаций:
    0
    Регистрация:
    30 авг 2006
    Сообщения:
    30
    Никто нигде не видел, или не строил сам преобразователь уровней RS232<->TTL на транзисторах?
     
  10. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    журнал "Радио". там в 1999-2002 годах об этом много было
     
  11. scf37

    scf37 New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    44
    Схема обвязки PIC16F84, с которой я работал
    проблем не было