[an error occurred while processing this directive]
Вот исходник... может я чего-то не понимаю???
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено M@RS 19 октября 2005 г. 22:51
В ответ на: Уроды...кто писал такое ? отправлено Kenat 19 октября 2005 г. 22:44

//-------------------------------------------------------------------------
// UART0 SECTION
//-------------------------------------------------------------------------
// Sub Description //
//--------------------------//
int UART0_Init(double Baud, BYTE BitNo, BYTE Parity, BYTE StopNo, int Sub(BYTE RecData, char *RXB, char *TXB, void Tx_Start(BYTE *Tx0Buf, WORD Tx0Count)));
void Tx0_Byte_Start(BYTE TxByte);
void Tx0_Start(BYTE *Tx0Buf, WORD Tx0Count);
void Rx0_LedOff(void);
void Tx0_LedOff(void);
void Rx0_LedOn(void);
void Tx0_LedOn(void);
void Tx0_DelStart(void);
void Tx0_RTSOFF(void);
void Rx0_WD(void);
//-------------------------------------------------------------------------
// Definitions //
//--------------------------//
#ifdef Mega8
#define UART0_TXINT_EN sbi(UCSRB, TXCIE)
#define UART0_RXINT_EN sbi(UCSRB, RXCIE)
#define UART0_TX_EN sbi(UCSRB, TXEN)
#define UART0_RX_EN sbi(UCSRB, RXEN)
#define UART0_TXINT_DIS cbi(UCSRB, TXCIE)
#define UART0_RXINT_DIS cbi(UCSRB, RXCIE)
#define UART0_TX_DIS cbi(UCSRB, TXEN)
#define UART0_RX_DIS cbi(UCSRB, RXEN)
#define UBRR0 UBRRL
#define UCSR0C UCSRC
#define UDR0 UDR
#define SIG_UART0_RECV _VECTOR(11)
#define SIG_UART0_DATA _VECTOR(12)
#define SIG_UART0_TRANS _VECTOR(13)
#else
#define UART0_TXINT_EN sbi(UCSR0B, TXCIE0)
#define UART0_RXINT_EN sbi(UCSR0B, RXCIE0)
#define UART0_TX_EN sbi(UCSR0B, TXEN0)
#define UART0_RX_EN sbi(UCSR0B, RXEN0)
#define UART0_TXINT_DIS cbi(UCSR0B, TXCIE0)
#define UART0_RXINT_DIS cbi(UCSR0B, RXCIE0)
#define UART0_TX_DIS cbi(UCSR0B, TXEN0)
#define UART0_RX_DIS cbi(UCSR0B, RXEN0)
#endif

//----------------------------
#define RX0_SIZE 32
#define TX0_SIZE 32
//----------------------------
#define B300 1
#define B600 2
#define B1200 3
#define B2400 4
#define B4800 5
#define B9600 6
#define B19200 7
#define B38400 8
#define B57600 9
#define B115200 10
//----------------------------
#define None 0
#define Even 2
#define Odd 3
//----------------------------
#define UART_READY 0
#define RX_BUSY 1
#define TX_BUSY 2
//-------------------------------------------------------------------------
// Variables Preferences //
//--------------------------//
struct {
double BaudRate;
BYTE Parity;
BYTE BitNo;
BYTE StopNo;
_Bool RxEn;
_Bool TxEn;
BYTE Status;
char RxBuf [Rx0Size];
char TxBuf [Tx0Size];
}
UCB0;

int (*RecHandler0)(BYTE RecData, char *RXB, char *TXB, void Tx_Start(BYTE *Tx0Buf, WORD Tx0Count));

BYTE Tx0Byte[1];
BYTE Rx0Last;
_Bool U0SendDelay;
BYTE Task_U0SD;
WORD Tx0Cnt;
WORD Rx0CurPos;
int Task_Rx0;
int Task_Tx0;
int Task_Tx0_WD;
int Task_Rx0_WD;
char* pTx0Buf;
//-----------------------------------------------------------------------//
// Main Initialization Routine //
//-----------------------------------------------------------------------//
int UART0_Init(double Baud, BYTE BitNo, BYTE Parity, BYTE StopNo, int Sub(BYTE RecData, char *RXB, char *TXB, void Tx_Start(BYTE *Tx0Buf, WORD Tx0Count)))
{
if (Baud<11)
{
switch ((int)Baud)
{
case 1: { Baud=300; break; }
case 2: { Baud=600; break; }
case 3: { Baud=1200; break; }
case 4: { Baud=2400; break; }
case 5: { Baud=4800; break; }
case 6: { Baud=9600; break; }
case 7: { Baud=19200; break; }
case 8: { Baud=38400; break; }
case 9: { Baud=57600; break; }
case 10:{ Baud=115200;break; }
}
}
#ifndef _U0-NORTS_
CLR_RTS0;
#endif
UCB0.BaudRate=Baud;
UCB0.BitNo=BitNo;
UCB0.Parity=Parity;
UCB0.StopNo=StopNo;
#ifdef Mega8
UCSR0C=(Parity<<4) | (((StopNo>>1)&0x01)<<3) | (((BitNo-5)&0x03)<<1)|(1<<7);
UBRRL=(OSC/(Baud*16))-1;
UBRRH=(WORD)((OSC/(Baud*16))-1)>>8;
#else
UCSR0C=(Parity<<4) | (((StopNo>>1)&0x01)<<3) | (((BitNo-5)&0x03)<<1);
UBRR0L=(WORD)(OSC/(Baud*16))-1;
UBRR0H=(WORD)((OSC/(Baud*16))-1)>>8;
#endif
#ifndef _HART_
UART0_TX_EN;
#endif
UART0_RX_EN;
UART0_TXINT_EN;
UART0_RXINT_EN;
if (!Task_Rx0) Task_Rx0=Task_Add(0, 1, 0, 1, 50, *Rx0_LedOff);
if (!Task_Tx0) Task_Tx0=Task_Add(0, 1, 0, 1, 50, *Tx0_LedOff);
if (!Task_Tx0_WD) Task_Tx0_WD=Task_Add(0, 1, 0, 1, 50, *Tx0_RTSOFF);
if (!Task_Rx0_WD) Task_Rx0_WD=Task_Add(0, 1, 0, 0, 10000, *Rx0_WD);
RecHandler0=*Sub;
if (!Task_U0SD) Task_U0SD=Task_Add(0, 0, 0, 0, 20, *Tx0_DelStart);
if (RecHandler0!=0) return((*RecHandler0)(0, UCB0.RxBuf, UCB0.TxBuf, *Tx0_Start));
else return(255);
}
//-----------------------------------------------------------------------//
// Rx0 complete interrupt:
// get UART byte & store in circle buffer
//-----------------------------------------------------------------------//
SIGNAL(SIG_UART0_RECV)
{
BYTE RecData;
BYTE RecRet;
UCB0.Status = RX_BUSY;
Task_ReSet(Task_Rx0_WD);
RecData=UDR0;
if (RecHandler0!=0) RecRet=(*RecHandler0)(RecData, UCB0.RxBuf, UCB0.TxBuf, *Tx0_Start);
switch (RecRet)
{
case 0:
{
Rx0CurPos=0;
break;
}
case 1:
{
UCB0.RxBuf[Rx0CurPos]=RecData;
Rx0CurPos++;
if (Rx0CurPos>Rx0Size) Rx0CurPos=0;
break;
}
case 2:
{
#ifdef _LEDS_
Rx0_LedOn();
#endif
UCB0.RxBuf[Rx0CurPos]=RecData;
Rx0CurPos=0;
break;
}
}
Rx0Last = RecData;
}
//-----------------------------------------------------------------------//
// Tx0 complete interrupt:
// transmit next byte up to Tx0Cnt
//-----------------------------------------------------------------------//
SIGNAL(SIG_UART0_TRANS)
{
UCB0.Status = TX_BUSY;
Task_ReSet(Task_Tx0_WD);
if(Tx0Cnt)
{
UDR0 = *pTx0Buf;
pTx0Buf++;
Tx0Cnt--;
}
else
{
#ifndef _U0-NORTS_
CLR_RTS0;
#endif
#ifdef _HART_
U0HART_TX_DIS;
#endif
UCB0.Status = UART_READY;
}
}
//------------------------------------------------------------------------
void Tx0_Byte_Start(BYTE TxByte)
{
while (UCB0.Status);
Tx0Byte[0]=TxByte;
Tx0_Start(&Tx0Byte[0], 1);
}
//------------------------------------------------------------------------
void Tx0_Start(BYTE *Tx0Buf, WORD Tx0Count)
{
#ifdef _LEDS_
Tx0_LedOn();
#endif
if (Tx0Count>32768)
{
U0SendDelay=1;
Tx0Count=Tx0Count-32768;
}
pTx0Buf = Tx0Buf;
Tx0Cnt=Tx0Count;
#ifndef _U0-NORTS_
SET_RTS0;
#endif
if (U0SendDelay)
{
#ifdef _HART_
U0HART_TX_EN;
#endif
U0SendDelay=0;
Task_Set(Task_U0SD, 0, 1, 0, 1, 20, *Tx0_DelStart);
return;
}
SIG_UART0_TRANS();
}
//------------------------------------------------------------------------
void Rx0_LedOn()
{
#ifdef _LEDS_
Task_ReSet(Task_Rx0);
SET_RX0_LED;
#endif
}
//------------------------------------------------------------------------
void Tx0_LedOn()
{
#ifdef _LEDS_
Task_ReSet(Task_Tx0);
SET_TX0_LED;
#endif
}
//------------------------------------------------------------------------
void Rx0_LedOff()
{
#ifdef _LEDS_
CLR_RX0_LED;
#endif
}
//------------------------------------------------------------------------
void Tx0_LedOff()
{
#ifdef _LEDS_
CLR_TX0_LED;
#endif
}
//------------------------------------------------------------------------
void Tx0_DelStart(void)
{
SIG_UART0_TRANS();
}
//------------------------------------------------------------------------
void Tx0_RTSOFF(void)
{
#ifndef _U0-NORTS_
CLR_RTS0;
#endif
}
//------------------------------------------------------------------------
void Rx0_WD(void)
{
Task_ReSet(Task_Rx0_WD);
#ifndef _U0-NORTS_
SET_RTS0;
CLR_RTS0;
SET_RTS0;
CLR_RTS0;
SET_RTS0;
CLR_RTS0;
#endif
}
//------------------------------------------------------------------------

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

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


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

E-mail: info@telesys.ru