Hallo,
ich benötige einen Timer der maximal 30 Minuten (+/- 5 Sekunden kein
Problem) läuft (Pumpe an).
Die Hardware besteht aus einem Mega8 dessen Pins VOLLSTÄNDIG belegt
sind.
Daher läuft er mit internem Oszillator bei 1MHz.
Prescaler auf 64 = 15625 => 8bit Timer => 15625/256 = 61,035...
Also Zähler bei 61 ungefähr 1 Sekunde.
Abweichung 9 Ticks pro Sekunde, ca. 1 Sekunde pro 30 Minuten.
So ich mich nicht gerade verrechnet habe ;)
Wahrscheinlich bin ich nur zu blöd im Datenblatt eine Kennkurve o.ä. für
die Abweichung des interen Oszillators zu finden.
Zusammengefaßt:
- Der Controller ist ein Mega8, OHNE freie Pins
- Umgebungstemperatur schwankt zwischen 20°C und 45° C
- Es muß ein Timer 30m laufen mit maximaler Abweichung von 5s
- Timer0 wie folgt initialisiert: TCCR0 = (1 << CS00) | (1 << CS01);
- In IRQ Variable auf 61 ca. 1 Sekunde abgefragt
Frage, wie stark ist die Abweichung des internen Oszillators bei 45°C
Umgebungstemperatur ?
Erfahrungwerte oder Kennline gefragt.
Danke,
Markus
OK,
also bei 45°C wären es dann statt 1MHz nur noch ca. 950kHz.
15625-14843,75 = 781,25 Ticks Abweichung :(
Paßt nie, irgend eine Idee wie das ausgeglichen werden könnte ?
Temperatursensor fällt allerdings aus :(
Seh' schon dann wird wohl extern was abgefragt werden müssen :(
Danke ;)
Kannst du an den restlichen Pins noch was freischaufeln?
Im schlimmsten Fall könntest du alle Output Pins über
Schieberegister laufen lassen. Du brauchst dann nur noch
4 oder 5 Pins für beliebig viele Outputs.
Hast du evtl. ein periodisches externes Signal zur Verfügung, mit dem du
den AVR on-the-fly kalibrieren kannst?
Z.b. Nulldurchgangs-IRQ bei Phasenanschnittssteuerung. Da kann man dann
schön das OSCCAL-Register danach stellen.
Alternativ könnte man dann ja aber auch gleich die 50Hz für den Timer
nehmen...
Sollte auf der Platine noch Platz für ein 8-Eingangs-Multiplexer-IC [*]
sein: Damit kannst Du auf einfachste Weise mit einem geschätzten
Aufwand von 10 Codezeilen Assembler acht digitale Eingänge über vier
Leitungen einlesen (drei µC-Ausgänge um 0...7 an den Multiplexereingang
zu legen, und einen µC-Eingang fürs Multiplexer-Ausgangssignal). Dann
hättest Du vier µC-Pins frei. Wäre das eine Lösung für Dein Problem?
[*] 74HCT251, 16 Pin, 0.31 € bei Reichelt
OK,
dann mal wie's insgesamt aussieht:
- Fertig aufgebautes Board, KEINE Erweiterungsmöglichkeiten
- PortB komplett durch 8bit ADC verwendet
- PortD komplett durch 8bit ADC verwendet
- PortC steuert via Software PWM zwei Pumpen PC0&PC1 (ist so :( )
- PortC Pin5&4 ist TWI=I2C Slave
- PortC Pin2&3 ebenfalls ADC
- Frei nur noch PC6
Aufgabe:
Dritte Pumpe soll 30 Minuten angehen, wenn Steuerwert an ADC PC2
bestimmten Schwellwert erreicht hat.
Mir ist es NICHT möglich irgendetwas an der Hardware zu ändern :(
Weil alleine wegen Software PWM würde ich ja gerne ......
Also nach dem Diagramm auf S272 wären bei -20°C bis +20°C bei 5V eine
Differenz von 200kHz => bei +/-5° Temperaturänderung +/- 25kHz
Unterschied.
Stimmt's oder Verpeil ich da wieder was ?
20°C = 1,1 MHz
25°C = 1,075 MHz
30°C = 1,05 MHz
35°C = 1,025 MHz
40°C = 1 MHz
45°C = 0,975 MHz
Nur paßt das irgendwie nicht mit dem Diagramm überein :(
Trotzdem bei 20°C wären es ca. 278 Sekunden mehr pro 30 Minuten !
Bei 40°C die besagte 1 Sekunde weniger.
Die drei Prozent Schwankung macht bei den angenommenen 25kHz/5° ca. +/-
750Hz aus, wäre also vernachlässigbar ;)
Also die Idee mit der konstanten Temperatur ist ja schon ganz nett ;)
Fragt sich jetzt nur auf wieviel °C ich den µC temperieren soll ?
Danke,
Markus
du hast ja 1 MHz also bei mir auf Seite 277
bei 5V VCC ?! hat ist er auf 1MHz kalibriert,
und bei 45°C sinds etwa 0,99MHz (im schlechtesten Fall).
der Fehler liegt als0 bei max 1% (mit etwas Glück sinds 0,5%.
1% von 30min sind 18 sec, wie mans dreht und wendet ;-)
Beheizen würde ich Ihn auf mind 45°C, dann musst du deine Software aber
darauf abstimmen)
Die Temperatur auf +-5°C einzuhalten müsste einfach machbar sein,
dann bist du in deinem Genauigkeitsbereich.
Peter
An den freien PC6 ne nicht zu hohe, feste Freq. anlegen und damit die
30min abzählen. Ist nen sicherer hack als die Heizgeschichte und nen
Strippchen am Pin muß halt gehen.
Cheers
Detlef
Ist sonst 'nen I2C Baustein möglich? z.B. ein Uhrenbaustein. Dann müßte
der Atmega nur einmal als master reagieren und könnte über Pin
ein mal programmieren, dann kann er in 30 min 'nen "int" geben und z.B.
PC6 auf low ziehen lassen.
problem: der Atmel tritt halt eben als zweiter master am I2C bus auf,
was vom prinmzip aber kein problem sein sollte. (ist der andere master
multimasterfähig oder kann man irgendwie realisieren, dass der master zu
der zeit, wenn der atmel als master auftreten will, definitiv nicht auf
den bus schreibt?)
Alternative:
über PC6 signalisieren, dass man in 30 min 'nen I2C datum bekommen
möchte, die Uhr kann dann auf dem I2C master laufen.
Markus wrote:
> - PortB komplett durch 8bit ADC verwendet> - PortD komplett durch 8bit ADC verwendet
Oh Gott, wer denkt sich denn bloß sowas aus.
Soll das ein Schildbürgerstreich sein ?
Reiß einfach die ollen 8Bit-ADCs raus und zieh nen Draht zu den internen
ADC, schon hast Du 14 Portpins übrig.
Peter
... was haltet ihr von einem I2C Thermometer (z.B. LM75 oder DS1621).
Das koennte man an die schon vorhandenen TWI-Pins haengen. Den Timer
koennte man denn an die Temperatur anpassen.
Ob sowas funktioniert, habe ich keine Ahnung. ;-)
Karsten
Bevor du den Aufwand mit der Temperaturkompensation betreibst, überleg'
lieber ob du nicht 'n Quarz dranhängst! Dann ist das Teil sehr genau.
Mit Timer1 (16 bit), CTC-Mode, Teiler /1024 (16MHz) und OCRxA auf 15624
(nicht 15625, es wird von 0 ab gezählt!) und der OC-Interrupt kommt
exakt jede Sekunde!