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?
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.
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. ...
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?
Die Megas werden mit 1MHz ausgeliefert. Änderungen auf Sonderwünsche per Fusebit. ...
"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?
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.
@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?
@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?
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...
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.
@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?
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... ...
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.
@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...
@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.
@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
@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. ...
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...
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
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.