[an error occurred while processing this directive] [an error occurred while processing this directive]
Вот всё собрал в единственный Си-файл...
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено Xan 15 мая 2002 г. 20:35
В ответ на: Она длинная, надо всё лишнее поотрезать... Попробую. отправлено Xan 15 мая 2002 г. 15:26

Компилилось PICC v7.87PL2. Могу ещё и файл проекта запостить.

В самом конце файла мэйнлуп... При том, что в нём сейчас написано, он на одиночный байт три байта посылает.
При уменьшении задержек или при посылке с частотой 30 Гц - ку-ку :-(


///////////////////////////////////////////////////

#include "pic.h"

__CONFIG(0x3D76); // 11.1101.0111.0110

///////////////////////////////////////////////////

void Init_Usart(void);
void Usart_Tx_Irq(void);
void Usart_Rc_Irq(void);
void Get_Parity(void);

char Test_Buffer(void);
char Test_Buffer_(void);
char Get_Byte(void);
void Send_Byte(char);

void Delay_4ms(void);
void MainLoop(void);

//-------------------------------------------------

unsigned char bank1 Usart_Buffer[32];
unsigned char bank1 Usart_Tx_State;
unsigned char bank1 Usart_Data;
unsigned char bank1 Usart_Parity;
unsigned char bank1 Rc_Status;
unsigned char bank1 Received;
unsigned char bank1 Tx_Byte;
unsigned char bank1 Tx_Cnt;
unsigned char bank1 Usart_Error_Cnt;
unsigned char bank1 Usart_Ptr_First;
unsigned char bank1 Usart_Ptr_Last;

unsigned char ch;

///////////////////////////////////////////////////

interrupt void Vectors(void)
{
if (RCIF == 1) Usart_Rc_Irq();
if (TXIF == 1 && TXIE == 1) Usart_Tx_Irq();
}

///////////////////////////////////////////////////

void Init_Usart(void)
{
SPBRG = 0x07; // baud rate = 115200 @ 14.7456MHz
BRGH = 1; // High speed
SYNC = 0; // asynchronous mode
SPEN = 1; // serial port enable
TX9 = 1; // 9 bits
RX9 = 1; // 9 bits
TXEN = 1; // Tx enable
CREN = 1; // Continuous receive enable

RCIE = 1; // Enable Reciver Irq
TXIE = 0; // NOT enable Transmitter Irq
PEIE = 1; // Enable Periferal

Tx_Cnt = 0;
Usart_Error_Cnt = 0;
Usart_Ptr_First = 0;
Usart_Ptr_Last = 0;
}

///////////////////////////////////////////////////

void Usart_Tx_Irq(void)
{
if (Tx_Cnt == 0)
{
TXIE = 0;
return;
}

Usart_Data = Tx_Byte;
Get_Parity();
if (Usart_Parity == 1) TX9D = 0;
else TX9D = 1;
TXREG = Usart_Data;
Tx_Cnt = 0;
}

///////////////////////////////////////////////////

void Usart_Rc_Irq(void)
{
Rc_Status = RCSTA;
if (Rc_Status & 6) Usart_Error_Cnt++;

Rc_Status &= 1;

Received = RCREG;
Usart_Data = Received;
Get_Parity();

if (Usart_Parity == Rc_Status) Usart_Error_Cnt++;

if (Test_Buffer_() == 0x1F)
{
Usart_Error_Cnt++;
return;
}

Usart_Buffer[Usart_Ptr_Last] = Received;
Usart_Ptr_Last++;
Usart_Ptr_Last &= 0x1F;
}

///////////////////////////////////////////////////

void Get_Parity(void)
{
Usart_Parity = Usart_Data;
if (Usart_Data & 0x02) Usart_Parity++;
if (Usart_Data & 0x04) Usart_Parity++;
if (Usart_Data & 0x08) Usart_Parity++;
if (Usart_Data & 0x10) Usart_Parity++;
if (Usart_Data & 0x20) Usart_Parity++;
if (Usart_Data & 0x40) Usart_Parity++;
if (Usart_Data & 0x80) Usart_Parity++;
Usart_Parity &= 1;
}

///////////////////////////////////////////////////

void Send_Byte(char byte)
{
while (Tx_Cnt) TXIE = 1;

Tx_Byte = byte;
Tx_Cnt = 1;
TXIE = 1;
}

///////////////////////////////////////////////////

char Test_Buffer(void)
{
static char tmp;

tmp = Usart_Ptr_Last - Usart_Ptr_First;
tmp &= 0x1F;
return tmp;
}

char Test_Buffer_(void)
{
static char tmp_;

tmp_ = Usart_Ptr_Last - Usart_Ptr_First;
tmp_ &= 0x1F;
return tmp_;
}

///////////////////////////////////////////////////

char Get_Byte(void)
{
static char byte;

if (Test_Buffer() == 0) return 0;

byte = Usart_Buffer[Usart_Ptr_First];
if (Usart_Ptr_First == 0x1F) Usart_Ptr_First = 0;
else Usart_Ptr_First++;
return byte;
}

///////////////////////////////////////////////////

void Init_Ports(void)
{
TRISA = 0;
TRISB = 0b00100010;
TRISC = 0b11111000;
TRISD = 0;
TRISE = 0;
}

///////////////////////////////////////////////////

void Delay_4ms(void)
{
static unsigned char i, j;

CLRWDT();
for (i=20; i!=0; i--)
{
for (j=122; j!=0; j--);
}
}

///////////////////////////////////////////////////

void main(void)
{
Init_Ports();
Init_Usart();

INTCON = 0;
PEIE = 1;
GIE = 1;

MainLoop();
}

///////////////////////////////////////////////////

void MainLoop(void)
{ while (1) {

CLRWDT();

//-------------------------------------------------

if (Test_Buffer() > 0)
{
ch = Get_Byte();
Send_Byte(ch+1);
Delay_4ms();
Delay_4ms();
Delay_4ms();
Delay_4ms();
Delay_4ms();
Send_Byte(ch+2);
Delay_4ms();
Delay_4ms();
Delay_4ms();
Delay_4ms();
Delay_4ms();
Send_Byte(ch+3);
}

//-------------------------------------------------

}}

///////////////////////////////////////////////////


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru