Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > Software UART


Автор: snakuzzz 2.3.2005, 16:42
Привет!

Mplab c18. Контроллер pic18f452 . Реализация software UART.

Непойму как рассчитать DelayRXHalfBitUART, DelayTXBitUART ... и т.д. для кварца 5mhz и скорости 2400 baud.

вот нашёл примерчик .... но всё равно непонятно ... плз. нужна помощь

#include <p18cxxx.h>
#include <stdlib.h>
#include <timers.h>
#include <delays.h>
#include <usart.h>
#include <sw_uart.h>

void PutROMStringUART(static const rom char *);
void PutRAMStringUART(const ram char *data);
void str2ram(static char *dest, static char rom *src);

void main (void)
{
char RAMmsg[32];

OpenUART();

while (1)
{
str2ram(RAMmsg,"Hello World! [RAM]");

WriteUART('A');
WriteUART('B');
WriteUART('C');

PutROMStringUART("Hello World! [ROM]");
PutRAMStringUART(RAMmsg);
Delay10KTCYx(200);
}

}

void str2ram(static char *dest, static char rom *src)
{
while ((*dest++ = *src++) != '\0')
;
}

void PutROMStringUART(static const rom char *data)
{
do
{ // Transmit a byte
WriteUART(*data);
} while( *data++ );
}

void PutRAMStringUART(const ram char *data)
{
do
{ // Transmit a byte
WriteUART(*data);
} while( *data++ );
}

void DelayTXBitUART(void) {

// delay for: ((((2*FOSC/(4*baud))+1) / 2) - 12 cycles
// = ((((2*16000000 / (4*4800)) + 1) / 2) - 12
// 821 cycles @16mhz @4800 baud

_asm
movlw 255 // 255 * 3 = 750 cycles
delayloop:
decfsz WREG, 1, 0 // 2 cycles on skip, one otherwise
bra delayloop // 2 cycles
nop // to make the last iteration 3 cycles instead of just 2

movlw 23 // 23 * 3 = 69 cycles (750 + 69 = 819 cycles)
delayloop:
decfsz WREG, 1, 0 // 2 cycles on skip, one otherwise
bra delayloop // 2 cycles
nop // to make the last iteration 3 cycles instead of just 2

_endasm
}

void DelayRXHalfBitUART(void) {

// delay for: ((((2*FOSC/(8*baud))+1) / 2) - 9 cycles
// = ((((2*16000000 / (8*4800)) + 1) / 2) - 9
// 408 cycles @16mhz @4800 baud

_asm
movlw 136 // 136 * 3 = 408 cycles
delayloop:
decfsz WREG, 1, 0 // 2 cycles on skip, one otherwise
bra delayloop // 2 cycles
nop // to make the last iteration 3 cycles instead of just 2

_endasm
}

void DelayRXBitUART(void) {

// delay for: ((((2*FOSC/(4*baud))+1) / 2) - 14 cycles
// = ((((2*16000000 / (4*4800)) + 1) / 2) - 14
// 819 cycles @16mhz @4800 baud

_asm
movlw 255 // 255 * 3 = 750 cycles
delayloop:
decfsz WREG, 1, 0 // 2 cycles on skip, one otherwise
bra delayloop // 2 cycles
nop // to make the last iteration 3 cycles instead of just 2

movlw 23 // 23 * 3 = 69 cycles (750 + 69 = 819 cycles)
delayloop:
decfsz WREG, 1, 0 // 2 cycles on skip, one otherwise
bra delayloop // 2 cycles
nop // to make the last iteration 3 cycles instead of just 2

_endasm
}

smile на си smile

спасибо.

Автор: bzx 5.3.2005, 17:46
Забудьте про программные задержки, выбросьте их из своего стиля. Всё делается на таймере. Если Ваше устройство всегда в роли слэйв и Вы априорно знаете скорость по умолчанию, то это проще в реализации. Первое – выделяете старт бит: либо сигнал Rx заводите на внешнее прерывание и отлавливаете состояние 0 в обработчике прерывания, либо делаете удвоенную частоту (в 2 или более раз больше скорости передачи) и в обработчике прерывания таймера ловите Rx=0. Остальное дело техники и вкуса программирования.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)