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:
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
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
- $regfile = "m328pdef.dat"
- $crystal = 16000000
- $hwstack = 32
- $swstack = 32
- $framesize = 24
- $baud = 38400
- Config Scl = Portc.5
- Config Sda = Portc.4
- I2cinit
- Const Ds3231_write = 208
- Const Ds3231_read = 209
- Config Timer1 = Timer , Prescale = 8
- Config Timer0 = Counter , Edge = Rising
- On Timer0 T0irq
- Start Timer0
- Enable Timer0
- Enable Interrupts
- Led Alias Portb.5
- Ddrb.5 = 1
- Dim I As Byte 'Hilfsvariable
- Dim Daten(16) As Byte 'Dateninhalt vom DS3231
- Dim T As Word 'Timerhilfsvariable
- Dim Talt As Word 'Timerhilfsvariable
- Dim Tx As Word 'Timerhilfsvariable
- Dim E As Long 'Zwischenergebnis
- Dim Intzaehler As Byte 'Hilfsvariable
- Dim Startbit As Bit 'Hilfsvariable
- Dim Erg As Long 'Berechnungsergebnis
- 'kleiner I2C Tester
- For I = 0 To 254 Step 2
- I2cstart
- I2cwbyte I
- If Err = 0 Then
- Print "I2C Adresse = " ; I
- End If
- Next
- 'lesen des Registers für die Taktausgabe
- I2cstart
- I2cwbyte Ds3231_write
- I2cwbyte &H0E
- I2crepstart
- I2cwbyte Ds3231_read
- I2crbyte I , Nack
- I2cstop
- Waitms 2
- ' Einstellen auf 8192Hz
- I.2 = 0
- I.6 = 0
- 'schreiben
- I2cstart
- I2cwbyte Ds3231_write
- I2cwbyte &H0E
- I2cwbyte I
- I2cstop
- Do
- ' Gosub Rtc_lesen
- Bitwait Startbit , Set
- Startbit = 0
- Print Erg
- ' Uhrzeitausgabe
- ' Print Hex(daten(3)) ; ":" ; Hex(daten(2)) ; ":" ; Hex(daten(1)) ; " ";
- Loop
- Rtc_lesen:
- I2cstart
- I2cwbyte Ds3231_write
- I2cwbyte &H00
- I2crepstart
- I2cwbyte Ds3231_read
- For I = 1 To 15
- I2crbyte Daten(i) , Ack
- Next
- I2crbyte Daten(16) , Nack
- I2cstop
- Return
- T0irq:
- T = Timer1 'Timer1 sichern
- Tx = T - Talt 'Takte seit letztem Besuch errechnen
- Talt = T 'aktuellen Wert für später sichern
- E = E + Tx 'Wert aufsummieren
- Incr Intzaehler 'mitzählen
- If Intzaehler = 0 Then 'bei 256 Überläufen Ergebnis sichern
- Erg = E
- E = 0
- Startbit = 1 'Im Hauptprogramm bescheid geben
- End If
- Toggle Led
- Return
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