TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: gera en 04 de Agosto de 2008, 12:49:26
-
Hola amigos!!!
Les cuento q tengo q hacer un programa en ensamblador para recibir un byte por rs232. Estoy trabajando con un pic16f84a. El problema es q no se cuantos bps son 9600 baudios (creo q coinciden, pero no estoy seguro).
Esto es para calcular el tiempo entre bit y bit para leerlos.
Tengo este codigo q consegui por ahi... a mi parecer es el mas claro.
INCLUDE "P16F84A.Inc"
;*******DEFINICION DE REGISTROS**********************************
CBLOCK .12
REG1, REG2, REG3, RECEP, NBITS
ENDC
RX equ 0h ;PATILLA QUE RECIBE LOS DATOS
;*******DEFINICION DE DATOS**************************************
VALOR1 EQU .7 ;para controlar numero de ciclos del retardo bymedio
VALOR2 EQU .1 ;1246 CICLOS DE RETARDO
VALOR3 EQU .56
VALOR4 EQU .5 ;para controlar numero de ciclos del retardo by
VALOR5 EQU .1 ;830 CICLOS DE RETARDO
VALOR6 EQU .52
;*******PROGRAMA*************************************************
ORG 00
goto INICIO
org 05
INICIO
bsf STATUS,RP0 ;PASA AL BANCO 1
movlw b'00000001'
movwf TRISA
clrf TRISB
bcf STATUS,RP0 ;PASA AL BANCO 0
clrf PORTA
clrf PORTB
movlw b'00000101' ;Carga un dato por defecto en el puerto B
movwf PORTB
RECIBIR
nop
btfsc PORTA,RX ;linea de recepcion esta en bajo?
goto RECIBIR ;ciclo hasta recibir bit de comienzo
call BYMEDIO ;llama rutina de bymedio
movlw 8 ;carga contador con el numero de bits
movwf NBITS
clrf RECEP
RNEXT
bcf STATUS,C ;limpia carry
rrf RECEP,1
btfsc PORTA,RX ;pregunta por el estado de la linea
bsf RECEP,7 ;si rx esta en alto pone el bit 7 de RECEP
call BY
decfsz NBITS
goto RNEXT
movf RECEP,w ;pasa el dato del registro RECEP al PORTB
movwf PORTB
goto RECIBIR
BYMEDIO
movlw VALOR1 ;retardo de bit y medio
movwf REG1
TRES
movlw VALOR2
movwf REG2
DOS
movlw VALOR3
movwf REG3
UNO
decfsz REG3
goto UNO
decfsz REG2
goto DOS
decfsz REG1
goto TRES
retlw 0
BY
movlw VALOR4 ;retardo de bit
movwf REG1
TRES2
movlw VALOR5
movwf REG2
DOS2
movlw VALOR6
movwf REG3
UNO2
decfsz REG3
goto UNO2
decfsz REG2
goto DOS2
decfsz REG1
goto TRES2
retlw 0
end
Saludos y muchas gracias de antemano!
-
9600 baudios = 9600 bits por segundo, para saber el tiempo que dura bit solamente calcula la inversa de 9600.
Saludos
-
Hola Gera, tendras que dividir 1 segundo por los BIT por segundo, es decir 1/9600, que te da un tiempo de cada BIT de 104 uS
Tendras que calcular bien el tiempo que tardas en la rutina, para compenzar en la demora...
Y ademas, en el arranque, tendras que temporizar medio BIT, para luego, ir leyendo practicamente en las mitades de cada bit, donde tienes el valor bien estable
Por ejemplo, para 1200 BPS, la demora es de 833 uS. (microsegundos)
Un abrazo
Norberto
-
Genial!!! mil gracias amigos! ahora mismo me pongo a probar a ver si funciona ;)
-
Gera, en esta misma seccion http://www.todopic.com.ar/foros/index.php?topic=5968.0 (http://www.todopic.com.ar/foros/index.php?topic=5968.0)
podes descargar un programita muy util para realizar demoras....
Lo ideal seria que trabajes en 20 mhz.. asi podes minimizar errores, o comprobarlo con el simulador del MPLAB :mrgreen:
Norberto
-
Hola, lo que te comento Norberto es la tecnica mas eficiente, tambien podrias programar un timer para que se dispare a ese tiempo ( 9600 ) y hacer justo la lectura la mitad del bit. La idea seria asi una vez que detectas el bit de Start, primero disparas el timer a la mitad de 9600 que seria algo asi como 52 us, eso es para entrar justo en la mitad del bit, una vez que ocurre ese evento programar el timer para que te interrumpa en 104 us y asi te sincronizas en la mitad de cada bit.
Saludos !
-
Gracias a todos por sus consejos! Les cuento q ya tengo todo funcionando. El programa era para un proyecto de la facultad q voy a presentar mañana. Se trata de un controlador de potencias (hasta 220W) manejado desde la PC.
Esperemos q salga todo bien, mañana les cuento como me fue ;)
gracias de nuevo!!!
PD: esta de mas decir q nombre el foro como bibliografia jaja.