Захотелось мне принять байт от контроллера. Сваял программу на 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)
{
}
}
{
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)
{
}
}
{
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)
{
}
}