Forum: Mikrocontroller und Digitale Elektronik sinus signal abtasten mit C51 537


von Betro H. (betro73)


Lesenswert?

hallo ;
ich versuche  einen  sinus signal(0v........5v )mit  den frequenzen
(100hz..................bis 5khz ) abzutasten mit  dem  mikrocontroller
und  die  abgetasteten  werte  in  RAM zu  speichern und  spaeter  alle 
werte  zu lesen ...
leider  bekomme ich mit dem  programm  immer noch keine  daten  und  ich 
weiss nicht   wo  der fehler  legt ....
ich  will  zb 4000  abtastwerte lesen   in hyperterminal ...

(der ad  wandler  von meinem  mikrocontroller  hat  8 bit  auflösung )

vielen  danke  für  ihre  antwort
------------------------------------------------------------

#include<reg517.h>
#include<stdio.h>


xdata unsigned char buf[4000];
int i;
sfr S0RELL=0xAA;
sfr S0RELH=0xBA;
sfr ausgang=0xE8;
bit flag =0;
unsigned int i;


int AD_Erg=0;
void init_io(void);

void main (void)
{
  init_io();



  ADM=  0x00;
  ADEX = 0;

  ADCON0 &= 0x80;

  ADCON1 = 0x00;                   // kanal AN0  ,  bei mir  p7.0
         DAPR=0x00;


  TF1=0;            // Überlauf-flag vorsichthalber     löschen
  TMOD=0x10;        //  reloadbetrieb  durch überlauf ,timer 2  EIN

    TL1= 0xff;             //  timming von mikrokontroller 50 us   timer


    TH1=0xce;

                               //Interrupt hauptschalter  EIN
    ET1=1;                       //timer 1 interrupt
    EAL=1;
    TR1=1;
  while (1)
     {
       //  if (flag==1)
         //  {
         //   printf("Ad_Wert=%d\n", buf[i]);
           //flag=0;
           //}
      }

}

void init_io(void)                   // initialiserung der serille 
schnitstelle S0

{
  S0RELL=0xEC ;                   //Reloadwert=1024- 
(Fosz/(32*Baudrate)) baudrate 19200
  S0RELH=0x3;
  S0CON= 0x52;                   // Mode 1
  PCON |= 0x80;                 //SMOD =1
  BD=1;                         // Internbaudrate generator

}

void timer1(void) interrupt 3     // Interruptserviceroutine

 {
  DAPR = 0x00;             // A-D-Wandler starten
  while(BSY);                      // warten auf Wandlung komplett

  buf[i] = ADDAT;
  i=i+1;
  if(i==4000)
  {
      for(i=0;i<=4000;i++)
       printf("Ad_Wert=%d\n", buf[i]);
  }
    ET1=0;
  TR1=1;                             // TF1-Bit löschen

  flag=1;
  }
}
}

von JÜrgen G. (Firma: 4CKnowLedge) (psicom) Benutzerseite


Lesenswert?

Ich hab mal schnell über das Programm drübergelesen und das einzige was 
mir Sorgen macht sind die 4000 Messwerte...

Du benutzt den SAB80C537 sehe ich das richtig?

von JÜrgen G. (Firma: 4CKnowLedge) (psicom) Benutzerseite


Lesenswert?

die init für den AD-Wandler kannst du auch in eine eigene Funktion 
packen...



mit welchem compiler arbeitest du? hast du die möglichkeit zu debuggen?!


woher kommen die printf?! das hab ich beim µC ja noch nie gesehen... 
ebenfalls die stdio.h! Du musst die Daten der AD Wandlung in einen Sende 
FIFO für die UART schreiben...

von Tcf K. (tcfkat)


Lesenswert?

Wo wird die Variable i zu 0 initialisiert? Ich bin mir gerade nicht ganz 
sicher, ob Variablen im Global Name Space durch den Compiler 
initialisiert werden, aber besser einmal zuviel initialisieren, als 
einmal zu wenig!
Meckert der Compiler nicht über die doppelte Definition von i?
Teste Dein printf mal separat mit festen Strings, um die Strecke 
UART-RS232-PC-Terminal zu sichern.

Nebenbei, um Code zu posten gibt es eine spezielle Formatierung, da wird 
dann auch nicht umgebrochen.

Edit: Nochwas, die Abtastfrequenz muss mindestens doppelt so hoch sein, 
wie die höchste zu messende Frequenz, das ist klar?

von Betro H. (betro73)


Lesenswert?

danke  erstes  mal  .
also  die  variable i  wird  oben global   und sie  ist
zwischen 0  und  255   weil  ich einen  ad -wandler  8 bit ...
der  compiler  meldet  gar  keine  fehlern  aber  ich bekomme  keine 
daten  über  serielle  schnitstelle rs232....

vielleicht  hat  zu  tun mit  printf ....?

von Tcf K. (tcfkat)


Lesenswert?

Hafid Zaifri wrote:
> danke  erstes  mal  .
> also  die  variable i  wird  oben global   und sie  ist
> zwischen 0  und  255   weil  ich einen  ad -wandler  8 bit ...
> der  compiler  meldet  gar  keine  fehlern  aber  ich bekomme  keine
> daten  über  serielle  schnitstelle rs232....
>
> vielleicht  hat  zu  tun mit  printf ....?

Hä? Du verwendest i als Zählvariable, bis 4000... muss ich Dir Deinen 
eigenen Code erklären? Ich sehe nirgendwo eine explizite Initialisierung 
von i.
Das printf wie gesagt separat testen, mach das zuerst.

von Tcf K. (tcfkat)


Lesenswert?

unsigned int i = 0;

Besser aber, erstmal ein gutes Buch über die Programmiersprache C zu 
kaufen, zu lesen, und zu verstehen... dann sehen wir weiter. Ich mache 
im Netz grundsätzlich nur Hilfe zur Selbsthilfe. Nachhilfe nur gegen 
Vorkasse.

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.