Autor Tema: Hablemos del Ruido  (Leído 59708 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 759
Re: Hablemos del Ruuuido
« Respuesta #45 en: 09 de Abril de 2008, 17:07:05 »
hola
''  :shock: '' pero en basic o c habrá alguna rutina que rellene la memoria sobrante con goto´s pero en assembler, como hago eso sin tener que currarme 6 ó 7k de gotos a mano  :shock: :shock: me mareo solo de imaginarlo  :-) vamos aunque sea copiar pegar, creo haber leido en algun lugar que con poner goto 0x00 en la ultima linea de codigo decian ya bastaba pero....... yo ademas las añado al final de cada hueco de memoria libre asi salta antes de empezar una rutina

un saludo
« Última modificación: 09 de Abril de 2008, 17:15:37 por alogic.on »

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3484
    • Mensajes de la Virgen María
Re: Hablemos del Ruuuido
« Respuesta #46 en: 09 de Abril de 2008, 17:29:17 »
No sirve poner en la última línea goto 0x00 ya que cuando ocurre un salto del programa no se sabe a dónde puede dirigirce, puede saltar al final de la memoria, como en el medio y etc, y si no coincide juesto con el goto 0x00, de nada sirve.

Entiendo que es encorroso o mucho trabajo completar la línea con el goto $, pero cuando se utiliza un PIC por algo será, no creo que se utilize un pic con 7 k de memoria y solo se utilize 1k.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

-Mi propio Foro de Meteorología
www.meteorologiafacil.com.ar/foros/index.php

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Hablemos del Ruuuido
« Respuesta #47 en: 09 de Abril de 2008, 18:23:01 »
Hola, una pregunta y algunos tips que no se si se puedan implementar en este caso ya que no conozco la arquitectura ni el compilador.
Pregunta
A cuantos bytes se traduce la instrucción goto $ ? porque si es a mas de un byte estamos fritos !!!
Tips
El relleno de memoria, cuando la arquitectura lo soporte tambien puede hacerse de las sgtes maneras:
  • Con un OpCode inválido y que el procesador se resetee ante esta condición
  • Disparando una interrupción por software ( SWI ) o un trap y en el handler producir el reset.

Para el llenado de la memoria se pueden utilizar estas 2 tecnicas entre otras:
  • Ver si el linker tiene una opción de llenado o copiado, algunos permiten estas directivas.
  • Si la imagen de memoria a grabar en el micro es formato Motorola o Intel, se puede hacer un programa externo tome el archivo y que haga el relleno automatico.

Saludos !

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3484
    • Mensajes de la Virgen María
Re: Hablemos del Ruuuido
« Respuesta #48 en: 09 de Abril de 2008, 19:02:14 »
Pregunta
A cuantos bytes se traduce la instrucción goto $ ? porque si es a mas de un byte estamos fritos !!!

No te entiendo a que te refieres exactamente.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

-Mi propio Foro de Meteorología
www.meteorologiafacil.com.ar/foros/index.php

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Hablemos del Ruuuido
« Respuesta #49 en: 09 de Abril de 2008, 22:16:33 »
Hola, como sabran no soy usuario de MicroChip, en un micro FreeScale y muchos otros, una instrucción del tipo GOTO $, se traduce como BRA $ ( Inconditional branch ) se traduce en el opcode 20 FE es decir ocupa 2 bytes, se que un PIC el largo del Opcode depende de la famila ( PIC12, PIC16, etc ), simplemente lo que pregunte en que se traduce un GOTO $ .
Saludos !

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3484
    • Mensajes de la Virgen María
Re: Hablemos del Ruuuido
« Respuesta #50 en: 09 de Abril de 2008, 23:07:43 »
Ummm, por como yo lo entiendo esta instrucción hace quedar al CP en la misma línea o misma pocición de memoria y de ahí no salga hasta que halla una interrupción (pero que no servirá porque volverá donde estaba) o cuando ocurre un reset.

Para hacerlo un poco más claro, supongamos que nuestro programa ocupa hasta la pocición de programa número 2233 y completamos las restantes con goto $ quedará así:

2234         goto    $
2235         goto    $
2236         goto    $
2237         goto    $
.....
.....
.....

y hay un ruido que afecta al CP y hace saltar al mismo a la pocición número 2236, el CP se encuentra con la intrucción goto $ por lo que quedará en la pocición de memoria número 2236, hasta, como ya mencioné antes, alla una reset.

No se si es esto lo que preguntas, ahora cuanto byte ocupa, pues 1 solo, ya que apunta a la misma dirección, no es que necesita ir a la pocición 2237 para ir a la 2236.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

-Mi propio Foro de Meteorología
www.meteorologiafacil.com.ar/foros/index.php

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Hablemos del Ruuuido
« Respuesta #51 en: 10 de Abril de 2008, 10:53:37 »
Estimado Leon, entiendo "perfectamente" que significa el GOTO $ y para que se lo esta utilizando en este thread, lo que simplemente pregunte fue, cual es el valor hexadecimal en que se traduce la instrucción GOTO $, simplemente eso...
Gracias ...

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3484
    • Mensajes de la Virgen María
Re: Hablemos del Ruuuido
« Respuesta #52 en: 10 de Abril de 2008, 11:59:41 »
Perdón,  perdón, richi, no es que te trataba de burro si no que no lograba entender lo que preguntabas.

GOTO $ corresponde al valor hexadecimal como 2A y los dos siguientes valores corresponde a la dirección a apuntar.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

-Mi propio Foro de Meteorología
www.meteorologiafacil.com.ar/foros/index.php

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Hablemos del Ruuuido
« Respuesta #53 en: 10 de Abril de 2008, 13:17:15 »
Hola Leon, muchas gracias por el dato :), justamente lo que queria explicar era eso, como comente muchas veces no conozco para nada la arquitectura MicroChip, pero si te puedo comentar de otras...vamos al ejemplo:
Si mal no entendi no seria tan asi como esta puesto en el ejemplo, si vemos el dump de la memoria de ejecucion ( Por favor corriganme si escribo alguna burrada )
Supongamos que nuestro código termina en la dirección 00FF
Código: [Seleccionar]
00FF ... fin de nuestro código
0100 ... 2A 00 --> GOTO $
0102 ... 2A 00 --> GOTO $
Si por cualquier causa ajena el PC se corrompe y cae en dirreccione pares todo ok, el salto incondicional hace que actue el watch-dog y el micro se reseta, hasta aca todo barbaro, pero que pasa si el PC se corrompe y cae en la dirección 0101, en este caso habria que ver cual es el opcode que interpreta al decodificar 00 y que es lo que hace el micro despues y hasta resetearse por watch-dog.
Como comente antes, en otros micros se coloca directamente un opcode invalido o un trap o interrucpcion por soft ( SWI ) que solo ocupa un byte, sea cual sea la dirreccion del PC siempre la situación es maneja correctamente.
Saludos ! y espero haber sido claro.




Desconectado flacoclau

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1692
    • El Micro Reactor
Re: Hablemos del Ruuuido
« Respuesta #54 en: 10 de Abril de 2008, 14:14:21 »
Otra opción es colocar, creo que la memoria de programa viene así, NOP en todas las posiciones, cuando el PC desborda empieza nuevamente desde cero.
Las personas con buena ortografía me atraen textualmente.

El Micro Reactor

Córdoba capital - Argentina.

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3484
    • Mensajes de la Virgen María
Re: Hablemos del Ruuuido
« Respuesta #55 en: 10 de Abril de 2008, 21:30:03 »
Richi, en la arquitectura de los PIC, cada palabra o instrucción ocupa una pocición de memoria, no lo hace en 2 pociciones, es por eso que si tiene 1K de memoria, puedes poner solo 1024 instrucciones, o si tiene 2K de memoria, puedes poner hasta 2048 instrucciones, obviamente.

En tu ejemplo, te falta la pocición de memoria 0101. Se que está echo a propósito. Digamos que al momento de cargar o quemar al PIC, modificamos el programa en el ICPROG y salteamos una pocición de memoria, vamos en tu caso la 0101, y ponemos una instrucción en la 0102, bien, si por alguna circunstancia, cae a la pocición de memoria 0101, el CP se encuentra con el valor 3FFF, que corresponde a la instrucción ADDLW 0xFF (3F = ADDLW y FF el valor mismo)

Tu ejemplo está mal:
Código: [Seleccionar]
00FF ... fin de nuestro código
0100 ... 2A 00 --> GOTO $
0102 ... 2A 00 --> GOTO $

En la pocición de memoria 0102 al poner la instrucción goto $ quedaría con el valor 2A02 y no 2A00, si en la pocición 0103 ponemos la instrucción goto  $ queda cargado con el valor 2A03 y así sucecivamente. Lo pongo con un ejemplo:

Código: [Seleccionar]
00FF .... fin de nuestro código
0100 ... 2A00 --> GOTO $
0101 ... 2A01 --> GOTO $
0102 ... 2A02 --> GOTO $
0103 ... 2A03 --> GOTO $
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

-Mi propio Foro de Meteorología
www.meteorologiafacil.com.ar/foros/index.php

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3484
    • Mensajes de la Virgen María
Re: Hablemos del Ruuuido
« Respuesta #56 en: 10 de Abril de 2008, 22:03:17 »
Otra opción es colocar, creo que la memoria de programa viene así, NOP en todas las posiciones, cuando el PC desborda empieza nuevamente desde cero.

Si llenamos la memoria de programa con NOP, lo que hace es nada, hasta llegar a la última pocición de memoria que empezará de nuevo. No se si es recomendable.



Algo que se me acaba de ocurrir para cuando no se trabaja con el WDT es llenar las pociciones de memoria de programa con la instrucción:

        GOTO      RUIDO

y colocamos la rutina RUIDO al principio de la pocición de memoria, digamos después del 05, de esta manera:

Código: [Seleccionar]

FALLA      EQU     0X30        ;La pocición 0x30 de la RAM, la llamamos FALLA
;
      ORG     0                      ;Aquí apunta cuando hay un reset
      GOTO   PRINCIPAL        ;Va al principio de nuestro programa
      ORG     4                      ;Aquí apunta cuando hay un interrupción
      GOTO   INTERRUPCIÓN  ;Va a la rutina de interrupción
;
RUIDO                                ;Atiende a la rutina de un ruido
       BSF     FALLA,0             ;Ponemos a 1 el bit 0 de la pocición de la RAM 0x30
       GOTO  PRINCIPAL         ;Va al principio de nuestro programa
;
INTERRUPCIÓN                    ;Rutina de la interrupción
       ......
       ......
       ......
;
PRINCIPAL                          ;Comienza nuestro programa.
       BTFSC   FALLA,0           ;Que el CP salte si el bit 0 de la pocición 0x30 de la RAM es 0
       GOTO    PROBLEMA       ;Es 1, hubo ruido
       ......                             ;Es 0, no hubo ruido
       ......
       ......
;
PROBLEMA                          ;Rutina por ruido
       .......                            ;Realizamos un aviso a nuestra medida.
       .......
       .....
;
       end

De esta manera si tuvimos ruido y el CP fue hasta una pocicón de memoria que no corresponde a nuestro programa, nos generará un aviso mediante un mensage en nuestro LCD, o por un LED y hacer el trabajo requerido para saber si hay errores o continuar desde se produjo un salto por ruido.

Un punto a aclarar es que el ruido puede hacer saltar al CP, justo en una intrucción de todo nuestro programa haciendo que el PIC, se comporte en forma errática. Mi idea es para cuando ocurre en las pociciones vacías.

Me gustaría algunas opiniones sobre mi idea.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

-Mi propio Foro de Meteorología
www.meteorologiafacil.com.ar/foros/index.php

Desconectado flacoclau

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1692
    • El Micro Reactor
Re: Hablemos del Ruuuido
« Respuesta #57 en: 11 de Abril de 2008, 01:03:06 »
Richi, en la arquitectura de los PIC, cada palabra o instrucción ocupa una pocición de memoria, no lo hace en 2 pociciones, es por eso que si tiene 1K de memoria, puedes poner solo 1024 instrucciones, o si tiene 2K de memoria, puedes poner hasta 2048 instrucciones, obviamente.

Otro dato Leo, es que desde la familia 18f las instrucciones ocupan entre dos y cuatro lugares de la memoria del programa, por lo que el PC cuenta de dos en dos, me parece haberlo leído en el datasheet pero recuerdo bien, que el bit menos significativo del PC no está implementado, por lo que no habría forma que el puntero quede en una posición impar, ojo tengo que buscar en el Datasheet.
saludos.
Las personas con buena ortografía me atraen textualmente.

El Micro Reactor

Córdoba capital - Argentina.

Desconectado Gonzalo_BlackHawk

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 519
Re: Hablemos del Ruuuido
« Respuesta #58 en: 11 de Abril de 2008, 01:04:53 »
Hola a todos los combatientes fervorosos del ruido mediante ejercitos de unos y ceros  :D :D. He visto muchas ideas interesantes aqui, de las cuales he tomado algunas en conjuncion con un poco de creatividad para crear lo que hoy utilizo como un modelo de programa que hasta ahora ha soportado condiciones industriales que yo considero casi espantosas.

Lo que yo utilizo basicamente es el modelo de flags y checkpoints, expuesto en alguna ocasión por Azicuetano, que permite que el programa se ejecute en un orden totalmente predecible, he complicado un poco los checkpoints y los flags para hacer posible la ejecución de mis programas, pero si que el esfuerzo ha valido la pena. La verificación de estos marcadores de seguridad como yo les digo puede tener dos efectos cuando se detecta que el programa no esta haciendo lo correcto: uno es el reseteo completo del microcontrolador por un bucle que me termina reiniciando el WDT, que generalmente lo produzco para errores criticos o bien en la etapa de carga inicial donde no pierdo nada con volver a empezar de nuevo. El segundo es generar un reinicio rapido donde el programa se realinea con el ultimo paso que hizo correctamente y asi el programa continua en forma normal sin necesidad de sacrificar el proceso que estamos realizando, de tal forma si el error es solo un salto a una instruccion incorrecta el programa se ajusta solo y uno no se da cuenta de lo que ha ocurrido, salvo porque mantengo un registro en memoria de los errores que se producen. Otra herramienta fundamental es tener el WDT bien justo por si el programa salta a una dirección de memoria vacia. Por ultimo utilizo una función creada por mi (Antes usaba la función restart_cause() del CCS pero a mi parecer tiene ciertas incontingencias para detectar que tipo de arranque se habia producido) que me permite realizar una accion diferente de carga para cada tipo de arranque del PIC en cuestión.

Lamentablemente sin el WDT esto no funciona pero siempre me las he arreglado para dejar el TMR0 disponible para el WDT, creando temporizadores simultaneos para un mismo TIMER, ocupa memoria si, pero este sacrificio de bytes es minusculo y me deja el WDT disponible.
Creo que ustedes estan tratando de hilar mas fino en el asunto (realmente son toda una tropa de expertos en el asunto) y la verdad es que ahora no tengo mucho tiempo para poder colgar un programa y que vean como organizo el código, asi que no se si mi opinión les servirá de mucha ayuda. Además mis programas los realizo en C, no estoy muy instruido en el Assembler que creo que es la clave para lograr inmunidad casi absoluta al ruido.

Saludos a todos.
"Siempre piensa si el jugo vale la exprimida..."

"La muerte esta tan segura de vencer que nos da toda una vida de ventaja."

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Hablemos del Ruuuido
« Respuesta #59 en: 11 de Abril de 2008, 10:28:07 »
Gracias Leon  por desasnarme un poco de la arquitectura :), y ahora entiendo mas, la situacion que plantee nunca pasaria con lo cual el GOTO $ tendria efectividad el 100 % de los casos.
Muchisimas gracias de nuevo !!!
Saludos !
« Última modificación: 11 de Abril de 2008, 10:33:49 por RICHI777 »