www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Silabs 8051F300: Quellcodeproblem


Autor: Frank (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,
bin neu im Programmiergeschäft und habe mich gefreut, dass mein
Quellcode im Keil yvision3 nun endlich lief und das macht was er
sollte. Eine Frequenz am A/D-Eingang (Pin1 eines 8051F300 von
Silabs)erkennen und mit Vorgabewerten vergleichen.
In der Simulation klappt das auch, nur nach dem Übertrag auf die
Hardware geht es nicht mehr.
Ich benutze die Soundkarte meines PC's zur Frequenzgeneration und habe
das Signal (120mV Sinus 1600kHz) mit einer Shotky-Diode (soll die
negative Sinuswelle abschneiden) an mein Evalboard angeschlossen.

Nun wird aber nicht die Schwingungsdauer berechnet, sondern nur die
Zykluszeit für 10 Schleifendurchläufe. Das Prog würde sonst schon
richtig funktionieren, nur eben das Halten in der Schleife ist nicht
von der Frequenz abhängig.

Ich finde nix Vergleichbares in anderen Foren, noch komme ich die
letzten Tage selber drauf, also wenn jemand eine Idee hat, bitte alles
schreiben.
Den Quellcode hänge ich in den Anhang.

Schon mal besten Dank im Vorraus.

Gruß Frank

Autor: Arno H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
120mV sind auch für eine Gleichrichtung mit Schottky-Diode zu wenig und
1600kHz für die Soundkarte zu viel. Bei der Frequenz unterstelle ich mal
einen Schreibfehler, aber die Ausgangsspannung sollte schon die
Flussspanung der Diode überschreiten.
Arno

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, da sind mehrere logische Fehler im Code.

Wenn Du ne Hysterese haben willst, dann mußt Du 2 Testschleifen
hintereinander und nicht ineinander setzen.

Du testest auch nirgends, ob überhaupt ein neues Wandlungsergebnis
bereit steht. Da gibts bestimmt ein Ready-Bit.

Sobald ADC0 > 20 ist, wird bis 10 gezählt und das wars dann.

Soweit ich weiß, haben die Silabs 8051 einen Fensterkomparatorinterrupt
und damit geht das aber viel einfacher.

Jedesmal, wenn einen neue Wandlung fertig ist und das Ergebnis liegt in
bzw. außerhalb der Fensterwerte, kriegst Du einen Interrupt und diese
kannst Du dann zählen und ausmessen.


Peter

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Arno,

ups, ja die 1600 sind Hz nicht kHz.

Bei den 120mV schließe ich einen Messfehler nicht aus, da eine
Veränderung am Lautstärkeregler das Erreichen eines Breakpoints (der
innerhalb einer while-Schleife zur Spannungs-Levelwahl liegt)
ermöglicht und bei zu geringer Lautstärke dieser nicht erreicht wird.
Daraus schloss ich, dass die Frequenz zum A/D-Wandler durchdringt.

Gruß Frank

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter,

die 2 Schleifen inneinander sollen nur nach einer aufsteigenden Flanke
suchen und die Abfallende ausklammern.

Die Wandlung habe ich mit dem Timer2 getaktet und damit zu jedem Takt
des 8051 auch ein neues Ergebnis des ADC's.

Aber Du hast recht, der besitzt einen Fensterkomparator.
Dann versuche ich es mal lieber auf diese Art über den Interrupt.

Also besten Dank für den Tip, supi, wieder Hoffnung und sicher ne kurze
Nacht. :-)

Gruß Frank

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"die 2 Schleifen inneinander sollen nur nach einer aufsteigenden Flanke
suchen und die Abfallende ausklammern."


Tun sie aber nicht, die erste ist vollkommen wirkungslos.

Sie müssen nacheinander stehen !
do{
  while(ADC0>0x15); // warte auf <=0x15
  while(ADC0<0x20); // warte auf >=0x20
//  Nulldurchgang = ++Nulldurchgang; sowas ist Mumpitz (undefiniert)
  Nulldurchgang++; // so ists richtig !
}while( Nulldurchgang <=10 ); // Ende


Peter

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Die Wandlung habe ich mit dem Timer2 getaktet und damit zu jedem Takt
des 8051 auch ein neues Ergebnis des ADC's."

Nö.

Die Wandlung benötigt Zeit, also hast Du mehrere Takte lang den
gleichen Wert stehen, bis die nächste Wandlung fertig ist.


Peter

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja erwischt, ich habe gemeint, nach einer Wandlung beginnt gleich die
Nächste ohne Wartezeit. So sollte es aber richtig sein, hoffe ich.

zur Schleife:
wenn ichs richtig verstehe, dann zählst Du damit die Durchgänge durch
den Bereich zwischen 0x15 und 0x20. Wie schließe ich aber aus, dass der
Bereich links und rechts vom Scheitel mitgezählt wird, besonders wenn
ich beim Beginn vom Scheitel her auch die fallende Flanke zuerst haben
kann? Ich habe da keinen definierten Anfang, nur irgendwo im
Sinussignal.

Meinen Denkfehler habe ich aber jetzt wenigstens verstanden.

Frank

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter,

also der Tip mit dem Window detector war echt Gold wert.

Das Ding läuft nun und macht sogar was es soll, naja fast, die
Umrechnung passt noch nicht über den ganzen Frequenzbereich, aber das
kann auch am Input liegen. Da ich eine sehr geringe Abweichung der
Einzelmessungen erhalte bin ich guter Dinge.

DANKE DANKE DANKE für Deine Hilfe. Ich muss jetzt erst mal den ganzen
Tag mit nem Grinsen durch die Gegend laufen. :-)

Gruß Frank

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.