Forum: Mikrocontroller und Digitale Elektronik Taktfrequenz überprüfen.


von Alex (Gast)


Lesenswert?

moin, moin!
wie kann ich sicherstellen, ob mein µC wirklich mit 4Mhz läuft?
Dankeeee!

von Falk B. (falk)


Lesenswert?

@ Alex (Gast)

>wie kann ich sicherstellen, ob mein µC wirklich mit 4Mhz läuft?

Messen. Ein kleines Programm schreiben, welches ein Pin immer toggelt. 
Die Frequenz messen.

MFG
Falk

von Alex (Gast)


Lesenswert?

@Falk
hat ein Bekannter von mit auch vorgeschlagen.

ich soll also den pin toggeln. die Toggelfrequenz = Taktfrequenz?

von Martin (Gast)


Lesenswert?

z.B. (bei avr)

toggle:

sbi PORTD, 0

nop
nop
nop

cbi PORTD, 0

rjmp toggle

dann müsste die ON-Zeit genau 1uS lang sein.

von Alex (Gast)


Lesenswert?

@ Martin

oh, ich progge in Bascom.
was kann man machen, wenn die toggelfrequenz NICHT zur erwartenden 
Frequenz passt?

von Jan (Gast)


Lesenswert?

Hi,

do
waitms 1000
portd.1=1
waitms 1000
portd.1=0
loop

wenn deine Werte stimmen sollte der dann im 1sekundetakt an und aus 
gehen.

Gruß
Jan

von Alex (Gast)


Lesenswert?

@ Jan
warum waitms 1000 und nicht wait 1 ?

von holger (Gast)


Lesenswert?

>warum waitms 1000 und nicht wait 1 ?

Weil man ein toggeln mit 1ms nicht sieht.
Bei 1s kann man es besser sehen, und abschätzen
ist es ungefähr eine Sekunde.

von Jan (Gast)


Lesenswert?

Wait 1 würde auch gehen....
allerdings habe ich irgendwie im Hinterkopf, dass der Befehl wait 
schonmal Probleme mit sich bringt. waitms soll wohl zuverlässiger sein. 
Habe ich jedenfalls mal irgendwo gelesen.
Gruß
Jan

von Alex (Gast)


Lesenswert?

>Weil man ein toggeln mit 1ms nicht sieht

WAIT 1
also 1sek.

und noch was. 1 sekunde oder 1,3 sekunden kann man schlecht voneinander 
unterscheiden (mit bloßem Auge)
Desswegen lieber messen.

von Jan (Gast)


Lesenswert?

Wahrscheinlich will Alex nur überprüfen, ob er die Fusebits richtig 
gesetzt hat.
Aber messen ist natürlich besser, wenn man die entsprechenden Messgeräte 
hat.

Gruß
Jan

von holger (Gast)


Lesenswert?

>und noch was. 1 sekunde oder 1,3 sekunden kann man schlecht voneinander
>unterscheiden (mit bloßem Auge)
>Desswegen lieber messen.

Dann programmiere eine einfache RS232 Übertragung zum PC
mit 9600 Baud. Wenn Schrott ankommt ist die Taktrate falsch.
Da sollten Beispiele bei BASCOM dabei sein.

von Alex (Gast)


Lesenswert?

>Aber messen ist natürlich besser, wenn man die entsprechenden Messgeräte
>hat.

ja, also immer nur pin toggeln. und die toggelfrequenz soll dann die 
Taktfrequenz sein, oder?

von Jan (Gast)


Lesenswert?

Oder man wartet anstatt 1sek 100sek und nimmt sich eine Stoppuhr...
Gruß
Jan

von Alex (Gast)


Lesenswert?

ich habe schon mal led blinken lassen. mit wait 1 (also 1 sek).
es kann mir aber vor, dass es etwas länger dauert als 1 sekunde.
desswegen wollte ich noch mal genauen nachmessen.
was kann man machen, wenn es nicht stimmt?

von Simon K. (simon) Benutzerseite


Lesenswert?

Wenn es 2 Sekunden gedauert hat, läuft er mit genau der Hälfte der 
Takfrequenz. So einfach ist es ;)

von Alex (Gast)


Lesenswert?

>Wenn es 2 Sekunden gedauert hat, läuft er mit genau der Hälfte der
>Takfrequenz.

diese erkundung habe ich schon früher gemacht!

von holger (Gast)


Lesenswert?

>Wenn es 2 Sekunden gedauert hat, läuft er mit genau der Hälfte der
>Takfrequenz. So einfach ist es ;)

Genau. Und wenn man einfach 10 Wechsel auszählt kommt
man einigermaßen genau auf den Wert: 21,22,23,24,25,...

von Karl H. (kbuchegg)


Lesenswert?

Alex wrote:

> und noch was. 1 sekunde oder 1,3 sekunden kann man schlecht voneinander
> unterscheiden (mit bloßem Auge)

Oh. Das kann man gut unterscheiden.
Nimm eine Uhr mit Sekundenzeiger. Wenn der schnellaufende
Zeiger ganz oben ist, guckst du ganz schnell auf deine
Led. Dann wartest du und zählst das Aufleuchten der Led mit.
Wenn du bei 60 angekommen bist, guckst du wieder auf deine
Uhr.
Hast du 1 Sek. dann sollte der schnelllaufende Zeiger
wieder ganz oben sein.
Hast du aber 1.3 Sekunden, dann ist derselbe Zeiger jetzt
nicht mehr oben, sondern schon waagrecht und an dem Strich
auf der Uhr vorbei, neben dem 3 steht.

Mann. Sei ein bischen kreativ!!!!!

von Alex (Gast)


Lesenswert?

ok, danke!!!

von Vorschlag (Gast)


Lesenswert?

1
.include "m16def.inc"
2
3
  ldi r16, 0xFF
4
  out DDRB, r16
5
6
loop:
7
  sbi PORTB, 0
8
  cbi PORTB, 0
9
  rjmp loop

Die "Toggelfrequenz" entspricht hierbei der Taktfrequenz geteilt durch 6

von holger (Gast)


Lesenswert?

>Die "Toggelfrequenz" entspricht hierbei der Taktfrequenz geteilt durch 6

Dann braucht man einen Frequenzzähler oder ein Oszi um
das dann zu MESSEN.

von AVRFan (Gast)


Lesenswert?

>Die "Toggelfrequenz" entspricht hierbei der Taktfrequenz geteilt durch 6

Fügt man der "loop"-Schleife noch vier "nop"s hinzu, wird der 
Teilungsfaktor 10.  Dann muss man nichts umrechnen, wenn man die 
Frequenz mit einem Frequenzmesser kontrolliert.

von Johannes M. (johnny-m)


Lesenswert?

holger wrote:
>>Die "Toggelfrequenz" entspricht hierbei der Taktfrequenz geteilt durch 6
>
> Dann braucht man einen Frequenzzähler oder ein Oszi um
> das dann zu MESSEN.
...und außerdem kam ein ähnlicher Vorschlag oben bereits und 
darüberhinaus wurde weiter oben bereits festgestellt, dass der OP mit 
Assembler nix anfangen kann...

von AVRFan (Gast)


Lesenswert?

>wie kann ich sicherstellen, ob mein µC wirklich mit 4Mhz läuft?

Schreib doch ein Programm, das eine LED genau im Minutentakt blinken 
läßt.  Wenn Du das heute exakt um 22:00:00 Uhr startest und bis morgen 
abend laufen läßt, kannst Du sogar gucken, ob die LED morgen auch genau 
wieder um 22:00:00 Uhr angeht, oder ein paar Sekunden später oder früher 
(dann wäre Dein Quarz nicht besonders genau).

von AVRFan (Gast)


Lesenswert?

>Schreib doch ein Programm, das eine LED genau im Minutentakt blinken läßt.

Nachtrag: Realisier das aber unbedingt auf Basis eines Timers. 
Verwende keine Wait-Funktionen, weil denen gewisse Ungenauigkeiten 
anhaften.

von Tilmann W. (tilmann)


Lesenswert?

Hallo,

habe mal ein Bascom-Programm geschrieben, das einen Ausgang nach 4 
Stunden abschaltet und eine LED im Sekundentakt blinken läßt um zu 
zeigen das sich was tut. Es arbeitet mit externem Oszillator und Timer, 
ist richtig genau und ist ausführlich kommentiert, wie ich meine.

Vielleicht nützt es jemandem.

Dabei stand am Anfang die Überlegung, welcher Quarz (-oszillator) 
geeignet ist. Dabei habe ich geschaut, welche Taktfrequenz, geteilt 
durch den Vorteiler von 2^10 (=1024) eine glatte Zahl ergibt, d.h. eine 
mit ein paar Nullen hinten, die man vernünftig weiterverarbeiten kann so 
daß eine gradzahlige Frequenz rauskommt.

Dabei habe ich hier 2,4576 MHz genommen, geteilt durch 1024 ergibt genau 
2,4 KHz. Dann gibt es ja den 8-Bit-Timer, der also bis 256 zählt und 
dann einen Interrupt auslösen kann. Wenn man den auf den Startwert 16 
setzt, zählt er ja von 16 bis 256, also 240 Zyklen. Damit ergibt sich 
2,4 KHz geteilt durch 240 = 10 Hz. Also gibt es mit einer Frequenz von 
10 Herz Timer-Überläufe, die einen Interrupt auslösen können und dieser 
dann weiter etwas machen kann, wie z.B. eine Zähler bis 10 hochzählen, 
wenn er 10 erreicht hat ist eine Sekunde vergangen. Und so weiter ...

Die Timer sind halt ganz genau weil sie sich nicht vom sonstigen 
Programmablauf beeinflussen lassen.

Gruß Tilmann



'ATtiny13A schaltet nach 4 Stunden ein Relais ab.
'Weiterhin blinkt eine LED im Sekundentakt, um anzuzeigen daß sich etwas 
tut.


$regfile = "attiny13.dat"
$crystal = 2457600       'Frequenz des externen Oszillators

$hwstack = 10
$swstack = 10
$framesize = 20

Config Portb.0 = Output                   'blinkende LED an Pin 5
Config Portb.4 = Output                   'Relaisausgang an Pin 3
Portb.4 = 1     'Relaisausgang sofort einschalten wegen der 
Selbsthaltung

Dim Ticks As Word                         'Ticks sind die 
Timer-Überläufe
Dim Sekunden As Word
Dim Minuten As Word
Dim Stunden As Word
Config Timer0 = Timer , Prescale = 1024        'Die Quartzfrequenz ' 
zusammen mit dem Prescaler ergeben eine Frequenz von 2,4kHz
On Ovf0 Tim0_isr                  'Wenn Timer überläuft, löse
                                  'den Interrupt "Tim0_isr" aus
Enable Timer0
Enable Interrupts

Do
   'nicht weiter in der Hauptschleife
Loop

Tim0_isr:                           'Der Interrupt:
Timer0 = 16                    'Der Timer hat 8 Bit (256). Mit dem
                          'Startwert von 16 zählt er bis 240.
                          'Bei einer Eingangsfrequenz von 2,4 KHz ergibt
                          'sich damit eine Überlauffrequenz von 10 Hz.

Ticks = Ticks + 1                            'Ticks sind Timer-Überläufe
   If Ticks = 10 Then                        '10 Ticks sind eine Sekunde
      Ticks = 0                              'Ticks zurücksetzen
      Sekunden = Sekunden + 1                'Sekunden hochzählen
      Toggle Portb.0                         'nur blinken damit man 
sieht
                                             'das sich was tut
      If Sekunden = 60 Then                   'nach 60 Sekunden ...
      Sekunden = 0                     'Sekunden auf Null zurücksetzen 
...
      Minuten = Minuten + 1          ' ... und Minuten um eins 
hochzählen
      End If
      If Minuten = 60 Then                    'nach 60 Minuten ...
      Minuten = 0                    'Minuten auf Null zurücksetzen ...
      Stunden = Stunden + 1          ' ... und Stunden um eins 
hochzählen
      End If
      If Stunden = 4 Then
      Portb.4 = 0                    'Relais schaltet nach 4 Stunden aus
      End If
   End If
Return

End

: Bearbeitet durch User
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.