Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

13/04/2014 #1

Avatar de jmth

Error "Indirect write" proteus
Hola, hoy estoy programando la comunicación entre 2 microcontroladores, para la que voy a usar el módulo de rf de 433mhz. He probado el sistema en proteus y me sale el siguiente error, al principio de la simulación y cuando envías algún dato. Es cosa del receptor:

PC=0x0040. Indirect write of 0x04 to adress 0x0000 is itself an indirect write

Traducción: la escritura indirecta de 0x04 en la dirección 0x0000 (creo que no estoy utilizando esa dirección ) es en sí mismo una escritura indirecta

Al recibir datos, cambia el 0x04 por cualquier otra cosa.

Y el código es éste:

Código:
#include <16f84a.h>
#include <stdlib.h>
#FUSES NOWDT,NOPROTECT,XT
#use delay(clock=4000000)
#byte trisa=getenv("SFR:TRISA")
#byte trisb=getenv("SRF:TRISB")
#byte portb=0x06
#bit OUT=0x05.0
#use rs232(baud=1200, xmit=PIN_B1, rcv=PIN_B2) 

int asdf[8]; //El vector donde se van a almacenar los datos que llegan

void main(){
   trisb=0b00000100; //Todo salidas menos el pin rcv en puerto B
   trisa=0x00; //Todo salidas en puerto A
   portb=0x00; //limpio el puerto B
   OUT=0; //Limpio el pin que voy a usar como indicador
   while(1){
      gets(asdf); //Coge lo que te llegue y almacenalo
      if((asdf[1]==64)&&(asdf[3]==64)){ //Si el primer y ultimo caracter es '@'
         if(asdf[2]==97){ //Y si el intermedio es 'a'
            OUT=!OUT; //Cambia el estado de la salida
         }
      }
   }           
}
Ya he estado cambiando algunos parámetros como minimizar el código en la declaración de variables y estado de los puertos pero sigue ocurriendo. ¿Ideas? Muchas gracias.
13/04/2014 #2

Avatar de Daniel Meza

Quizá el vector donde guardas los datos es iniciado en la dirección 0 de RAM y cuando escribe en la dirección 0x04 corrompe el mismo FSR. No se mucho de C pero ¿no puedes asignarle el inicio de direcciones al arreglo?. Para colocarlo después de la dirección 0x20
13/04/2014 #3

Avatar de jmth

En C no lo sé, sí que me acuerdo que se podría hacer en ASM, pero ahí ya es otra historia. Supongo que es algo de lo que se debería encargar el compilador.

Y añado: acabo de descubrir que la línea de la discordia es 'trisb=0b00000100;'

Éste valor en hexadecimal es 0x04, si lo cambio, el error cambia. Es algo que no me ha ocurrido nunca.

Vuelvo a editar

El error es que en la línea de declaración de trisb he puesto
trisb=getenv("SRF:TRISB") en lugar de SFR. Un tanto extraño porque lo he copiado de otro programa que hice anteriormente y sí funcionaba.

Ahora el mismo error ocurre cuando envío los datos, en el receptor. Y el problema me viene del gets. En lugar de utilizar gets he utilizado 3 veces getc y está funcionando.

Gracias!
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.