реклама на сайте
подробности

 
 
> PIC18F2520 и EUSART, пример программы
Kolia
сообщение Sep 15 2009, 08:53
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 188
Регистрация: 28-09-06
Из: Minsk
Пользователь №: 20 762



Дайте плиз пример программы PIC18F2520 для асинхронного режима EUSART, через прерывания желательно.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
fantasy
сообщение Sep 15 2009, 10:14
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 69
Регистрация: 17-09-05
Из: Kirov
Пользователь №: 8 659



Цитата(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;
};
};
}


--------------------
В голове слышался грохот: рушились грандиозные планы...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th June 2025 - 12:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01396 секунд с 7
ELECTRONIX ©2004-2016