Перейти к содержанию
    

Передача данных с PIC12F679 в ПК

Не очень. Зачем программному нужен кварц? Не вижу никакой причины.

Повторю. Мне не трудно:

" Когда я писал в 1995 софтверный UART на 16С71, там за 104 микросекунды (длина бита для 9600) надо было делать обработку бита и возможно принимать решения. Самплировать 16 раз за бит как это делается в хардверных UARTах возможности не было. Кажадая инструкция 1 микросекунду занимает."

 

Мне, например, так не кажется. Абсолютно всё подразумевает наличие временных рамок. Кроме вечности.

Асинхронный - значит не нуждающийся в синхронизации. Теоретически, мог бы вообще с произвольной скоростью работать.

"А может вы, батюшка, партийный?" ©

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ксати если делать софтверный UART , то я прав насчет кварца :)

Ничего подобного. Во первых софт работает в тех же временных ограничениях. Во-вторых, софт может померять длину бита у приходящих данных, и таким образом подстроить свою скорость передачи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ничего подобного. Во первых софт работает в тех же временных ограничениях. Во-вторых, софт может померять длину бита у приходящих данных, и таким образом подстроить свою скорость передачи.

 

Век живи век учись.

Расскажите мне а по какому признаку софт узнает, что надо подстроить частоту?

Вы имеете ввиду технику, используемую в умершем автомотив протоколе LIN?

Да будет работать, но сколько ненужных задач надо решать? А вот если поставить кварц, то у начинающего программиста, которому простой UART непросто сделать не возникнет необходимости дополнять разработку никому не нужным, более сложным и усложняющим протокол добавлением детектора и подстройщика частоты. Кстати это не всегда легко сделать. Помню в конце 90х делали SIM card reader на 68НС16. Он так устроен, что системную частоту сильно делят (на 32 кажется) прежде чем она попадет на программируемый делитель для задания скорости UARTа и разрешение установки скорости UART было низким. Так чтобы попасть точно на нужный бодрейт, мне пришлось подстраивать системную частоту при помощи ФАПЧ. Но пока я до этого дошел, позеленел.

Изменено пользователем Tarbal

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Блин, опять 10 постов и по поводу кварца и режима работы.

 

Есть ли у кого этот конвертер для Altium Designer???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Блин, опять 10 постов и по поводу кварца и режима работы.

 

Есть ли у кого этот конвертер для Altium Designer???

 

А как же иначе. Я спрашивал у вас в постинге 26 вопросы по существу вашей проблемы.

Могу дать код устройства на 16С71, который по программному UART на 38400 передает намерянное АЦП в PC. Вы ведете себя индеферентно, никак не реагируете.

Мало того, могу рассказать как писать UART на PICе и на какие грабли можно наступить.

Кстати ставить кварц или воспользоваться внутренним генератором это тоже важный для вас вопрос, только вы этого еще не знаете.

 

Изменено пользователем Tarbal

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мало того, могу рассказать как писать UART на PICе и на какие грабли можно наступить.

Расскажите. Большая скорость мне не нужна. Не куда гнаться. Да и данных не очень много будет. Главное чтоб передовалось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Повторю. Мне не трудно:

" Когда я писал в 1995 софтверный UART на 16С71, там за 104 микросекунды (длина бита для 9600) надо было делать обработку бита и возможно принимать решения. Самплировать 16 раз за бит как это делается в хардверных UARTах возможности не было. Кажадая инструкция 1 микросекунду занимает."

Всё равно не понимаю, как Вам тут кварц помогает. Хотите сказать, просто поднять тактовую требовалось?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1% точности позволяет на 100 битной последовательности сделать ошибку в 1 бит. Если считать стартовый и стоповый биты, то это случится через 10 байт переданных подряд. На 100 байтах это будет ошибка в 10 бит. Синхронизация вначале байта осуществляется если есть пауза между байтами. В моих устройствах это не было позволено почти никогда. Представьте, что передатчик работает на 1% быстрее приемника.

сегодня специально перечитал работу UART на атмегах. Пересинхронизация идет по каждому стартбиту, не зависит от числа стопбитов и от паузы между байтами. Как только отлавливается середина первого стопбита сразу начинается поиск старта.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

сегодня специально перечитал работу 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

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Основная работа делается в прерывании. Стейт машина на 11 состояний пробегает по очереди по всем состояниям. Первое состояние соответствует стартовому биту, второе первому биту данных, ... одиннадцатое второму стоп биту. Макрос AD_GO запускает АЦП преобразование. В одиннадцатом значение считывается из АЦП:

movfw ADRES

movwf BUF

Изменено пользователем Tarbal

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...