Forum: Mikrocontroller und Digitale Elektronik Taktfrequenz messen


von tex (Gast)


Lesenswert?

Hi!
Ich habe einen Mega128 extern mit 8Mhz getaktet, weil ich dem internen
Takt nicht getraut habe. Leider konnte ich die Masse Cs nicht mit
anlöten, weil mir die Pins bei einem früheren Problem mit dem
Oszillator "abhanden" gekommen sind. Somit fehlt mir nun die
Masseanbindung, um ein Signal messen zu können.
Der Oszillator scheint zu schwingen, weil die Fuses auf ext. gesetzt
sind und ich noch immer programmiern kann, aber ich traue dem Takt
nicht über den Weg.
(Problem mit der UART)
Gibt es einen Weg den Takt trotzdem zu messen?

von ...HanneS... (Gast)


Lesenswert?

Mit Testprogramm Pin toggeln und messen.

...

von tex (Gast)


Lesenswert?

Das setzt voraus, das man Assembler programmieren kann und weiss, wie
man das in den AVR reinbekommt? oder geht es auch mit einer Schleife in
C? Ich hatte an sowas wie
PORTE = 0x77
while(1)
{
PORTE = >>;
PORTE = <<;
}
gedacht.

von ...HanneS... (Gast)


Lesenswert?

Timer-Interrupt alle 256 Takte mit freilaufendem Timer0,
Pin toggeln, gemessene Frequenz mal 512.

Dürfte mit allen Prog-Sprachen funktionieren, sofern man damit umgehen
kann. Ich kann's (leider) nur (etwas) in ASM.

...

von AxelR. (Gast)


Lesenswert?

timer2 im CTC, OC2-Pin connect toggle. OCR2 stellt die Frequenz ein.

von tex (Gast)


Lesenswert?

Ich habe gerade noch den Prescaler Thread gelesen und mich mal bei
meinem mega128 auf die Suche gemacht. Dabei das hier gefunden.


The CKDIV8 Fuse determines the initial value of the CLKPS bits. If
CKDIV8 is unprogrammed,
the CLKPS bits will be reset to “0000”. If CKDIV8 is programmed, CLKPS
bits
are reset to “0011”, giving a division factor of 8 at start up. This
feature should be used if
the selected clock source has a higher frequency than the maximum
frequency of the
device at the present operating conditions. Note that any value can be
written to the
CLKPS bits regardless of the CKDIV8 Fuse setting. The Application
software must
ensure that a sufficient division factor is chosen if the selcted clock
source has a higher
frequency than the maximum frequency of the device at the present
operating conditions.
The device is shipped with the CKDIV8 Fuse programmed.

Wenn ich das richtig lese, ist meine Taktfrequenz also garnicht 8Mhz,
sondern nur 1Mhz?!? Das würde doch den Prescaler meiner seriellen
Schnittstelle auch beeinflussen, oder?

von ...HanneS... (Gast)


Lesenswert?

Die Megas werden mit 1MHz ausgeliefert.
Änderungen auf Sonderwünsche per Fusebit.

...

von Rufus T. Firefly (Gast)


Lesenswert?

"Leider konnte ich die Masse Cs nicht mit
  anlöten, weil mir die Pins bei einem früheren Problem
  mit dem Oszillator "abhanden" gekommen sind.
  Somit fehlt mir nun die Masseanbindung,
  um ein Signal messen zu können."

Hä? Der Controller hat doch einen Masseanschluss, und der muss auch
funktionieren, sonst hätte der ja keine Stromversorgung mehr.

Tastkopf an XTAL1 oder XTAL2 halten, Tastkopfmasse mit Masse
verbinden.

Meinst Du Oszillator im Sinne von Quarzoszillator oder im Sinne von
diskret angeschlossenem Quarz nebst kleiner gegen Masse zu schaltenden
Kondensatoren?

von AxelR. (Gast)


Lesenswert?

Da kann er wohl 5 Quarze /Oszillatoren anlöten, wenn er die Fusebits
nicht umstellt..

@tex
Hast Du nach oder vor dem "aufspielen" der HEX-Datei die Fuses auf
den gewünschten Wert gestellt? Ich habe das auch mal vergessen und mich
dann arg gewundert.

Kannst ja mal- geht am schnellsten- im Quellcode die Xtal Konstante auf
1Mhz setzen und die Baudrate runter auf 4800 nehmen. Wenns dann geht,
hast Du noch 1Mhz eingestellt...
AxelR.

von tex (Gast)


Lesenswert?

@Rufus
"..oder im Sinne von
diskret angeschlossenem Quarz nebst kleiner gegen Masse zu schaltenden
Kondensatoren?.."
Wie gesagt, die Kondensatoren musste ich weglassen.
Mit der Masse vom µC bekomme ich ein 650kHz Sinus mit 200mV Amplitude
und 100 mV Offset. Ich halte das für unrealistisch an einem 8MHz Quarz
zumal ich den zuvor an einen 80C537 dran hatte um rauszubekommen welche
der 4 Pins eigentlich beschatet sind. DAs Datenblatt von Epson war etwas
ungenau in diesem Punkt.

@Hannes
Ich habe mir mal die zwei Zeilen
#define CLKPR  _SFR_IO8(0x61)

buffer[17]=CLKPR;
ins Programm eingefügt aber es scheint 0 zu sein.
Dann dürfte doch eigentlich nicht dividiert werden?
Mach ich irgendetwas grundlegendes falsch?

von tex (Gast)


Lesenswert?

@Axel
Also 1MHz geht auch nicht ...
Ich hab dieses AVR Studio für die Fuses. Das sieht alles ein bisschen
komisch aus.
CKSEL ist 1101
SUT ist 01
Hab ich was übersehen?

von AxelR. (Gast)


Lesenswert?

Sei froh, dass Du AVR Studio für die Fuses hast! da steht doch nun alles
im klartext daneben. Sollte also stimmen. kannst ja noch CKOPT fuse
anhaken. Dann schwingt das Teil mit voller Amplitude.
Die Masse C's wegzulassen, ist aber so eine Sache...

von tex (Gast)


Lesenswert?

Das kann ich gerade nicht mehr ausprobieren. Irgendwas ist gerade
abgestorben. Der Sender sendet nicht mehr, AVR-Studio programmiert
nicht mehr und das Board läuft nicht mehr. Das kann jetzt dauern. Falls
noch jemand eine Idee hat bin ich vorab schon mal dankbar.
Ich probier noch mal die Cs irgendwie ranzubekommen.

von tex (Gast)


Lesenswert?

@Hannes
Folgendes Testprogramm gibt 1,33MHz zurück

.include "m128def.inc"
         ldi r16, 0xF0
         out DDRC, r16
         ldi r16, 0xF0
     out PORTC, r16
loop:
         ldi r16, 0xF0
     out PORTC, r16
     ldi r16, 0x00
     out PORTC, r16
         rjmp loop
Ist das so zu verstehen, das mein Mega128 mit mageren 1,5 Mhz läuft?

von ...HanneS... (Gast)


Lesenswert?

Hi...

.include "m128def.inc"
 ldi r16, 0xF0
 out DDRC, r16
 ldi r16, 0xF0
 out PORTC, r16
loop:
 ldi r16, 0xF0    ;1 Takt
 out PORTC, r16   ;1 Takt
 ldi r16, 0x00    ;1 Takt
 out PORTC, r16   ;1 Takt
 rjmp loop        ;3 Takte
                  ;-------
                  ;7 Takte
                  ;=======

Ist das so zu verstehen, das mein Mega128 mit mageren 1,5 Mhz läuft?

1,5 MHz??? - Wiso das denn?????

1,33 MHz * 7 = 9,31 MHz...

Dazu noch dein (unvermeidlicher) Messfehler...

...

von tex (Gast)


Lesenswert?

Ist es möglich sowas von einem 8MHz - Quarz zu generieren? Ich hab die
Cs inzwischen an den Quarz angelötet und bekomme nun auch einen
einigermaßen stabielen 8Mhz Takt
PS. Du siehst da oben mein erstes ASM-Programm! Da kannst Du nicht
erwarten, dass ich auch noch die Takte berechnen kann.

von ...HanneS... (Gast)


Lesenswert?

@Tex:

Streiche bitte sechs meiner Fragezeichen, dann sieht es nicht mehr so
arrogant aus... ;-) (denn arrogant war das eigentlich nicht gemeint)

Ich weiß ja nicht, mit welchen Mitteln du die Frequenz gemessen hast.
Mit meinen bescheidenen Mitteln würde ich sagen "das liegt in der
Toleranz".

Dein erstes ASM...
Das ist gut, denn das ASM-Wissen ist für den Umgang mit (AVR-) C
unverzichtbar. Die Takte habe ich gezählt, um dir zu zeigen, wie
einfach das geht. Wie du siehst, sagen die Kommentare mehr als der
Programmcode. Und du bist so dicht an der Hardware, dass du genau (Takt
für Takt) nachvollziehen kannst, was da passiert. In einer Hochsprache
kannst du da nur dem Compiler vertrauen (oder eben nicht) und hoffen,
dass er das günstig bis optimal macht. Wissen kannst du das aber erst,
wenn du den vom Compiler erzeugten Assemblercode analysierst. Ansonsten
kannst du nur "glauben" (statt zu "wissen"). Wie du siehst, ist ASM
doch schon ganz nützlich und es schadet nicht es (halbwegs) zu
verstehen.

Dafür kann ich aber kein C...

Gruß...
...HanneS...

von tex (Gast)


Lesenswert?

@Hannes
Keine Arroganz unterstellt. Bin für jede Hilfe dankbar und bei manchem
Thread packt auch mich der Fragezeichenwahn...
...? Irgendwo versucht hier jemand einen Frequenzmesser mit einem µC zu
bauen ?...
Das Projekt, das ich hier versuche zu realisieren, beruht auf einer 10
Jahre alten Idee. Mit dem 80537 hatte ich das alles super unter
Kontrolle, aber der ist wohl abgekündigt, und zeitgemäß ist er auch
nicht mehr
Das Problem ist aber, dass ich in dem Programm mit solchen Ausdrücken
daherkomme.
x = (280.46061837 + 360.98564736629 * (JD-2451545)
  +0.000387933  T  T -(( T  T  T) / 37810000))
        -(signed long)((280.46061837 + 360.98564736629 * (JD-2451545)
  +0.000387933  T  T -(( T  T  T) / 37810000))/360.0)*360.0;
Und da gibts noch in paar mehr von. Ich glaube nicht, das ich das in
Assembler hinbekomme.
Die Meßmethode war übrigens nicht all zu ungenau. Fluke Scopemeter
allerdings auch schon 12 jahre alt und nicht mehr kalibriert und schon
die Batterien drin ausgelaufen.
Die Frage nach dem Takt kam ja nur auf, weil die UART nur Müll ausgibt.
Inzwischen habe ich aber keine Idee mehr, weil der Takt ja einiger Maßen
zu stimmen scheint, aber ich trotzdem nur Datensalat von der UART
bekomme. (ich hab dazu noch einen GCC thread aufgemacht)
Im moment bin ich einfach nur ratlos ...
Das mit dem ASM hat mich schon getroffen. Immerhin hat die C-Code
Version des Programms einen Takt von 74kHz erzeugt ?! Ich dachte die
Compiler wären inzwischen besser.

von dave (Gast)


Lesenswert?

@Hannes

Also beim Mega32 ist nen RJMP immernoch 2 Takte.. ich denke, dass das
beim M128 nicht anders ist.. hab grad nachgeuggt.. bei dem brauchts
auch nur 2 Takte ;) ==> Schleife kostet 6 Takte

Dann nochmal: 1,33 * 6 ~ 8Mhz ;)

dave

von ...HanneS... (Gast)


Lesenswert?

@Dave:
Danke...
Ich bin immernoch bei den kleinen Megas und Tinys, daher ist mir das
noch nicht aufgefallen. Außerdem habe ich zur Sicherheit (man will sich
ja nicht blamieren) im Buch "AVR-Mikrockntroller-Praxis" (Volpe,
Elektor) nachgesehen, da steht definitiv auf Seite 128 bei RJMP 3
Takte. Daher der Irrtum.

...

von tex (Gast)


Lesenswert?

Lektüre liegt vor. Meine UART funktioniert davon aber noch immer nicht

von ...HanneS... (Gast)


Lesenswert?

Habe nochmal in einige Datenblätter geschaut. RJMP braucht auch bei den
anderen AVRs nur 2 Takte. Die Angabe im Buch ist definitiv falsch. Ist
aber lange nicht der erste Fehler, den ich in dem Buch gefunden und
(mit Bleistift) korregiert habe. Richtig gesehen, war das Buch eine
Fehlinvestition. Aber davon funktioniert tex' UART auch nicht
besser...

...HanneS...

von dave (Gast)


Lesenswert?

Hast du eigentlich schon mal den Sourcecode gezeigt? Im andren
"klemmt"-Thread ist keiner..
Vielleicht ist ja nen Fehler mit den Datenbits 5-9 oder Parität oder
Stop-Bits.. wer weiß.

Mit was nimmste das denn am PC auf, ist da der Fehler ausgeschlossen?

@Hannes
Haste das vielleicht mit dem JMP verwechselt?

dave

von ...HanneS... (Gast)


Angehängte Dateien:

Lesenswert?

@Dave:
Verwechselung mit JMP oder rcall wäre mir lieber, dann läge wenigstens
der Fehler bei mir. Ist aber nicht so, wie du im Anhang sehen kannst.
Es ist Seite 128 des Buches.

Gruß...
...HanneS...
(der bald keinem Buch mehr traut...)

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.