Que tiene de malo este codigo ?

Esta es la descripcion:

1.-El momento de energizar el circuito, los diodos LED, deben encenderse y apagarse secuencialmente en intervalos de 300ms, en sentido horario, durante 10 segundos.

2.-Luego debe invertir la secuencia en sentido anti horario en intervalos de 500ms durante otros 10 segundos.

3.-A continuación, deben encenderse y apagarse alternativamente en intervalos de 300ms los LEDs de los cuadrantes pares durante 5 segundos.

4.-Finalmente, deben encenderse y apagarse alternativamente en intervalos de 400ms los LEDs de los cuadrantes impares por otros 5 segundos, quedando finalmente encendidos los LEDs delimitadores de los 4 cuadrantes.

El problema esta en que las secuencias tardan mas de lo previsto, por ejemplo la secuencia 1 deberia tardar 10 segundos, pero tarda como 15 segundos, igual pasa con las demas secuencias, alguien me puede dar una mano por favor?, les dejo todos los archivos, proteus, asm, hex y libreria

PD:debo aclarar que la variable Vueltas es el numero de secuencias por el que va, no las veces que estan dando vueltas los leds

PD:para contar los 10 segundos y los 5 segundos lo estoy haciendo por medio de timer, y el timer lo uso por medio de una interrupcion
 

Adjuntos

  • archivos.rar
    18.4 KB · Visitas: 18
Última edición:
He descargado tu programa y al compilarlo me da error en la etiqueta secuencia3 y secuencia4 , he buscado dichas etiquetas y no las tienes definidas
Por favor corrige el código y suvelo de nuevo

Un saludo
 
o_O, pero si las tiene, vere que pasa y lo vuelvo a subir

perdon parece que subi un archivo antiguo, aqui esta completo
 

Adjuntos

  • proteus.rar
    18.7 KB · Visitas: 15
Última edición:
Tengo algunas dudas
Porque pones un registro que no le das direccion ni tampoco lo utilizas?
Principal
movlw Timer_50ms
movwf TMR0
bcf INTCON,T0IF
bsf INTCON,GIE

Tengo la duda sobre el registro contador, lo utilizas como tiempo?

Es necesario (pues quieres practicar) la interrupcion?

Si que me he dado cuenta, de que la pila se llena desbordandose, lo cual es un problema para los saltos

Perdona por las dudas el tiempo del cual dispongo es escueto

Un saludo
 
Lo iba a leer, pero un codigo sin comentarios solo le entiende quien lo hizo, ademas en el futuro te servira para recordar como lo hiciste, perdon pero me dio pereza,
chauuuuuu
 
Tengo algunas dudas
Porque pones un registro que no le das direccion ni tampoco lo utilizas?
Principal
movlw Timer_50ms
movwf TMR0
bcf INTCON,T0IF
bsf INTCON,GIE

Tengo la duda sobre el registro contador, lo utilizas como tiempo?

Es necesario (pues quieres practicar) la interrupcion?

Si que me he dado cuenta, de que la pila se llena desbordandose, lo cual es un problema para los saltos

Perdona por las dudas el tiempo del cual dispongo es escueto

Un saludo

utilizo la variable Contador para contar 200 interrupciones cada 50ms, en otras palabras 10 segundos exactos, lo mismo hago para otras secuencias, 100 interrupciones cada 50ms para que cuente 5 segundos exactos

¿ por que dices que la pila se desborda?, ¿no me habia dado cuenta en que parte?¿ o como verificaste eso? estas seguro? por que funciona correctamente, el unico incoveniente es que se retrasa unos 3 o 4 segundos mas de lo que deberia

El Timer_50ms es una constante con el valor de 60, que es el valor calculado para que el timer se desborde cada 50ms con un Prescaler de 256, y asi provoque la interrupcion por timer. Y pues si lo utilizo para cargar el registro TMR0 con esa constante al principio, ahi mismo donde lo estas mencionando

por cierto gracias por responder, pense que ya no lo ibas a revisar

pues estuve pensando que con la interrupcion del timer iba a ser mas exacto
 
Última edición:
Buenos días.

¿El problema de tiempos lo tienes en Proteus o en el Mundo Real?

Ten en cuenta que los tiempos, Proteus, no los respeta mucho :cry:

Sal U2
 
pues no puedo probarlo ya que no tengo un grabador de pics, pero no creo que sea tanta la diferencia en tiempos... o_O o si?

Puedes probarlo tu mismo....
En Proteus abre un proyecto...
Pon un clock de 1Hz
Conéctale un led de modo que parpadee al ritmo del Clock.
Observa la cadencia del destello :cool:

:unsure: ¿Qué opinas?...

Sal U2
 
Última edición:
utilizo la variable Contador para contar 200 interrupciones cada 50ms, en otras palabras 10 segundos exactos

¿También cuentas con los ciclos de las instrucciones y de los saltos?

El tema de la pila, por experiencia, en los simuladores todo funciona bien pero en la practica tienes verdaderos calentamientos de cabeza
El problema radica en

Código:
InicioTimer                                                ;Vienes de la interrupcion
     movwf         Guarda_W
     swapf         STATUS,W
     movwf         Guarda_STATUS
ComrobandoEstado
     movf          Vueltas,W
     sublw         d'0'
     btfsc         STATUS,Z
     goto          Secuencia1_timer
     movf          Vueltas,w
     sublw         d'1'
     btfsc         STATUS,Z
     goto          Secuencia2_timer
     movf          Vueltas,W
     sublw         d'2'
     btfsc         STATUS,Z
     goto          Secuencia3_timer
     movf          Vueltas,W
     sublw         d'3'
     btfsc         STATUS,Z
     goto          Secuencia4_timer

Secuencia1_timer
     incf          Contador,F
     movf          Contador,W
     sublw         d'200'
     btfss         STATUS,Z
     goto          Final
     clrf          Contador
     incf          Vueltas,F
     clrf          PORTB
     clrf          PORTA
     bcf           INTCON,T0IF
     [COLOR=Red]goto          Principal          [/COLOR]
Secuencia2_timer
     incf          Contador,F
     movf          Contador,W
     sublw         d'100'
     btfss         STATUS,Z
     goto          Final
     clrf          Contador
     incf          Vueltas,F
     clrf          PORTB
     clrf          PORTA
     bcf           INTCON,T0IF
     [COLOR=Red]goto          Principal[/COLOR]      ;

Aquí llegas después de una interrupción, no hay ningún return, ni tampoco un retfie con lo cual la pila se llena y se llena

Lo iba a leer, pero un código sin comentarios solo le entiende quien lo hizo, ademas en el futuro te servira para recordar como lo hiciste, perdón pero me dio pereza,
chauuuuuu

Si, no tenemos el tiempo necesario para desarrollar un proyecto sin comentarios.
 
Última edición por un moderador:
ok tenes razon con lo de las pilas, y bueno el tema de los ciclos de las instrucciones no la tome en cuenta ya que crei que no iba a sobrepasar los 800uS cada secuencia. ya me di cuenta que no se puede corregir facilmente, simplemente esta mal diseñado

saludos
 
Lo que no se corrige en esta vida facilmente son los vicios, y lo que no tiene remedio es la muerte

El planteamiento como tu dices es malo (no quiero ofenderte con mi expresion) esta mal diseñado, pero puedes corregirlo con facilidad(todo tiene arreglo)
Simplemente debes efectuar un par de cambios, contar dentro del tiempo los ciclos de instruccion y de salto, estos ultimos son los que deberias controlar con mas eficacia, pues en el codigo de referencia que nos has ofrecido, lo dejabas a la ligera
Piensa en como hacer las modificaciones, nos ayudara a todos, pon el codigo porfavor para ilustrarnos y poder ayudarte (a veces nos ofuscamos y no queremos continuar con el problema) y por ultimo siempre pon un comentario en cada instruccion pues ayudara al nuevo que quiera aprender el lenguaje como al resto en comprender que es y como funciona Tu programa

Un saludo (estoy a la espera de tu nuevo planteamiento aunque el tiempo del que dispongo sea escueto)

Un saludo
 
Atrás
Arriba