mikrocontroller.net

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


Autor: Alex (Gast)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Falk
hat ein Bekannter von mit auch vorgeschlagen.

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

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Martin

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

Autor: Jan (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Jan
warum waitms 1000 und nicht wait 1 ?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Jan (Gast)
Datum:

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

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Simon K. (simon) Benutzerseite
Datum:

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

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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,...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
1 lesenswert
nicht 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!!!!!

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, danke!!!

Autor: Vorschlag (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.include "m16def.inc"

  ldi r16, 0xFF
  out DDRB, r16

loop:
  sbi PORTB, 0
  cbi PORTB, 0
  rjmp loop

Die "Toggelfrequenz" entspricht hierbei der Taktfrequenz geteilt durch 6

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Die "Toggelfrequenz" entspricht hierbei der Taktfrequenz geteilt durch 6

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

Autor: AVRFan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: AVRFan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: AVRFan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tilmann Walker (tilmann)
Datum:

Bewertung
0 lesenswert
nicht 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

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.