Цитата(Kolia @ Sep 15 2009, 12:53)

Дайте плиз пример программы PIC18F2520 для асинхронного режима EUSART, через прерывания желательно.
Пример на приём, по опыту передачу через прерывания делать накладно - сказывается особенность работы EUSART. Если будут вопросы - поясню.
//инициализируем порт C
PORTC = 0b01000100;
LATC = 0b01000100;
TRISC = 0b11010000; //0-output, 1-input
...
//Настраиваем USART
SPBRGH = 0;
SPBRG = 9;
BRG16 = 0;
BRGH = 1;
SYNC = 0;
SPEN = 1;
TX9 = 1;
TX9D = 1;
TXEN = 0;
RX9 = 1;
CREN = 0;
NOP();
CREN = 1;
RCIP = 1; //Hi priority
RCIF = 0;
RCIE = 0; //1
TXIP = 0; //Low priority
TXIE = 0;
TXIF = 0;
...
GIEL = 0; //di()
GIEH = 0;
RCIE = 0;
TXIE = 0;
TXEN = 0; //запрещаем передачу сигнала DMX512
CREN = 0; //останавливаем приём сигнала...
DMX_DIR = _dmxIn;
CREN = 1; //разрешили приём сигнала DMX512
RCIE = 1;
TXIF = 0;
RCIF = 0;
GIEL = 1; //ei()
GIEH = 1;
...
void interrupt HI_ISR(void){
static near unsigned long _nowDMXTime; //время последнего сигнала BREAK (начало получаемого пакета)
static near unsigned char tempISRhi;
static near unsigned char intDMXArray[maxChNum];
static near bit __newDataInActualBuffer; //=true, если в буфере actualBuffer содержится новый пакет
if(RCIF){
if(!OERR){
if(RX9D&&(!FERR)){//принят байт без ошибок
tempISRhi = RCREG;
if(dmx__wasBREAK!=false){
if(dmx__wasSCode!=false){
intDMXArray[dmx__chNum] = tempISRhi;
dmx__chNum++;
if(dmx__chNum>=maxChNum){
__hi_int_was_short_pack:
dmx__wasBREAK=false;
__newDataInActualBuffer = false;
if(!__actualBufferBusy){
do{
dmx__chNum--;
tempISRhi = intDMXArray[dmx__chNum];
if(tempISRhi!=actualBuffer[dmx__chNum]){
actualBuffer[dmx__chNum]=tempISRhi;
__newDataInActualBuffer=true; //указали, что данные в буфере изменились и необходимо их записать!
}
}while(dmx__chNum!=0);
if(__newDataInActualBuffer){
actualBufferTime._long = _nowDMXTime; //сохраняем время начала пакета (начальная синхронизация)
__actualBufferBusy = true; //указываем основной программе что новые данные готовы
}
};
};
}
else{//проверяем на стартовый код... основной (0x00)
if(tempISRhi==0x00){
dmx__wasSCode = true;
dmx_error = false;
dmx_tmrDMX = 0;
}
else dmx__wasBREAK=false;
};
};
}
else{//детектирование сигнана BREAK (ошибка кадра или отсутствие стопового бита)
dmx__chNum = 0;
//проверяем на возможный _короткий_ пакет
if(dmx__wasBREAK!=false)goto __hi_int_was_short_pack;
dmx__wasBREAK = true;
dmx__wasSCode = false;
tempISRhi = RCREG;
_nowDMXTime = _DMXTimer;
};
}
else{//ошибка переполнения аппаратного буфера
dmx_error = true;
dmx__wasBREAK = false;
CREN = 0;
CREN = 1;
while(RCIF)tempISRhi = RCREG;
};
};
}
В голове слышался грохот: рушились грандиозные планы...