реклама на сайте
подробности

 
 
> USART в PIC16F870
rl_inc
сообщение Apr 30 2009, 06:45
Сообщение #1





Группа: Новичок
Сообщений: 8
Регистрация: 14-04-09
Пользователь №: 47 680



Доброго времени суток!
Захотелось мне принять байт от контроллера. Сваял программу на MicroC:

CODE
void interrupt(void)
{
if(PIR1.TXIF)
{
PORTB=10;//äëÿ îáíàðóæåíèÿ ïðåðûâàíèÿ ïåðåäàò÷èêà
}
if(PIR1.TMR2IF)
{
PORTB++;
PIR1.TMR2IF=0;
if(PORTB==4)//äëÿ èñêóññòâåííîãî âûçîâà ïðåðûâàíèÿ ïåðåäàò÷èêà
{
PIR1.TXIF=1;
PORTB=0;
}
}
}
//=======================
void main(void)
{
TRISB=0;
PORTB=0;
TRISC=0b11000000;
//RC6 - äëÿ ïåðåäà÷è áàéòà
//RC7 - äëÿ ïðè¸ìà áàéòà
PORTC=0;
INTCON.GIE=1;
INTCON.PEIE=1;
//-------
TXSTA.BRGH=1;
SPBRG=90;//ñêîðîñòü 9600 áîä
TXSTA.SYNC=0;//àñèíõðîííûé ðåæèì
TXSTA.SPEN=1;//âêëþ÷àåì USART
RCSTA.CREN=1;//ïðè¸ì äàííûõ âûêë
TXSTA.TXEN=1;//ïåðåäà÷a äàííûõ âêë

PIR1.RCIF=0;
PIE1.RCIE=0;//ïðåðûâàíèå îò ïðè¸ìíèêà âûêë
PIR1.TXIF=1;
PIE1.TXIE=1;//ïðåðûâàíèå îò ïåðåäàò÷èêà âêë
//-------
T2CON=0b11111111;//255 ïðåñêàëåð=16, ïîñòñêàëåð=16, âêë.=1
TMR2=0;
PIE1.TMR2IE=1;
//-------
while(1)
{
}
}


Перегнал в ХЕКС. Загрузил в ПРОТЕУС. И фиг там. Не работает.
Прерывания передатчика вообще не происходит!
Даже искусственно созданного!
Горелый модуль USART в контроллере?

Извиняюсь. Код немного не тот отправил.

CODE
void interrupt(void)
{
if(PIR1.TXIF)
{
PORTB=10;//для обнаружения прерывания передатчика
PIR1.TXIF=0;
TXREG=PORTB;
}
if(PIR1.TMR2IF)
{
PORTB++;
PIR1.TMR2IF=0;
if(PORTB==4)//для искусственного вызова прерывания передатчика
{
PIR1.TXIF=1;
PORTB=0;
}
}
}
//=======================
void main(void)
{
//-------
TRISB=0;
PORTB=0;
TRISC=0b11000000;
//RC6 - для передачи байта
//RC7 - для приёма байта
PORTC=0;
INTCON.GIE=1;
INTCON.PEIE=1;
//-------
TXSTA.BRGH=1;
SPBRG=90;//скорость 9600 бод
TXSTA.SYNC=0;//асинхронный режим
TXSTA.SPEN=1;//включаем USART
RCSTA.CREN=1;//приём данных выкл
TXSTA.TXEN=1;//передачa данных вкл

PIR1.RCIF=0;
PIE1.RCIE=0;//прерывание от приёмника выкл
PIR1.TXIF=0;
PIE1.TXIE=1;//прерывание от передатчика вкл
//-------
T2CON=0b11111111;//255 прескалер=16, постскалер=16, вкл.=1
TMR2=0;
PIE1.TMR2IE=1;
//-------
while(1)
{
}
}


Сообщение отредактировал zltigo - May 2 2009, 18:49
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Herz
сообщение Apr 30 2009, 10:59
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



Ну и? А где сама передача?
Go to the top of the page
 
+Quote Post
rl_inc
сообщение Apr 30 2009, 12:41
Сообщение #3





Группа: Новичок
Сообщений: 8
Регистрация: 14-04-09
Пользователь №: 47 680



Цитата(Herz @ Apr 30 2009, 14:59) *
Ну и? А где сама передача?


TXREG=PORTB;

А вообще, немного покопавшись ошибку нашёл.

Вместо
TXSTA.TXEN=1;//передачa данных вкл
Надо писать
RXSTA.TXEN=1;//передачa данных вкл

Компилятор ошибку не увидел, гад.
Всем спасибо за внимание!
Go to the top of the page
 
+Quote Post
Herz
сообщение Apr 30 2009, 14:33
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



Цитата(rl_inc @ Apr 30 2009, 14:41) *
Вместо
TXSTA.TXEN=1;//передачa данных вкл
Надо писать
RXSTA.TXEN=1;//передачa данных вкл

Компилятор ошибку не увидел, гад.

Ну, если б он ещё мысли умел читать...
Go to the top of the page
 
+Quote Post
rl_inc
сообщение May 2 2009, 17:59
Сообщение #5





Группа: Новичок
Сообщений: 8
Регистрация: 14-04-09
Пользователь №: 47 680



Напишу теперь про чтение того самого байта на компе.
На COM порт приходит только одно число 172 с интервалом в 50мс.

На Visual Basic написал прогу
CODE
Option Explicit

Private Sub Form_Load()
MSComm1.CommPort = 1
MSComm1.Settings = "9600,N,8,1"
MSComm1.InBufferSize = 1 '=6 буфер на 6 байт
MSComm1.InputLen = 1 'читаем по одному байту
MSComm1.RTSEnable = 1 'на всякий случай smile.gif
MSComm1.RThreshold = 1 'порог, через сколько символов будет
' генерироваться OnComm при приеме
MSComm1.EOFEnable = False ' если встречает EOF - не генерировать OnComm
MSComm1.PortOpen = True
End Sub

Sub Read_1()
Dim RS As String
RS$ = MSComm1.Input
'далее вставлен код для отображения данных в LISTBOX
.....
End Sub

Private Sub MSComm1_OnComm()
If MSComm1.CommEvent = 2 Then Read_1
End Sub


и вместо ожидаемого байта я увидел кучу нулей изредка разбавленых часлом 10.
Передаю то я число 172 !!!

Бьюсь уже целый день. Посетил много сайтов по этой теме, но вопрос не решается никак sad.gif
Чего я не того делаю?

Сообщение отредактировал rl_inc - May 2 2009, 18:00
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 12:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.01435 секунд с 7
ELECTRONIX ©2004-2016