Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: USART в PIC16F870
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
rl_inc
Доброго времени суток!
Захотелось мне принять байт от контроллера. Сваял программу на 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)
{
}
}
Herz
Ну и? А где сама передача?
rl_inc
Цитата(Herz @ Apr 30 2009, 14:59) *
Ну и? А где сама передача?


TXREG=PORTB;

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

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

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

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

Ну, если б он ещё мысли умел читать...
rl_inc
Напишу теперь про чтение того самого байта на компе.
На 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
Чего я не того делаю?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.