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

USART в PIC18F452

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

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

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

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

 USART в PIC18F452
Автор: Руслан ()
Дата:   10/10/2005 12:14

Всем привет!

На PIC16F877 на asm с обменом по RS-232 у меня проблем не было.
А PIC18F452 шо то с ходу не пошёл.
Пишу:
void InitUsart()
{
	SPBRG = 15;	     //9600 bod    			
	bitclr(TXSTA, SYNC); //Asynchronous mode	
	bitclr(TXSTA, TX9);  //8-bit transmission	
	bitclr(TXSTA, BRGH); //Low speed		
	bitset(TXSTA, TXEN); //Transmission enable
										
	bitset(RCSTA, SPEN); //Serial port enable
	bitclr(RCSTA, TX9);  //8-bit reception	
	bitset(RCSTA, CREN); //Enable reception	
	}//InitUsart


Отправка байта:
void out(unsigned char byte) 
{
/* output one byte */
	TXREG = byte;

	while(!TRMT)	// set whilst TX in progress
		continue;   //пока TRMT == 0 цикл вращается
}//out

Отправляю байт:
ucOut = 0x33;
out(ucOut); 

1)В компе моя программка упорно говорит, что от PICа пришло 0x0, но что-то
приходит, т.к. если вообще ничё не придёт, то моя прога в компе выдаст 0xBB
2)Может кто подскажет, где можно взять прогу ComTest для винды (для dos у меня есть)
3)Смотрю в отладчике в PIC18F452:
после записи в TXREG значения 0x33
TXSTA,TRMT переходит в 0 и из него не выходит!!! (а это типа значит что TXREG
полный и не освобождается - и так бесконечно!)
4)PIR1,TXIF постоянно =0 (т.е. типа TXREG полон)

Может кто подскажет, в чём здесь проблемка?

С благодарностью, Руслан.




 
 а если так..
Автор: VaBо ()
Дата:   10/10/2005 12:24


Отправка байта:
 void out(unsigned char byte) 
 {
 /* output one byte */
 	while(!TRMT)	// set whilst TX in progress
 		continue;   //пока TRMT == 0 цикл вращается
 	TXREG = byte;
 }//out
 



 
 так и знал
Автор: Руслан ()
Дата:   10/10/2005 13:11

что меня это спросят. Сначало я так и делал.

Если так, то:
при первом вызове функции out TRMT будет = 1
После TXREG = byte; TRMT станет = 0 на ВСЕГДА!

При повторном вызове функции out прога зациклится
на коде
	while(!TRMT)	// set whilst TX in progress
 		continue;   //пока TRMT == 0 цикл вращается

т.к. TRMT = 0 БЕСКОНЕЧНО! - в этом то и проблема!




 
 Re: USART в PIC18F452
Автор: @ndrey ()
Дата:   10/10/2005 13:19

С пиками давно не возился, на асме что-то было, если нужно вечером найду и завтра сброшу.


 
 извини, но это бред какой-то (-)
Автор: VaBо ()
Дата:   10/10/2005 13:51

1


 
 Re: USART в PIC18F452
Автор: Руслан ()
Дата:   10/10/2005 13:52

На asm у меня проблем для PIC16F877 не было.

Может подкините или скажите где можно взять
прогу типа ComTest для винды.




 
 Re: так и знал
Автор: GRR ()
Дата:   10/10/2005 13:53

У меня работает без проблем...

Инициализация:
TXSTA = 0b00100010;
RCSTA = 0b10000000;
SPBRG = 1;
BRGH = 0;

Предача байта:
while(!TRMT);
TXREG = '5';


 
 Re: USART в PIC18F452
Автор: @ndrey ()
Дата:   10/10/2005 14:08

А кто говорит о 877, а я на 452 на асме писал.
http://www.software.rs232.ru/russian/index.html
http://www.compt.ru/
http://www.perisoft.net/bushound/
Если не хватит остальное мылом дошлю :)


 
 ага - всё ок, а не работает
Автор: Руслан ()
Дата:   10/10/2005 14:49

.




 
 Re: USART в PIC18F452
Автор: GRR ()
Дата:   10/10/2005 14:51

http://www.software.rs232.ru/download/rs232pro.zip
Я пользовался вот этой программой...


 
 Спасибо
Автор: Руслан ()
Дата:   10/10/2005 15:13

за ссылки.

Если ещё есть чё (а вдруг то шо скачал по ссылкам не будет работать),
то буду благодарен, если пришлёте мне на мыло:

ruslan_b76@mail.ru




 
 может
Автор: Руслан ()
Дата:   11/10/2005 10:48

кабель не тот.
В смысле: я соеденил демо плату и комп кабелем для RS-232,
который шёл в комплекте к MPLAB IDC2.
Но ведь этот кабель для подключения IDC2 к компу - может там
кабель на такой? Хотя сумневаюсь, однако.




 
 хм
Автор: Руслан ()
Дата:   11/10/2005 12:18


Да, а если даже кабель отключить от СОМ, то будет ли
USART передавать в "воздух", в смысле: будет ли TXSTA,TRMT
переходить в 1, т.е. что TXREG освободился?
Будет ли TXREG освобождаться, если комп не принял
переданный байт? Или PICу наплевать на комп - принял тот или нет,
дело PICа выбросить байт и ВСЁ? Так ли это?




 
 Re: хм
Автор: KYV ()
Дата:   11/10/2005 12:24

Пику наплевать приняли там или нет. Кабель от ICD2 нормальный,через него работал.

Я знаю, что ничего не знаю.
Сократ.


 
 СПАСИБО! Заработало :-)
Автор: Руслан ()
Дата:   12/10/2005 11:02

теперь надо разобраться, чё я не так делал.


 
 а контроль чётности
Автор: Руслан ()
Дата:   12/10/2005 11:08

может у кого есть примеры на С, чтоб запрограммить контроль
чётности при обмене по RS-232




 
 Возвращает кол-во единиц в байте
Автор: VaBо ()
Дата:   12/10/2005 11:23

char Check_Parity(char cb)
{
char bit_count;
	bit_count = 0;
	while(cb)
	{	cb &= cb - 1;
		++bit_count;
	}
	return bit_count;
}



 
 а куда
Автор: Руслан ()
Дата:   12/10/2005 11:57

это тулить?




 
 типа "дай говна, дай ложку" :))
Автор: VaBо ()
Дата:   12/10/2005 12:08

void UartTXChar (char tByte)
{
#ifdef	LRC	//-----------------------------------
	lrc_count += tByte;
#endif
#ifdef	PARITY_CHECK
	if(Check_Parity(tByte)&0b00000001)	tByte |= 0x80;
#endif		//-----------------------------------
......... здесь твой код!!
}



 
 если надо побыстрее и покороче
Автор: Greg ()
Дата:   12/10/2005 12:34


/* возвращает "бит четности"*/
bit Check_Parity(char cc) {

 cc ^= ((cc>>4) | (cc<<4));  //сгенерит swap
 cc ^= (cc>>1);

 if (cc & 0x04)
    cc++;

  return (cc & 1);
 }
 




Отправка отредактированного (12/10/2005 13:34)


 
 попробую вкурить, токо
Автор: Руслан ()
Дата:   12/10/2005 13:13

bit char Check_Parity(char cc)

возвращаемый тип: bit char
Это описка?




 
 а шо такое
Автор: Руслан ()
Дата:   12/10/2005 13:16

swap ?

строка:
cc ^= ((cc>>4) | (cc<<4)); //сгенерит swap




 
 это бисер ... (-)
Автор: Vova ()
Дата:   12/10/2005 13:26

это бисер ... (-)


 
 Re: попробую вкурить, токо
Автор: Greg ()
Дата:   12/10/2005 13:33

Руслан писал(а):

> bit char Check_Parity(char cc)
>
> возвращаемый тип: bit char
> Это описка?
>

да, надо просто bit (есть такая штука в picc)


 
 перестановка... глянь систему команд ( - )
Автор: patton ()
Дата:   12/10/2005 23:37

-

юзера дурковали по чёрному... ©


 
 хочу уточнить
Автор: Руслан ()
Дата:   13/10/2005 13:04

чтоб отправить 9-й бит (бит проверки чётности)
я должен его просто записать в TX9D

и ПОСЛЕ ЭТОГО уже написать:
TXREG = 'a';

и в комп пойдёт 9 бит передачи.

Верно ли я понимаю?




 
 Re: хочу уточнить
Автор: Greg ()
Дата:   13/10/2005 13:14

Руслан писал(а):

> чтоб отправить 9-й бит (бит проверки чётности)
> я должен его просто записать в TX9D
>
> и ПОСЛЕ ЭТОГО уже написать:
> TXREG = 'a';
>
> и в комп пойдёт 9 бит передачи.
>
> Верно ли я понимаю?


да, верно
ну, разрешить еще перед всем этим девятибитную передачу (TX9 = 1;)


if (bit Check_Parity(char cc))  // что там надо с парити сделать, может и наоборот
  TX9D = 1;
else
  TX9D = 0;

while (!TXIF);

TXREG = cc;



 
 спасибо, ясно, а...
Автор: Руслан ()
Дата:   13/10/2005 13:26

если проверка чётности не прошла (в PICе или в компе),
то как я об этом узнаю?

Или самому надо чё-то дописывать для выдачи сообщения
в случае ошибки при проверке чётности?




 
 Re: спасибо, ясно, а...
Автор: Greg ()
Дата:   13/10/2005 13:49

Руслан писал(а):

> если проверка чётности не прошла (в PICе или в компе),
> то как я об этом узнаю?

при приеме проверили (также)


RCREG = cc;

if (checkparity(cc) == RX9D)
   OK();
else 
   errorparity();





> Или самому надо чё-то дописывать для выдачи сообщения
> в случае ошибки при проверке чётности?

тут все от вашей фантазии зависит. Можно заставить передатчик еще раз прислать
посылку, можно сообщение выдать (кому только?)

обычно эту четность не используют - толку мало: если линия шумная, то такая фигня
не поможет уже при, например двойной ошибке - надо использовать алгоритмы покруче.
Да и что значит "поможет", ну была ошибка, а дальше что делать?

Если линия не шумная, то и нафиг он не нужен.


 
 Re: спасибо, ясно, а...
Автор: Руслан ()
Дата:   13/10/2005 14:00

>Да и что значит "поможет", ну была ошибка, а дальше что делать?

поможет обнаружить наличие ошибки при передаче.

А со стороны компа тоже ж надо шо-то делать, чтоб
обнаружить что пришёл ошибочный бит чётности...




 
 в компе проверка четности аппаратно реализована (-)
Автор: IceS ()
Дата:   13/10/2005 14:03

-


 
 Re: спасибо, ясно, а...
Автор: Greg ()
Дата:   13/10/2005 14:05

Руслан писал(а):

> >Да и что значит "поможет", ну была ошибка, а дальше что
> делать?
>
> поможет обнаружить наличие ошибки при передаче.
>
> А со стороны компа тоже ж надо шо-то делать, чтоб
> обнаружить что пришёл ошибочный бит чётности...

конечно

только если планируется такая фигня (ошибки), то четность вам не помощник.
Закладывайте сразу какой-нибудь помехоустойчивый алгоритм.


 
 а в компе что - дядя сидит...
Автор: Руслан ()
Дата:   13/10/2005 14:52

и если пришёл ошибочный байт чётности, то дядя мне закричит про это?




 
 готовые примеры!?
Автор: Руслан ()
Дата:   13/10/2005 17:45

Может кто подскажет где можно взять готовые примеры на С++
записи/чтения СОМ порта со стороны компа С ПРОВЕРКОЙ ЧЁТНОСТИ.

т.е. типа:

// Fill in the DCB: baud=9600, 8 data bits, no parity, 1 stop bit.
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;

токо в строке:
dcb.Parity = NOPARITY;

было = ODDPARITY или чё там надо для контроля
и с последующей ловлей ошибок чётности.

pls :)))




 
 ну мля!
Автор: IceS ()
Дата:   13/10/2005 21:28

Cам хоть в чем-нибудь разобраться попробуй!

http://www.microchip.ru/phorum/read.php?f=2&i=105154&t=104936

:-)