TODOPIC
FORO TÉCNICO => Foro Técnico => Mensaje iniciado por: Fer_TACA en 07 de Febrero de 2004, 10:19:00
-
¡Ya se que que el mensaje está repetido, en el subforo de todo en microcontroladores!
Pero es que me tiene desesperado, llevo dos dias dando vueltas a lo mismo y nada.
A ver sis algun colega se le ocurre algo nuevo al respecto.¿Espero vuestras ayudas!
Acabo de construir un pequeño automata(entradas-salidas Digitales). He comprobado todas las entradas y salidas por separado funcionando correctamente. Las tensiones de las in-out estan separadas galvanicamente con lo que no tiene influencia con las tensiones del Pic.
Realizo un programa de prueba que crequea las entredas y activa las salidas, pero no funciona. Al pic le llegan correctas. Utilizo como entradas el puerto C y como salidas el B. Pero las salidas siempre las tengo a nivel bajo.
Compruebo el oscilador y obtengo una frecuencia de 4Mz(pin 10), pero observo que la onda es senoidal y de amplitud 2Vpp(y offset de 2V).
Hasta donde sé, deberia ser más o menos rectangular( aunque en la realidad cas nunca se le parece) y amplitud de unos 5V( más de cuatro). Compruebo los condensadores del oscilador y son de 27pF.
Tambien he probado con varios micros y tipos como xxx876 y xxxxx873.Siempre el resultado es el mismo.
He simulado el programa con proteus y con Mplab y va bien por lo que he descartado que sea el programa.
En la configuracion tengo deshabilitado el Watchdog, el oscilador es XT y he probado tambien con Hs. Desabilitado Brow-out reset. En fin creo que he probado con todo.
¿Alguien me puede indicar/decir como puedo solucionarel problema?¿Deberia bajar la capacidad de los condensadores?
Me es urgente solucionar el problema lo antes posible, pues para terminar mi proyecto de fin de carrera?
Muchas gracias y un saludo
-
Si estas mirando la señal de clock con un osciloscopio ten cuidado porque al colocar la sonda de este estas cargando la señal de clock con la sonda, es mejor realizar las medidas con la sonda en x10 de esa forma la impedancia de la sonda aumenta hasta los 10Mohm y afecta tanto en esa frecuencia a la señal.
Si pruebas de forma individual el micro y funciona, mira a ver si es del programa. Porque no nos pones el programa y el esquema del circuito para ver si hay algo que se te ha pasado.
-
Me temo que la frecuencia no la puedes medir directamente en el cristal. A no ser que uses un oscilador interno (que estos que mencionas no tienen) o un oscilador RC. En esos casos si puedes obtener la frecuencia en el pin que indicas.
Para 4MHz el fuses es XT. Con 27pf tiene que funcionar. Cosa distinta es que yo, por ejemplo siempre los monto de 22pF, valor que está en la mitad del rango aconsejado.
Raro, raro, raro.
Empezamos por lo de siempre. Tienes colocada la R=10K en el pin MCLR?? En proteus no hace falta ponerla, pero en los montajes reales si. Supongo que la tendrás puesta.
Si no usas la parte analógina del micro tienes que desactivarla, ya que por defecto se inicializan activadas.
Saludos!!
-
Gracias por vuestras respuestas colegas:
pero, la patilla de MCLR está de momento fija a Vcc. La sonda es de por 10 para no cargar la salida. La frecuencia la mido en la patilla 10 y se ve de la forma que os explico en el post anterior, pero en la patilla 9 no se ve nada
Cuando realizo montajes por ejemplo para el micro Z86XXX o X8 de Zilog el montaje del oscilador es similar al del PIc y la frecuencia se ve en los 2 pines.
El esquema no lo adjunto pues me parecio que sobraba. Solo tiene conectadas(de momento solo para ir probando todo el montaje), unas a + y otras a - por medio de unas resistencias de 10K.
Las salidas puerto B van aun draiver para no cargar el bus de la puerta B y de este a unos leds con sus resistencias correspondientes.
El programa solo configura el puerto C como entradas y el puerto B como salidas. Lee el C y lo pasas al b pasando por W.
Como dice cuca es raro, raro, pero me tiene frito y para el viernes tengo que entregar el proyecto y ahora estoy casi 39 horas (omás) cada dia para terminarlo.
Seguiré investigando, pero seguiré agradeciendo cualquier ayuda. Estoy conectado las 24 horas al foro por si acao
Muchas gracias.
-
Hola de nuevo:
Os adjunto el programa final, solo chequea las entradas y asi pone las salidas.
Solo os ponga parte de el pues todo el resto del programa es casi igual. Solo adjunto la configuracion.
LIST P=16F876 ;Selecciona el tipo de micro.
LIST C=132 ;Número de caracteres por línea.
#INCLUDE <P16F876.INC> ;Inserta librería igualdades de registros micro.
#Define Banco_0 bcf STATUS,RP0 ;Selección del banco 0 de la memoria de programa.
#Define Banco_1 bsf STATUS,RP0 ;Selección del banco 1 de la memoria de programa.
; #Define CS1_ON bsf PORTA,0 ;Se habilita las entradas.
; #Define CS1_OFF bcf PORTA,0 ;Se deshabilita las entradas.
#Define CS3_ON bsf PORTA,1 ;Se habilita las salidas.
#Define CS3_OFF bcf PORTA,1 ;Se deshabilita las salidas.
W_Temporal EQU 0x20 ;Dir. a guardar el W en operaciones para salvar su valor.
Status_Temporal EQU 0x21 ;Dir. a guardar el STATUS en operaciones y salvar su valor.
Delay_Tiempo_1 EQU 0x22 ;Dir. a guardar el valor de contaje a en rutinas de delay.
Delay_Tiempo_2 EQU 0x23 ;Dir. a guardar el valor de contaje a en rutinas de delay.
Byte_Entrada EQU 0x24 ;Var_temporal del dato leido de las entradas.
Byte_Salida EQU 0x25 ;Var_temporal del dato a WR para el periférico de Salida-1.
ORG 0x00 ;Dirección del Vector de RESET. Desactivar si hay bootloader.
; ORG 0x1F00 ;Dirección del Vector de RESET cuando hay bootloader.
goto Inicio ;Comienzo del programa después del vector de Interrupción.
ORG 0x05 ;una posición detrás Vector_Interrupción.
;; 1.1.- Configuración de los registros del micro a utilizar.
Inicio Banco_1 ;Selección del banco 1 de la memoria de programa.
movlw b"00000000" ;Se configura la puerta B como salida.
movwf PORTB ;Puerta B configurada como salida.
movlw b"11111111" ;Se configura el puerto C como entradas.
movwf TRISC ;Puerta C configurada como entrada.
movlw b"00000110" ;Valor a cargar W para configurar la
movwf ADCON1 ;Puerta A como E/S digitales.
movlw 0x00 ;Valor para reconfigurar la puerta A como salida.
movwf TRISA ;Puerta A = salida.
Banco_0 ;Selección del banco 0 de la memoria de programa.
movlw b"10000111" ;Pull_up=Off, InterpRB0=Off,Clock=Interno,Contador=Ascendente y
movwf OPTION_REG ;Predivisor de 1:256 asociado al temporizador TMR0.
clrf Byte_Salida ;Al empezar se borra el contenido del registro de las salidas.
call WR_Salida;Se escribe el dato inicial en la salida.
; 2.1.- Se realiza la comprobación del estado del presostato B44.
B44 call RD_Entrada ;Se lee el estado de las entradas.
btfsc Byte_Entrada,0 ;Está el presostato B44 abierto. B44=>0.
goto URG ;¿No? => B44=1 Se sigue con la prueba en el punto URG.
bcf Byte_Salida,0 ;Valor para dejar el rele 1 desactivado.
call WR_Salida ;Se escribe el dato en la salida.
goto A23 ;Se
Apartir se checuea otra entrada y asi sucesivamente..
Tengo definidos al principio los Byte_entrada y Bayte _salida al princio en direcciones de memoria 0x24 y 0x25.
WR_Salida y RD_Entrada se encargan de leer y escribir en los puertos B y C
Gracias
-
Vaya, vaya, cuantas horas dices que le dedicas al día... Quizás sea hora de dormir...
Cambia esto
movlw b"00000000" ;Se configura la puerta B como salida.
movwf PORTB ;Puerta B configurada como salida.
por:
movlw b"00000000" ;Se configura la puerta B como salida.
movwf TRISB ;Puerta B configurada como salida.
-
Hola cuca:
Gracias voy a probar.
Las horas son ultimamente, si no mi familia( mujer e hijos) me van a cortar en pedacitos sino termino pronto, pues deje la carrera un tiempo por problemas familiares y ahora la retomé hace un tiempo y estan más ilusionados que yo.
Pero los tengo un poco hartos ya.
De momento voy a cenar.
¿Pero si estoy en el banco apropiado para configurar el puero B no da lo mismo poner TRIS B que PORT B?
¿Si no diera lo mismo despues de compilar y no dar el errores, el MLab al simular ¿no daria problemas, si esta mal configurado?
Gracias y hasta luego
-
Hola otra vez:
Por cierto cuca:
Ya tengo puesto en el programa como me habias indicado
-
grave error, no lo tengo como dices
-
Eeeh! No te duermas ahora. Que pasó! Hubo avances??
-
eo:
No me dormí fui a cenar un poco.
Tanto con Port B como con TRIS B, se programa bien el puerto B como salida. Era de esperar ya que estaba en el banco 1.
Sigo probando,
fermin
-
Nueva Prueba:
Estoy simulando con Mlab y el programa me entra en una rutina de delay que utiliza el TMR0, pero al simular paso a paso, no veo que se incremente el TMR0. Voy a revisar la rutina que os adjunto asi como la configuracion del TMR0 a ver si hay algo mal.
Banco_0 ;Selección del banco 0 de la memoria de programa.
movlw b"10000111" ;Pull_up=Off, InterpRB0=Off,Clock=Interno,Contador=Ascendente y
movwf OPTION_REG ;Predivisor de 1:256 asociado al temporizador TMR0.
.
.
.
.
.
DE_10msg_TMR0_4 bcf INTCON,T0IF ;Desconecta el flag de rebosamiento del TMR0.
movlw ~.39 ;Valor para cargar en el registro TMR0. (~.39)
movwf TMR0 ;carga el TMR0 con complemento de 39.
WAIT_De_10msg clrwdt ;Se borra el watchdog.
btfss INTCON,T0IF ;Rebasamiento del TMR0 ??
goto WAIT_De_10msg ;Todavía no.
return ;Ahora si.
-
HOLA a todos:







¡¡¡¡¡ Pero que burro soy!!!!!!
Dos dias perdidos.
Como siempre la respuesta estaba ahi, muy facil y no verla.
Al configurar el Tmr0 lo hacia en la pagina 1, con lo que aunque el tmr0 se cargaba con el valor a cargara para la temporizacion, el registro no se incrementaba por no estar aplicada la configuracion al tmr0. DE esta manera se quedaba en el bucle siempre pues el flag T0IF no se activaba nunca.
La puerta B no cambiaba nunaca pues se ponia al principio del programa a 0 todos los bits y despues la temporizacion era para evitar rebotes. Al no salir del bucle pues eso no hacia nada


Cuca, da igual que al confifurar las puertas, si estás en la página adecuada, no importa si lo haces con PortB o con TRIS B.
Gracias alos que me habeis respondido y ya sabeis cuando esteis embotados, pues un descanso y a repasar despacio y con mucha calma.

-
Me alegro Fermín. Al final siempre suelen ser cosas tan simples que al repasar las ojeas tan rápido que no te das cuenta. Ni te cuento el tiempo que estuve la semana pasada con una tontería también. En CCS (C) en tenía un define (como un EQU en asm) para ahorrarme lo de poner el número. La cosa es que al principio lo tenía en hexadecimal (0x57 p.ej) y luego como era un registro de configuración decidí ponerlo en binario para diferenciar mejor cada bit. Y en lugar de poner 0b10010101 puse 0x10010101. Pues esa dichosa "x" en lugar de la "b" ni te imaginas los quebraderos que me trajo. Hasta corté y pegué el número en la calculadora de windows para comprobarlo un par de veces. Y ni por esa me dí cuenta de la "x". En fin...
Bueno, me alegro. Ahora a seguir...
Suerte!!
-
Hola: Sigo adelante con las pruebas del proyectoy demomento todo OK.
Me encerre en que el el problema no era del programa, dado que al simularlo ls primeras veces con proteus y MLab, tenia desabilitada la rutina de temporización.
Por eso es mejor dejarlo unpequeño tiempo y despues volver a empezar a repasarlo TODO con CALMA y la saloucion debe aparecer ante nuestros ojos de forma sencilla.
Gracias alos que me habeis contestado. Si me surgiera cualquier otro problema al respecto pues lo consultaria.¡Es pero que no!.
Gracias nuevamente y un saludo pa tos.