PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATmega644P Millisekunde genau?



HeyHey
24.02.2011, 09:17
Hallo Leute

Ich würde gerne mit einem ATmega644P ein kleines Gerätchen bauen mit dem es möglich ist, auf die Millisekunde genau einen Transistor für eine digitale Leitung zu schalten. Ich muss den Bereich von 1ms bis 10 Sekunden in 1ms Schritten abdecken können. Eingestellt wird das ganze über ein IO Warrior, der mit dem PC verbunden ist und über I2C mit dem Mega644P. Das sollte doch eigentlich mit einem ATmega644P bei 20 Mhz machbar sein oder?
Ansonnsten soll noch ein LCD Display per SPI und eine Tastaturmatrix über einen ADC angesteuert werden.

Mir fallen programmtechnisch 2 Möglichkeiten ein, entweder ich geh über die TOSC Eingänge oder ich nehme einen abgestimmten Oszillator. Die Millisekunde muss halt so genau wie nur irgendwie möglich eingehalten werden.


Wie würdet ihrs machen?


lg HeyHey

BMS
24.02.2011, 11:08
Hallo,
also machbar ist das auf jeden Fall.
Solange der Controller nicht alles gleichzeitig sondern schön nacheinander bewältigen soll, ist das gut machbar.
Würde einen 20Mhz Quarz an XTAL anschließen mit je 2x 22pF gegen Masse.
Wenn die 1ms vom Systemtakt abgeleitet werden sollen, ist das mit Timern schwierig weil es krumme Zeitwerte geben wird (Prescaler haben immer Zweierpotenzen). Dann entweder Quick-and-Dirty mit Warteschleifen, die man halt genau genug auslegt oder den Timer 2 über einen Uhrenquarz (32,768kHz) an TOSC1/2 laufen lässt. Ein Uhrenquarz hat 2^15 Hz, das lässt sich binär gut teilen.

Grüße,
Bernhard

HeyHey
24.02.2011, 17:21
nebenher muss halt auch noch dauerhaft auf den I2C Bus gelauscht werden und das LCD Display per SPI angesteuert werden, eine Tastaturmatrix aus 12 Tastern kommt auch noch dazu.


Was ist denn besser?

man richtet sich nach dem 20 Mhz Quarz?

oder man nimmt das Uhrenquarz an TOSC1 und 2

wäre es eine Möglichkeit den Prescaler von Timer 2 des ATmega644P auf 64 zu setzen und das Uhrenquarz mit 32kHz laufen zu lassen?

dann hätte ich ja alle 500µs einen Impuls und einen höheren Zählstand

500µs würden doch noch für andere Operationen dazwischen reichen oder?

for_ro
24.02.2011, 20:32
... oder den Timer 2 über einen Uhrenquarz (32,768kHz) an TOSC1/2 laufen lässt. Ein Uhrenquarz hat 2^15 Hz, das lässt sich binär gut teilen.
Wie willst du denn von den 32768Hz auf ms kommen? Der schwingt in einer ms 32,768 mal. Da geht doch nichts.

Sind denn die 20MHz fix? Mit einem 16MHz Quarz kannst du sogar mit einem 8-bit Timer die Sache so genau hinkriegen, wie der Quarz ist.
16.000.000 / 64 = 250.000, also 250 Ticks pro ms. Ganz einfach.
Bei 20MHz würde das so aussehen:
20.000.000 / 8 = 2.500.000, also 2500 Ticks pro ms. Dazu würde ich einen 16-bit Timer bemühen. Ebenfalls so genau wie es der Quarz hergibt.

BMS
24.02.2011, 20:56
Oops hab mich vertan - wenn du die 32768Hz durch 2^15 teilst, dann bekommst einen Sekundentakt (wie kam ich bloß auf Millisekunden...?).
In dem Fall also wirklich Systemtakt teilen und Timer laufen lassen.

HeyHey
25.02.2011, 10:10
die 20Mhz sind nicht so absolut genau, ich wollte halt ein Quarzoszillator verwenden, der nicht allzu viel kostet.

Isses programmiertechnisch einfacher mit einem 8Bit Timer oder einem 16Bit Timer, was wäre denn für mich besser?

Bei 8Bit und 16 Mhz würde ja auch mehr Zeit für andere Sachen bleiben, als bei 16Bit und 20 Mhz

Cid
18.03.2011, 14:14
das einfachste wäre wohl einen der int. Timer zu verwenden...

20 MHz --> 20.000.000 Hz --> bis 20.000 zählen für 1 ms
also den 16 Bit-Zähler bis 20k (- 1) - Abweichung durch Arbeit zählen lassen

ist nicht so genau, wenn der Quarz nicht so genau ist...

oder du nimmst nen Uhrenquarz, der ist genauer, aber dafür dann das Problem, dass du nie auf glatte ms kommst...
müsste man dann einen Korrekturcode einbauen, damit das ganze dann besser hinkommt... gerade zu faul da die Abweichungen auszurechnen, aber die wird größer sein als oben - auch wenn die Korrektur perfekt läuft...

glaube nicht, dass der Oszi wesentlich besser ist als der Crystal... außerdem wird das ganze gleich ein bisschen mehr Strom fressen...?!?

lokirobotics
18.03.2011, 20:10
...16.000.000 / 64 = 250.000, also 250 Ticks pro ms. Ganz einfach....
Genau so würde ich es auch machen.
Dazu kannste den Counter2 nehmen, Output Compare auf 250, Compare Match Output Unit vom Pin entkoppeln und nur den Interrupt behandeln.
Dann haste mehr als genug Zeit, die anderen Sachen zu machen und die CPU ist nicht die ganze Zeit mit Zählen beschäftigt.