MicroCHIP.RU
Главная Документация Отладочные средства Справочник Поиск Ссылки
 Новости   Конференция   Контакты 
 

Пример связи с COM портом

 Нoвaя темa  |  Наверх  |  Перейти к теме  |  Поиск  |  Правила  |  Вход 

ВНИМАНИЕ!
Вы просматриваете архив форума.

Этот форум работает только в режиме просмотра и поиска.

Действующий форум переведен на новый движок и
находится по адресу www.microchip.su

 Пример связи с COM портом
Автор: AlexeiR ()
Дата:   15/05/2004 22:12

Если кто программировал PIC для связи с СОМ портом, то поделитесь опытом
пожалуйста. Буду очень благодарен.


 
 :-)) А ПИК-то какой?
Автор: MajorPAE ()
Дата:   16/05/2004 15:44

1. Пройдись поиском по конфе, были примеры неоднократно.
2. http://www.qsl.net/oz1bxm/PIC/628uart.htm
3. http://www.telesys.ru/projects/proj064/index.shtml
4. Для 628-го на аппаратном USART:
;******************************************************************************
; Макрос тестовой выдачи на терминал значения 
Send_DTMF	macro			
	local	out_busy
;-------------------------------; настройка USART
	movwf	RxDtmf
	bank1
;	movlw	.103		; скорость 2400
;	movlw	.25		; скорость 9600
	movlw	.12		; скорость 19200
;	movlw	.6		; скорость 38400 ???
	movwf	SPBRG		
	bsf	TXSTA,BRGH	
	bcf	TXSTA,SYNC
	bsf	TXSTA,TXEN
	bank0
	bsf	RCSTA,SPEN
;	call	out_busy
out_busy	nop
	clrwdt
	btfss	PIR1,TXIF		
	goto	out_busy
	movf	RxDtmf,0	
	movwf	TXREG	
	endm

Вроде на 9600 и 19200 работает, проверял...



Отправка отредактированного (16/05/2004 16:03)


 
 PIC16F73
Автор: AlexeiR ()
Дата:   16/05/2004 20:26

Я вроде соединил с СОМ портом через МАХ232, но PIC не реагирует на мои посылки. Он
должен записывать в порт В пришедший байт. Что не так я не пойму, может кто
подскажет!

ORG 0
GOTO BEGIN

ORG 4 ;В обработчике прерываний
btfsc PIR1,RCIF ;Прерывание от RS232 ???
goto RS232 ;Да, прерывание от RS232.

retfie ;Выходим

ORG 100h

BEGIN

BCF STATUS,RP ;Выбор банка 0
CLRF DATAPORT ;Очистить регистр DATAPORT
MOVLW INITB ;Загpузить B'00000000' в pегистp W
BSF STATUS,RP ;Выбор банка 1
MOVWF TRISB ;Все разряды порта В установить как выходы

CALL Init_USART
BCF STATUS,RP ;Выбор банка 0
MOVLW B'00000001' ;загpузить 01010101 в pегистp W
MOVWF DATAPORT ;записать W в поpт B (DATAPORT)

LOOP
MOVLW SCRATCH
MOVWF DATAPORT

GOTO LOOP

RS232

movf RCREG,0 ;Считали пришедший байт
MOVWF SCRATCH
bcf PIE1,RCIE ;Сбросили флаг прерывания

retfie ;И все, вышли....

Init_USART
BCF STATUS,RP ;Выбор банка 0
clrf RCSTA
bsf STATUS, RP ;банк1
clrf TXSTA
movlw .129 ;9600 Byte/sec
movwf SPBRG
movlw b'00100100' ;brgh = 1 page 18-3
movwf TXSTA ;enable Async Transmission, set brgh
movlw b'11000000' ;Разрешение прерывания
movwf INTCON ;общего и аппаратного
bsf PIE1,RCIE ;Разрешаем прерывание по RS232
bsf PIE1,TXIE
bcf STATUS, RP ;банк0
movlw b'10010000' ;enable Async Reception
movwf RCSTA
RETURN

END



 
 Re: Пример связи с COM портом
Автор: Zemfir ()
Дата:   16/05/2004 20:42

да посмотрите архив, куча примеров была, кажись был и с выводом в порт.


 
 Это код для 16с74, но думаю покатит...
Автор: Troll ()
Дата:   17/05/2004 12:20


В начале надо проинициализировать сом порт. И не забудь сконфигурить порт вводы-
вывода как сом-порт. Удачи.

unsigned char
sci_Init(unsigned long int baud, unsigned char ninebits)
{
int X;
unsigned long tmp;

/* calculate and set baud rate register */
/* for asynchronous mode */
tmp = 16UL * baud;
X = (int)(FOSC/tmp) - 1;
if((X>255) || (X<0))
{
tmp = 64UL * baud;
X = (int)(FOSC/tmp) - 1;
if((X>255) || (X<0))
{
return 1; /* panic - baud rate unobtainable */
}
else
BRGH = 0; /* low baud rate */
}
else
BRGH = 1; /* high baud rate */
SPBRG = X; /* set the baud rate */

SYNC = 0; /* asynchronous */
SPEN = 1; /* enable serial port pins */
CREN = 1; /* enable reception */
SREN = 0; /* no effect */
TXIE = 0; /* disable tx interrupts */
RCIE = 1; /* disable rx interrupts */
TX9 = ninebits?1:0; /* 8- or 9-bit transmission */
RX9 = ninebits?1:0; /* 8- or 9-bit reception */
TXEN = 1; /* enable the transmitter */

return 0;
}

void
sci_PutByte(unsigned char byte)
{
while(!TXIF) /* set when register is empty */
continue;
TXREG = byte;

return;
}

signed int
sci_GetByte(void)
{
unsigned int i;
/* set when register is not empty */
// if(!RCIF)
// return(-1); else
// {
// CREN = 0;
// CREN = 1;
//
// return RCREG;
// }
i=0;
while(!RCIF)
{
asm("CLRWDT");
i++;
if(i>60000) break;
continue;
}

if(i<60000)
return RCREG; else
return -1;


}


 
 Re: Это код для 16с74, но думаю покатит...
Автор: AlexeiR ()
Дата:   17/05/2004 13:44

Спасибо за помощь. Я теперь полностью разобрался. Если кому надо, спрашивайте,
помогу.