Модераторы: PILOT, ManiaK, Mazzi
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Software UART, Как рассчитать Delay? 
:(
    Опции темы
snakuzzz
Дата 2.3.2005, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 11.2.2005

Репутация: нет
Всего: нет



Привет!

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

спасибо.
PM MAIL   Вверх
bzx
Дата 5.3.2005, 17:46 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Забудьте про программные задержки, выбросьте их из своего стиля. Всё делается на таймере. Если Ваше устройство всегда в роли слэйв и Вы априорно знаете скорость по умолчанию, то это проще в реализации. Первое – выделяете старт бит: либо сигнал Rx заводите на внешнее прерывание и отлавливаете состояние 0 в обработчике прерывания, либо делаете удвоенную частоту (в 2 или более раз больше скорости передачи) и в обработчике прерывания таймера ловите Rx=0. Остальное дело техники и вкуса программирования.
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.0445 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.