mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frequenzmessung


Autor: Wörnz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute!

Ich hoff ihr könnte mir weiter helfen.

Ich muss eine Frequenz messen, um eine Regelung zu realisieren.
Ich verwende dabei den Timer 0 und den Timer 2. Mit dem Timer0 mach ich
ein Zeitintervall. In dieser Zeit werden die Impulse mit dem Timer2
gezählt.

Anbei hab ich mein Programm.

Ich hoffe jemand kann mir helfen, bin Anfänger.

Lg Wörnz

Autor: Schoaschi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo ist denn dein Programm? Welche µC? Welche Sprache? und vorallem...
welche Probleme?
mfg Schoasch

Autor: Wörnz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <reg517.h>
#include <stdio.h>
#include "lcd.h"


float speed;
void messung (void);
void takt (void);
int t2low,t2high;
int a;


void INTTIM0 (void) interrupt 1
{
        t2low  =  TL2;
        t2high =  TH2;
        TH2    =    0;
        TL2    =    0;
        TH0    =  -39;
        TL0    =    0;

}

void messung (void)

{


TMOD  =  0x01;          /**** Timer 0 Mode 1 16 Bit             ****/
TH0   =   -39;          /**** Vorgesetzter Wert, alle 100ms Int.****/
TL0   =     0;          /**** Vorgesetzter Wert                 ****/
ET0   =     1;          /**** Timer 0 Interrupt enabled         ****/
T2CON =  0x02;           /**** Timer 2 Counter Einstellung       ****/
TH2   =     0;           /**** Timer 2 Startwert High Byte       ****/
TL2   =     0;           /**** Timer 2 Startwert Low Byte        ****/
IT1 = 1;                /**** Externer Interrupt 1 negative Flanke */
EX1 = 1;                /**** Externer Interrupt 1 enabled      ****/
EAL   =     1;           /**** Interrupt allgemein erlaubt       ****/
TR0   =     1;           /**** Einschalten der Zeitschleife      ****/


while (1)
{

        speed = (41.66 *( (float)t2low + 256.0 * (float)t2high ));
        ptintf("F=%f",speed);

}
}


void takt (void)
{
a=300;

CTREL = 65535-a;                   /*Reloadwert*/
CTCON = 0;                       /*fz=6Mhz*/
CMSEL = 0x80;                    /*Auswahl Port4.7*/
CMEN = 0x80;                     /*Freigabe Port4.7*/


while(1)
{

 CM7 = 65535-a/2;

}
}
main()
{
messung();
takt();
}




Arbeite mit dem µ-controller 80C51 Entwicklungsboard und werde dann das
Programm auf den Atmell 89S52 umschreiben.

hab folgendes Problem:

Es zeigt einfach das gewünschte Ergebnis an, obwohl ich mir sicher bin
dass das Programm funktionieren muss. es ist sicher nur ein kleiner
Fehler aber ich komm nicht drauf.

Lg Wörnz

PS.: sorry dass es am anfang nicht funktioniert hat mit dem Programm,
und dass ich nicht genauere Daten angegeben hab.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
80C51? Und was soll dann die reg517.h?

Autor: Neuer Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich denke wenn die erste Funktion nach Power-up main() ist, dann sind
vielleicht die zahlreichen while(1) loops dein Problem, denn wie soll
der Controller in die Funktion takt() kommen wenn Du ihn mit while(1)
in messung() "gefangen" hälst. Genauso würde while(1) in takt() den
Controller für ewig an der Stelle "gefangen" halten und der Rest von
deinem Programm würde nie wieder ausgeführt werden.
Hoffe ich konnte helfen.

Autor: Wörnz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab mein Programm geändert:

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


float speed;
void messung (void);
void takt (void);
int t2low,t2high;
int a;


void INTTIM0 (void) interrupt 1
{
        t2low  =  TL2;
        t2high =  TH2;
        TH2    =    0;
        TL2    =    0;
        TH0    =  -39;
        TL0    =    0;

}

void messung (void)

{


TMOD  =  0x01;          /**** Timer 0 Mode 1 16 Bit             ****/
TH0   =   -39;          /**** Vorgesetzter Wert, alle 100ms Int.****/
TL0   =     0;          /**** Vorgesetzter Wert                 ****/
ET0   =     1;          /**** Timer 0 Interrupt enabled         ****/
T2CON =  0x02;           /**** Timer 2 Counter Einstellung       ****/
TH2   =     0;           /**** Timer 2 Startwert High Byte       ****/
TL2   =     0;           /**** Timer 2 Startwert Low Byte        ****/
IT1 = 1;                /**** Externer Interrupt 1 negative Flanke */
EX1 = 1;                /**** Externer Interrupt 1 enabled      ****/
EAL   =     1;           /**** Interrupt allgemein erlaubt       ****/
TR0   =     1;           /**** Einschalten der Zeitschleife      ****/





}


void takt (void)
{
a=300;

CTREL = 65535-a;                   /*Reloadwert*/
CTCON = 0;                       /*fz=6Mhz*/
CMSEL = 0x80;                    /*Auswahl Port4.7*/
CMEN = 0x80;                     /*Freigabe Port4.7*/


while(1)
{

 CM7 = 65535-a/2;
 speed = (( (float)t2low + 256.0 * (float)t2high ));
 printf("F=%f \n",speed);
}
}
main()
{
messung();
takt();
}




Um das Programm zu testen erzeug ich gleichzeitig auf Port 4_7 ein TTl
-Signal vo 19kHz. Dieses Signal leg ich auf den Eingang von timer2.
Port1_7. Aber es funktioniert noch immer nicht.

Bitte um Tipps.

LG

Autor: Neuer Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welchen Typ von Controller verwendest Du denn genau?
Das könnte doch sehr hilfreich sein.

Autor: Wörnz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich verwende den Microcontroller 80C517A..

Autor: Schoaschi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Benutzt du das Humerboard bzw kennst du es? Hier könnten vl für weitere
PRojekte hilfreiche Informationen sein:
http://www.humerboard.at/

Nun zum eigentliche Problem. Wo benutzt du denn den externen Interrupt
jemals? Mir ist sie nicht aufgefallen ;-)

Und was soll folgende Zeile bewirken:
CM7 = 65535-a/2;

Autor: Schoaschi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi.

So. ich hab mir nochmal deinen Code angesehen und hab noch folgende
Vorschläge zur Änderung.
1.)
a=300;
CTREL = 65535-a;                   /*Reloadwert*/

Diese sind ja statische Werte, also warum rechnenst du das nicht gleich
selbst aus und tragst den wert ein? Dadurch ersparst du dir ein paar
Arbeitstakte ;-)
Also:
CTREL= 65235    //Reloadwert = 65535-300

Die Wahl deiner Variablen und Funktionen sind auch nicht gerade
Vorteilhaft. So würde ich statt "messung" den Namen "init" oder so
nehmen, denn hier Initialisierst du den Timer und die Interrupts ja
nur.
Und als "speed" würde ich "freq" oder so was nehmen. Also Versuch
immer selbsterklärende Namen zu nehmen.

Warum benutzt du als Taktquelle eigentlich nicht einen
Funktionsgenerator oder einen Quarzoszillator zb? Fang lieber mal so
an, dadurch ist es etwas übersichtlicher und die
Fehlerwahrscheinlichkeit ist geringer und sie ist auch überschaubarer.

mfg Schoasch

PS.: Poste deinen Quelltext bitte das nächste mal als Anhang.

Autor: Wörnz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für deine Tipps. Ja ich verwende derzeit das Humerboard, und werde
deine Vorschläge ausführen.

mfg Wörnz

Autor: Neuer Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

sag mal was gibt die der µC denn auf der seriellen Schnittstelle aus?
Wilde Werte oder überhaupt nichts? Wenn ich beim C167 printf() benutze
ohne vorher die serielle zu Initialisieren, dann hängt sich der
Controller in printf() auf und macht im Programm nicht mehr weiter.
Könnte das auch noch ein Problem bei Dir sein, so das Du nichts auf der
seriellen sehen kannst und dein Progamm hängt?

mfg

Autor: Schoaschi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beim Humerboard muss man das normal nicht initialisieren, da das mit
beim Bootloader schon geschieht. Also sollte das kein Problem
darstellen.

Ich muss mal schauen ob ich meine alten Beispiele noch irgendwo habe,
dort sollte die Frequenzmessung noch irgendwo sein:-). Hast du leicht
bald mal Laborprüfung? Gehst du rein zufällig HTL Kapfenberg? Wenn ja,
welchen Lehrer hast du denn im Labor?

Autor: Wörnz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja ich geh htl.kapfenberg! Hab keine Laborprüfung sonder brauch das für
mein Porjekt!

Hab lehrer wie:

Mussmann
Frank
Schager
Prinz
Scher
Pölzl
.
.
.

warst du auch in kapfenberg??

>Ich muss mal schauen ob ich meine alten Beispiele noch irgendwo habe,
dort sollte die Frequenzmessung noch irgendwo sein:-).

wär echt super wenn du das Beispiel finden würdest. wär dir sehr
verbunden.

lg wörnz

Autor: Schoaschi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
loool

Da hast du aber echt einen tollen Haufen zusammen ;-) :-)

Ja, ich ging auch mal dort zur Schule und durft auch ein bisschen mit
dem Board spielen.

Naja, ich hab nachgesehen und muss dir leider sagen, dass ich dieses
Beispiel nicht mehr habe.

Was für ein Projekt machst du? Was soll es können? Welche Kriterien
soll es erfüllen?

Du kannst es mal bei Herr Prof. Paul probieren. Der hat ne gelbe Mappe
mit der er immer beim Humerboard unterrichtet, dort sollte eigentlich
ein Freuqenzmessungsbeispiel drinn sein.

Autor: Wörnz (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Habs geschafft!!! Die Frequenzmessung funktioniert! (nur auf dem 80c51
Board) Hab ein Messintervall von 1 sec. Die Messung ist sehr genau.

Nur muss ich mein Programm auf den AT89s52 umschreiben.
Hat wer Tipps wie ich meine Timer konfiguriere??

LG Wörnz

Autor: Wörnz (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Habs geschafft!!! Die Frequenzmessung funktioniert! (nur auf dem 80c51
Board) Hab ein Messintervall von 1 sec. Die Messung ist sehr genau.

Nur muss ich mein Programm auf den AT89s52 umschreiben.
Hat wer Tipps wie ich meine Timer konfiguriere??

LG Wörnz

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
WOW

Doppelposting mit 2 Tagen Abstand... Hat deine Maus zu viel Gras
geraucht? ggg

Autor: Wörnz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein im Prinzip nicht aber, als ich erstmals den Eintrag gelinkt hab ist
er nicht in die akuellsten Einträge gekommen.

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Wörnz:

Sollte auch nur ein kleiner Scherz sein ;) Ausserdem ist in den beiden
Postings auch unterschiedlicher Code im Anhang...

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.