Arduino Nano V3 Taktfrequenz

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Arduino Nano V3 Taktfrequenz

      Angeregt von der Taktquellenproblematik hier
      Digispark mini (attiny85) ohne Quarz mit softclock, RTC und DCF
      und hier
      SIM800L
      habe ich einen aktuellen Arduino Nano mit der Taktquelle eines DS3231 verbunden.
      Der Takt vom Pin 3 geht auf den Takteingang von Timer0, der als Counter bei 256 Takten überläuft und dann Timer1 ausliest.
      Timer1 ist in der Zeit (etwa31ms) um 62500 Takte weiter (0,03125*1600000/Prescaler8)
      Die Takte werden 256 mal aufsummiert, was alle 8 Sekunden 16000000 ergibt und seriell ausgegeben wird.
      Hier das Programm:

      BASCOM-Quellcode: Arduino Nano Taktfrequenzmessung

      1. $regfile = "m328pdef.dat"
      2. $crystal = 16000000
      3. $hwstack = 32
      4. $swstack = 32
      5. $framesize = 24
      6. $baud = 38400
      7. Config Scl = Portc.5
      8. Config Sda = Portc.4
      9. I2cinit
      10. Const Ds3231_write = 208
      11. Const Ds3231_read = 209
      12. Config Timer1 = Timer , Prescale = 8
      13. Config Timer0 = Counter , Edge = Rising
      14. On Timer0 T0irq
      15. Start Timer0
      16. Enable Timer0
      17. Enable Interrupts
      18. Led Alias Portb.5
      19. Ddrb.5 = 1
      20. Dim I As Byte 'Hilfsvariable
      21. Dim Daten(16) As Byte 'Dateninhalt vom DS3231
      22. Dim T As Word 'Timerhilfsvariable
      23. Dim Talt As Word 'Timerhilfsvariable
      24. Dim Tx As Word 'Timerhilfsvariable
      25. Dim E As Long 'Zwischenergebnis
      26. Dim Intzaehler As Byte 'Hilfsvariable
      27. Dim Startbit As Bit 'Hilfsvariable
      28. Dim Erg As Long 'Berechnungsergebnis
      29. 'kleiner I2C Tester
      30. For I = 0 To 254 Step 2
      31. I2cstart
      32. I2cwbyte I
      33. If Err = 0 Then
      34. Print "I2C Adresse = " ; I
      35. End If
      36. Next
      37. 'lesen des Registers für die Taktausgabe
      38. I2cstart
      39. I2cwbyte Ds3231_write
      40. I2cwbyte &H0E
      41. I2crepstart
      42. I2cwbyte Ds3231_read
      43. I2crbyte I , Nack
      44. I2cstop
      45. Waitms 2
      46. ' Einstellen auf 8192Hz
      47. I.2 = 0
      48. I.6 = 0
      49. 'schreiben
      50. I2cstart
      51. I2cwbyte Ds3231_write
      52. I2cwbyte &H0E
      53. I2cwbyte I
      54. I2cstop
      55. Do
      56. ' Gosub Rtc_lesen
      57. Bitwait Startbit , Set
      58. Startbit = 0
      59. Print Erg
      60. ' Uhrzeitausgabe
      61. ' Print Hex(daten(3)) ; ":" ; Hex(daten(2)) ; ":" ; Hex(daten(1)) ; " ";
      62. Loop
      63. Rtc_lesen:
      64. I2cstart
      65. I2cwbyte Ds3231_write
      66. I2cwbyte &H00
      67. I2crepstart
      68. I2cwbyte Ds3231_read
      69. For I = 1 To 15
      70. I2crbyte Daten(i) , Ack
      71. Next
      72. I2crbyte Daten(16) , Nack
      73. I2cstop
      74. Return
      75. T0irq:
      76. T = Timer1 'Timer1 sichern
      77. Tx = T - Talt 'Takte seit letztem Besuch errechnen
      78. Talt = T 'aktuellen Wert für später sichern
      79. E = E + Tx 'Wert aufsummieren
      80. Incr Intzaehler 'mitzählen
      81. If Intzaehler = 0 Then 'bei 256 Überläufen Ergebnis sichern
      82. Erg = E
      83. E = 0
      84. Startbit = 1 'Im Hauptprogramm bescheid geben
      85. End If
      86. Toggle Led
      87. Return
      Alles anzeigen
      Ich habe das Programm gestartet und die serielle aufgezeichnet.
      Dann den Finger auf den "Quarz" gelegt und dann noch etwas fester gedrückt.
      Die Temperatur hat anfangs etwa 25°C und höchstens etwa 35°C.
      Die Kurve ist erschreckend.
      Mit so viel Abweichung hatte ich nicht gerechnet, das sind locker 223 ppm! oder über 20ppm/°C!
      Das ist sehr, ähh, viel.

      Arduino_Fingerfrequenz.png
    • Michael schrieb:

      Dann den Finger auf den "Quarz" gelegt und dann noch etwas fester gedrückt.
      Die Temperatur hat anfangs etwa 25°C und höchstens etwa 35°C.
      Oder erzeugt das störende Kapazitäten? Mal mit einer Glühlampe bestrahlt (erwärmt)?
      Aber Achtung!
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • tschoeatsch schrieb:

      Oder erzeugt das störende Kapazitäten?
      nein, sonst würde der Effekt viel unmittelbarer sein und nicht etliche Sekunden brauchen (die X-Achse hat etwa 11 Minuten, alle 8s ein Wert)

      tschoeatsch schrieb:

      Mal mit einer Glühlampe bestrahlt (erwärmt)?
      Hätte den gleichen schlecht reproduzierbaren Charakter.
      Aus der Erfahrung weiß ich aber, dass das Zimmer 25° hat und mein Finger 35° schafft.
      Für eine richtige Klimakammer fehlt mir zur Zeit die Lust ;)

      Ich wollte mit meinem Beitrag klar stellen, wie stark die 16MHz wirklich abweichen, über 20ppm pro Grad.
      Das hat ein Quarz im gesamten Bereich.
    • monkye schrieb:

      Das Thema hatten wir kürzlich schon. Quarze sind baulich deutlich größer und vor allem teurer als der Arduino
      Richtig, die Arduina Nanos haben keine Quarze verbaut, die wären bei dieser Frequenz viel größer.
      Der Temperaturtest oben würde einen Quarz auch kalt lassen (Wortspiel;))
      Ich wollte mit meinem Beitrag den Sinn schärfen für die Ungenauigkeit des günstigen Arduinos, für Uhren oder anspruchsvolle asynchrone Datenübertragungen ist er deshalb eher nicht geeignet.
    • Habe jetzt schon 3, 4 Mal den Resonator entlötet und dann einen SMD Quarzgenerator angepappt. Aber Achtung, dann müssen auch die Fuses angepasst werden. Musste ich machen, weil ich per Serialport nicht über 56k hinauskam.
      Baue gerade wieder Sensoren, die sollen per Modbus (teilweise via RF) kommunizieren...
      Aus datenschutzrechtlichen Gründen befindet sich die Kontaktdaten auf der Rückseite dieses Beitrages.