Forum: Mikrocontroller und Digitale Elektronik Silabs 8051F300: Quellcodeproblem


von Frank (Gast)


Angehängte Dateien:

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

von Arno H. (Gast)


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

von Peter D. (peda)


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

von Frank (Gast)


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

von Frank (Gast)


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

von Peter D. (peda)


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 !
1
do{
2
  while(ADC0>0x15); // warte auf <=0x15
3
  while(ADC0<0x20); // warte auf >=0x20
4
//  Nulldurchgang = ++Nulldurchgang; sowas ist Mumpitz (undefiniert)
5
  Nulldurchgang++; // so ists richtig !
6
}while( Nulldurchgang <=10 ); // Ende


Peter

von Peter D. (peda)


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

von Frank (Gast)


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

von Frank (Gast)


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

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.