sinus signal abtasten mit C51 537

OP #653976
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;
  }
}
}
(Firma: 4CKnowLedge) Persönliche Seite #654250
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...
#654495
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?
OP #654498
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 ....?
#654499
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren