![]() |
|
Модераторы: PILOT, ManiaK, Mazzi |
![]()
|
|
| snakuzzz |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 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 } спасибо. |
|||
|
||||
| bzx |
|
|||
|
Unregistered |
Забудьте про программные задержки, выбросьте их из своего стиля. Всё делается на таймере. Если Ваше устройство всегда в роли слэйв и Вы априорно знаете скорость по умолчанию, то это проще в реализации. Первое – выделяете старт бит: либо сигнал Rx заводите на внешнее прерывание и отлавливаете состояние 0 в обработчике прерывания, либо делаете удвоенную частоту (в 2 или более раз больше скорости передачи) и в обработчике прерывания таймера ловите Rx=0. Остальное дело техники и вкуса программирования.
|
|||
|
||||
![]()
|
| Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)" | |
|
|
На данный раздел помимо Правил форума распространяются текже следующие правила:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |