Forum: Mikrocontroller und Digitale Elektronik EKG Projekt bzw eig programmier problem :D (8051)


von Magdalena G. (magi)


Lesenswert?

hallo liebe community!
Ich habe folgendes Problem:
Ich soll ein EKG gerät nachbauen(schaltung habe ich bereits) von dieser 
schaltung übertrage ich mein signal über den adc (tl549) auf den MC 
(8051) und von diesem soll ich es über die RS232 auf den PC schicken und 
dort mit einem programm (hab ich schon in VB6 gemacht..) empfangen und 
die Daten in eine csv datei schreiben und diese dann in excel 
öffnen(diagramm ect) (in csv schreiben hab ich auch schon..).. das ganze 
8051 gebilde hab ich schon fertig auf nem board mit display und 2 
seriellen .. jetzt brauch ich aber die eine serielle zur 
programmübertragung auf den MC und die zweite sollte ich mit dem UART 
protokoll ansteuern.. ja und da hörts jetzt bei mir auf mim verständniss 
ehrlich gesagt(und ja ich hab mich schon versucht einzulesen usw .. wär 
nett wenn mir da wer weiter helfen könnte.. ich schreib mal einen auszug 
aus dem was ich schon hab (programmiert wird in KEIL) ..

#include<absacc.h>
#include<reg51F.h>
#include <intrins.h>
#include<lcdlib.h>
#include<stdio.h>

sbit clk = P1^0;
sbit input = P1^1;
sbit cs = P1^2;
char send_wert[5]; // array für den zu übertragenden wert

int einer,ZS,HS,miau; // variablen definition für wert ins array 
schreiben
int i ; // Zählervariable

void delay_ms(unsigned char ms)
{
  unsigned long us = 500*ms;

  while (us--)
  {
    _nop_();
  }
}

int adc_read()
{
  int i;
  int wert = 0;
  cs = 0;
  delay_ms(1);
  for(i=0;i<8;i++)
  {
    wert = wert<<1;
    wert |= input;
    clk = 1;
    clk = 0;
  }
  cs = 1;
  return wert;

/*wert in array schreiben */ // muss noch 30 hex dazu addieren für ascii

HS=wert/100;
send_wert[1]=HS;  // hunderterstelle

miau=wert%100;
ZS=miau/10;
send_wert[2]=ZS;

einer=miau%10;
send_wert[3]=einer;

}

//für jeden array wert einmal die sende routine aufrufen/jedes zeichen 
einzeln senden

/*void senden(char *send_wert){
for(i=0;send_wert[i]!='';i++){
acc=send_wert[i];
SBUF=send_wert[i]; // evtl anderes register nicht mehr sbuf
TB8=P;
while(!T1);
T1=0;
}
}*/
void sendfirst()
{
ACC=send_wert[0];
SBUF=send_wert[0];
TB8=P;
}

void senden (void) interrupt 4
{
  if (TI)
  {
      if( send_wert[i]=='\0')
    {
        IE =0;
      }
      for (i=1;send_wert[i]!='\0';i++)
    {
        ACC=send_wert[i];
        SBUF=send_wert[i];
        TB8=P;
        TI=0;
      }
  }
}

void main()
{
send_wert[0]='$'; // $ als startzeichen definieren
send_wert[4]= '\13'; // carriage return als letztes zeichen senden// 
line feed = '\10'
  adc_read();
  sendfirst();
  senden();
  LCD_init();
  while(1)
  {
    char buffer[10];
    int wert = adc_read(); // umrechnung auf 5V
    reg_write(0x01);
    reg_write(0x02);
    sprintf(buffer,"%d V",wert);
    stringxy(buffer,0,1); // ausgabe auff das lcd des strings
    delay_ms(10);
  }
}

von eProfi (Gast)


Lesenswert?

Und wo hakt es jetzt genau?
Was funktioniert und was nicht?


Es ist nicht gerade leicht, sich in das Programm reinzudenken.
Und man merkt, dass schon viel darin "gewütet" wurde.

Oft hilft es, mal in einfachen Worten (oder anhand eines Diagramms) sich 
selbst und den Beteiligten / Befragten  klarzumachen, was genau man 
will.

Versuchs mal.


Noch ein paar Verbesserungsvorschläge:
1.
#include<reg51F.h>
#include <intrins.h>
#include<lcdlib.h>
bitte entweder immer Leerzeichen oder nie.

2.
send_wert[0]='$'; // $ als startzeichen definieren
send_wert[4]= '\13'; // carriage return als letztes zeichen senden//
ebenso

3.
Ein bisschen Struktur würde die Lesbarkeit enorm steigern.
(Klammern gleicher Ebene immer in die selbe Spalte...)

Viel Glück und Erfolg!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.