Так что не работает? Прием или передача?
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

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

Отправлено Сергей Борщ 02 апреля 2004 г. 17:02
В ответ на: Кто реализовывал программно приемо-передатчики IRDA, поделитесь опытом, интересует именно преобразование байта в импульсы (+) отправлено Dmitry A S 02 апреля 2004 г. 12:10

Я делал на 430, только не как в этой аппноте, а как программный UART.
При передаче режим set on capture, clear on CCR0, соттветственно в CCR1 грузил время начала импульса, в CCR0 - конец. Обновлял в прерывании по CCR0.
И при приеме считывал не в середине бита, а после capture по стартовому настраивал compare на время одного бита и смотрел, установился ли за это время флаг в регистре P1IFG, т.е. был бит ("0") или нет.
вот примерный исходник:
[pre]
#define _IrRx (1<<1)
#define _IrTx (1<<6)
#define IrDARxModule TACCTL0_
#define IrDATxModule TACCTL1_
#define IrDAPort P1IN_

IrDABitTime ds 2
IrDABuffer ds 1

#define IrDAPointer R4
#define IrBitLen (TCLK*3/115200/16)

RSEG CODE

IrDAStartTx
mov #TxStepTable,R4
mov.b #0xFF,&IrDABuffer ;xBOF
mov #_CCIFG|_CCIE,&CCTL0 ;pend interrupt
ret
TxStart
push &TAR
add &IrDABitTime,0(SP)
mov 0(SP),&CCR0
add #-IrBitLen,0(SP) ;time til start of pulse
pop &IrDATxModule+CCR ;time till end of pulse
mov #CCPWMSetReset,&IrDATxModule+CCTL ;generate start
mov #_CCIE,&CCTL0 ;compare mode, int at the end of bit
reti
TxBit
rra.b &IrDABuffer ; LSB is shifted to carry
jc TxHigh ; Jump if bit = 1
TxLow
bis #CCPWMSetReset,&IrDATxModule+CCTL ;Tx Space
jmp ReloadTxCCP
TxHigh ; TXpin remains low
bic #CCPWMSetReset,&IrDATxModule+CCTL ; Tx Mark
ReloadTxCCP
add &IrDABitTime,&IrDATxModule+CCR ; Bitime till next bit
reti
TxDone
bic #CCPWMSetReset,&IrDATxModule+CCTL ; Tx Mark (stop bit)
add &IrDABitTime,&IrDATxModule+CCR ; Bitime till next bit
mov #TxStepTable,R4
call #IrDATx ; check next byte
reti

IrDAStartRx
clr &IrDATxModule+CCTL ; Stop transmitting
push SR
RXDone
mov #RxStepTable,R4
bis.b #_IrRx,&P1SEL ; enable CAP logic
mov #CapPositive|CCIAIn|_CAP|_CCIE,&IrDARxModule+CCTL ; from end of start bit
reti
RXStart
bic #_CAP,&IrDARxModule+CCTL ; Switch to Compare mode
bic.b #_IrRx,&P1SEL ; enable IFG logic
bic.b #_IrRx,&P1IFG ; reset int flag
reti

RXBit
bit.b #_IrRx,&P1IFG ; Get bit waiting in receive latch
rrc.b &IrDABuffer ; Store received bit
bic.b #_IrRx,&P1IFG ; reset int flag
reti
RXLastBit
bit.b #_IrRx,&P1IFG ; Get bit waiting in receive latch
rrc.b &IrDABuffer ; Store received bit
xor.b #0xFF,&IrDABuffer
mov #RxStepTable,R4
bis.b #_IrRx,&P1SEL ; enable CAP logic
mov #CapPositive|CCIAIn|_CAP|_CCIE,&IrDARxModule+CCTL ; from end of start bit

call #IrDARx
reti

RxInterrupt ;TACCR0 interrupt vector
add &IrDABitTime,&IrDARxModule+CCR ; Bitime till next bit
mov @IrDAPointer+,PC ; Branch To Routine
RxStepTable
dw RXStart
dw RXBit ; Bit 7
dw RXBit ; Bit 6
dw RXBit ; Bit 5
dw RXBit ; Bit 4
dw RXBit ; Bit 3
dw RXBit ; Bit 2
dw RXBit ; Bit 1
dw RXLastBit ; Bit 0

TxStepTable
dw TxStart ; TX Start Bit
dw TxBit ; TX First Data Bit
dw TxBit ; first bit falling, prepare to tx bit2
dw TxBit ;3
dw TxBit ;4
dw TxBit ;5
dw TxBit ;6
dw TxBit ;7
dw TxBit ;8
TX_End dw TxDone ; TX Stop Bit= Mark, TX Complete, check for next byte

[/pre]

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

Ответы



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

E-mail: info@telesys.ru