Programación Específica > Microcontroladores

 Fallo - Rs232

(1/5) > >>

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  &#59; Receive Data#Define    TxD   PORTB,5  &#59; Transmit Data tempData1  EQU  0x44counter2  EQU  0x45counter1  EQU  0x46 ;------------------------------------------------------------------------------ RS232_setUp:  bsf STATUS,RP0  &#59; Segundo banco   bsf RxD    &#59; Configura la entrada  bcf TxD    &#59; Configura la salida   bcf STATUS,RP0  &#59; Primer banco   return    &#59; Retorna donde fue llamada ;------------------------------------------------------------------------------ RS232_readData:   movlw 0x08  movwf counter1 waitBegin    btfsc RxD  &#59; Bit de START?  goto waitBegin  &#59; No, sigue esperando      &#59; Si, sigue el programa   call wait_mc100  &#59; Espera a que termine el bit de START  call wait_mc50  &#59; Espera medio bit para leer el primer bit de      &#59; datos medio bit retrasadoreadBit   bcf STATUS,C  &#59; Supone que es "0"  btfsc RxD  &#59; Es "0" realmente?  bsf STATUS,C  &#59; No, es "1"   rrf tempData1,F  call wait_mc100   decfsz counter1,F&#59; Ha leido todos los bits de datos?  goto readBit  &#59; No, lee el próximo bit   call wait_mc200  &#59; Si, espera al bit de STOP  movf tempData1,W&#59; Pone el resultado en el acumulador   return    &#59; Retorna donde fue llamada ;------------------------------------------------------------------------------ RS232_sendAsciiNumber:  addlw '0'RS232_sendData:  movwf tempData1  &#59; Guarda el contenido del byte a trans-      &#59;   mitir  movlw 0x08  &#59; Número de bits a transmitir  movwf counter1  bcf TxD  &#59; Bit de START  call wait_mc100  sendBit    &#59; Comienza a enviar tempData1s  rrf tempData1,F  &#59; Lleva el bit que se quiere enviar al  btfss STATUS,0  &#59;  Carry para deducir su valor. ¿Es un      &#59;  "1"  el bit a transmitir?  goto sendZero  &#59; No, pues envía un "0"  sendOne  bsf TxD  &#59; Transmite un "1"  goto endSendBit  sendZero  bcf TxD  &#59; Transmite un "0"  endSendBit  call wait_mc100  &#59; Este es el tiempo que estará en alto      &#59;   o bajo  decfsz counter1,1&#59; Comprueba que es el último bit  goto sendBit  &#59; Como no es el último bit repite la       &#59;   operación  bsf TxD  &#59; Envía dos bits de stop  call wait_mc200   return    &#59; Retorna donde fue llamada ;------------------------------------------------------------------------------ wait_createMc:  movwf counter2  &#59; Aporta 1 ciclo de máquina waitLoop  decfsz counter2,1&#59; Aporta 1 c.m. cuando no se salta, y      &#59;  2 c.m. si se salta.  goto waitLoop  &#59; Aporta 2 ciclos de máquina   return    &#59; Aporta 2 ciclos de máquina  ;------------------------------------------------------------------------------; RETARDOS;------------------------------------------------------------------------------ wait_mc50:    &#59; La llamada "call" aporta 2 c.m.  nop    &#59; Aporta 1 ciclo de máquina  movlw 0Eh  &#59; Aporta 1 ciclo de máquina  goto wait_createMc&#59; Aporta 2 ciclos de máquina wait_mc100:    &#59; La llamada "call" aporta 2 c.m.  movlw 1Fh  &#59; Aporta 1 ciclo de máquina  goto wait_createMc&#59; Aporta 2 ciclos de máquina wait_mc200:    &#59; La llamada "call" aporta 2 c.m.  nop    &#59; Aporta 1 ciclo de máquina  movlw 40h  &#59; Aporta 1 ciclo de máquina  goto wait_createMc&#59; 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

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa