Programación Específica > Microcontroladores
Fallo - Rs232
jaumegs:
Hola,
Se que esto se pide mucho por aqui, pero no me queda otro remedio...
Miren, este codigo (sacado del FTP del foro, un poco modificado) teóricamente tocaría funcionar para la transmisión y recepción serie...
Lo alucinante es que antes me funcionaba, bueno, me explico...
HAce unos dias formatee el ordenador... y me olvidé de guardar todos los programas para los PIC. Entre ellos, un programa que me funcionaba muy bien, era este mismo código(un poco mas modificado). Este código funcionaba bien, pero no se porque ahora no hay forma...
Lo he probado en simuladores y funciona bien, no da ningún error. Puedo pensar que es el hardware... pero estoy mas que arto de montarlo y desmontarlo...
--- Código: Text ---;------------------------------------------------------------------------------; DECLARACIÓN DE VARIABLES;------------------------------------------------------------------------------ #Define RxD PORTB,4 ; Receive Data#Define TxD PORTB,5 ; Transmit Data tempData1 EQU 0x44counter2 EQU 0x45counter1 EQU 0x46 ;------------------------------------------------------------------------------ RS232_setUp: bsf STATUS,RP0 ; Segundo banco bsf RxD ; Configura la entrada bcf TxD ; Configura la salida bcf STATUS,RP0 ; Primer banco return ; Retorna donde fue llamada ;------------------------------------------------------------------------------ RS232_readData: movlw 0x08 movwf counter1 waitBegin btfsc RxD ; Bit de START? goto waitBegin ; No, sigue esperando ; Si, sigue el programa call wait_mc100 ; Espera a que termine el bit de START call wait_mc50 ; Espera medio bit para leer el primer bit de ; datos medio bit retrasadoreadBit bcf STATUS,C ; Supone que es "0" btfsc RxD ; Es "0" realmente? bsf STATUS,C ; No, es "1" rrf tempData1,F call wait_mc100 decfsz counter1,F; Ha leido todos los bits de datos? goto readBit ; No, lee el próximo bit call wait_mc200 ; Si, espera al bit de STOP movf tempData1,W; Pone el resultado en el acumulador return ; Retorna donde fue llamada ;------------------------------------------------------------------------------ RS232_sendAsciiNumber: addlw '0'RS232_sendData: movwf tempData1 ; Guarda el contenido del byte a trans- ; mitir movlw 0x08 ; Número de bits a transmitir movwf counter1 bcf TxD ; Bit de START call wait_mc100 sendBit ; Comienza a enviar tempData1s rrf tempData1,F ; Lleva el bit que se quiere enviar al btfss STATUS,0 ; Carry para deducir su valor. ¿Es un ; "1" el bit a transmitir? goto sendZero ; No, pues envía un "0" sendOne bsf TxD ; Transmite un "1" goto endSendBit sendZero bcf TxD ; Transmite un "0" endSendBit call wait_mc100 ; Este es el tiempo que estará en alto ; o bajo decfsz counter1,1; Comprueba que es el último bit goto sendBit ; Como no es el último bit repite la ; operación bsf TxD ; Envía dos bits de stop call wait_mc200 return ; Retorna donde fue llamada ;------------------------------------------------------------------------------ wait_createMc: movwf counter2 ; Aporta 1 ciclo de máquina waitLoop decfsz counter2,1; Aporta 1 c.m. cuando no se salta, y ; 2 c.m. si se salta. goto waitLoop ; Aporta 2 ciclos de máquina return ; Aporta 2 ciclos de máquina ;------------------------------------------------------------------------------; RETARDOS;------------------------------------------------------------------------------ wait_mc50: ; La llamada "call" aporta 2 c.m. nop ; Aporta 1 ciclo de máquina movlw 0Eh ; Aporta 1 ciclo de máquina goto wait_createMc; Aporta 2 ciclos de máquina wait_mc100: ; La llamada "call" aporta 2 c.m. movlw 1Fh ; Aporta 1 ciclo de máquina goto wait_createMc; Aporta 2 ciclos de máquina wait_mc200: ; La llamada "call" aporta 2 c.m. nop ; Aporta 1 ciclo de máquina movlw 40h ; Aporta 1 ciclo de máquina goto wait_createMc; Aporta 2 ciclos de máquina
Bueno, aquí les dejo el código haber si me pueden hechar una mano.
SALUDOS
lalo_soft:
Siempre me ha intrigado por que algunos insisten el crear por codigo los modulos que
existen por hardware en versiones de chips posteriores al que estan usando :blink: .
1.-Por costo dicen algunos :
El codigo que posteo nuestro amigo tiene cara de pic16F84 y este micro es reemplazado con creces por el pic16F877 con un costo en dinero no muy mayor que F84
y con prestaciones de modulos de hardware(UART,ADC,PWM,TIMER,COUNTERS) que haran que el codigo sea mas poderoso y eficiente .Por que los que cren que ahorran dinero entre un modelo y otro, la verda es que lo gastan tratando de implementar los modulos que necesitan por codigo :comp: dejando poca memoria para la aplicacion es si misma, bajas prestaciones y largos tiempo de desarrollo.
2.- Por espacio dices Otros.
Donde cave uno de 16Pines cave uno de 28Pines sin grandes coseciones de espacio.
3.-Por aprender mas.
Si se acostumbran a las malas pacticas de querer reinvertar la rueda su vida laboral sera dificil y llena de proyectos a medio terminar.
Como humilde desarrollador de sistemas embebidos con 15 años de experiencia les aconsejo elegir sus chip de acuerdo a los requerimientos reales de su proyecto y no ahorren centavos pensando que lo solucionaran todo por codigo .
Recuerden cliente satisfecho = fama y fortuna.
Saludos.
Kain589:
--- Cita de: "lalo_soft" --- 2.- Por espacio dices Otros.
Donde cave uno de 16Pines cave uno de 28Pines sin grandes coseciones de espacio.
--- Fin de la cita ---
Yo pienso igual que tu.
Y ni por el espacio, existen micros superiores al f84 con mas modulos, incluido usart y que tiene el mismo patillaje para poder sustituirlo en el mismo circuito
Huguen_aus_Tirol:
Hola! Estoy muy de acuerdo con Lalo_soft! Personalmente, cuando me hace falta un periférico, busco el micro que ya lo tenga implementado. Después es solo configurar algunos registros y, depende el caso, un poco de código.
Pero también veo que aquí en el foro la mayoría es gente que se inicia en este mundo, aparentemente muchos estudiantes. Por este motivo no veo mal que hagan experimentos y pruebas, mientras se disponga de tiempo y ganas. Ya se darán cuenta con el tiempo y la experiencia de qué es lo más conveniente... :rolleyes:
En cuanto a costos, es mejor tener un micro con algún periférico que no usemos (es decir, pagar por un periférico extra) que implementar alguno por soft. Y en lo que respecta al 84, podemos ir olvidandonos de él; es más caro, e incluso está empezando a ser difícil conseguirlo...
Conclusión: como dice Lalo_soft, para cualquier proyecto, busquemos el micro que tenga el periférico que necesitemos. Si es para practicar, fines didácticos, o jugar, podemos buscar de hacerlo por soft... pero no nos compliquemos mucho ;)
Saludos a todos!
jaumegs:
Bueno, realmente yo también estoy deacuerdo... pero me interesaba practicar un poco... :smartass:
Definitivamente utilizare el 16f876. Pero ahora el problema está en que solo he programado el 16f84... y desconozco los registros del 16f876 y como realizar tareas tales como la utilización de la UART.
Alguien podría recomendarme un lugar que explique esto?
SALUDOS
Navegación
[#] Página Siguiente
Ir a la versión completa