Forum: Mikrocontroller und Digitale Elektronik Frequenzmessung


von Wörnz (Gast)


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

von Schoaschi (Gast)


Lesenswert?

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

von Wörnz (Gast)


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.

von johnny.m (Gast)


Lesenswert?

80C51? Und was soll dann die reg517.h?

von Neuer Gast (Gast)


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.

von Wörnz (Gast)


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

von Neuer Gast (Gast)


Lesenswert?

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

von Wörnz (Gast)


Lesenswert?

ich verwende den Microcontroller 80C517A..

von Schoaschi (Gast)


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;

von Schoaschi (Gast)


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.

von Wörnz (Gast)


Lesenswert?

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

mfg Wörnz

von Neuer Gast (Gast)


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

von Schoaschi (Gast)


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?

von Wörnz (Gast)


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

von Schoaschi (Gast)


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.

von Wörnz (Gast)


Angehängte Dateien:

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

von Wörnz (Gast)


Angehängte Dateien:

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

von Magnus Müller (Gast)


Lesenswert?

WOW

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

von Wörnz (Gast)


Lesenswert?

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

von Magnus Müller (Gast)


Lesenswert?

@Wörnz:

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

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.