ejemplo recepcion de datos y gaurdarlos en la memoria (tabla)

hola buenos dias;
estoy intentando hacer un programa para almacenar los datos que recibe el pic por la usart
y guardarlos en la memoria del pic para luego reenviarlos por la usart a modo de prueba

he leido por ahi manuales pero no me termina de quedar claro lo de almacenar los datos
y leerlos de nuevo podia alguien mandarme algun ejemplo para que vaya entendiendolo??
estoy trabajando con un 16f786

gracias
un saludo
 
Se le denomina direccionamiento indirecto, primero necesitas reservar un area especial en la RAM para poder guardar los datos y tambien una localidad extra conocida como "puntero" que contiene la ultima direccion escrita:

Código:
	puntero	equ H'0F'	;puntero de memoria
						;La tabla ira de 10h a 1Fh (15 datos)

ORG	H'0004'
	movlw	H'10'		;Se inicializa el puntero con la primer direccion
	movwf	puntero		;
	....
	....
	....


guardar:
	movf	puntero,w	;Se carga el puntero en el registro FSR con la 
	movwf	FSR			;direccion del puntero
	movf	dato,w		;Se recupera el dato a guardar y se envia a la 
	movwf	INDF		;tabla de datos
	incf	puntero,f	;se incrementa el puntero
	movlw	H'20'		;Se compara el puntero con 20H para determinar
	xorwf	puntero,w	;si ya se han guardado 16 datos
	btfss	status,z	;
	return				;return , o cambiar a goto segun sea el caso
	movlw	H'10'		;Se inicializa el puntero con la primer direccion
	movwf	puntero		;
	return				;return , o cambiar a goto segun sea el caso

En los PIC la direccion se coloca en el registro FSR y despues cuando quieres escribir de modo indirecto lo guardas en el registro INDF, eso le dice al micro que el dato lo guarde en la localidad de memoria con direccion "FSR"
 
es sencillo yo los guardo en un arreglo.

#include "16f877a.h"
#fuses xt,nowdt
#use delay(clock=4mhz)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=N)
char senal[95]={}; si el dato es entero int, flotante flaot, cadena char etc utilizare 95 datos
char x=0;

int e=0;
int i=1;


#INT_RDA interruccion por puerto serie
RDA_isr()
{
x=getchar(); leoo t lo guardo
while(i<95) obtendre 95 datos
{
senal=x; lo va guardando en la posicion de i cada vez que lo guarde se sale del while y aumenta i
break;
}
i++;

void main()
{


while(true)
{
}
si quisieser leer un dato tan solo haces senal[posicion del dato] y ya lo asignas a una variable o lo procesas etc
}
 
hola que tal;
me podrian explicar un poco el siguein tema?;
A modo de prueba para terminar de comprender el funcionamiento de las tablas tengo un programa en visual que me manda datos decimales por rs232 y los recibe el pic
ahora bien si el pic recibe 1 byte cada vez o sea un numero entre 0 y 255
como le digo yo al pic que numero es un dato y que numero es una direccion donde almacenar el dato?
no se si la direccion se tendria que enviar en hexadecimal y el dato como decimal
la verdad ando algo perdido en este tema
ahora me encuentro terminando de comprender como almacenarlos en tablas pero tan pronto termine quiero empezar a mandar direccion de almacenaje y luego dato

muchas gracias por su ayuda
la verdad desde que me hice miembro de este foro esta siendo muy grata la experiencia
de compartir y poder enseñarse mas
un saludo
 
Bien... tu problema es un problema de protocolos.
Para empezar, tu tienes un tipo de comunicación asíncronica, es decir, no tienes señal de reloj ni otras señales que te digan que estas recibiendo.

Este tipo de problema se soluciona manejando un protocolo de comunicación que debes inventarte a medida de tu problema. Como bien mencionaste, necesitas recibir dos datos (dato y direccion destino).
Aqui se me ocurren dos vertientes a trabajar. Una como tambien asumiste, es recibir pares de bytes (es decir, un word).
Pero en estos casos, yo prefiero trabajar si es posible, una comunicacion de datos consecutivos, es decir, yo se que el primer byte, corresponde a la primera direccion, el segundo a la segunda, y asi sucesivamente hasta llenar la tabla, cuentas el numero de bytes recibidos y cuando se completen X bytes, ya se lleno la tabla y recibiste todos los datos.

Pero si la tabla debe ser llenada de forma aleatoria, entonces si manejaras pares de bytes, muy similar a la primera opción, solo que la tabla "buffer" debe de ser interpretada de manera que, el primer byte es la direccion de la tabla destino y el segundo el dato. O bien al revez, eso tu lo defines.

Ahora a trabajar!
 
Atrás
Arriba