Forum: Mikrocontroller und Digitale Elektronik Signal Zählen


von Oliver D. (smasher)


Lesenswert?

Hallo,

ich würde auf meinem AT89S52 gerne den Counter Mode des Timer0 
verwenden.
Dazu habe ich mir das Datenblatt durchgelesen und folgende Einstellung 
getroffen:
///
sbit PIN=0xB3;
sfr led=0x80;
void main (void)

{
TMOD=0b00000100;//Timer 0, Gate0,Countermode, 16Bit-Mode(P3.4 wird 
gezählt)
TF0=0;//OF Flag
TH0=0x00;//Startwert auf Null setzen!
TL0=0x00;
TR0=1;
for(;;)
{

PIN=1;
led=TL0;

}
}
///
In meinem Hauptprogramm habe ich dann einfach in einer endlosschleife 
den Pin 3.4 auf 1 gesetzt.
Dann sollte ja ein auf masse legen des Pins in den TL0 geschrieben 
werden.
Und diesen wert wiederrum schreibe ich in mein port 0x80, woran leds 
hängen.

Tut sich aber leider nix.

Weshalb?

Gibt es sinnvollere Lösungen eine Zeit zu messen?
Also z.B. das Gating umstellen, sodass bei Positiver Flanke angefangen 
wird zu zählen und bei Negativer aufgehört wird?
Den Wert, den ich dann im Register stehen habe, also die gezählte Zeit, 
muss ich mir dann nurnoch so verwursten, dass sie korrekt angezeigt 
wird.
(Also nachschauen, wie lange man z.B. von 0x00-0xAB braucht).

Für Tipps bin ich danbar!

von MC (Gast)


Lesenswert?

Ich kenne deinen C-Compiler zwar nicht, aber meiner (Keil µVision) kann 
keine binären Zahlen verarbeiten.
Also musst du
1
TMOD=0b00000100;
umformen.
1
TMOD=0x04;

Weiter weiß ich nicht, wie deine for-Schleife arbeiten soll.
Versuch doch mal
1
while(1)
2
{
3
  led=TL0;
4
}
anstatt von
1
for(;;)
2
{
3
4
PIN=1;
5
led=TL0;
6
7
}

von Oliver D. (Gast)


Lesenswert?

Alles klar, aber prinzipiell ist das doch korrekt "gedacht" oder?

von MC (Gast)


Lesenswert?

Funktioniert dein Programm jetzt?
Was möchtest du denn genau machen? Einmal sagst du, du möchtest ein 
Signal zählen, woanders sagst du, du möchtest eine Zeit messen?!

von Peter D. (peda)


Lesenswert?

Im Countermode werden die 1-0 Flanken am Takteingang gezählt.

Im Gatemode wird solange gezählt, wie der Gate-Eingang auf 1 ist.
Zusätzlich kann man noch einen externen Interrupt erzeugen lassen, wenn 
der Gateeingang auf 0 geht.


Was möchtest Du?


Peter

von Oliver D. (Gast)


Lesenswert?

Aaalso,

ich habe ein TTL Rechteck Signal, dessen Frequenz ich bestimmen möchte.

Dafür gibt es ja mehrere möglichkeiten und ich suche eine möglichst 
genaue.
Was ich mir gedacht habe ist, 10ms lang Veränderungen auf einem Portpin 
zu zählen.
Dummerweise wird dabei aber nur die durchschnitts Frequenz angezeigt, 
wenn während der 10ms eine Veränderung auftritt.
Das möchte ich vermeiden und suche nach einer guten möglichkeit dazu.

Ich hatte mir gedacht z.B. einen Timer der Gategesteuert zählt, zu 
verwenden.
Bei Positiver Flanke am Gate, geht er an, und bei negativer aus. Die 
Zählzeit müsste ich dann mit 2 multiplizieren, da ich ja nur den "high" 
teil des signals habe und der low teil noch fehlt.
Glücklicherweise sind die beiden exakt gleich lang. Also x2 rechnen.


Naja, ein paar nette vorschläge wären dazu hilfreich...

gruß
Oliver D.

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.