TODOPIC

Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: LeSs en 08 de Enero de 2007, 13:16:24

Título: Display Puntaje Basquet, problemas con Timer0.
Publicado por: LeSs en 08 de Enero de 2007, 13:16:24
Saludos a Todos!

Disculpen la molestia amigos, pero ya no doy +....
Estoy trabajando hace +d un mes en un Control de puntaje para basquet. Pero dado el tiempo he completado el codigo, poco a poco, hasta que por fin lo termine y lo simule.
 :(comienzan los dolores de cabeza :(.

Si no es mucha molestia les explico el funcionamiento y los problemas que me da.

Comienza el programa y muestran mensajes de presentación...
aparece el primer mensaje luego borra y muestra el segundo mensaje.
>>>1º inconveniente
   el timer0 comienza a contar una vez que configuro el prescaler con las   siguientes lineas de codigo
                 banco   1            ; Cambio al banco 1
   movlw   b'10000111'        ; Prescaler de 256 asignado al         TMR0     
   movwf   OPTION_REG      ; resistencias de Pull-Up del Puerto B.   

Luego de que configuro el Timer0 pero aun no autorizo las interrupciones del mismo.
por que? cuenta y cuenta y si no lo he activado o me equivoco?
   pero si no configuro el presacaler no pasa s error(No se incrementa la cuenta del timer)

hago la configuracion inicial se borra o cargan los contenidos iniciales, llega al inicio del juego.

Considerando el segundo caso,presiono start(tecla A)
sigo simulando y bueno, se carga el reloj, uso el timer0 para que se  produzk una interrupcion cada 50ms, cuento 20 veces y tengo mi interrupción cada segundo.
decrementa bien el tiempo si lo dejo sin presionar ninguna tecla extra.

Cuando trato de realizar las otras operaciones como incrementar puntaje del
equipo local con las teclas 1,2,3 ,al principio si lo logra incrementa bien el puntaje
luego ya no responde las teclas de incrementar puntaje y para terminar aparece el siguiente error.
Warning: [U1] at 213.632 (PC=0x0419): Stack underflow executing RETURN instruction.
Warning: [U1] at 213.632 (PC=0x0411): Stack overflow executing CALL instruction.
Warning: [U1] at 213.632 (PC=0x0419): Stack underflow executing RETURN instruction.
esto me pasa cuando voy por mas de 21 puntos a veces .

Cuando trato de realizar las otras operaciones como incrementar puntaje del
equipo local con las teclas 4,5,6 ,al principio si lo logra incrementa bien el puntaje
luego aparece el siguiente error.
Warning: [U1] at 213.632 (PC=0x0419): Stack underflow executing RETURN instruction.
Warning: [U1] at 213.632 (PC=0x0411): Stack overflow executing CALL instruction.
Warning: [U1] at 213.632 (PC=0x0419): Stack underflow executing RETURN instruction.
esto me pasa cuando voy por los mas de 21 puntos a veces.
despues de varios minutos el teclado no responde.
Que estoy haciendo mal alguna pista en especial a lo del timer al comienzo del programa y luego con lo del stack?
En algo influyen los Macros, claro con las llamadas a subrutinas???

Me podrian ayudar con una guia para poder completar mi proyecto. Por Favor.
O si alguien esta interesado en unirse al proyecto y lo terminamos en conjunto.

Si no es mucha molestia alguna sugerencia para reestructurar el codigo, eliminar los SAA1064( que obligatoriamente lo tengo q hacer por q n mi pais no venden... que pena) y utilizar multiplexaciòn de los displays a 7 segmentos, si es de cambiar la frecuencia del oscilador no importa pero nunca lo he intentado( se me pone uso del CPU al 100% cuando simulo, pero si he leido los post anteriores respecto al tema, el unico inconveniente es que no se como reestrucrurar el codigo y en que momento utilizarlo.


Muchas gracias por su atencion y pronta respuesta...

Adjunto archivos, codigo fuente y de simulación.
Título: Re: Display Puntaje Basquet, problemas con Timer0.
Publicado por: Fer_TACA en 09 de Enero de 2007, 17:14:59
Hombre en principio por lo poco que pones del codigo, los errores parece que son por que se a desborbado la pila(stack). Si es asi es porque estan anidadas unas rutinas dentro de otras rutinas(el maximo son 8 niveles) y por eso se desborda y al final no sabe a donde regresar el programa.
fermin
Título: Re: Display Puntaje Basquet, problemas con Timer0.
Publicado por: LeSs en 09 de Enero de 2007, 23:17:46
Gracias por su interes!

Lo del la pila si lo tengo claro por eso estoy buscando una reestructuracion de codigo, mi pregunta va con lo del timer0, si tengo claro lo del timer y las interrupciones pero lo que me suced y me parece raro corrijanme si estoy equivocado: "Que una vez que se asigna al timer el conteo interno o sea q se incremente con cada pulso de reloj, comienza a contar, cuenta y cuenta sin parar, se dessborda a cada rato, pero si no se activa la interrupcion del mismo no influye en nada. pero como estoy trabajando con otras interrupciones, tiene que revisar la causa de la interrupcion se me pierde el conteo del .

Ahora si se dan cuenta cuando se mantiene presionada una tecla estando en el servicio de interrupcion el timer cuenta mas rapido que si se trabaja en modo normal fuera de la interrupcion.

Otra consulta respecto de los Macros, deberia poner antes de cada debinicion del macro banksel "Registros en cuestion" por si akzo, est fallando en esto.

Por el momento Sigo reestructurando el codigo, para hacerlo +claro d entender y corregir posibles fallas.
Título: Re: Display Puntaje Basquet, problemas con Timer0.
Publicado por: LeSs en 13 de Enero de 2007, 12:29:44
Saludos!

En vista de q no hay respuestas nuevas, y basado en las pruebas que he realizado. llegue a la siguiennte conclusion:
El Timer0 comienza a contar desde el primer momento en que seleccionas como contador o temporizador, para mi caso por descuido no active una tercera variable a parte de las interrupciones por desbordamiento del timer y su flag de reconocimiento, como por ejemplo Temporizador On u OFF, que dependiendo del estado del programa realizaria los procedimientos correspondientes.

Como el programa es un poquito largo, ya solucione los problemas de desbordamiento del stack, ahora estoy trabajando con un codigo algo mas reducido, pero ya casi ta listo...
Alguna sugerencia para presentar los datos el los 16displays de 7 segmentos?

Título: Re: Display Puntaje Basquet, problemas con Timer0.
Publicado por: micro_cadaver en 20 de Enero de 2007, 00:21:45
jeje hola luis como vas con el proyecto, espero q bien, saludos y sigue adelante!!!! :-/
Título: Re: Display Puntaje Basquet, problemas con Timer0.
Publicado por: maunix en 22 de Enero de 2007, 08:16:26
Alguna sugerencia para presentar los datos el los 16displays de 7 segmentos?

Hola, ¿qué tipo de sugerencia estas hablando? ¿Algo relativo al hardware/software? ¿Cómo mostrar los datos?

Título: Re: Display Puntaje Basquet, problemas con Timer0.
Publicado por: LeSs en 22 de Enero de 2007, 13:12:54
Que tal compañeros!

Citar
Hola, ¿qué tipo de sugerencia estas hablando? ¿Algo relativo al hardware/software? ¿Cómo mostrar los datos?

Si era respecto al Hardware, por que al principio ya tenia hecho hasta las subrutinas que manejaban los 4 SAA1064, pero no los pude conseguir.

Bueno ya estoy depurando el codigo, y dandole una mejor explicacion de lo que hice, ya lo simule y todo ok!.

El diseño final cuenta con comunicacion serial entre un micro16876 y un 16870, en modo asincrono. el 16870 estaba a la espera de los datos, solo envio 3bytes, uno codigo para saber a que grupo de displays pertenecen los datos, y los otros 2, contienen informacion en la parte alta como baja de cada byte, luego de recibir los 3 bytes actualiza datos, y sigue con la subrutina de multiplexacion para mostrar los datos en los displays.

Ahora tengo una interrogante:

Cuanto es la mayor distancia a la que pueden estar separados los 2 micros??? :? :?
 


Título: Re: Display Puntaje Basquet, problemas con Timer0.
Publicado por: maunix en 22 de Enero de 2007, 14:51:50
Si era respecto al Hardware, por que al principio ya tenia hecho hasta las subrutinas que manejaban los 4 SAA1064, pero no los pude conseguir.

La cosa cambia si usas un integrado que te mantenga el refresco que si usas uno que no lo haga.  Además 16dígitos 7 segmentos mediante multiplexado simple por los pines de un pic realmente es condenarlo a que o bien parpadee o bien se vea tan tenue que no se distinga mucho que digamos.

Puedes entonces, seguir pensando en el uso del SAA1064 o bien usar latchs.
 

Cuanto es la mayor distancia a la que pueden estar separados los 2 micros??? :? :?

Depende, comunicados mediante RS485, pueden estar a 1000mts.  Comunicados mediante fibra óptica a kilómetros de distancia.

Si a lo que te refieres es dentro de un PCB con el puerto serie , depende de la velocidad a la que los comuniques, de cómo diseñes las pistas y de qué hardware uses para comunicarlos.  Por ejemplo si usas un módulo para 485 no tendrías problema alguno en cualquier tamaño de PCB ya que eliminan muchisímo el modo común por su característica diferencial.

Título: Re: Display Puntaje Basquet, problemas con Timer0.
Publicado por: micro_cadaver en 23 de Enero de 2007, 02:00:50
yo usaria el max232 para q suba a 12V y con eso tiene hasta 15metros pero cuanta es la distancia q los usaras mucha? si no hay ruido ni motores por ahi creo q con eso es fuciciente y no tienes q agregar nada al soft del pic, solo poner un max232 por pic  conectarlo como correponde y listo. cuentanos mas sobre tus interrogantes me parece  todo un reto manejar 16 displays amigo!!  :-/
Título: Re: Display Puntaje Basquet, problemas con Timer0.
Publicado por: maunix en 23 de Enero de 2007, 08:19:44
yo usaria el max232 para q suba a 12V y con eso tiene hasta 15metros pero cuanta es la distancia q los usaras mucha?

Yo he usado RS232 a más de 35 mts pasando por líneas de alimentación de luces.

Baudeaje 9600.
Usando cable mallado multifilar.

Si uno baja el baudeaje se puede transmitir más lejos.
Título: Re: Display Puntaje Basquet, problemas con Timer0.
Publicado por: micro_cadaver en 23 de Enero de 2007, 10:11:57
ah excelente entonces, con eso bastaria Less!!!  :-)
Título: Re: Display Puntaje Basquet, problemas con Timer0.
Publicado por: maunix en 23 de Enero de 2007, 10:19:52
ah excelente entonces, con eso bastaria Less!!!  :-)

De todas formas, si está pensando en hacer algo cableado para una cancha de básquet, lo mejor, más práctico y más robusto es montarlo bajo RS485.

Lo de RS232 lo hice porque me veía limitado porque debía unir una PC a una UPS y era la única forma de gastar el menor dinero posible sin necesitar adaptar nada, además de que el monitoreo era con un soft propietario del cual no conocía los pormenores.

Título: Re: Display Puntaje Basquet, problemas con Timer0.
Publicado por: Y@el en 23 de Enero de 2007, 10:25:54
Hola,

Puedes montar tu RS232/ Sobre 485.
Ami me fue de maravilla, y justamente la hice para un panel de un coliseo. La distancia fue de 500 metros. Pero se puede ir hasta 1000 metros.

Para eso basta solo con las interfaces MAX485,... Dejame buscar... que creo q tengo el esquema a la mano.

Saludos,

Yoel
Título: Re: Display Puntaje Basquet, problemas con Timer0.
Publicado por: maunix en 23 de Enero de 2007, 10:33:34
Hola,

Puedes montar tu RS232/ Sobre 485.
Ami me fue de maravilla, y justamente la hice para un panel de un coliseo. La distancia fue de 500 metros. Pero se puede ir hasta 1000 metros.

Para eso basta solo con las interfaces MAX485,... Dejame buscar... que creo q tengo el esquema a la mano.

Saludos,

Yoel

No necesita pasar por RS232, el PIC tiene una usart perfectamente compatible con transceivers RS485 como los DS75176 de National o MAX485 de Maxim.

Título: Re: Display Puntaje Basquet, problemas con Timer0.
Publicado por: LeSs en 23 de Enero de 2007, 12:58:19
Citar
me parece  todo un reto manejar 16 displays amigo!! 

No se que inconvenientes me esperan cuando lo implemente, por que en la simulacion en el proteus me va de lujo, los datos se ven fijos en los displays, no se si es que ya cuando lo implemente me va a dar problemas. pero como el micro esta en ese bucle de refrescar los displays, creo que los tiempos se pueden afinar.


Citar
Puedes entonces, seguir pensando en el uso del SAA1064 o bien usar latchs.

Les comento compañeros que dada mi inexperiencia en este tipo de proyectos, y la situacion tecnologica de mi pais( no encontre los SAA1064), hice un diseño para cada situacion:
 1º utilizar 4 SAA1064 con comunicacion I2C. codigo del proceso comprobado
 2º utilizar registros de desplazamiento 74HC164, tb hice el codigo y lo comprobe, pero no me gusto por que despues tok hacer una placa + grande y demoro un poquito +
3º La comunicacion serial con un 16f870 para que muestre los datos, esta ya esta comprobada y si funciona.
 Realmente ha sido una buena experiencia, este proyecto aprendì y comprendì, temas que nunk habia tratado, y gracias a ustedes me estoy adentrando + en este mundo de los MIcros.

Citar
No necesita pasar por RS232, el PIC tiene una usart perfectamente compatible con transceivers RS485 como los DS75176 de National o MAX485 de Maxim.
Me gusta la idea de usar la comunicacion RS485, voy a ver primero si hay los integrados en mi pais, para no emocionarme en algo que luego no lo voy a poder terminar. :D :D :D

 :?Aqui me detengo un momento, no lo recuerdo bien pero  en el data del 16876A, especifica que es compatible con RS232 solamente o me equivoco? , pero  en los de la serie 18F si especifica que es compatible con RS485.

Maunix como deberia hacer para utilizar la comunicacion RS485? me podrias decir como configurar los registros? , estoy trabajando a 9600baudios y 4MHZ.


Otra consulta, para no utilizar transistores para el manejo de cada display podria utilizar los ULN2003, alli la configuracion seria:
Pic  74LS48 displays y ULN2803, para ahorrar espacio y trabajo en el diseño de la plaK.

Salu2,

Luis Enrique


Título: Re: Display Puntaje Basquet, problemas con Timer0.
Publicado por: maunix en 23 de Enero de 2007, 13:13:42
Un error común es confundir USART con RS232

El RS232 define la capa física, los niveles de tensión.  El USART puede funcionar en niveles RS232 , niveles TTL , 3.3V , etc.

El Módulo USART , hace referencia al módulo de comunicación síncrono/asíncrono receptor transmisor y requiere solamente TX y RX para comunicarse (+ el clock en modo síncrono, el cual es poco utilizado).

El PIC funciona con tensiones de alimentación.  Si el pic lo trabajas a 5V entonces entregará niveles TTL.  0V para el 0 lógico y 5V para el 1 lógico.

Para trabajar con RS485, simplemente necesitas un integrado como el DS75176 de national, el cual te hace toda la conversión.  Conectas el TX al pin de DO (Data Out), el RX al pin de DI), debes agregar un pin extra para el control de TX/RX, porque el DS75176 es half duplex, osea que no puedes transmitir y recibir al mismo tiempo, sino que le indicas cuando vas a transmitir y cuando a recibir.

Si usas 2 integrados (uno para TX y otro para RX) no te hace falta controlar esto, pero esta opción sirve únicamente para unir 2 pics nada más, si quieres unir N pics, tendrás problemas ya que si o si, puede transmitir solo 1 por vez.

Acá te dejo un post sobre cómo conectar un MAX485 o DS75176 (son idénticos) a un pic

http://www.todopic.com.ar/foros/index.php?topic=12827.msg74559#msg74559



Con respecto al RS232, puedes usar un MAX232.  Este te convierte de niveles TTL a niveles RS232 y viceversa.  Es de uso muy popular sobre todo cuando quieras conectarte a una PC.

En cuanto a conexiones PIC to PIC, yo sugiero siempre el rs485, me parece mucho más versátil y robusto.


Con respecto a cómo configurar el baudeaje no se modifica en nada lo que figura en el datasheet, estas módulos son de la capa física, osea adaptan las tensiones de tu pic para adaptarse a los niveles RS485 y/o RS232.
Título: Re: Display Puntaje Basquet, problemas con Timer0.
Publicado por: LeSs en 23 de Enero de 2007, 13:37:50
Gracias Maunix!
Entendido me olvidaba del modelo OSI,  :D :D :D :D

Voy a hacer los cambios en el esquema.

Con estos cambios, mi imaginacion vuela, ahora se me ocurre implementar una comunicacion con el PC, para manejar los datos de los displays tb desde el PC.
Hasta se me ocurre hacerlo multideportivo, para canchas de uso multiple, y que tenga sensores de temperatura y humedad,  bueno con lo de temperatura si he trabajado lo de la humedad esta por probarse.

Gracias una vez + a todos, pronto regresare con el esquema y codigo final. :mrgreen: :mrgreen:
Título: Re: Display Puntaje Basquet, problemas con Timer0.
Publicado por: maunix en 23 de Enero de 2007, 14:52:15
Me alegro haberte disparado la chispa de la imaginación.

Creo que muchos proyectos siempre comienza con una idea... y si se tienen muchas ideas tanto mejor!
Título: Re: Display Puntaje Basquet, problemas con Timer0.
Publicado por: LeSs en 23 de Enero de 2007, 17:22:21
 :shock:oh no, pase las 2000 lineas de codigo!!! :shock:
 que de debo considerar en esto? al menos cuando utilizo las subrutinas de servicios de interrupcion. ahora si debo utilizar la directiva Pagesel verdad.?
Título: Re: Display Puntaje Basquet, problemas con Timer0.
Publicado por: micro_cadaver en 23 de Enero de 2007, 17:31:15
sip, ten cuidado con los bits de las paginas pclath, leete bien esa parte o tendras problemas con los CALL y las tablas. Exitos amigo!!
Título: Re: Display Puntaje Basquet, problemas con Timer0.
Publicado por: maunix en 23 de Enero de 2007, 17:49:26
:shock:oh no, pase las 2000 lineas de codigo!!! :shock:
 que de debo considerar en esto? al menos cuando utilizo las subrutinas de servicios de interrupcion. ahora si debo utilizar la directiva Pagesel verdad.?

Si, has como te dice micro_cadaver, te sugiero leas al respecto en el datasheet así comprendes bien lo de la paginación.

En cuanto a el uso de interrupciones, ten cuidado en el 'grabado del contexto'.  Deberás guardar SI o SI el contenido del PCLATH al ingresar a la rutina de interrupción y luego reestablecerlo al salir de ella.

Saludos
Título: Re: Display Puntaje Basquet, problemas con Timer0.
Publicado por: micro_cadaver en 24 de Enero de 2007, 01:16:42
el q programa en assembler se debe conocer el datassheet del pic como si juera la palma de su mano  :mrgreen:
Título: Re: Display Puntaje Basquet, problemas con Timer0.
Publicado por: Nocturno en 24 de Enero de 2007, 05:24:29
Programar en otros lenguajes nunca exime de conocer el datasheet también al dedillo. Yo diría que es obligatorio SIEMPRE.
Título: Re: Display Puntaje Basquet, problemas con Timer0.
Publicado por: maunix en 24 de Enero de 2007, 08:25:18
Programar en otros lenguajes nunca exime de conocer el datasheet también al dedillo. Yo diría que es obligatorio SIEMPRE.

Coincido con Manolo en que siempre hay que conocer el datasheet, de hecho el lenguaje es el medio por el que uno programa pero lo que se está programando no deja de ser un pic.

Conocer el datasheet allana terreno... el que no lo conoce, tarde o temprano pierde tiempo y dinero por esa misma razón.
Título: Re: Display Puntaje Basquet, problemas con Timer0.
Publicado por: aitopes en 24 de Enero de 2007, 09:10:24
Las datasheet son imprescindibles. Yo soy un newbie en esto, y cada integrado que he comprado tiene su datasheet en mi disco duro.
Con esa informacion podes hacer un diseño con un 90% de posibilidades de que ande de una. (el 10% restante casi siempre son errores de interpretacion o de implementacion...).

Gracias a internet no tenemos excusas para no leerlas. Aguanten las dataheet!!!! :D
Título: Re: Display Puntaje Basquet, problemas con Timer0.
Publicado por: LeSs en 24 de Enero de 2007, 11:50:27
 :D :D :D
Es verdad lo de los data, yo soy muy nuevo en esto. Pero recuerdo aya por el tiempo de los circuitos logicos  :D, que los buskba solo para saber la configuracion del los pines + no para saber sus kracteristiks electricas y configuraciones internas.

Al parecer soy Asembledependiente, pues segun yo solo se programar en este lenguaje, y por lo tanto tengo que saber interpretar bien los data, aunque en ocasiones las 600 u 800 pag por micro lleva bbbaaassstttaaannnttt, tiempo en comprenderlas, agregregal que estan en Ingles.

Recuerdo lo que un dia le pregunte a Gio que si era Ing Electrico, como habia aprendido y de donde, tanto acerk d los Micros y el me contesto: " Pues de los datas" al principio lo tome en broma, pero ahora le doy la razon.