www.mikrocontroller.net

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


Autor: Betro Hafid (betro73)
Datum:

Bewertung
0 lesenswert
nicht 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;
  }
}
}

Autor: JÜrgen Grieshofer (Firma: 4CKnowLedge) (psicom) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: JÜrgen Grieshofer (Firma: 4CKnowLedge) (psicom) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Tcf Kat (tcfkat)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Betro Hafid (betro73)
Datum:

Bewertung
0 lesenswert
nicht 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 ....?

Autor: Tcf Kat (tcfkat)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tcf Kat (tcfkat)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.