TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: iguanapeluda en 24 de Noviembre de 2008, 14:41:58
-
Hola a todos, bueno, he leido mucho en éste foro y me hubiera gustado opinar..pero como tampoco se responder a ninguna duda por ahora no he podido participar desgraciadamente.
La cosa es que estoy haciendo un PFC con un PIC 16f877a utlizandolo de tarjeta de adquision de datos de un motor, con su conversor para luego meterlo al LABVIEW...pero no hay manera, incluso meto los ejemplos que he visto por ahi y nada.
Me he comprado el EASYPIC5, lo estoy intentando hacer con Ensamblador comunicando a 9600Baud con 16f877a y reloj externo de 8MHZ y mi programa es éste...pero nose que pasa q no recibo nada, llevo mas de una semana metiendo horas y horas y no avanzo..y me gustaria una pequeña ayudita porque de verdad, me estoy muriendo y con ganas de tirar la toalla...
A ver que opinais...ademas es muy sencillo, adquirir una señal y mandar una de los 2 registros del ADRES
************************************************************************
;* Este programa realiza la conversión de una señal analógica conectada *
;* al canal AN0 y envía a través del serie los datos al ordenador
;**************************************************************************
;
Include "p16f887.inc"
list P=16f887
cont EQU 0x20
dato EQU 0x21
org 0x0000
CALL initrans ;Inicializamos el puerto serie
BSF STATUS,RP0 ;Banco 1
CLRF ADCON1 ;configura 8 canales analógicos,
BSF ADCON1,ADFM ;justificación a la derecha
BSF TRISA,0 ;entrada el canal digital RA0
BCF STATUS,RP0 ;Accedemos al Banco0
MOVLW b'00000001' ;AN0, reloj de conversión Fosc/2
MOVWF ADCON0 ;y enciende el convertidor
ciclo CALL pausa ;30 µseg tiempo de adquisición
BSF ADCON0,GO_DONE ;inicia conversión
espera BTFSC ADCON0,GO_DONE
GOTO espera ;Espera a que termine la conversión
BSF STATUS,RP0 ;Banco 1
MOVF ADRESL,W ;Carga en W el Byte alto resultado
MOVWF dato ;lo guarda en dato
CALL envia ;Enviamos por el puerto serie
GOTO ciclo ;Volvemos a convertir
;**************************************************************
; Subrutina de pausa de aprox. 30 µseg (con Fosc=20 MHZ)
;****************************************************************
pausa MOVLW 0x29 ;Carga dato para 30 µseg.
MOVWF cont ;inicializa contador con el dato
rep DECFSZ cont,1 ;Decrementa contador y escapa si cero
GOTO rep ;si no es cero, repite
esc RETURN ;regresa de esta subrutina
;********************************************************************
; Subrutina para inicializar el puerto serie para el envío de datos
;*********************************************************************
initrans BSF STATUS,RP0 ;Banco 1
BCF TXSTA,BRGH ;Pone Bit BRGH=0 (velocidad baja)
MOVLW b'00001100' ;12 decimal para 9600 8Mhz vel baja
MOVWF SPBRG ;Lo configura a 9600
BCF TXSTA,SYNC ;Limpia Bit SYNC (Asincrono)
BSF TXSTA,TXEN ;Ponemos a 1 el bit (Habilitamos)
BCF STATUS,RP0 ;Banco 0
BSF RCSTA,SPEN ;Pone Bit a 1 (habilita serie)
RETURN
;**********************************************************************
; Subrutina para enviar un dato por el puerto Serie
;***********************************************************************
envia BSF STATUS,RP0 ;Banco 1
esp BTFSS TXSTA,TRMT ;Chequea el buffer de transmision
GOTO esp ;si esta ocupado espera
BCF STATUS,RP0 ;Regresa al Banco 0
MOVF dato,W ;Rescata el dato a enviar
MOVWF TXREG ;lo envia
RETURN
end
MUCHAS GRACIAS POR ENTRAR EN EL POST
-
Para empezar, luego de ORG 0 configura primero los puertos del pic, luego recien configura el USART y el conversor.
En tu rutina de configuración del USART te falta indicarle que vas a enviar a 8 bits sin paridad es decir: bcf TXSTA,TX9
Otro detalle importantisimo es que el registro "dato" está declarado en el banco 0 (EQU 0x21 en tu programa) y sin embargo mira tu programa:
BSF STATUS,RP0 ;Banco 1
MOVF ADRESL,W ;Carga en W el Byte alto resultado
MOVWF dato ;lo guarda en dato
CALL envia ;Enviamos por el puerto serie
cuando guardas lo estas haciendo en el Banco1, para ello deberias hacer esto:
BSF STATUS,RP0 ;Banco 1
MOVF ADRESL,W ;Carga en W el Byte alto resultado
BCF STATUS,RP0 ;Banco 0
MOVWF dato ;lo guarda en dato
CALL envia ;Enviamos por el puerto serie
Prueba estas correcciones y a ver que tal te va.
Javicho.
-
Muchas gracias Javicho...pero lo he modificado y sigue estando muerto completamente...
Aquí dejo como está ahora con las modificaciones que me has dicho, que por cierto no eran pocas...jo, me da verguenza hasta ponerlo de lo mal que lo hago!
;**************************************************************************
;* Este programa realiza la conversión de una señal analógica conectada *
;* al canal AN0 y envía a través del serie los datos al ordenador
;**************************************************************************
;
Include "p16f887.inc"
list P=16f887
cont EQU 0x20
dato EQU 0x21
org 0x0000
CLRF STATUS ;Banco 0
CLRF PORTA ;inicializa puerto A
CLRF PORTB ;Inicializa puerto B
BSF STATUS,RP0 ;Banco 1
MOVLW b'11111111' ;todas patas como entrada
MOVWF TRISA ;lo configuramos
MOVLW b'00000000' ;todas como salida
MOVWF TRISB ;Lo configuramos
CALL initrans ;Inicializamos el puerto serie
BSF STATUS,RP0 ;Banco 1
CLRF ADCON1 ;configura 8 canales analógicos,
BSF ADCON1,ADFM ;justificación a la derecha
BSF TRISA,0 ;entrada el canal digital RA0
BCF STATUS,RP0 ;Accedemos al Banco0
MOVLW b'00000001' ;AN0, reloj de conversión Fosc/2
MOVWF ADCON0 ;y enciende el convertidor
ciclo CALL pausa ;30 µseg tiempo de adquisición
BSF ADCON0,GO_DONE ;inicia conversión
espera BTFSC ADCON0,GO_DONE
GOTO espera ;Espera a que termine la conversión
BSF STATUS,RP0 ;Banco 1
MOVF ADRESL,W ;Carga en W el Byte alto resultado
BCF STATUS,RP0 ;Banco 0
MOVWF dato ;lo guarda en dato
CALL envia ;Enviamos por el puerto serie
GOTO ciclo ;Volvemos a convertir
;**************************************************************
; Subrutina de pausa de aprox. 30 µseg (con Fosc=20 MHZ)
;****************************************************************
pausa MOVLW 0x29 ;Carga dato para 30 µseg.
MOVWF cont ;inicializa contador con el dato
rep DECFSZ cont,1 ;Decrementa contador y escapa si cero
GOTO rep ;si no es cero, repite
esc RETURN ;regresa de esta subrutina
;********************************************************************
; Subrutina para inicializar el puerto serie para el envío de datos
;*********************************************************************
initrans BSF STATUS,RP0 ;Banco 1
BCF TXSTA,BRGH ;Pone Bit BRGH=0 (velocidad baja)
MOVLW b'00001100' ;12 decimal para 9600 8Mhz vel baja
MOVWF SPBRG ;Lo configura a 9600
BCF TXSTA,SYNC ;Limpia Bit SYNC (Asincrono)
BSF TXSTA,TXEN ;Ponemos a 1 el bit (Habilitamos)
BCF TXSTA,TX9 ;Ponemos a 0, (8 bits tranms)
BCF STATUS,RP0 ;Banco 0
BSF RCSTA,SPEN ;Pone Bit a 1 (habilita serie)
RETURN
;**********************************************************************
; Subrutina para enviar un dato por el puerto Serie
;***********************************************************************
envia BSF STATUS,RP0 ;Banco 1
esp BTFSS TXSTA,TRMT ;Chequea el buffer de transmision
GOTO esp ;si esta ocupado espera
BCF STATUS,RP0 ;Regresa al Banco 0
MOVF dato,W ;Rescata el dato a enviar
MOVWF TXREG ;lo envia
RETURN
end
-
Interpreto que lo que te falla es la parte de comunicaciones. Te sugiero, por experiencia propia, que antes de seguir dudando del programa y si no ves nada raro en él, te asegures de que estas conectando la señal de TX y RX del RS-232 en el sentido correcto. Te lo digo porque yo también he perdido mucho tiempo con un problema similar y al final era una mala interpretación del sentido de las señales entre el conecotor que viene del PC y el MAX 232 y de este al pic . Asegurate de que es correcto antes de seguir buscando otros problemas porque es lo primero que se suele hacer mal y es muy facil equivocarse de sentido en alguno de los pasos.
-
Gracias por la respuesta, pero con esto no tengo lugar a dudas, ya que estoy uitilizando una protoboard (EASYPIC5), el cual ya tiene el conector y con un conversor Serie-USB para el PC, ademas en el conversor tengo 2 LEDS que me indican si hay actividad de un lado al otro o viceversa..
Gracias y un saludo,
PD; Ahora estoy empezando de 0 con MIKRO_c a ver si con esto me resulta mas sencillo...
-
Hey iguanapeluda no tires la toalla con el asembler, nos estamos quedando poquitos en este lenguaje como para tener otra baja mas en nuestras filas.
Porque no pruebas solo la comunicación primero, has un programa que envie cada 1segundo por ejemplo datos, algo asi:
clrf dato
Bucle call envia
incf dato,f
call delay_1_segundo
goto Bucle
Una buena técnica es activar un led en un pin del pic que no estes usando para ver si el flujo del programa pasa o no por determinada linea de programa por ejemplo:
clrf dato
Bucle call envia
bsf PORTB,4 ;si este led no se prende hay problemas con la rutina envia
incf dato,f
call delay_1_segundo
goto Bucle
Lo mismo aplicalo en tu programa original por ejemplo despues de que se realizó la conversion A/D, tal vez nunca sale del bucle de espera de la conversión y le estas echando la culpa al USART.
Bueno ahi tienes varios tips para que te saques de dudas.
Javicho.
-
Olvidé decirte, veo que estas configurando asi:
Include "p16f887.inc"
list P=16f887
Pero dices que estas usando un PIC16F877A entonces deberia ser asi:
Include "p16f877A.inc"
list P=16f877A
y mas aun este pic a diferencia del PIC16F877 tiene un modulo comparador por tal razon debes desactivar este módulo de esta forma:
org 0x0000
CLRF STATUS ;Banco 0
CLRF PORTA ;inicializa puerto A
CLRF PORTB ;Inicializa puerto B
BSF STATUS,RP0 ;Banco 1
movlw 0x07
movwf CMCON ;COMPARADORES DESACTIVADOS
MOVLW b'11111111' ;todas patas como entrada
MOVWF TRISA ;lo configuramos
MOVLW b'00000000' ;todas como salida
MOVWF TRISB ;Lo configuramos
Veo que todo el puerto A lo has configurado como entrada, asegurate de usar pull-up si vas a conectar pulsadores de lo contrario estos pines no deben quedar al aire libre o si no los vas a usar todos mejor configura como salida los pines que no vas a usar.
Javicho.
-
Una cosa más iguanapeluda, no veo que inicialices el puerto C (puerto donde se encuentran los pines TX=RC6 y RX=RC7).
Posiblemente por ello no obtienes ningún dato en la salida TX.
Debes agragar a lo que te indicó Javicho, luego de los otros TRIS:
movlw b'10xxxxxx' ;Las x debes seleccionarlas como 1 o 0 según desees. Si no los usas mejor como salida, como te indicaron
movwf TRISC
saludos
Sergio
-
ufff, nose cómo agradeceros la ayuda que me habeis prestado ya que lo tengo funcionando ya y recibiendo en el ordenador...
Lo unico que me pasa ahora es que me salta error de "FRAMING ERROR" en el labview
-----------------------------------------------------------------------------------------
Error -1073807253 occurred at VISA Read in mio.vi
Possible reason(s):
VISA: (Hex 0xBFFF006B) A framing error occurred during transfer.
--------------------------------------------------------------------------------------------
He ido a las ayudas de labview y he hecho lo que me ponen, que es meter un delay de 10 a 100ms despues del VISA configurator y luego un VISA Flush I/O Buffer pero sigue dandome fallo...creo que lo tengo bien configurado de Baudios ya que con 8Mhz, y velocidad baja tengo que meterle 12 decimal...con un bit de parada, sin paridad y demas...
Pero weno, ahora éste problema lo pondre sino en el post de LABVIEW a ver que opinan.
Lo dicho, muchas gracias por todo, me habeis dado animo para continuar con ensamblador
PD; Estoy transmitiendo el bucle que me has dicho javicho para evitar problemas con el ADC