PDA

Ver la Versión Completa : Microcontrolador pic16f877a y cport en delphi 7


italo_grossi
11-05-2008, 07:08:51
hola amigos me encuentro realizando una pequeña aplicaciones que me permite o permitiria ver las capturas que realiza el conversor analogico digital de un micriciontrolador (pic16f877a) y enviarlas via serial a un PC en al pc he diseñado una aplicacion en delphi 7 con el componente cport previamente instalado (aseguro que el componente esta bien instalado) bueno la cosa es que la aplicacion de delphi le manda una string a microcontrolador y este le empieza a mandar las capturas que va realizando en su ADC pero cuando llegan a la aplicacion de delphi y las voy guardando en una linea de un memo, pero estas no las recive bien como ejemplo si el micro manda un 158 en una linea aparece un 1 y en la segunda un 58 como puedo hacer para que este problema se arregle tengo los codigos tanto de el micro con el realizado en delphi.
se me imagina que trabajando directamente con el buffer esto podria tener solucion pero la ayuda de la documentacion que trae el componente para mi no es suficiente espero que me peudan ayudar no referenciandome la pagina de donde se debe bajar pues ya he estado en ese foro.

de ante mano muchas gracias.

coso
11-05-2008, 12:45:31
Un TMemo tiene varias strings de una clase q se llama TStrings. Para recoger desde el procesador seguramente con una string a secas tendrias bastante...

Vamos, en vez de
TMemo.Add(inttostr(valor_lpt))

hacer

s := s + inttostr(valor_lpt);

¿el 158 del ejemplo anterior te lo mandaba todo en un solo byte? si no es asi, es normal q por cada Add te haga un salto de linea.

FGarcia
11-05-2008, 18:47:11
cport? hay varios componentes de comunicacon serial y hasta el momento conosco 2 con este nombre. ¿Cual es el que tienes tu?
¿Como realizas la captura de los datos que envia el pic? ¿Puedes mostrarnos tu codigo?

italo_grossi
12-05-2008, 16:32:44
Haber las capturas las realizo con un pic.... el se encarga de capturar un vooltaje analogio y convertirlo en digital ademas de mandarle por protocolo serial por medio de un cable....a un pc.....

Adjunto la rutina en C y la aplicacion en delphi el componente cport que baje esta en: http://sourceforge.net/projects/comport/

Con respecto al primer comentario que se hizo en el foro efectivamente se manda un string y llega a cada a una linea del memo pero se ha hecho una rutina que ocupa un memo auxiliar k hace que cada vez que llega 3 datos junta las 3 lineas de ese emo auxiliar y hace un numero que va se copia en el memo que se ve en la aplicacion.

espero que me puedan ayudar son la ultima esperanza cualquier pregunta que tengan las respondere lo antes posible

coso
12-05-2008, 16:57:26
en delphi.zip has puesto todo menos el .pas :(.

italo_grossi
12-05-2008, 17:05:48
Amigos aca esta el codigo completo pero si lo kieren probar tendran que instalar el compornente cport que esta en la direccion que anteriormente he puublicado grax

coso
12-05-2008, 19:02:30
Italo_grossi me da la impresion que has ido cogiendo y pegando codigo de varios sitios sin comprender bien bien que hace...
mira, vamos a hacer que se te pongan los valores muestreados en la memo 'numero', sin que de momento lo pase al tchart, y me dices q te sale

en vez de ... (ComportRxChar)


var
Str,z,b,g: String;
dato, conv : real;
s,i:integer;
nume:double;

begin
ComPort.ReadStr(Str, count);
memo.Lines.Add(Str);
f:=f+1;
// label1.Caption:=floattostr(h);
//label2.Caption:=Str;
if (((memo.Lines[0]='x')or(memo.Lines[1]='x')or(memo.Lines[2]='x'))and(memo.Lines[3]<>'x')) then begin memo.Lines.Clear; f:=0; end;//goto GotoLabel; end;

if (f=4) then
begin
h:=h+1;
gran:=gran+1;
if (h=200) then begin series1.Clear; h:=0; end;
if (gran=2500) then begin series2.Clear; gran:=0; end;

z:=memo.Lines[0]+memo.Lines[1]+memo.Lines[2];
val(z,nume,s);
numero.Lines.Add(floattostr(nume));
series1.Add(nume*(strtofloat(edit1.Text))/255);
series2.Add(nume*(strtofloat(edit1.Text))/255);
f:=0;
memo.Clear;
// ComPort.ClearBuffer(True, False);
end;

end;




pon


var
s : string;
begin
ComPort.ReadStr(s,count);
while (s = 'x') or (s='y')do
begin
ComPort.ReadStr(s, count);
Application.ProcessMessages;
end;
numero.Add(s);
end;


esto en teoria te tiene que ir llenando la memo 'numero' de los numeros muestreados, sin las x ni las y...que por cierto, desde el fichero 7.c ... para q son las 'x' y las 'y's? no te iria mejor cambiarlo a printf("%lu",s) sin poner el printf("x") delante y el printf("y") detras?

venga, espero tu respuesta

FGarcia
12-05-2008, 19:23:29
Hice una prueba colocando un TrackBar en el formulario y este código:

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
If comport.Connected then
Comport.WriteStr(IntTostr(TrackBar1.Position ))
else
showmessage('Abra el Puerto primero');
end;

Conecte los pines 2 (Tx) y 3 (Rx) de mi puerto com en puente para que el trasmita y reciba simultaneamente.
Al TrackBar le puse un valor de mínimo 100 y máximo 500 con intervalos de 15 y en memo me aparecen perfectamente los tres dígitos. tres lecturas y se limpia el memo.

Pienso que el problema no esta en la recepcion sino en la manera en que estas enviando los datos, pero eso ya es codigo de los pics y ahi si no se nada.:)

italo_grossi
12-05-2008, 20:48:42
grax amigos por la ayuda pero contesto algunas preguntas.....los ocntervalos de 15 ms??? eso es demasiado timepo la idea es muestrear menos de 1 ms 500us seria lo ideal lo que pasa es que a esa velocidad el porgrama de delphi si agrupa los valores en 3 cifras y toodo bien pero cuendo bajo la velocidad ......entonces en algunas lineas del memo encontremos solo un valor y entraas nada o en otroas la cifra entera.

la cosa creo k va mas que nada en trabajar no recepcionando el buffer del puerto serial se que mi codigo es muy basico y no he solo copiado o pegado como se dice ahi me base en un ejemplo que traia el mismo componente cport se que a baja velocidad ni un problema... pero es no es mi idea.....

estoy probando las posibles soluciones que me han anviado.........ahhh lo ultimo la rutina del microcontrolado es muy basica y solo manda un string....noc reo que eso sea el problema.

coso
12-05-2008, 21:59:56
Quiza el problema esta en que por debajo de los 15 ms la aplicación aun esta ejecutando otro codigo, por lo que algunas muestras se 'pierden'...

bueno, es una idea. Quiza pasa por optimizar el codigo de 7.c...

FGarcia
13-05-2008, 02:37:12
Hola!
No me explique correctamente, los intervalos de 15 no son intervalos de ningun temporizador, son los intervalos que avanza en su posicion el trackbar.

Despues de dormir y descansar (aja!) probe con un timer en intervalos de 1ms e insisto funciona bien. Solo añadi al formulario un Timer con su propiedad Interval a 1 y un boton de inicio.

procedure TForm1.Button7Click(Sender: TObject);
begin
if timer1.Enabled then
begin
Button7.Caption := 'Timer On';
timer1.Enabled := false;
end
else
begin
Button7.Caption := 'Timer Off';
timer1.Enabled := true;
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
trackbar1.Position := TrackBar1.Position + 1;
end;

MaMu
15-05-2008, 06:42:31
procedure TForm1.Button7Click(Sender: TObject);
begin
if timer1.Enabled then
begin
Button7.Caption := 'Timer On';
timer1.Enabled := false;
end else
begin
trackbar1.Position := 0; //Y esto no??? o mantenemos lo anterior?
Button7.Caption := 'Timer Off';
timer1.Enabled := true;
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
trackbar1.Position := TrackBar1.Position + 1;
end;


Saludos