moin, moin! wie kann ich sicherstellen, ob mein µC wirklich mit 4Mhz läuft? Dankeeee!
@ 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
@Falk hat ein Bekannter von mit auch vorgeschlagen. ich soll also den pin toggeln. die Toggelfrequenz = Taktfrequenz?
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.
@ Martin oh, ich progge in Bascom. was kann man machen, wenn die toggelfrequenz NICHT zur erwartenden Frequenz passt?
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
>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.
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
>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.
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
>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.
>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?
Oder man wartet anstatt 1sek 100sek und nimmt sich eine Stoppuhr... Gruß Jan
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?
Wenn es 2 Sekunden gedauert hat, läuft er mit genau der Hälfte der Takfrequenz. So einfach ist es ;)
>Wenn es 2 Sekunden gedauert hat, läuft er mit genau der Hälfte der >Takfrequenz. diese erkundung habe ich schon früher gemacht!
>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,...
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!!!!!
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
>Die "Toggelfrequenz" entspricht hierbei der Taktfrequenz geteilt durch 6
Dann braucht man einen Frequenzzähler oder ein Oszi um
das dann zu MESSEN.
>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.
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...
>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).
>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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.