Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Софтуерен UART
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=4878
Страница 1 от 1

Автор:  dan [ Пет Сеп 28, 2007 11:57 am ]
Заглавие:  Софтуерен UART

Здравейте!
Търсих из форума и из нета информация за софтуерна емулация на УАРТ,попрочетох и седнах да пиша код. Понеже не съм много сигурен дали съм пресметал времената правилно, реших да напиша програмата така, че самостоятелно да си сменя настройките, определящи времето м/у импулсите. Идеята ми беше да включа контролера към компютъра, да дам едни настройки на терминала и той да чака данните, който съобщават брой на циклите на таймер0.
Да, ама не стана.
Някой може ли да даде акъл по въпроса?
Код:
   PROCESSOR   12F629
   LIST      p=12F629
   #include   <p12f629.inc>
   __CONFIG   _CP_OFF & _WDT_OFF & _MCLRE_ON & _HS_OSC
   #define      B0   bcf STATUS,RP0;izbor na banka 0
   #define      B1   bsf STATUS,RP0;izbor na banka 1
   
W      EQU   0
F      EQU   1
SPEED   EQU   25H
TSPEED   EQU   26H      ;KOPIE NA SPEED ZA IZPRA6TANE KYM TERMINALA
NoBIT   EQU   27H
COUNTER   EQU   28H

   ORG      H'00'
   GOTO   START
;======================================================================   
START   B1
      MOVLW   B'10001000'   ;PULL-UPS ENABLED,PRESCALER ASSIGNED TO WDT
      MOVWF   OPTION_REG
      BCF      TRISIO,1   ;GP1 IZHOD
      B0
      GOTO   MAIN   
;=======================================================================   
SEND
   MOVLW   D'1'
   MOVWF   SPEED
   MOVWF   TSPEED
   MOVWF   COUNTER
S1   CALL   TRANSFER
   INCFSZ   SPEED
   MOVFW   SPEED
   MOVWF   TSPEED
   MOVWF   COUNTER
   GOTO   S1
;========================================================================   
TRANSFER
   MOVLW   D'8'
   MOVWF   NoBIT
   BSF      GPIO,1   ;GENERIRANE NA START BIT I VISOKO NIVO PREDI NEGO
   CALL   TIME
   BCF      GPIO,1

TRAN
   CALL   TIME            
   RLF      TSPEED
   BTFSC   STATUS,C
   BSF      GPIO,1
   BTFSS   STATUS,C
   BCF      GPIO,1
   DECFSZ   NoBIT
   GOTO   TRAN
         ;IZPRA6TANE NA 1 STOP BIT
   CALL   TIME
   BCF      GPIO,1
   CALL TIME
   BSF      GPIO,1
   RETURN
;========================================================================   
TIME
      CLRF   TMR0
AGAIN   BCF   INTCON,T0IF
LOOP   BTFSS   INTCON,T0IF
      GOTO   LOOP
      DECFSZ   COUNTER,F
      GOTO   AGAIN
   RETURN
;========================================================================   
MAIN
   CALL   SEND
      
   END

Автор:  sthx [ Пет Сеп 28, 2007 12:56 pm ]
Заглавие:  Re: Софтуерен UART

Не можеш да очакваш всичко да става от първия път.
Необходим ти е цифров или аналогов запомнящ осцилоскоп и проблемчето ще го регистрираш лесно. Може и с обикновен осцилоскоп да пробваш, като софтуерно пуснеш непрекъснат поток от данни по интерфейса.

Автор:  Ки4о [ Пет Сеп 28, 2007 2:17 pm ]
Заглавие: 

Пусни си една симулация и ще видиш че въпросния ПИН 1 изобщо не реагира - стои си в 0.
Пробвай това :

START B1
bcf STATUS,RP0 ;Bank 0
clrf GPIO ;Init GPIO
movlw 07h ;Set GP<2:0> to
movwf CMCON ;digital IO
bsf STATUS,RP0 ;Bank 1


MOVLW B'10001000' ;PULL-UPS ENABLED,PRESCALER ASSIGNED TO WDT
MOVWF OPTION_REG
movlw 0x2D ;0B00111101
banksel TRISIO
andwf TRISIO,1

B0
GOTO MAIN

Автор:  dan [ Пет Окт 05, 2007 10:08 am ]
Заглавие: 

Цитат:
сни си една симулация и ще видиш че въпросния ПИН 1 изобщо не реагира - стои си в 0.

това е от версията на симулатора(преполагам използваш mplab7.6?). реагира си пинчето.
Реших да пусна просто един диод да мига и забелязах нещо много странно:
каквато и стойност да запиша в OPTION_REG за делителя, диода не променя честотата си на мигане. На какво може да се дължи това? Изтествах с крайни стойности:
Код:
      MOVLW   B'10001000'   
      MOVWF   OPTION_REG
и после с
Код:
      MOVLW   B'10001111'   
      MOVWF   OPTION_REG

Автор:  plameniv [ Пет Окт 05, 2007 10:55 am ]
Заглавие:  Мда

dan написа:
Цитат:
сни си една симулация и ще видиш че въпросния ПИН 1 изобщо не реагира - стои си в 0.

това е от версията на симулатора(преполагам използваш mplab7.6?). реагира си пинчето.
Реших да пусна просто един диод да мига и забелязах нещо много странно:
каквато и стойност да запиша в OPTION_REG за делителя, диода не променя честотата си на мигане. На какво може да се дължи това? Изтествах с крайни стойности:
Код:
      MOVLW   B'10001000'   
      MOVWF   OPTION_REG
и после с
Код:
      MOVLW   B'10001111'   
      MOVWF   OPTION_REG

А прочете ли в документацията за какво се ползва бит 3 в option_reg ?
PSA: Prescaler Assignment bit
1 = Prescaler assigned to the WDT
0 = Prescaler assigned to Timer0
Ползваш ли WDT, гледам че си го изключил , ами превключи ли делителя към TMR0 :idea: :!:

MOVLW B'10000111'
MOVWF OPTION_REG

Автор:  dan [ Пет Окт 05, 2007 2:39 pm ]
Заглавие: 

мерси за корекцията. Оправих го, обаче сега без делител мига по-бавно, отколкото с делител?!?!?!
Код:
      MOVLW   B'10000000'   ;тук мига бързо
      MOVWF   OPTION_REG
Код:
      MOVLW   B'10001000';тук мига бавно   
      MOVWF   OPTION_REG

въобще не знам дали мисля правилно:
честота на кварца-4MHz => входна честота на "таймер-блока"-1MHz => при PS2-PS0=000 (делител на 2), честотата на входа на брояча трябва да е 0.5MHz(период 2us)=> времето за препълване от 00 през FF до 00 трябва да е 257цикъла х 2us = 564us .т.е. би трябвало диода да мига с честота около 1kHz,а в момента е някъде около 4-5Hz. Верни ли са ми сметките по-горе?

Автор:  dan [ Пет Окт 05, 2007 3:17 pm ]
Заглавие: 

не знам какво направих, но то тръгна :)(мигалката де :)) мерси за помощта!

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/