Tarbal 4 4 октября, 2013 Опубликовано 4 октября, 2013 · Жалоба Не очень. Зачем программному нужен кварц? Не вижу никакой причины. Повторю. Мне не трудно: " Когда я писал в 1995 софтверный UART на 16С71, там за 104 микросекунды (длина бита для 9600) надо было делать обработку бита и возможно принимать решения. Самплировать 16 раз за бит как это делается в хардверных UARTах возможности не было. Кажадая инструкция 1 микросекунду занимает." Мне, например, так не кажется. Абсолютно всё подразумевает наличие временных рамок. Кроме вечности. Асинхронный - значит не нуждающийся в синхронизации. Теоретически, мог бы вообще с произвольной скоростью работать. "А может вы, батюшка, партийный?" © Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slavka012 0 4 октября, 2013 Опубликовано 4 октября, 2013 · Жалоба Ксати если делать софтверный UART , то я прав насчет кварца :) Ничего подобного. Во первых софт работает в тех же временных ограничениях. Во-вторых, софт может померять длину бита у приходящих данных, и таким образом подстроить свою скорость передачи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tarbal 4 4 октября, 2013 Опубликовано 4 октября, 2013 (изменено) · Жалоба Ничего подобного. Во первых софт работает в тех же временных ограничениях. Во-вторых, софт может померять длину бита у приходящих данных, и таким образом подстроить свою скорость передачи. Век живи век учись. Расскажите мне а по какому признаку софт узнает, что надо подстроить частоту? Вы имеете ввиду технику, используемую в умершем автомотив протоколе LIN? Да будет работать, но сколько ненужных задач надо решать? А вот если поставить кварц, то у начинающего программиста, которому простой UART непросто сделать не возникнет необходимости дополнять разработку никому не нужным, более сложным и усложняющим протокол добавлением детектора и подстройщика частоты. Кстати это не всегда легко сделать. Помню в конце 90х делали SIM card reader на 68НС16. Он так устроен, что системную частоту сильно делят (на 32 кажется) прежде чем она попадет на программируемый делитель для задания скорости UARTа и разрешение установки скорости UART было низким. Так чтобы попасть точно на нужный бодрейт, мне пришлось подстраивать системную частоту при помощи ФАПЧ. Но пока я до этого дошел, позеленел. Изменено 4 октября, 2013 пользователем Tarbal Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vovken1997 0 4 октября, 2013 Опубликовано 4 октября, 2013 · Жалоба Блин, опять 10 постов и по поводу кварца и режима работы. Есть ли у кого этот конвертер для Altium Designer??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tarbal 4 4 октября, 2013 Опубликовано 4 октября, 2013 (изменено) · Жалоба Блин, опять 10 постов и по поводу кварца и режима работы. Есть ли у кого этот конвертер для Altium Designer??? А как же иначе. Я спрашивал у вас в постинге 26 вопросы по существу вашей проблемы. Могу дать код устройства на 16С71, который по программному UART на 38400 передает намерянное АЦП в PC. Вы ведете себя индеферентно, никак не реагируете. Мало того, могу рассказать как писать UART на PICе и на какие грабли можно наступить. Кстати ставить кварц или воспользоваться внутренним генератором это тоже важный для вас вопрос, только вы этого еще не знаете. Изменено 4 октября, 2013 пользователем Tarbal Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vovken1997 0 4 октября, 2013 Опубликовано 4 октября, 2013 · Жалоба Мало того, могу рассказать как писать UART на PICе и на какие грабли можно наступить. Расскажите. Большая скорость мне не нужна. Не куда гнаться. Да и данных не очень много будет. Главное чтоб передовалось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Herz 4 4 октября, 2013 Опубликовано 4 октября, 2013 · Жалоба Повторю. Мне не трудно: " Когда я писал в 1995 софтверный UART на 16С71, там за 104 микросекунды (длина бита для 9600) надо было делать обработку бита и возможно принимать решения. Самплировать 16 раз за бит как это делается в хардверных UARTах возможности не было. Кажадая инструкция 1 микросекунду занимает." Всё равно не понимаю, как Вам тут кварц помогает. Хотите сказать, просто поднять тактовую требовалось? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZASADA 0 4 октября, 2013 Опубликовано 4 октября, 2013 · Жалоба 1% точности позволяет на 100 битной последовательности сделать ошибку в 1 бит. Если считать стартовый и стоповый биты, то это случится через 10 байт переданных подряд. На 100 байтах это будет ошибка в 10 бит. Синхронизация вначале байта осуществляется если есть пауза между байтами. В моих устройствах это не было позволено почти никогда. Представьте, что передатчик работает на 1% быстрее приемника. сегодня специально перечитал работу UART на атмегах. Пересинхронизация идет по каждому стартбиту, не зависит от числа стопбитов и от паузы между байтами. Как только отлавливается середина первого стопбита сразу начинается поиск старта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tarbal 4 4 октября, 2013 Опубликовано 4 октября, 2013 · Жалоба сегодня специально перечитал работу UART на атмегах. Пересинхронизация идет по каждому стартбиту, не зависит от числа стопбитов и от паузы между байтами. Как только отлавливается середина первого стопбита сразу начинается поиск старта. Да понял я уже и покаялся. Всё равно не понимаю, как Вам тут кварц помогает. Хотите сказать, просто поднять тактовую требовалось? Давайте я расскажу как делать программный UART, а потом предметно обсудим этот вопрос? Вот работаюший код апликации, которая делает следующее: Измеряет при помощи АЦП один байт и передает его на скорости 38400. Приемника нет, но только в этой аппликации. Давайте поймем как она работает и перейдем к приемнику. ;TITLE "Serial I/O + A/D " ;/* ;************************************************************************* ; A/D - Scope program ;************************************************************************* LIST P=16C71, F=INHX8M, w=1 LIST R=DEC ; ; PIC16C71 definitions #include "regs71.def" ; This including program constants definitions, hardware ; configuration and memory allocation #include "scope.inc" ; This program macro. #include "ser_mac.inc" ; CONFIGURATION FUSES must be programmed as follows: ; - XT (!!!) oscillator ; - WDT enabled ; - Power-up timer enabled ; - Code protection on ;------------------------------------------------------------------------ ; DEFINITIONS BLOCK TO CONTROL THE PROGRAM ;cSTOP_BITS equ 1 ;if 1 stop bit cSTOP_BITS equ 2 ;if 2 stop bits cBODE_RATE equ 9600*4 ;cBODE_RATE equ 9600 ;cBODE_RATE equ 4800 ;cBODE_RATE equ 2400 ;cBODE_RATE equ 1200 ;cBODE_RATE equ 600 ;cBODE_RATE equ 300 ; if cBODE_RATE > 9600 ; error" Bode rate is to be <= 9600" endif cSUB_RATE equ cBODE_RATE/100 ;------------------------------------------------------------------------ org 0x00 goto Start ;reset vector ; org 0x04 ; goto Service_int ;interrupt vector ; ; ; org 0x30 ;******************************************************* ;* INTERRUPT SERVICE SUBROUTINE * ;******************************************************* ;Service_int btfss INTCON, T0IF goto Int_exit_c ;---------------------------------------------------- Int_tim_Tr ; Timer 0 interrupt service for transmittion mode only bcf INTCON,T0IF ;Clear Timer call flag movlw cTIM_VAL ;+3 ;Reload timer by value movwf RTCC ; CNT_DCR TIMOUT, T_OUT_PROC SWITCH tstage, 00001111b ;---------------------------------------------------------------- goto T_STAGE1 ;stage 0 - Leave the interrupt goto T_STAGE1 ;Start bit - 0 in transmitting sequence goto T_STAGE2 ;bit - 0 in transmitting sequence goto T_STAGE3 ;bit - 1 in transmitting sequence goto T_STAGE4 ;bit - 2 in transmitting sequence goto T_STAGE5 ;bit - 3 in transmitting sequence goto T_STAGE6 ;bit - 4 in transmitting sequence goto T_STAGE7 ;bit - 5 in transmitting sequence goto T_STAGE8 ;bit - 6 in transmitting sequence goto T_STAGE9 ;bit - 7 in transmitting sequence goto T_STAGE10 ;First stop bit - '1' goto T_STAGE11 ;Second stop bit - '1' goto T_STAGE12 ;Same point as T_STAGE1 goto Int_exit_c ;Phase error in bit reception goto Int_exit_c ;Phase error in bit reception goto Int_exit_c ;Phase error in bit reception goto Int_exit_c ;Phase error in bit reception ;-------------------------- end SWITCH -------------------------- ;**************************************************************** ;----------------- Transmitter AUTOMAT NOTES ---------------------- ;----------------- Transmitter AUTOMAT ----------------------------- T_STAGE1 ;Start bit - 0 in transmitting sequence T_STAGE12 ;This make the automat as cyclic - first and last stages ;are the same bcf pTXD movlw 1 ;Prepare to the next stage movwf tstage ;Next stage AD_GO bsf pSTROB ; goto Int_exit ;Finish the stage 1,12 ;------------------------------------------------------------ T_STAGE2 ;bit - 0 in transmitting sequence T_STAGE3 ;bit - 1 in transmitting sequence T_STAGE4 ;bit - 2 in transmitting sequence T_STAGE5 ;bit - 3 in transmitting sequence T_STAGE6 ;bit - 4 in transmitting sequence T_STAGE7 ;bit - 5 in transmitting sequence T_STAGE8 ;bit - 6 in transmitting sequence T_STAGE9 ;bit - 7 in transmitting sequence rrf BUF ;move buffer's LSB to CY SC ;If CY - scip goto Trans_0 ;Goto to transmit '0' bsf pTXD ;Transmit '1' goto Int_exit ;Finish the stage 1-8 Trans_0 bcf pTXD ;Transmit '0' goto Int_exit ;Finish the stage 2-9 ;------------------------------------------------------------ T_STAGE10 ;First stop bit - '1' bsf pTXD ;First stop bit == 1 if cSTOP_BITS == 2 ;First stop bit - '1' goto Int_exit ;Finish the stage 10 else if cSTOP_BITS == 1 ;Only 1 stop bit. goto T_STAGE11 ;Stop bit - '1' else error "ERROR STOP_BITS definition!!! STOP_BITS is to be 1 or 2 only" endif endif ;------------------------------------------------------------ T_STAGE11 ;Second stop bit - '1' as is presented already on pTXD bsf pTXD ;Second stop bit == 1 movfw ADRES movwf BUF bcf pSTROB ; goto Int_exit ;Finish the stage 11 ;------------------------------------------------------------------- ;----------------- Transmitter AUTOMAT END ------------------------- ;************************************************************** ;------------------------------------------------------------------- ;----------------------- SPECIAL CASES ----------------------------- ;--------------------- SPECIAL CASES END --------------------------- Int_exit ;Only here leave the interrupts handler incf tstage retfie Int_exit_c ; clrf INTCON ;Disable all interrupts bsf INTCON,GIE ;enable interrupts bsf INTCON,T0IE ;enable T0 interrupt goto Int_exit ; ; ;Initializes and sets up the T0 hardware. ; InitializeT0 bsf STATUS,5 ;select pg1 movlw B'01001111' ;Timer 0 configuration and movwf OPT_REG ;Prescaler configuration bcf STATUS,5 ;select pg0 movlw cTIM_VAL ;Load timer by value movwf RTCC return ;A/D initialisation InitializeAD movlw B'01001001' ;fosc/8, AIN1, ;A/D is operating movwf ADCON0 bsf STATUS,5 ;select pg1 movlw B'00000010' ;Inputs A0..A1 are disabled as digital ;inputs movwf ADCON1 bcf STATUS,5 ;select pg0 return ;-------------------------------------------- Start bcf INTCON,GIE ;disable interrupts btfsc INTCON,GIE ; goto $-2 ; call InitializeT0 call InitializeAD bsf STATUS,5 ;select pg1 movlw PORTB_OUT ;Data BUS to writeto RAM movwf TRISB ;Set TRISB movlw B'00000010' ;Only PA1 config as input movwf TRISA ;Set TRISA bcf STATUS,5 ;select pg0 bsf pLED ;OFF LED clrf INTCON ;Disable all interrupts bsf INTCON,GIE ;enable interrupts bsf INTCON,T0IE ;enable T0 interrupt bcf INTCON,INTE ;disable INT interrupt clrf GLOB_STAGE ;Start from 0 stage HEADLOOP ; movf RT_CNT ; SNZ ; goto HEADLOOP ; Short loop ;---------------------------------------------------- clrwdt ; decf RT_CNT goto HEADLOOP ; Main loop ; ;---------------------------------------------------- END Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tarbal 4 5 октября, 2013 Опубликовано 5 октября, 2013 (изменено) · Жалоба Основная работа делается в прерывании. Стейт машина на 11 состояний пробегает по очереди по всем состояниям. Первое состояние соответствует стартовому биту, второе первому биту данных, ... одиннадцатое второму стоп биту. Макрос AD_GO запускает АЦП преобразование. В одиннадцатом значение считывается из АЦП: movfw ADRES movwf BUF Изменено 5 октября, 2013 пользователем Tarbal Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться